[
  {
    "path": ".editorconfig",
    "content": "﻿[*.cs]\n\n# CS1591: Missing XML comment for publicly visible type or member\ndotnet_diagnostic.CS1591.severity = none\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Oo]ut/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*.json\ncoverage*.xml\ncoverage*.info\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd"
  },
  {
    "path": "Binaries/CGALDotNet.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>CGALDotNet</name>\n    </assembly>\n    <members>\n        <member name=\"T:CGALDotNet.Arrangements.Arrangement2`1\">\n            <summary>\n            The generic arrangment class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.#ctor\">\n            <summary>\n            The default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a arrangement from a unmanaged ptr.\n            </summary>\n            <param name=\"ptr\">The unmanaged pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.ToString\">\n            <summary>\n            The arrangement as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Assign(CGALDotNet.Arrangements.Arrangement2{`0})\">\n            <summary>\n            Assigns the contents of another arrangement. \n            </summary>\n            <param name=\"other\">The other arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Overlay(CGALDotNet.Arrangements.Arrangement2{`0})\">\n            <summary>\n            Computes the overlay of two arrangements and return as a new arrangement.\n            </summary>\n            <param name=\"other\">The other arrangement.</param>\n            <returns>The overlay of both arrangements.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Copy\">\n            <summary>\n            Create a deep copy of this arrangment.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.InsertPolygon(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Insert the polygon into this arrangement.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.InsertPolygon(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Boolean)\">\n            <summary>\n            Insert the polygon into this arrangement.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.Arrangement2\">\n            <summary>\n            The abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor\">\n            <summary>\n            The default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a arrangement from the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a arrangement from the kernel and unmanaged pointer.\n            </summary>\n            <param name=\"kernel\">The kernel.</param>\n            <param name=\"ptr\">The unmanaged pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.Kernel\">\n            <summary>\n            The arrangements kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.VertexCount\">\n            <summary>\n            The number of vertices in the arrangement.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.IsolatedVerticesCount\">\n            <summary>\n            The number of vertices in the arrangement that are i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.VerticesAtInfinityCount\">\n            <summary>\n            returns the number of arrangement vertices that lie at infinity a\n            nd are not associated with valid points.\n            Such vertices are not considered to be regular arrangement \n            vertices and VertexCount does not count them.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.HalfEdgeCount\">\n            <summary>\n            The number of half edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.EdgeCount\">\n            <summary>\n            The number of edges. two half edges count as one edge.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.FaceCount\">\n            <summary>\n            The number of faces in the arrangement not counting\n            the unbounded face.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.UnboundedFaceCount\">\n            <summary>\n            returns the number of unbounded faces in the arrangement.\n            Such faces are not considered to be regular arrangement \n            faces and FaceCount does not count them.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.Locator\">\n            <summary>\n            The type of locator used to find element \n            in the arrangement when queried.\n            Default is walk which is the best in most cases\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.IsEmpty\">\n            <summary>\n            Is the arrangement empty.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.BuildStamp\">\n            <summary>\n            A number that will change if the unmanaged \n            arrangement model changes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Clear\">\n            <summary>\n            Clear the arrangement.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.IsValid\">\n            <summary>\n            In particular, the functions checks the topological structure of the arrangement \n            and assures that it is valid. In addition, the function performs several simple \n            geometric tests to ensure the validity of some of the geometric properties of \n            the arrangement. Namely, it checks that all arrangement vertices are associated \n            with distinct points, and that the halfedges around every vertex are ordered clockwise.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a copy of all the points in the arrangement.\n            </summary>\n            <param name=\"points\">A point array that is the length of the vertex count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a copy of all the segments in the arrangment.\n            </summary>\n            <param name=\"segments\">A segment array that is the length of the edge count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetVertices(CGALDotNet.Arrangements.ArrVertex2[],System.Int32)\">\n            <summary>\n            Get a copy of all the vertices in the arrangement.\n            </summary>\n            <param name=\"vertices\">A vertices array that is the length of the vertex count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetVertex(System.Int32,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Get the vertex from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the vertex.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetHalfEdges(CGALDotNet.Arrangements.ArrHalfedge2[],System.Int32)\">\n            <summary>\n            Get a copy of all the half edges in the arrangement.\n            </summary>\n            <param name=\"edges\">A half edge array that is the length of the half edge count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetHalfEdge(System.Int32,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Get the half edge from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the half edge.</param>\n            <param name=\"edge\">The half edge.</param>\n            <returns>True if the half edge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetFaces(CGALDotNet.Arrangements.ArrFace2[],System.Int32)\">\n            <summary>\n            Get a copy of all the faces in the arrangement.\n            </summary>\n            <param name=\"faces\">A face array that is the length of the facee count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetFace(System.Int32,CGALDotNet.Arrangements.ArrFace2@)\">\n            <summary>\n            Get the face from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the half edge.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.CreateLocator(CGALDotNet.Arrangements.ARR_LOCATOR)\">\n            <summary>\n            Create the locator used to find query the arrangement.\n            </summary>\n            <param name=\"locator\">The locator type.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.ReleaseLocator\">\n            <summary>\n            Release the locator. Default will be used..\n            Default is walk which is the best in most cases.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PointQuery(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrQuery@)\">\n            <summary>\n            Query what the point hits in the arrangment.\n            </summary>\n            <param name=\"point\">The point to query.</param>\n            <param name=\"result\">What was hit.</param>\n            <returns>True if something was hit.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.BatchedPointQuery(CGALDotNetGeometry.Numerics.Point2d[],CGALDotNet.Arrangements.ArrQuery[])\">\n            <summary>\n            Query multiple points in the arrangment.\n            </summary>\n            <param name=\"points\">The points to query.</param>\n            <param name=\"results\">The results for each point.</param>\n            <returns>True if any point hit something.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.VerticalRayQuery(CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Arrangements.ArrQuery@)\">\n            <summary>\n            Query using a ray going up or down (y axis) from the query point.\n            </summary>\n            <param name=\"point\">The point to start at.</param>\n            <param name=\"up\">True to shoot ray up, false to shoot down.</param>\n            <param name=\"result\">The result of what was hits.</param>\n            <returns>True if some thing was hit.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Locate the vertex at this point.\n            </summary>\n            <param name=\"point\">The point to locate vertex at.</param>\n            <param name=\"vert\">The vertex.</param>\n            <returns>True if a vertex was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Locate the closest vertex in the hit face\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The radius te closest vertex has to be within.</param>\n            <param name=\"vertex\">The closest vertex.</param>\n            <returns>True if point hit a face and found a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Locate the edge at this point.\n            </summary>\n            <param name=\"point\">The point to locate edge at.</param>\n            <param name=\"edge\">The edge.</param>\n            <returns>True if a edge was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Locate the closest edge in the hit face.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"edge\">The closest edge.</param>\n            <param name=\"radius\">The radius from the point a edge counts as being clicked on.</param>\n            <returns>True if the point hit a face and found a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateFace(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrFace2@)\">\n            <summary>\n            Locate the faces at this point.\n            </summary>\n            <param name=\"point\">The point to locate face at.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if a face was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.IntersectsSegment(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Find if the arrangement has a element that intersects the segment.\n            </summary>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if the segment intersects something in the arrangement.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertPoint(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Inserts a given point into a given arrangement.\n            It uses a given point-location object to locate the given point in the given arrangement.\n            If the point conincides with an existing vertex, there is nothing left to do. if it lies \n            on an edge, the edge is split at the point. Otherwise, the point is contained inside a face, \n            and is inserted as an isolated vertex inside this face.\n            </summary>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegment(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Insert the segment in to the arrangement.\n            </summary>\n            <param name=\"a\">The segments start point.</param>\n            <param name=\"b\">The segments end point.</param>\n            <param name=\"nonIntersecting\">True if the segment is know not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegment(CGALDotNetGeometry.Shapes.Segment2d,System.Boolean)\">\n            <summary>\n            Insert a segment into the arrangement.\n            </summary>\n            <param name=\"segment\"></param>\n            <param name=\"nonIntersecting\">True if the segment is know not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Insert a array of segments into the arrangement.\n            </summary>\n            <param name=\"segments\">The segment array</param>\n            <param name=\"count\">The segment arrays length.</param>\n            <param name=\"nonIntersecting\">True if the segments are known not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveVertex(System.Int32)\">\n            <summary>\n            Attempts to removed a given vertex from a given arrangement.\n            The vertex can be removed if it is either an isolated vertex, \n            (and has no incident edge,) or if it is a redundant vertex.That is, \n            it has exactly two incident edges, whose associated curves can be \n            merged to form a single x-monotone curve.The function returns a \n            boolean value that indicates whether it succeeded removing the \n            vertex from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the vertex in the arrangement.</param>\n            <returns>True if the vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveVertex(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Attempts to removed a given vertex from a given arrangement.\n            The vertex can be removed if it is either an isolated vertex, \n            (and has no incident edge,) or if it is a redundant vertex.That is, \n            it has exactly two incident edges, whose associated curves can be \n            merged to form a single x-monotone curve.The function returns a \n            boolean value that indicates whether it succeeded removing the \n            vertex from the arrangement.\n            </summary>\n            <param name=\"point\">The poisition of the vertex in the arrangement.</param>\n            <returns>True if the vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveEdge(System.Int32)\">\n            <summary>\n            Removes an edge at the index from the arrangement.\n            Once the edge is removed, if the vertices associated with its endpoints \n            become isolated, they are removed as well.\n            </summary>\n            <param name=\"index\">The index of the one of the half edges in the arrangement.</param>\n            <returns>True if the edge was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveEdge(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Removes an edge at the index from the arrangement.\n            Once the edge is removed, if the vertices associated with its endpoints \n            become isolated, they are removed as well.\n            </summary>\n            <param name=\"segment\">A segment with the same positions as the edge in the arrangement.</param>\n            <returns>True if the edge was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Print(System.Text.StringBuilder,System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n            <param name=\"printElements\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintVertices(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintHalfEdges(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintFaces(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.SweepLine`1\">\n            <summary>\n            The generic sweep line class.\n            </summary>\n            <typeparam name=\"K\">The kernel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Arrangements.SweepLine`1.Instance\">\n            <summary>\n            A static instanceof a sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a unmanaged pointer.\n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.ToString\">\n            <summary>\n            The sweep line as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.SweepLine\">\n            <summary>\n            The abstract sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor\">\n            <summary>\n            The default sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create from the kernel.\n            </summary>\n            <param name=\"kernel\">A kernel that implements a sweep line.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create from the kernel and unmanaged pointer.\n            </summary>\n            <param name=\"kernel\">A kernel that implements a sweep line.</param>\n            <param name=\"ptr\">A unmanaged pointer to a sweep line.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.SweepLine.Kernel\">\n            <summary>\n            The sweep line kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.DoIntersect(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Do any of the segments in the array intersect.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Do any of the segments in the array intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ComputeSubcurves(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Compute all the sub segemnts from the intersection \n            of the segments in the array.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>The sub segments.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ComputeIntersectionPoints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Compute all the intersection points from the \n            segments in the array.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>The intersection points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the point buffer.\n            </summary>\n            <param name=\"points\">A point array the size of the point buffer.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the segments in the point buffer.\n            </summary>\n            <param name=\"segments\">A segment array the size of the segment buffer.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ClearPointBuffer\">\n            <summary>\n            Clear the point buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ClearSegmentBuffer\">\n            <summary>\n            Clear the segment buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.PointBufferSize\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.SegmentBufferSize\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.CGALGlobal\">\n            <summary>\n            Global utility functions.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALGlobal.Version\">\n            <summary>\n            Get the version of CGAL in use.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALGlobal.EigenVersion\">\n            <summary>\n            Get the version of eigen being used.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNet.Geometry.Vector2{CGALDotNet.EIK},CGALDotNet.Geometry.Vector2{CGALDotNet.EIK})\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNet.Geometry.Vector2{CGALDotNet.EEK},CGALDotNet.Geometry.Vector2{CGALDotNet.EEK})\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Returns an approximation of the angle between u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns an approximation of the angle between p-q and r-q.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Returns an approximation of the angle between u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns an approximation of the angle between p-q and r-q.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxDihedralAngle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns an approximation of the signed dihedral angle \n            in the tetrahedron pqrs of edge pq.\n            p,q,r and p,q,s are not collinear.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <param name=\"s\">The fourth tetrahedrons point.</param>\n            <returns>The sign is negative if orientation(p,q,r,s) \n            is CGAL::NEGATIVE and positive otherwise.\n            The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, iff p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Constructs the bisector line of the two points p and q.\n            The bisector is oriented in such a way that p lies on its positive side.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns>Constructs the bisector line of the two points p and q.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Coplanar(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if p, q, r, and s are coplanar.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns>Returns true, if p, q, r, and s are coplanar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.CoplanarOrientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            If p,q,r are collinear, then CGAL_COLLINEAR is returned.\n            If not, then p,q,r define a plane p. The return value in this \n            case is either CGAL_POSITIVE or CGAL_NEGATIVE, but we don't \n            specify it explicitly. However, we guarantee that all calls to\n            this predicate over 3 points in p will return a coherent \n            orientation if considered a 2D orientation in p\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>If p,q,r are collinear, then CGAL_COLLINEAR is returned.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.CoplanarOrientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Let P be the plane defined by the points p, q, and r.\n            Note that the order defines the orientation of P. The function computes \n            the orientation of points p, q, and s in P: If p, q, s are collinear, \n            CGAL_COLLINEAR is returned. If P and the plane defined by p, q,\n            and s have the same orientation, CGAL_POSITIVE is returned; \n            otherwise CGAL_NEGATIVE is returned.\n            p, q, r, and s are coplanar and p, q, and r are not collinear.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.EquidistantLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Constructs the line which is at the same distance from the three points p, q and r.\n            p, q and r are not collinear.\n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"q\"></param>\n            <param name=\"r\"></param>\n            <returns>Constructs the line which is at the same distance from the three points p, q and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            returns LEFT_TURN if u and v form a left turn, returns \n            RIGHT_TURN if u and v form a right turn, and returns \n            COLLINEAR if u and v are collinear.\n            </summary>\n            <param name=\"u\"></param>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Vector2{CGALDotNet.EIK},CGALDotNet.Geometry.Vector2{CGALDotNet.EIK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Vector2{CGALDotNet.EEK},CGALDotNet.Geometry.Vector2{CGALDotNet.EEK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            returns POSITIVE, if s lies on the positive side of the \n            oriented plane h defined by p, q, and r, returns NEGATIVE\n            if s lies on the negative side of h, and returns COPLANAR \n            if s lies on h.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            returns NEGATIVE if u, v and w are negatively oriented, \n            POSITIVE if u, v and w are positively oriented,\n            and COPLANAR if u, v and w are coplanar.\n            </summary>\n            <param name=\"u\"></param>\n            <param name=\"v\"></param>\n            <param name=\"w\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.OrthogonalVector(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            computes an orthogonal vector of the plane defined by p, q\n            and r, which is directed to the positive side of this plane.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>computes an orthogonal vector of the plane</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Shapes.Ray2d)\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Ray2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Ray2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Segment2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Segment2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"T:CGALDotNet.CGALObject\">\n            <summary>\n            Base class for objects that referrence a CGAL object.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.CGALObject.m_ptr\">\n            <summary>\n            The pointer to the unmanged CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.#ctor(System.IntPtr)\">\n            <summary>\n            Constructor taking a referrence to a CGAL object.\n            </summary>\n            <param name=\"ptr\">A pointer to a CGAL object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Finalize\">\n            <summary>\n            The destuctor.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALObject.IsDisposed\">\n            <summary>\n            Has the object been disposed.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALObject.Ptr\">\n            <summary>\n            Get the ptr to the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Dispose\">\n            <summary>\n            Dispose the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ToString\">\n            <summary>\n            Print some information about the object.\n            </summary>\n            <returns>Print some information about the object.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Print\">\n            <summary>\n            Print the object into the console.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the object into a string builder.\n            </summary>\n            <param name=\"builder\">The builder to print into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Release\">\n            <summary>\n            Release the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Swap(System.IntPtr)\">\n            <summary>\n            Swap the unmanaged pointer with another.\n            The old ptr will be released first.\n            </summary>\n            <param name=\"ptr\">The new ptr. The old ptr will be released first.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ReleasePtr\">\n            <summary>\n            Allow derived class to release the unmanaged memory.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Allow derived class to release the unmanaged memory.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.CheckPtr\">\n            <summary>\n            Check if the object is still valid.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Collections.NativeList`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"T\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Collections.NativeList`1.m_list\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList`1.IsSync\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.GetEnumerator\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList`1.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Clear\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Add(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.AddRange(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            \n            </summary>\n            <param name=\"items\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.CopyTo(`0[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"array\"></param>\n            <param name=\"startIndex\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Contains(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.IndexOf(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Insert(System.Int32,`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Remove(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.RemoveAt(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Reverse\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.TrimExcess\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Get(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Set(System.Int32,`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Collections.NativeList\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.Capacity\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.Count\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.IsReadOnly\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenColumnVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Collections.Generic.IList{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"list\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Normalized\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Transpose\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Adjoint\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Conjugate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Dot(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Resize(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Random(System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"seed\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EIGEN_SOLVER\">\n            <summary>\n            enum for egien solvers.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Create a new matrix filled with zeros.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number of columns.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double[0:,0:])\">\n            <summary>\n            Create a new matrix fill with the array contents.\n            </summary>\n            <param name=\"array\">The array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Collections.Generic.IList{CGALDotNet.Eigen.EigenColumnVector})\">\n            <summary>\n            Create a new matrix filled with the contents of the column vectors.\n            All column vectors must have the same dimension.\n            </summary>\n            <param name=\"columns\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 2 x 2 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 3 x 3 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 4 x 4 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new matrix from a pointer.\n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Identity(System.Int32)\">\n            <summary>\n            Create a identity matrix.\n            </summary>\n            <param name=\"size\">The number of rows and columns of the matrix. Must be square.</param>\n            <returns>The identity matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Series(System.Int32,System.Int32)\">\n            <summary>\n            Create a matrix filled with the numbers 1, 2. 3, etc to end.\n            Used for debugging.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number columns.</param>\n            <returns>The Matrix.</returns>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Random(System.Int32,System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a new matrix fill with random numbers.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number columns.</param>\n            <param name=\"min\">The minimum random number generated.</param>\n            <param name=\"max\">The maximum random number generated.</param>\n            <param name=\"seed\">The random generators seed.</param>\n            <returns>The matrix.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Rows\">\n            <summary>\n            The number of rows in the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Columns\">\n            <summary>\n            The number of columns in the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Length\">\n            <summary>\n            The total size of the matrix which is \n            the rows times the number of columns.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Item(System.Int32)\">\n            <summary>\n            The single dimension array accessor.\n            </summary>\n            <param name=\"i\">The array index.</param>\n            <returns>The value at the index i.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Item(System.Int32,System.Int32)\">\n            <summary>\n            The double dimension array accessor.\n            </summary>\n            <param name=\"i\">The row index.</param>\n            <param name=\"j\">The column index.</param>\n            <returns>The value at the index i,j.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.ToString\">\n            <summary>\n            The matrix string info.\n            </summary>\n            <returns>The matrix string info.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Transpose\">\n            <summary>\n            The matrix transposed.\n            Flips a matrix over its diagonal that is, \n            it switches the row and column indices of the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Conjugate\">\n            <summary>\n            The matrices conjugate.\n            The matrix obtained by replacing each element a(ij) with its complex conjugate, A^=(a^(ij)).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Adjoint\">\n            <summary>\n            The matrices adjoint.\n            The transpose of its cofactor matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsInvertible\">\n            <summary>\n            Is the matrix invertible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Inverse\">\n            <summary>\n            The inverse of a square matrix A, \n            sometimes called a reciprocal matrix, \n            is a matrix A^(-1) such that AA^(-1)=I.\n            DOes not check if the matrix is invertible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Determinant\">\n            <summary>\n            The determinant is a scalar value that is a \n            function of the entries of a square matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Trace\">\n            <summary>\n            The trace of a square matrix is defined to be the \n            sum of elements on the main diagonal from the upper left to the lower right.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsSquare\">\n            <summary>\n            A square matrix has the same number of rows and columns.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsDiagonal\">\n            <summary>\n            A diagonal matrix is a matrix in which the entries \n            outside the main diagonal are all zero.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsUpperTriangular\">\n            <summary>\n            A square matrix is called upper triangular \n            if all the entries below the main diagonal are zero.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsLowerTriangular\">\n            <summary>\n            A square matrix is called lower triangular \n            if all the entries above the main diagonal are zero.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,System.Double)\">\n            <summary>\n            Multiple each component in matrix by the scalar.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"s\">The scalar.</param>\n            <returns>The matrix with each component multiplied by the scalar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Division(CGALDotNet.Eigen.EigenMatrix,System.Double)\">\n            <summary>\n            Divide each component in matrix by the scalar.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"s\">The scalar.</param>\n            <returns>The matrix with each component divided by the scalar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Multiple the two matrices.\n            The first matrices number of columns must \n            the same as the second matrices number of rows.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>The product matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Addition(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Add two matrices.\n            The matrices must be the same size.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>A matrix where each compoent is the sum of the other two matrices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Subtraction(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Subtract two matrices.\n            The matrices must be the same size.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>A matrix where each compoent is the difference of the other two matrices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            Multiple a matrix and a column vector.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"v\">The column vector.</param>\n            <returns>The product column vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsIdentity(System.Double)\">\n            <summary>\n            Is this matrix the identity matrix.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Is this matrix the identity matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsZero(System.Double)\">\n            <summary>\n            Is this matrix filled with zeros.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Is this matrix filled with zeros.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsPositive\">\n            <summary>\n            Are all the values in this matrix positive.\n            </summary>\n            <returns>Are all the values in this matrix positive.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.HasNAN\">\n            <summary>\n            Does the matrix have a component that is nan.\n            </summary>\n            <returns>Does the matrix have a component that is nan.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.NoNAN\">\n            <summary>\n            Replaces all nan values in the matrix with 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsFinite\">\n            <summary>\n            Are all the values in the matrix finite (non-infinite and non-nan).\n            </summary>\n            <returns>Are all the values in the matrix finite (non-infinite and non-nan).</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.MakeFinite\">\n            <summary>\n            Replaces all infinite and nan values in matrix with 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsConst(System.Double)\">\n            <summary>\n            Are all the values in the matrix the same.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Are all the values in the matrix the same.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SubMatrix(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Create a sub matrix from this matrix.\n            </summary>\n            <param name=\"startRow\">The row to start at.</param>\n            <param name=\"startCol\">THe column to start at.</param>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"cols\">The number of columns.</param>\n            <returns>A sub matrix from this matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SubMatrix(System.Int32,System.Int32)\">\n            <summary>\n            Create a sub matrix from this matrix.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"cols\">The number of columns.</param>\n            <returns>A sub matrix from this matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Solve(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EIGEN_SOLVER)\">\n            <summary>\n            Solve the linear system.\n            </summary>\n            <param name=\"v\">The vector to solve.</param>\n            <param name=\"solver\">The solver type.</param>\n            <returns>The solution vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Solve(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EIGEN_SOLVER)\">\n            <summary>\n            Solve the linear system.\n            </summary>\n            <param name=\"v\">The vector to solve.</param>\n            <param name=\"solver\">The solver type.</param>\n            <returns>The solution vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RelativeError(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            Find the relative error from the linear system.\n            </summary>\n            <param name=\"v\">The vector that was solved.</param>\n            <param name=\"x\">The vector that was the solution.</param>\n            <returns>The relative error.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RelativeError(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Find the relative error from the linear system.\n            </summary>\n            <param name=\"v\">The vector that was solved.</param>\n            <param name=\"x\">The vector that was the solution.</param>\n            <returns>The relative error.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenValues(CGALDotNet.Eigen.EigenColumnVector@)\">\n            <summary>\n            Find the eigen values of the matrix.\n            </summary>\n            <param name=\"values\">The eigen values if found, null otherwise.</param>\n            <returns>True if the values could be determined.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenVectors(CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            Find the eigen vectors of the matrix.\n            </summary>\n            <param name=\"vectors\">The eigen vectors if found, null otherwise.</param>\n            <returns>True if the vectors could be determined.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenValuesAndVectors(CGALDotNet.Eigen.EigenColumnVector@,CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"values\"></param>\n            <param name=\"vectors\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.TryInverse(CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            Try and find the inverse of the matrix.\n            </summary>\n            <param name=\"inverse\">The inverse if found, null otherwise.</param>\n            <returns>True if the inverse was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.GetRow(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Row\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,CGALDotNet.Eigen.EigenRowVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Row\"></param>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.GetColumn(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Column\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Column\"></param>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Round(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"digits\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Scale(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"s\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Rotate(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a rotation from a angle and the rotation axis.\n            </summary>\n            <param name=\"radian\">The rotation amount.</param>\n            <param name=\"axis\">The axis to rotate on.</param>\n            <returns>The rotation matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenRowVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Collections.Generic.IList{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"list\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.ToString\">\n            <summary>\n            /\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Normalized\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Transpose\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Adjoint\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Conjugate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Dot(CGALDotNet.Eigen.EigenRowVector,CGALDotNet.Eigen.EigenRowVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Random(System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"seed\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.x\">\n            <summary>\n            The first value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.y\">\n            <summary>\n            The second value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.z\">\n            <summary>\n            The third value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.w\">\n            <summary>\n            The fourth value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Resize(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsZero(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsPositive\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.HasNAN\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.NoNAN\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsFinite\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.MakeFinite\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsConst(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Round(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"digits\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.AreSameSize(CGALDotNet.Eigen.EigenVector,CGALDotNet.Eigen.EigenVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Box2`1\">\n            <summary>\n            The generic Box wrapper for a CGAL object.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create box from min and max values.\n            </summary>\n            <param name=\"min\">The min x and y value.</param>\n            <param name=\"max\">The max x and y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create box from min and max points.\n            </summary>\n            <param name=\"min\">The min point.</param>\n            <param name=\"max\">The max point.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The iso rectangle pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.ToString\">\n            <summary>\n            The iso rectangle as a string.\n            </summary>\n            <returns>The iso rectangle as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the rectangle.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Copy\">\n            <summary>\n            Create a deep copy of the rectangle.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Box2\">\n            <summary>\n            The abstract iso rectangle definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The geometry kernel.</param>\n            <param name=\"ptr\">The Box pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Kernel\">\n            <summary>\n            The iso rectangle kernel.\n            Contains the functions to the unmanaged CGAL object.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Min\">\n            <summary>\n            The rectangles min point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Max\">\n            <summary>\n            The rectangles max point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Area\">\n            <summary>\n            The rectangles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.IsDegenerate\">\n            <summary>\n            Is the rectangle degenerate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The side the rectangle the point is on.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>If the point is iside, outside or on boundary.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the rectangle contain the point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"includeBoundary\">Should a point on \n            the boundary count as being inside.</param>\n            <returns>Does the rectangle contain the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.CGALIntersections\">\n            <summary>\n            The static intersection class.\n            </summary>\n            <summary>\n            The static intersection class.\n            </summary>\n            <summary>\n            The static intersection class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Box2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Box2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_PointPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Box2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Box2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_PointPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_PointLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_BoxPoint(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_PointLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_BoxPoint(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_PointPoint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The IsoRectancle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Point2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Vector2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.HPoint2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Line2_EEK_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Ray2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Segment2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Triangle2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Box2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The IsoRectancle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Point2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Vector2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.HPoint2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Line2_EIK_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Ray2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Segment2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Triangle2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Box2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.HPoint2`1\">\n            <summary>\n            Weighted point class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor\">\n            <summary>\n            Create a new weighted point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double)\">\n            <summary>\n            Create a new weighted point from a value and weight as 1.\n            </summary>\n            <param name=\"v\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as 1.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as the w value.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n            <param name=\"w\">The points weight value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new weighted point from a pointer.\n            </summary>\n            <param name=\"ptr\">The pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.Copy\">\n            <summary>\n            Create a deep copy of the point.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.HPoint2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new weighted point.\n            </summary>\n            <param name=\"kernel\">The points kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(System.Double,System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as the w value.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n            <param name=\"w\">The points weight value.</param>\n            <param name=\"kernel\">The points kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new weighted point from a existing ponter and kernel.\n            </summary>\n            <param name=\"kernel\">The points kernel.</param>\n            <param name=\"ptr\">The points pointer</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.Kernel\">\n            <summary>\n            The points kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.ReleasePtr\">\n            <summary>\n            Release the pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the pointer.\n            </summary>\n            <param name=\"ptr\">The pointer to release.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.x\">\n            <summary>\n            Accessor or the points x value.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.y\">\n            <summary>\n            ccessor or the points y value.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the point.\n            </summary>\n            <param name=\"min\">The points min value.</param>\n            <param name=\"max\">The points max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Clamp01\">\n            <summary>\n            Clamp the point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.INTERSECTION_RESULT_2D\">\n            <summary>\n            Enum for the type of intersection geomerty.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.IntersectionResult2d\">\n            <summary>\n            The intersection result struct.\n            May contain up tp 6 points of data.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Data\">\n            <summary>\n            The point data for the intersection.\n            Represents up to 6 points in xy order.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Count\">\n            <summary>\n            The number of points of data used.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Hit\">\n            <summary>\n            Was there a intersection.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.IsPolygon\">\n            <summary>\n            Is the intersection a polygon.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Type\">\n            <summary>\n            The intersection geometry type.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Item(System.Int32)\">\n            <summary>\n            Array accessor for the point data.\n            </summary>\n            <param name=\"i\">The array index from 0 to 6.</param>\n            <returns>The point at index i.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.IntersectionResult2d.ToString\">\n            <summary>\n            Results information as string.\n            </summary>\n            <returns>esults information as string</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Point\">\n            <summary>\n            If result type was point get the point geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Line\">\n            <summary>\n            If result type was line get the line geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Ray\">\n            <summary>\n            If result type was ray get the ray geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Segment\">\n            <summary>\n            If result type was segment get the segment geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Box\">\n            <summary>\n            If result type was box get the box geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Triangle\">\n            <summary>\n            If result type was triangle get the triangle geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.PolygonPoints\">\n            <summary>\n            If result type was polygon get the points that\n            make up the polygon geometry.\n            Should only ever have at most 6 points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.IntersectionResult2d.Polygon``1\">\n            <summary>\n            The intersection result as a polygon.\n            </summary>\n            <typeparam name=\"K\">The polygons kernel.</typeparam>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Line2`1\">\n            <summary>\n            A CGALObject that represents a line on 2D space.\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Line2`1.Horizontal\">\n            <summary>\n            A horizontal line on the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Line2`1.Vertical\">\n            <summary>\n            A vertical line on the y axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new line where ax + by + c = 0 holds.\n            </summary>\n            <param name=\"a\">The constant in ax.</param>\n            <param name=\"b\">The constant in by.</param>\n            <param name=\"c\">The constant.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a new line that passes through the two points.\n            </summary>\n            <param name=\"p1\">The first point.</param>\n            <param name=\"p2\">The second point.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Create a line that passes through the point in the direction of the vector.\n            </summary>\n            <param name=\"p\">The point.</param>\n            <param name=\"v\">The vector.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a line from a existing pointer.\n            </summary>\n            <param name=\"ptr\">The pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2`1.Opposite\">\n            <summary>\n            Create a new line that faces in the opposite direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Perpendicular(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a new line that is perpendicular to current line.\n            </summary>\n            <param name=\"point\">A point the line should turn ccw when turning.</param>\n            <returns>The perpendicular line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the object.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the object.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Scale(System.Double)\">\n            <summary>\n            Scale the object.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Translate, rotate and scale the object.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in degrees.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Copy\">\n            <summary>\n            Create a deep copy of the line.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Line2\">\n            <summary>\n            The abstract class for the line object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(System.Double,System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"v\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Kernel\">\n            <summary>\n            The lines kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.A\">\n            <summary>\n            The lines constant in ax.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.B\">\n            <summary>\n            The lines constant in by.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.C\">\n            <summary>\n            The lines constant.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsDegenerate\">\n            <summary>\n            Is the line degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsHorizontal\">\n            <summary>\n            Is the line horizontal on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsVertical\">\n            <summary>\n            Is the line vertical on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Vector\">\n            <summary>\n            Convert the line to a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lie on the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOnNegativeSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lies on the negative/cw side of the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the negative/cw side of the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOnPositiveSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lies on the positive/ccw side of the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the positive/ccw side of the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.X_On_Y(System.Double)\">\n            <summary>\n            The lines x value given a y value.\n            </summary>\n            <param name=\"y\">The y value.</param>\n            <returns>The lines x value given a y value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Y_On_X(System.Double)\">\n            <summary>\n            The lines y value given a x value.\n            </summary>\n            <param name=\"x\">The x value.</param>\n            <returns>The lines y value given a x value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Point2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.Half\">\n            <summary>\n            A point of halfs.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Point2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.x\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.y\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the point.\n            </summary>\n            <param name=\"min\">The points min value.</param>\n            <param name=\"max\">The points max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Clamp01\">\n            <summary>\n            Clamp the point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Ray2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Ray2`1.UnitX\">\n            <summary>\n            The unit x ray.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Ray2`1.UnitY\">\n            <summary>\n            The unit y ray.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"position\"></param>\n            <param name=\"direction\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2`1.Opposite\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2`1.Line\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Ray2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"position\"></param>\n            <param name=\"direction\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsHorizontal\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsVertical\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Position\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Direction\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Segment2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Segment2`1.Horizontal\">\n            <summary>\n            A horizontal line on the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Segment2`1.Vertical\">\n            <summary>\n            A vertical line on the y axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2`1.Line\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Segment2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.A\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.B\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Min\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Max\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsHorizontal\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsVertical\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Vector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.SqrLength\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Triangle2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Triangle2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.A\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.B\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.C\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Area\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Orientation\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.OrientedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Vector2`1\">\n            <summary>\n            A Vector2 object with kernel type K.\n            </summary>\n            <typeparam name=\"K\">The type of kernel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor\">\n            <summary>\n            Create a new Vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.Double)\">\n            <summary>\n            Create a new vector filled with the value.\n            </summary>\n            <param name=\"v\">The value to fill.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create a new vector with the values x and y.\n            </summary>\n            <param name=\"x\">The vectors x value.</param>\n            <param name=\"y\">The vectors y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new vector from a existing pointer.\n            </summary>\n            <param name=\"ptr\">The pointer object.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.ToString\">\n            <summary>\n            Vector information.\n            </summary>\n            <returns>The vectors string information.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.Copy\">\n            <summary>\n            Create a deep copy of the vector.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Vector2\">\n            <summary>\n            The vectors abstract bass class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new vector with the kernel.\n            </summary>\n            <param name=\"kernel\">The vectors kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new vector from the x and y values.\n            </summary>\n            <param name=\"x\">The vectors x value.</param>\n            <param name=\"y\">The vectors y value.</param>\n            <param name=\"kernel\">The vectors kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new vector from a existing pointer.\n            </summary>\n            <param name=\"kernel\">The vectors kernel.</param>\n            <param name=\"ptr\">The existing pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.Kernel\">\n            <summary>\n            The vectors kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.Magnitude\">\n            <summary>\n            The vectors sqr magnitude.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.SqrMagnitude\">\n            <summary>\n            The vectors sqr magnitude.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.x\">\n            <summary>\n            Access the x component.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.y\">\n            <summary>\n            Access the y component.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.ReleasePtr\">\n            <summary>\n            Release the vectors pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release a pointer to a vector.\n            </summary>\n            <param name=\"ptr\">The pointer to release.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the vector.\n            </summary>\n            <param name=\"min\">The vectors min value.</param>\n            <param name=\"max\">The vectors max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Clamp01\">\n            <summary>\n            Clamp the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.HULL_METHOD\">\n            <summary>\n            The convex hull method to use.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull2`1\">\n            <summary>\n            The generic convex hull class.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Hulls.ConvexHull2`1.Instance\">\n            <summary>\n            The static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.CreateHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,CGALDotNet.Hulls.HULL_METHOD)\">\n            <summary>\n            Find the convex of the points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"method\">The hull ethod to use.</param>\n            <returns>A polygon that represents the convex hull.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.UpperHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Find the upper hull of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>A polygon that represents the upper hull.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.LowerHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Find the lower hull of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>A polygon that represents the lower hull.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull2\">\n            <summary>\n            The convex hull abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct hull with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"P:CGALDotNet.Hulls.ConvexHull2.Kernel\">\n            <summary>\n            The hulls kernel type.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.IsStronglyConvexCCW(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Is this set of points ccw orderer.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Is this set of points ccw orderer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.IsStronglyConvexCW(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Is this set of points cw orderer.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Is this set of points cw orderer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.CheckCount(System.Int32)\">\n            <summary>\n            Checks if the minimum number of points have been provided.\n            </summary>\n            <param name=\"count\">The point array length.</param>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull3`1\">\n            <summary>\n            The generic convex hull class.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Hulls.ConvexHull3`1.Instance\">\n            <summary>\n            The static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.CreateHullAsPolyhedron(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Create the convex hull from a set of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length</param>\n            <returns>The hull as a polyhedron.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.CreateHullAsSurfaceMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Create the convex hull from a set of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length</param>\n            <returns>The hull as a surface mesh.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull3\">\n            <summary>\n            The convex hull abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct hull with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"P:CGALDotNet.Hulls.ConvexHull3.Kernel\">\n            <summary>\n            The hulls kernel type.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.IsStronglyConvex(CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            Check if the points in the polyhedron are convex.\n            </summary>\n            <param name=\"poly\">The polyhedron.</param>\n            <returns>True if the polyhedron is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.IsStronglyConvex(CGALDotNet.Polyhedra.SurfaceMesh3)\">\n            <summary>\n            Check if the points in the mesh are convex.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>True if the mesh is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.CheckCount(System.Int32)\">\n            <summary>\n            Checks if the minimum number of points have been provided.\n            </summary>\n            <param name=\"count\">The point array length.</param>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.ConformingTriangulation2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.ConformingTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Insert(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Insert(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.InsertConstraint(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.ConformingTriangulation2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.ConformingTriangulation2.MAX_ANGLE_BOUNDS\">\n            <summary>\n            The max value the angle bounds can be.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.VertexCount\">\n            <summary>\n            The number of verices in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.TriangleCount\">\n            <summary>\n            The number of triangles in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.IndiceCount\">\n            <summary>\n            The number of indices need to represent the\n            triangulation (number of triangles * 3).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.Kernel\">\n            <summary>\n            The conforming triangulation kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.GetIndices(System.Int32[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"indices\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the triangulation.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the triangulation.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Scale(System.Double)\">\n            <summary>\n            Scale the triangulation.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the triangulation with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"segment\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"segments\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.MakeDelaunay\">\n            <summary>\n            Make the mesh delaunay.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.MakeGabriel\">\n            <summary>\n            Make the mesh \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Refine(System.Double,System.Double)\">\n            <summary>\n            Refine the mesh into smaller triangles.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Refine(System.Double,System.Double,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Refine the mesh into smaller triangles.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <param name=\"seeds\">Seeds point in polygons that are not to be refined.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.SkinSurfaceMeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.SkinSurfaceMeshing`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.CreateSkinPolyhedra(System.Double,System.Boolean,CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"shrinkFactor\"></param>\n            <param name=\"subdivde\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.CreateSkinPolyhedra(System.Double,System.Boolean,CGALDotNetGeometry.Numerics.HPoint3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"shrinkFactor\"></param>\n            <param name=\"subdivde\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.SkinSurfaceMeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.SkinSurfaceMeshing.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.TetrahedralRemeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.TetrahedralRemeshing`1.Instance\">\n            <summary>\n            A static instance of the tetrahedral remeshing.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.TetrahedralRemeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.TetrahedralRemeshing.Kernel\">\n            <summary>\n            The tetrahedral remeshing kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.Remesh(System.Double,System.Int32,CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"targetLength\"></param>\n            <param name=\"iterations\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.Polygon2`1\">\n            <summary>\n            Generic polygon definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polygons points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.ToString\">\n            <summary>\n            The polygon as a string.\n            </summary>\n            <returns>The polygon as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Copy\">\n            <summary>\n            Copy the polygon.\n            </summary>\n            <returns>The copied polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersects(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersects(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersection(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"results\">The intersection results.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersection(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"results\">The intersection results.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Refine(System.Double)\">\n            <summary>\n            Refine the polygon to a triangulation.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <returns>The base triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Refine(System.Double,System.Double)\">\n            <summary>\n            Refine the polygon to a triangulation.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <returns>The base triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Partition(System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}},CGALDotNet.Polygons.POLYGON_PARTITION)\">\n            <summary>\n            Partition the polygon into convex pieces.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"results\">The convex partition.</param>\n            <param name=\"type\">The type of partition method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"threshold\">The simplification threshold.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Simplify(CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"param\">The simplification parameters.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Offset(CGALDotNet.Polygons.OFFSET,System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            offset the polygon. Does not modify this polygon.\n            </summary>\n            <param name=\"offset\">The type of offset.</param>\n            <param name=\"amount\">The amount to offset.</param>\n            <param name=\"results\">The offset results.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.ToPolyhedron3(System.Boolean)\">\n            <summary>\n            Create a polyhedron3 mesh with one polygon face.\n            </summary>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <returns>The new polyhedron mesh</returns>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Dual\">\n            <summary>\n            Get the dual polygon where every point s now a edge.\n            </summary>\n            <returns>The dual polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.Polygon2\">\n            <summary>\n            The abstract polygon definition.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.Polygon2.m_isSimple\">\n            <summary>\n            Is the polygon simple.\n            Must be updated to find if simple.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.Polygon2.m_orientation\">\n            <summary>\n            The polygons orientation.\n            Must be updated to find orientation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Count\">\n            <summary>\n            The number of points in the polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsSimple\">\n            <summary>\n            Is this a simple polygon.\n            Certains actions can only be carried out on simple polygons.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Orientation\">\n            <summary>\n            The polygons orientation.\n            Certain actions depend on the polygons orientation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.ClockDir\">\n            <summary>\n            The orientation expressed as the clock direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsDegenerate\">\n            <summary>\n            Is the polygon degenerate.\n            Polygons with less than 3 points are degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsClockWise\">\n            <summary>\n            Is the polygon cw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsCounterClockWise\">\n            <summary>\n            Is the polygon ccw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsUpdated\">\n            <summary>\n            Is the polygon updated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Kernel\">\n            <summary>\n            The polygons kernel.\n            Contains the functions to the unmanaged CGAL polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetIsUpdatedToFalse\">\n            <summary>\n            Mark th mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.IsValid\">\n            <summary>\n            Valid polygons should be simple and ccw \n            for most algorithms to work on them.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.IsValidHole\">\n            <summary>\n            Valid hole polygons should be simple\n            and cw to add to a polygon with holes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Clear\">\n            <summary>\n            Clear the polygon of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Insert the point at the index into the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Insert a range of points into the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Add(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the point to the end of the poylgon.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polygon.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polygons last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the polygon.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the polygon points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the polygon segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polygon then \n            the new points will be appended to end of polygon.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Reverse\">\n            <summary>\n            Reverse the polygon.\n            Swithches the orientation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindBoundingBox\">\n            <summary>\n            Find the bounding box for the polygon.\n            </summary>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindIfSimple\">\n            <summary>\n            Find if the polygon is simple.\n            </summary>\n            <returns>True if simple.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindIfConvex\">\n            <summary>\n            Find if the polygon is convex.\n            Must be simple to determine.\n            </summary>\n            <returns>True if the polygon is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindOrientation\">\n            <summary>\n            Find the polygons orientation.\n            Must be simple to determine.\n            </summary>\n            <returns>The polygons orientations.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.OrientedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the orientated side the point lies on.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The orientated side of the polygon the point is on.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the bounded side the point lies on.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The bounded side of the polygon the point is on.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindSignedArea\">\n            <summary>\n            Find the polygons signed area. \n            Must be simple to determine.\n            </summary>\n            <returns>The signed area is positive if polygon is ccw \n            and negation if cw.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindArea\">\n            <summary>\n            The area of the polygon.\n            Must be simple to determine.\n            </summary>\n            <returns>The abs of the signed area.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindPerimeter\">\n            <summary>\n            Find the perimeter.\n            This is the length of the polygon boundary.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindSquarePerimeter\">\n            <summary>\n            Find the square perimeter.\n            This is the square length of the polygon boundary.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the polygon contain the points.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point to find.</param>\n            <param name=\"inculdeBoundary\">Does the point on the boundary count</param>\n            <returns>True if the point is inside the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Round(System.Int32)\">\n            <summary>\n            Round each point it polygon to a number of digits.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Scale(System.Double)\">\n            <summary>\n            Scale the polygon.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the polygon with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ToArray\">\n            <summary>\n            Return all the points in the polygon in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ToList(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygon into a list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Convert``1\">\n            <summary>\n            Convert the polygon to a new polygon with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Truncate(System.Int32,System.Double)\">\n            <summary>\n            Truncate a point in the polygon by splitting\n            the point and shifting toward its neghbours.\n            </summary>\n            <param name=\"index\">The points index in mesh.</param>\n            <param name=\"amount\">The amount to truncale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polygon into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Update\">\n            <summary>\n            Update the polygon if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Update(System.Boolean,CGALDotNet.ORIENTATION)\">\n            <summary>\n            Update the polygon directly without calling the update\n            function.\n            </summary>\n            <param name=\"isSimple\">Is the polygon simepl.</param>\n            <param name=\"orientation\">The polygons orientation.</param>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonAlgorithm.CheckInput\">\n            <summary>\n            Should the input polygon be checked.\n            Can disable for better performance if \n            it is know all input if valid.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonAlgorithm.CheckPolygon(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Check if the polygon is valid to offset.\n            Should be simple and ccw.\n            </summary>\n            <param name=\"polygon\">The polygon to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonAlgorithm.CheckPolygon(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Check if the polygon is valid to offset.\n            Should be simple and ccw.\n            </summary>\n            <param name=\"polygon\">The polygon to check.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_BOOLEAN\">\n            <summary>\n            The type of boolean ops.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonBoolean2`1\">\n            <summary>\n            Generic polygon boolean class.\n            </summary>\n            <typeparam name=\"K\">The type of kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonBoolean2`1.Instance\">\n            <summary>\n            A static instance to the boolean class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.#ctor\">\n            <summary>\n            Create a new object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Complement(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The complement of the polygon.\n            </summary>\n            <param name=\"polygon\">A simple ccw polygon.</param>\n            <param name=\"result\">The complement of the polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.CopyBuffer(System.Int32,System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Copy the unmanaged polygon objects created \n            into the result list.\n            </summary>\n            <param name=\"count\">The number of objects in the buffer.</param>\n            <param name=\"result\">The result lis.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.CopyBufferItem(System.Int32)\">\n            <summary>\n            Copy the unmanaged polygon object.\n            </summary>\n            <param name=\"index\">The index of the polygon in the buffer.</param>\n            <returns>The polygon copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonBoolean2\">\n            <summary>\n            Abstract base class for polygon boolean.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonBoolean2.Kernel\">\n            <summary>\n            The polygon boolean kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2.ClearBuffer\">\n            <summary>\n            Clear the unmanaged buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonFactory`1\">\n            <summary>\n            Factory for creating polygons.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.Create\">\n            <summary>\n            Create a empty polygon.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateTriangle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a triangle.\n            </summary>\n            <param name=\"a\">The triangle first point.</param>\n            <param name=\"b\">The triangle second point.</param>\n            <param name=\"c\">The triangle third point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateTriangle(CGALDotNetGeometry.Shapes.Triangle2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a triangle.\n            </summary>\n            <param name=\"tri\">The triangle.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"min\">The boxs min point.</param>\n            <param name=\"max\">The boxs max point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"min\">The boxs min point.</param>\n            <param name=\"max\">The boxs max point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateDounut(System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a polygon from a dounut.\n            Outer radius must be greater than inner.\n            </summary>\n            <param name=\"outer\">The outer radius.</param>\n            <param name=\"inner\">The inner radius</param>\n            <param name=\"segments\">The number of segments.</param>\n            <returns>The created polygon with holes</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateDounut(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a polygon from a dounut.\n            Outer radius must be greater than inner.\n            </summary>\n            <param name=\"center\">The center position of the polygon.</param>\n            <param name=\"outer\">The outer radius.</param>\n            <param name=\"inner\">The inner radius</param>\n            <param name=\"segments\">The number of segments.</param>\n            <returns>The created polygon with holes</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"radius\">The radius of the circle.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"center\">The center of the circle.</param>\n            <param name=\"radius\">The radius of the circle.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(CGALDotNetGeometry.Shapes.Circle2d,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"circle\">The cirlce.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochStar(System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"size\">The size of the polygon.</param>\n            <param name=\"iterations\">The number of times to sub divide.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochStar(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"center\">The stars center.</param>\n            <param name=\"size\">The size of the polygon.</param>\n            <param name=\"iterations\">The number of times to sub divide.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochNext(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"points\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION\">\n            <summary>\n            Decomposition stratergy for polygons.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION_PWH\">\n            <summary>\n            Decomposition stratergy for polygons with holes.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonMinkowski`1\">\n            <summary>\n            Generic Minkowski class.\n            </summary>\n            <typeparam name=\"K\">The type of kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonMinkowski`1.Instance\">\n            <summary>\n            A static instance to the Minkowski class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.#ctor\">\n            <summary>\n            Create a new object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"decomp\">The decomposition method.</param>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION_PWH,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"decomp\">The decomposition method.</param>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumSSAB(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            It is based on the angle-bisector decomposition method suggested by Chazelle and Dobkin [4],\n            which runs in O(n2) time. In addition, it applies a heuristic by Flato that reduces the number\n            of output polygons in many common cases. The convex decompositions that it produces usually \n            yield efficient running times for Minkowski sum computations. It starts by examining each pair \n            of reflex vertices in the input polygon, such that the entire interior of the diagonal \n            connecting these vertices is contained in the polygon. Out of all available pairs, the vertices\n            pi and pj are selected, such that the number of reflex vertices encountered when traversing \n            the boundary of the polygon from pi to pj in clockwise order is minimal. The polygon is split \n            by the diagonal pipj. This process is repeated recursively on both resulting sub-polygons. \n            In case it is not possible to eliminate two reflex vertices at once any more, each reflex \n            vertex is eliminated by a diagonal that is closest to the angle bisector emanating from this \n            vertex and having rational-coordinate endpoints on both sides.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumOptimalConvex(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses the dynamic-programming algorithm of Greene [6] for computing an optimal decomposition of \n            a polygon into a minimal number of convex sub-polygons. While this algorithm results in a small\n            number of convex polygons, it consumes rather many resources, as it runs in O(n4) time and O(n3) \n            space in the worst case, where n is the number of vertices in the input polygon.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumHertelMehlhorn(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n             Implements the approximation algorithm suggested by Hertel and Mehlhorn [8], which triangulates \n             the input polygon and then discards unnecessary triangulation edges. After triangulation (carried \n             out by the constrained-triangulation procedure of CGAL) the algorithm runs in O(n) time and space,\n             and guarantees that the number of sub-polygons it generates is not more than four times the optimum.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumGreeneConvex(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Implementation of Greene's approximation algorithm [6], which computes a convex decomposition of the \n            polygon based on its partitioning into y-monotone polygons. This algorithm runs in O(nlogn) time and \n            O(n) space, and has the same guarantee on the quality of approximation as Hertel and Mehlhorn's algorithm.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumVertical(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses vertical decomposition to decompose the underlying arrangement.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumVertical(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses vertical decomposition to decompose the underlying arrangement.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumTriangle(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumTriangle(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonMinkowski\">\n            <summary>\n            Abstract base class for polygon minkowski.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonMinkowski.Kernel\">\n            <summary>\n            The polygon Minkowski kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonOffset2`1\">\n            <summary>\n            The generic polgon offset class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonOffset2`1.Instance\">\n            <summary>\n            Static instance of polygon offset.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.#ctor\">\n            <summary>\n            Create new polygon offset.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateOffset(CGALDotNet.Polygons.OFFSET,CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior or exterior offset.\n            </summary>\n            <param name=\"offset\">The offset type</param>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"amount\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateOffset(CGALDotNet.Polygons.OFFSET,CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior or exterior offset.\n            </summary>\n            <param name=\"offset\">The offset type</param>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"amount\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorOffset(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorOffset(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorOffset(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a exterior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorOffset(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a exterior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorSkeleton(CGALDotNet.Polygons.Polygon2{`0},System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the interior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorSkeleton(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the interior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorSkeleton(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the exterior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorSkeleton(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the exterior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonOffset2\">\n            <summary>\n            The abstract polygon offset class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonOffset2.Kernel\">\n            <summary>\n            The offset kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.PolygonBufferSize\">\n            <summary>\n            Get the number off polygons in the buffer.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.SegmentBufferSize\">\n            <summary>\n            The size of the segment buffer.\n            </summary>\n            <returns>The number of segments in the buffer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.GetBufferedPolygon(System.Int32)\">\n            <summary>\n            Get the unmanaged point to the polygon at the buffer index\n            </summary>\n            <param name=\"index\">The index in the buffer.</param>\n            <returns>The pointer</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.GetBufferedSegment(System.Int32)\">\n            <summary>\n            Get the segment from buffer.\n            </summary>\n            <param name=\"index\">The segments index.</param>\n            <returns>The segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ClearPolygonBuffer\">\n            <summary>\n            Clear the polygon buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ClearSegmentBuffer\">\n            <summary>\n            Clear the segment buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_PARTITION\">\n            <summary>\n            Type of polygon partitions.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonPartition2`1\">\n            <summary>\n            Generic polygon partition class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonPartition2`1.Instance\">\n            <summary>\n            Static instance of polygon partition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.#ctor\">\n            <summary>\n            Create new polygon partition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Is_Y_Monotone(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Is this polygon Y monotonic.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <returns>True if y monotonic.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Is_Y_Monotone(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Is this polygon Y monotonic.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <returns>True if y monotonic.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.POLYGON_PARTITION,CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"type\">The type of partition to perfrom.</param>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.POLYGON_PARTITION,CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"type\">The type of partition to perfrom.</param>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Y_Monotone(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition in to Y monotonic polygons.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Y_Monotone(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition in to Y monotonic polygons.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ApproxConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ApproxConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.GreeneApproxConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.GreeneApproxConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.OptimalConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of \n            convex polygons produced is minimal.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.OptimalConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of \n            convex polygons produced is minimal.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.CopyBufferAndClear(System.Int32,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Copy the new polygons into the result array\n            and the clear the buffer.\n            </summary>\n            <param name=\"count\">The number of polygons in buffer.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonPartition2\">\n            <summary>\n            The abstract base class.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonPartition2.Kernel\">\n            <summary>\n            The partition kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2.ClearBuffer\">\n            <summary>\n            Clear the unmanaged buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_SIMP_COST_FUNC\">\n            <summary>\n            Cost options for simplification.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_SIMP_STOP_FUNC\">\n            <summary>\n            Stop distance options for simplification.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplificationParams\">\n            <summary>\n            Paramaters for poylgon simplification.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonSimplificationParams.Default\">\n            <summary>\n            The default param settings.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplificationParams.ToString\">\n            <summary>\n            The param as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplification2`1\">\n            <summary>\n            Generic polygon simplification class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonSimplification2`1.Instance\">\n            <summary>\n            Static instance of polygon simplification.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.Simplify(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyPtr(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon ptr.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.Simplify(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary and all the holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyPtr(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary and all the holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygons ptr.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyBoundary(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyHoles(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyHole(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams,System.Int32)\">\n            <summary>\n            Simplify one of the polygons holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <param name=\"index\">The hole index to simplify.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplification2\">\n            <summary>\n            Abstract polygon simplification class.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonSimplification2.Kernel\">\n            <summary>\n            The simplification kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2.ReleasePtr\">\n            <summary>\n            Release unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonVisibility`1\">\n            <summary>\n            The generic polgon visibility class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonVisibility`1.Instance\">\n            <summary>\n            Static instance of polygon visibility.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.#ctor\">\n            <summary>\n            Create new polygon visibility.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0}@)\">\n            <summary>\n            Compute the visibility from a simple polygon with no holes.\n            This class implements the algorithm of B.Joe and R.B.Simpson [4]. The algorithm is a modification\n            and extension of the linear time algorithm of Lee [5]. It computes the visibility region from a \n            viewpoint that is in the interior or on the boundary of the polygon.\n            While scanning the boundary the algorithm uses a stack to manipulate the vertices, and ultimately\n            yields the visibility region.For each scanned edge, at most 2 points are pushed onto the stack.\n            Overall, at most 2 n points are pushed or popped. Thus, the time and space complexities of the\n            algorithm are O(n) even in case of degeneracies such as needles, where n is the number of the vertices of the polygon.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A simple polygon that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNet.Polygons.POLYGON_VISIBILITY,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes.\n            </summary>\n            <param name=\"method\">What method to use.</param>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibilityTEV(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes using the triangular expansion method.\n            The algorithm does not require preprocessing. It relies on the algorithm of T. \n            Asano [1] based on angular plane sweep, with a time complexity of O(nlogn) in the number of vertices.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibilityRSV(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes using the rotational sweep method.\n            The algorithm obtains a constrained triangulation from the input arrangement, then computes visibility by \n            expanding the triangle that contains the query point. Preprocessing takes O(n) time and O(n) space, where \n            n is the number of vertices of input polygon. The query time is O(nh), where h is the number of holes+1 of \n            input polygon. Thus, for simple polygons (or a polygon with a constant number of holes) the algorithm \n            complexity is linear, but it is O(n2) in the worst case, as the number of holes can be linear in n.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonVisibility\">\n            <summary>\n            The abstract polygon visibility class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonVisibility.Kernel\">\n            <summary>\n            The offset kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_ELEMENT\">\n            <summary>\n            Polygon with holes consists of a boundary and holes.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonWithHoles2`1\">\n            <summary>\n            Generic polygon definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor\">\n            <summary>\n            Default constuctor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Construct polygon with the boundary.\n            </summary>\n            <param name=\"boundary\">A CCW polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct polygon with the boundary points\n            </summary>\n            <param name=\"boundary\">A CCW set of points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ToString\">\n            <summary>\n            The polygon as a string.\n            </summary>\n            <returns>The polygon as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Copy\">\n            <summary>\n            Create a deep copy of the polygon.\n            </summary>\n            <returns>The copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Copy(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Create a deep copy of the polygon element.\n            </summary>\n            <param name=\"element\">The element type to copy.</param>\n            <param name=\"index\">If element os a hole thiss is the holes index.</param>\n            <returns>The copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.GetBoundary\">\n            <summary>\n            Get the boundary as a copy.\n            If unbounded will return a empty polygon.\n            </summary>\n            <returns>A copy of the hole polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.GetHole(System.Int32)\">\n            <summary>\n            Get the hole as a copy.\n            </summary>\n            <param name=\"index\">The holes index</param>\n            <returns>A copy of the hole polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.AddHole(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Add a polygon as a holes.\n            Holes must simple and CW.\n            </summary>\n            <param name=\"polygon\">The hole polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ToList\">\n            <summary>\n            Create a copy of boundary and hole polygons.\n            </summary>\n            <returns>The list of polygons.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Intersects(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Intersects(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ConnectHoles\">\n            <summary>\n            Connect all the holes of the polygon \n            and return as a polygon. \n            Will result in a non simple polygon.\n            </summary>\n            <returns>The connected non-simple polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Partition(System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}},CGALDotNet.Polygons.POLYGON_PARTITION)\">\n            <summary>\n            Partition the polygon into convex pieces.\n            </summary>\n            <param name=\"results\">The convex partition.</param>\n            <param name=\"type\">The type of partition method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"threshold\">The simplification threshold.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Simplify(CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"param\">The simplification parameters.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Offset(CGALDotNet.Polygons.OFFSET,System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            offset the polygon. Does not modify this polygon.\n            </summary>\n            <param name=\"offset\">The type of offset.</param>\n            <param name=\"amount\">The amount to offset.</param>\n            <param name=\"results\">The offset results.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonWithHoles2\">\n            <summary>\n            The abstract polygon definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct polygon with the kernel.\n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Construct the polygon with the kernel and boundary.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"boundary\">A CCW polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct the polygon with the kernel and boundary.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"boundary\">A CCW set of points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct the polygon with the kernel and pointer.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsUnbounded\">\n            <summary>\n            Is the polygon unbounded. \n            ie no boundary polygon has been set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsBounded\">\n            <summary>\n            Is the polygon bounded. \n            ie a boundary polygon has been set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Count\">\n            <summary>\n            Number of points in the boindary polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.HoleCount\">\n            <summary>\n            The number of holes in polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsSimple\">\n            <summary>\n            Is this a simple polygon.\n            Certains actions can only be carried out on simple polygons.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Orientation\">\n            <summary>\n            The polygons orientation.\n            Certain actions depend on the polygons orientation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.ClockDir\">\n            <summary>\n            The orientation expressed as the clock direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsDegenerate\">\n            <summary>\n            Is the polygon degenerate.\n            Polygons with less than 3 points are degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsClockWise\">\n            <summary>\n            Is the polygon cw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsCounterClockWise\">\n            <summary>\n            Is the polygon ccw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Kernel\">\n            <summary>\n            The polygon kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.IsValid\">\n            <summary>\n            Valid polygon with holes must have a simple and ccw boundary\n            and all holes must be simple and cw.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.IsValidHole(CGALDotNet.Polygons.PolygonWithHoles2,CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Valid holes must be simple, cw and must be contained\n            within the boundary polygon.\n            </summary>\n            <param name=\"pwh\"></param>\n            <param name=\"hole\"></param>\n            <returns>True if the polygon is a valid hole.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Clear\">\n            <summary>\n            Clear the polygon.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ClearBoundary\">\n            <summary>\n            Clear the polygons boundary.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ClearHoles\">\n            <summary>\n            Clear the polygons holes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.PointCount(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Get the number of points of a polygon element.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Remove(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Remove a polygon.\n            Can remove the boundary or a hole.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.RemoveHole(System.Int32)\">\n            <summary>\n            Remove a hole from the polygon.\n            </summary>\n            <param name=\"index\">The holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Reverse(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Reverse the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetPoint(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32,System.Int32)\">\n            <summary>\n            Get a polygons point.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"pointIndex\">The index of the point in the polygon.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetPoints(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Get the points in the polygon element.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"points\">The point array to copy points into.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.SetPoint(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Set a polygons point.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"pointIndex\">The index of the point in the polygon.</param>\n            <param name=\"point\">The point to set.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.SetPoints(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Set all the points in the polygon. If the point array is longer\n            than the polygon is current the extra points are appended to the end.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"points\">The points to set.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.AddHole(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Add a hole from a set of points.\n            </summary>\n            <param name=\"points\">A CW set of points.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfUnbounded\">\n            <summary>\n            Find if the polygon has a boundary.\n            </summary>\n            <returns>True if the polygon has a boundary.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindBoundingBox(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find the polygons bounding box.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The polygons bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfSimple(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find if the polygon is simple.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>True if the polygon is simple.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfConvex(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find if the polygon is convex.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>True if polygon is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindOrientation(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find the orientation of polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The orientation of the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.OrientedSide(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Find the orientated side the point is on.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"point\"></param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The orientated side of point compared to the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindSignedArea(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            The signed area of the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The signed area is positive if polygon is ccw \n            and negation if cw.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindArea(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            The area of the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The polygons area.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ToArray\">\n            <summary>\n            Return all the points in the polygon in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ToList(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygons boundary into a list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetAllPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygon boundary and holes.\n            </summary>\n            <param name=\"points\">The point array to copy into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Round(System.Int32)\">\n            <summary>\n            Round each point it polygon to a number of digits.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Convert``1\">\n            <summary>\n            Convert the polygon to a new polygon with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resoures.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ContainsPolygon(CGALDotNet.Polygons.Polygon2,System.Boolean)\">\n            <summary>\n            Does the polygon fully contain the other polygon.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"inculdeBoundary\">Should the boundary be included.</param>\n            <returns>True if the polygon is contained within this polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does this polygon contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"inculdeBoundary\">Should points on the boundary be \n            counted as being inside the polygon.</param>\n            <returns>True if the polygon contain the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Translate(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Rotate(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Degree,System.Int32)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Scale(System.Double)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Scale(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Double,System.Int32)\">\n            <summary>\n            Scale the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"scale\">The amount to scale.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Transform(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double,System.Int32)\">\n            <summary>\n            Transform the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"scale\">The amount to scale.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print debug infomation.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.VertexCount\">\n            <summary>\n            Number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.FaceCount\">\n            <summary>\n            Number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.HalfedgeCount\">\n            <summary>\n            Number of halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.BorderEdgeCount\">\n            <summary>\n            Number of border edges.\n            Since each border edge of a polyhedral surface has exactly one \n            border halfedge, this number is equal to size of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValid\">\n            <summary>\n            Returns true if the polyhedral surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidTriangleMesh\">\n            <summary>\n            Is this a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidClosedMesh\">\n            <summary>\n            Is this a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidClosedTriangleMesh\">\n            <summary>\n            Is this a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map. </param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The length of the point array.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\">The points index.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ComputeVertexNormals\">\n            <summary>\n            Computes the vertex normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ComputeFaceNormals\">\n            <summary>\n            Computes the face normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ReadOFF(System.String)\">\n            <summary>\n            Read data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.WriteOFF(System.String)\">\n            <summary>\n            Write data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshFace3.Index\">\n            <summary>\n            The faces index\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshFace3.Halfedge\">\n            <summary>\n            THe faces edge\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshFace3.NullFace\">\n            <summary>\n            A face where all compents are null index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.op_Equality(CGALDotNet.Polyhedra.MeshFace3,CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.op_Inequality(CGALDotNet.Polyhedra.MeshFace3,CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.Equals(CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.GetHashCode\">\n            <summary>\n            The faces hash code.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.EnumerateVertices(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all vertices in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next vertex</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.MeshFactory\">\n            <summary>\n            https://github.com/caosdoar/spheres/blob/master/src/spheres.cpp\n            https://github.com/mrdoob/three.js/tree/dev/src/geometries\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.IsBorder\">\n            <summary>\n            Is the edge a border to a hole.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Index\">\n            <summary>\n            The edges index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Source\">\n            <summary>\n            The edges  source vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Target\">\n            <summary>\n            The edges  target vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Opposite\">\n            <summary>\n            The edges opposite edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Next\">\n            <summary>\n            The edges next edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Previous\">\n            <summary>\n            The edges previous edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Face\">\n            <summary>\n            The edges face\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshHalfedge3.NullHalfedge\">\n            <summary>\n            A edge where everthing is set to null index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.SourcePoint(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Get the source point. \n            </summary>\n            <param name=\"mesh\">The mesh the point belongs to.</param>\n            <returns>The  source point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point is null index.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.TargetPoint(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Get the target point. \n            </summary>\n            <param name=\"mesh\">The mesh the point belongs to.</param>\n            <returns>The  target point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point is null index.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.op_Equality(CGALDotNet.Polyhedra.MeshHalfedge3,CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.op_Inequality(CGALDotNet.Polyhedra.MeshHalfedge3,CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.Equals(CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.GetHashCode\">\n            <summary>\n            The edges hahe code\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.EnumerateVertices(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all vertices in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next vertex</returns>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Degree\">\n            <summary>\n            The vertices degree is how mang edges connect to it.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Index\">\n            <summary>\n            The vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Halfedge\">\n            <summary>\n            The vertices edge\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshVertex3.NullVertex\">\n            <summary>\n            A vertex where all components are null.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.op_Equality(CGALDotNet.Polyhedra.MeshVertex3,CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.op_Inequality(CGALDotNet.Polyhedra.MeshVertex3,CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.Equals(CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.GetHashCode\">\n            <summary>\n            The vertices hash code\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges surrounding the vertex.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.NefPolyhedron3`1\">\n            <summary>\n            Generic nef polyhedron definition.\n            A 3D Nef polyhedron is a subset of the 3-dimensional space that is the result of forming\n            complements and intersections starting from a finite set H of 3-dimensional halfspaces.\n            Nef polyhedra are closed under all binary set operations, i.e., intersection, union, \n            difference, complement, and under the topological operations boundary, closure, and interior.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            creates a Nef polyhedron and initializes it to the empty \n            set if plane == EMPTY and to the whole space if space == COMPLETE.\n            </summary>\n            <param name=\"space\">The nef's space</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNetGeometry.Shapes.Plane3d,CGALDotNet.Polyhedra.NEF_BOUNDARY)\">\n            <summary>\n            creates a Nef polyhedron containing the halfspace on the \n            negative side of plane including plane if boundary==INCLUDED, \n            excluding plane if boundary==EXCLUDED.\n            </summary>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"boundary\">The boundary.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            creates a Nef polyhedron, which represents the same point \n            set as the polyhedral surface.\n            </summary>\n            <param name=\"polyhedra\">The polyhedron</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polyhedrons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ToString\">\n            <summary>\n            The nef polyhdron as a string.\n            </summary>\n            <returns>The nef polyhedron as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Intersection(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the intersection of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Join(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the union of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Difference(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the difference between nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.SymmetricDifference(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the symmetric difference of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Complement\">\n            <summary>\n            Returns the complement of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Interior\">\n            <summary>\n            Returns the interior of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Boundary\">\n            <summary>\n            Returns the boundary of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Closure\">\n            <summary>\n            Returns the closure of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Regularization\">\n            <summary>\n            Returns the regularization, i.e. the closure of the interior, of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.MinkowskiSum(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Returns the MinkowskiSum.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ConvertToPolyhedron(CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            Converts nef into a Polyhedron.\n            nef must be simple to convert.\n            </summary>\n            <param name=\"poly\">The result of the conversion.</param>\n            <returns>True if nef is simple and the conversion was successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ConvertToSurfaceMesh(CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            Converts nef into a surface mesh.\n            nef must be simple to convert.\n            </summary>\n            <param name=\"mesh\">The result of the conversion.</param>\n            <returns>True if nef is simple and the conversion was successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.GetVolumes(System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Get a list of the nef volumes.\n            </summary>\n            <param name=\"volumes\">Get a list of the nef volumes.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.NefPolyhedron3\">\n            <summary>\n            The abstract nef polyhedra definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            creates a Nef polyhedron and initializes it to the empty \n            set if plane == EMPTY and to the whole space if space == COMPLETE.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"space\">The nef's space</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Shapes.Plane3d,CGALDotNet.Polyhedra.NEF_BOUNDARY)\">\n            <summary>\n            creates a Nef polyhedron containing the halfspace on the \n            negative side of plane including plane if boundary==INCLUDED, \n            excluding plane if boundary==EXCLUDED.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"boundary\">The boundary.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            creates a Nef polyhedron, which represents the same point \n            set as the polyhedral surface.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"polyhedra\">The polyhedron</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"ptr\">The polyhedrons pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.Kernel\">\n            <summary>\n            The polyhedron kernel.\n            Contains the functions to the unmanaged CGAL polhedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.EdgeCount\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.FaceCount\">\n            <summary>\n            Return the number of halfedge pairs.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.HalfEdgeCount\">\n            <summary>\n            Return the number of halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.HalfFaceCount\">\n            <summary>\n            Return the number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.VertexCount\">\n            <summary>\n            Return the number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.VolumeCount\">\n            <summary>\n            Return the number of volumes.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsEmpty\">\n            <summary>\n            Returns true, if nef is the empty point set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsSimple\">\n            <summary>\n            Rreturns true, if nef is a 2-manifold.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsSpace\">\n            <summary>\n            Returns true, if nef is the complete 3D space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.Clear(CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            Make nef the empty set if space == EMPTY and the complete \n            3D space if space == COMPLETE.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.IsValid\">\n            <summary>\n            Checks the integrity of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.ConvexDecomposition\">\n            <summary>\n            Decompose the nef into convex volumes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the nef polyhedron into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckInput\">\n            <summary>\n            Should the input polygon be checked.\n            Can disable for better performance if \n            it is know all input if valid.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is valid.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValid(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is valid.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidTriangleException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidTriangle(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid closed mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosed(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid closed mesh.\n            </summary>\n            <param name=\"mesh\">The polygon to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedTriangleException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedTriangle(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.Polyhedron3`1\">\n            <summary>\n            A polyhedral surface consists of vertices, edges, \n            facets and an incidence relation on them.\n             Each edge is represented by two halfedges with opposite orientations.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[])\">\n            <summary>\n            Construct from points and triangle indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Construct from points and polygon indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The meshs pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ToString\">\n            <summary>\n            The polyhdron as a string.\n            </summary>\n            <returns>The mesh as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Copy\">\n            <summary>\n            Create a deep copy of the mesh.\n            </summary>\n            <returns>A deep copy of the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"oriente\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Split(System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Split the mesh into its unconnected components.\n            </summary>\n            <param name=\"results\">Each unconnect component as a new mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.CreatePolygonMesh(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"polygon\">The faces polygon.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Dual\">\n            <summary>\n            Create the dual mesh where each face becomes a vertex\n            and each vertex becomes a face.\n            Must be a valid closed mesh to create the dual.\n            </summary>\n            <returns>The duel mesh.</returns>\n            <exception cref=\"T:System.InvalidOperationException\">Is thrown if the mesh is not a valid closed mesh.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ToSurfaceMesh\">\n            <summary>\n            Convert to a surface mesh.\n            </summary>\n            <returns>The surface mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.Polyhedron3\">\n            <summary>\n            The abstract polyhedra definition.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.Polyhedron3.m_isValid\">\n            <summary>\n            Cached values found by running Update.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The mesh kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The mesh kernel.</param>\n            <param name=\"ptr\">The meshs pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.Kernel\">\n            <summary>\n            The mesh kernel.\n            Contains the functions to the unmanaged CGAL polhedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.VertexCount\">\n            <summary>\n            Number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.FaceCount\">\n            <summary>\n            Number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.HalfedgeCount\">\n            <summary>\n            Number of half edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BorderEdgeCount\">\n            <summary>\n            Number of border edges.\n            Since each border edge of a polyhedral surface has exactly one \n            border halfedge, this number is equal to size of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BorderHalfEdgeCount\">\n            <summary>\n            Number of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValid\">\n            <summary>\n            Returns true if the polyhedral surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidTriangleMesh\">\n            <summary>\n            Is the mesh a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidClosedMesh\">\n            <summary>\n            Is the mesh a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidClosedTriangleMesh\">\n            <summary>\n            Is the mesh a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsUpdated\">\n            <summary>\n            Has the update function been called.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetIsUpdatedToFalse\">\n            <summary>\n            Mark th mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClearIndexMaps(System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex index map.</param>\n            <param name=\"faces\">True to clear the face index map.</param>\n            <param name=\"edges\">True to clear the edges index map.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BuildIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Builds the vertex and/or face index maps if needed.\n            </summary>\n            <param name=\"vertices\">True to build the vertex index map.</param>\n            <param name=\"faces\">True to build the face index map.</param>\n            <param name=\"edges\">True to build the face index map.</param>\n            <param name=\"force\">True to force the build even if already built.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeTetrahedron(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            A tetrahedron is added to the polyhedral surface\n            with its vertices initialized to p1, p2, p3, and p4.\n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"p3\"></param>\n            <param name=\"p4\"></param>\n            <returns>A edge in the tetrahdron.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeTriangle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            A triangle with border edges is added to the \n            polyhedral surface with its vertices initialized to p1, p2, and p3.\n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"p3\"></param>\n            <returns>A edge in the triangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The point array length.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetDualPolygonalIndices\">\n            <summary>\n            Get the dual meshes triangles, quads, pentagons and hexagons.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The indices</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\">The points index.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polygon.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polygons last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointClamp(System.Int32)\">\n            <summary>\n            Get the vertices point but wraps the index.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegment(System.Int32)\">\n            <summary>\n            Get the segment.\n            </summary>\n            <param name=\"index\">The segment index.</param>\n            <returns>The segment</returns>\n            <exception cref=\"T:System.ArgumentException\">If segmentwith the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangle(System.Int32)\">\n            <summary>\n            Get the triangle.\n            </summary>\n            <param name=\"index\">The triangle index.</param>\n            <returns>The triangle</returns>\n            <exception cref=\"T:System.ArgumentException\">If triangle with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertex(System.Int32)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertexs index.</param>\n            <returns>The vertexs</returns>\n            <exception cref=\"T:System.ArgumentException\">If vertex with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFace(System.Int32)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The faces</returns>\n            <exception cref=\"T:System.ArgumentException\">If face with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedge(System.Int32)\">\n            <summary>\n            Get the mesh Halfedge.\n            </summary>\n            <param name=\"index\">The Halfedges index.</param>\n            <returns>The Halfedges</returns>\n            <exception cref=\"T:System.ArgumentException\">If Halfedge with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ComputeVertexNormals\">\n            <summary>\n            Computes the vertex normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ComputeFaceNormals\">\n            <summary>\n            Computes the face normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.NormalizeBorder\">\n            <summary>\n            sorts halfedges such that the non-border edges precede the border edges.\n            For each border edge the halfedge iterator will reference the halfedge \n            incident to the facet right before the halfedge incident to the hole.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.NormalizedBorderIsValid\">\n            <summary>\n            returns true if the border halfedges are in normalized representation, \n            which is when enumerating all halfedges with the iterator: \n            The non-border edges precede the border edges and for border edges,\n            the second halfedge is the border halfedge.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.DoesSelfIntersect\">\n            <summary>\n            Tests if a set of faces of a triangulated surface mesh self-intersects.\n            Must be a triangle mesh.\n            </summary>\n            <returns>True/Fasle if a valid triangle polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfValid(System.Int32)\">\n            <summary>\n            returns true if the polyhedral surface is combinatorially consistent.\n            For level == 1 the normalization of the border edges is checked too.\n            This method checks that each face is at least a triangle and that the\n            two incident facets of a non-border edge are distinct.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindBoundingBox\">\n            <summary>\n            Computes the bounding box.\n            </summary>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindArea\">\n            <summary>\n            Computes the area of a range of faces\n            of a given triangulated surface mesh.\n            </summary>\n            <returns>The area or 0 if poyhedron is not valid triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindCentroid\">\n            <summary>\n            computes the centroid of a volume bounded \n            by a closed triangulated surface mesh.\n            </summary>\n            <returns>The centroid or 0 if poyhedron is not valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindVolume\">\n            <summary>\n            Computes the volume of the domain bounded by a \n            closed triangulated surface mesh.\n            </summary>\n            <returns>The volume or 0 if poyhedron is not valid closed triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfBivalent\">\n            <summary>\n            Returns true if all vertices have exactly two incident edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfTrivalent\">\n            <summary>\n            Returns true if all vertices have exactly three incident edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfTriangleMesh\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfQuadMesh\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfDoesBoundAVolume\">\n            <summary>\n            Indicates if the mesh bounds a volume.\n            Must be a closed and triangulated.\n            </summary>\n            <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BuildAABBTree\">\n            <summary>\n            Builds the aabb tree used for location.\n            Tree will be automatically built if need so not \n            actually necessary to call this function.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReleaseAABBTree\">\n            <summary>\n            Will delete the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.DoIntersect(CGALDotNet.Polyhedra.Polyhedron3,System.Boolean)\">\n            <summary>\n            Returns true if there exists a face of this poly and \n            a face of other poly which intersect, and false otherwise.\n            Must be a triangle mesh\n            </summary>\n            <param name=\"poly\">The other triangle poly.</param>\n            <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n            the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n            <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReadOFF(System.String)\">\n            <summary>\n            Read data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.WriteOFF(System.String)\">\n            <summary>\n            Write data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ToArray\">\n            <summary>\n            Return all the points in the mesh in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ToList\">\n            <summary>\n            Return all the points in the mesh in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.AddFacetToBorder(System.Int32,System.Int32)\">\n             <summary>\n             https://doc.cgal.org/latest/Polyhedron/classCGAL_1_1Polyhedron__3.html#a73119c0c90bf8612da003305af25a52a\n             creates a new facet within the hole incident to h and g by connecting the \n             vertex denoted by g with the vertex denoted by h with a new halfedge and \n             filling this separated part of the hole with a new facet, such that the \n             new facet is incident to g.\n            \n             Precondition\n             h->is_border(), g->is_border(), h != g, h->next() != g, \n             and g can be reached along the same hole starting with h.\n             </summary>\n             <param name=\"h\">a halfedge index</param>\n             <param name=\"g\">a halfedge index</param>\n             <returns> Returns the halfedge of the new edge that is incident to the new facet.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.AddVertexAndFacetToBorder(System.Int32,System.Int32)\">\n             <summary>\n             creates a new facet within the hole incident to h and g by connecting the \n             tip of g with the tip of h with two new halfedges and a new vertex and \n             filling this separated part of the hole with a new facet, such that the \n             new facet is incident to g.\n            \n             Precondition\n             h->is_border(), g->is_border(), h != g, and g can be reached along the same hole starting with h.\n             </summary>\n             <param name=\"h\">a halfedge index</param>\n             <param name=\"g\">a halfedge index</param>\n             <returns>Returns the halfedge of the new edge that is incident to the new facet and the new vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateCenterVertex(System.Int32)\">\n            <summary>\n            barycentric triangulation of h->facet().\n            Creates a new vertex, a copy of h->vertex(), and connects it to each vertex incident \n            to h->facet() splitting h->facet() into triangles.h remains incident to the original \n            facet, all other triangles are copies of this facet.\n            Precondition\n            h is not a border halfedge.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the halfedge h->next() \n            after the operation, i.e., a halfedge pointing to the new vertex.The time is \n            proportional to the size of the facet.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseCenterVertex(System.Int32)\">\n            <summary>\n            reverses create_center_vertex().\n            Erases the vertex pointed to by g and all incident halfedges thereby merging all \n            incident facets.Only g->facet() remains. The neighborhood of g->vertex() may not \n            be triangulated, it can have larger facets.\n            Precondition\n            None of the incident facets of g->vertex() is a hole. There are at least two distinct facets incident to the facets that are incident to g->vertex(). (This prevents the operation from collapsing a volume into two facets glued together with opposite orientations, such as would happen with any vertex of a tetrahedron.)\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the halfedge g->prev(). \n            Thus, the invariant h == erase_center_vertex(create_center_vertex(h)) \n            holds if h is not a border halfedge.The time is proportional to the sum of the size of all incident facets.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseConnectedComponent(System.Int32)\">\n            <summary>\n            removes the incident facet of h and changes all halfedges incident to the facet \n            into border edges or removes them from the polyhedral surface if they were already border edges.\n            If this creates isolated vertices they get removed as well.See make_hole(h) for a more specialized variant.\n            Precondition\n            h->is_border() == false.\n            Supports_removal must be CGAL::Tag_true\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseFacet(System.Int32)\">\n            <summary>\n            Erase a facet.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>returns a range of handles over the facets.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FillHole(System.Int32)\">\n            <summary>\n            fills a hole with a newly created facet.\n            Makes all border halfedges of the hole denoted \n            by h incident to the new facet.Returns h.\n            Precondition\n            h.is_border().\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FlipEdge(System.Int32)\">\n            <summary>\n            performs an edge flip.\n            \n            Precondition\n            h != Halfedge_handle() and both facets incident to h are triangles.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>It returns h after rotating the edge h one vertex in the direction of the face orientation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinFacet(System.Int32)\">\n            <summary>\n            joins the two facets incident to h.\n            The facet incident to h->opposite() gets removed.Both facets might be holes. \n            \n            Precondition\n            The degree of both vertices incident to h is at least three(no antennas).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the predecessor of h around the facet. The invariant join_facet(split_facet(h, g)) \n            returns h and keeps the polyhedron unchanged.The time is proportional to the size of \n            the facet removed and the time to compute h->prev().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinLoop(System.Int32,System.Int32)\">\n            <summary>\n            glues the boundary of the two facets denoted by h and g together and returns h.\n            Both facets and the vertices along the facet denoted by g gets removed.Both facets may be holes.\n            The invariant join_loop(h, split_loop(h, i, j)) \n            Precondition\n            The facets denoted by h and g are different and have equal degree(i.e., number of edges).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>returns h and keeps the polyhedron unchanged.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinVertex(System.Int32)\">\n            <summary>\n            joins the two vertices incident to h.\n            The vertex denoted by h->opposite() gets removed.\n            Precondition\n            The size of both facets incident to h is at least four(no multi-edges).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the predecessor of h around the vertex, i.e.,\n            h->opposite()->prev(). The invariant join_vertex(split_vertex(h, g)) \n            returns h and keeps the polyhedron unchanged.The time is proportional \n            to the degree of the vertex removed and the time to compute h->prev() and h->opposite()->prev().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeHole(System.Int32)\">\n            <summary>\n            removes the incident facet of h and changes all halfedges incident to the facet into border edges.\n            \n            Precondition\n            None of the incident halfedges of the facet is a border edge.\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns h.See erase_facet(h) for a more generalized variant.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitEdge(System.Int32)\">\n            <summary>\n            splits the halfedge h into two halfedges inserting a new vertex that is a copy of h->opposite()->vertex().\n            Is equivalent to split_vertex(h->prev(), h->opposite())->opposite(). The call of prev() can make this method \n            slower than a direct call of split_vertex() if the previous halfedge is already known and computing \n            it would be costly when the halfedge data structure does not support the prev() member function.\n            \n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the new halfedge now pointing to the inserted vertex.The new halfedge is followed \n            by the old halfedge, i.e., hnew->next() == h.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitFacet(System.Int32,System.Int32)\">\n            <summary>\n            splits the facet incident to h and g into two facets with a new diagonal between \n            the two vertices denoted by h and g respectively.\n            The second(new) facet is a copy of the first facet.\n            Precondition\n            h and g are incident to the same facet.h != g (no loops). h->next() != g and g->next() != h (no multi-edges).\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>Returns h->next() after the\n            operation, i.e., the new diagonal.The new face is to the right of the new diagonal,\n            the old face is to the left.The time is proportional to the distance from h to g around the facet.</returns>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitLoop(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            cuts the polyhedron into two parts along the cycle (h,i,j) (edge j runs on the backside of the three dimensional figure above).\n            Three new vertices(one copy for each vertex in the cycle) and three new halfedges(one copy for each halfedge in the cycle), \n            and two new triangles are created.h,i,j will be incident to the first new triangle.\n            Precondition\n            h, i, j denote distinct, consecutive vertices of the polyhedron and form a cycle: i.e., h->vertex() == i->opposite()->vertex(),\n            … , j->vertex() == h->opposite()->vertex(). The six facets incident to(h, i, j) are all distinct.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <param name=\"k\">a halfedge index</param>\n            <returns>The return value will be the halfedge \n            incident to the second new triangle which is the copy of h-opposite().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitVertex(System.Int32,System.Int32)\">\n            <summary>\n            splits the vertex incident to h and g into two vertices, the old vertex remains and a\n            new copy is created, and connects them with a new edge.\n            Let hnew be h->next()->opposite() after the split, i.e., a halfedge of the new edge.\n            The split regroups the halfedges around the two vertices.The halfedge sequence hnew,\n            g->next()->opposite(), … , h remains around the old vertex, while the halfedge \n            sequence hnew->opposite(), h->next()->opposite() (before the split), … , g is \n            regrouped around the new vertex.\n            Precondition\n            h and g are incident to the same vertex. h != g (antennas are not allowed).\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>The split returns hnew, i.e., the new halfedge \n            incident to the old vertex.The time is proportional to the distance from h to \n            g around the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Update\">\n            <summary>\n            Update the mesh if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintVertices(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintFaces(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintHalfedges(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.SurfaceMesh3`1\">\n            <summary>\n            This class is a data structure that can be used as halfedge data structure.\n            It is an alternative to the classes Polyhedron3.The main difference is that it is indexed based and not pointer based, \n            and that the mechanism for adding information to vertices, halfedges, edges, and faces is much simpler.\n            When elements are removed, they are only marked as removed, and a garbage collection function must be called to really remove them.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[])\">\n            <summary>\n            Construct from points and triangle indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Construct from points and polygon indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The surface meshes pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ToString\">\n            <summary>\n            The mesh as a string.\n            </summary>\n            <returns>The mesh as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Copy\">\n            <summary>\n            Create a deep copy of the mesh.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"oriente\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Split(System.Collections.Generic.List{CGALDotNet.Polyhedra.SurfaceMesh3{`0}})\">\n            <summary>\n            Split the mesh into its unconnected components.\n            </summary>\n            <param name=\"results\">Each unconnect component as a new mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Join(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Copy the other mesh to this one.\n            </summary>\n            <param name=\"other\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.CreatePolygonMesh(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"polygon\">The faces polygon.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ToPolyhedronMesh\">\n            <summary>\n            Convert to a polyhedron mesh.\n            </summary>\n            <returns>The polyhedron mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.SurfaceMesh3\">\n            <summary>\n            The surface mesh abstract base class.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.SurfaceMesh3.m_isValid\">\n            <summary>\n            Cached values found by running Update.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct mesh with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The surface meshes kernel.</param>\n            <param name=\"ptr\">The surface meshes pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.Kernel\">\n            <summary>\n            The meshes kernel type.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.VertexCount\">\n            <summary>\n            The number of vertices in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.HalfedgeCount\">\n            <summary>\n            The number of half edges in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.EdgeCount\">\n            <summary>\n            The number of edges in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.FaceCount\">\n            <summary>\n            The number of faces in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.BorderEdgeCount\">\n            <summary>\n            The number of border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedVertexCount\">\n            <summary>\n            The number of vertices currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of vertices marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedHalfedgeCount\">\n            <summary>\n            The number of halfedges currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of half edges marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedEdgeCount\">\n            <summary>\n            The number of edges currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of edges marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedFaceCount\">\n            <summary>\n            The number of faces currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of face marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValid\">\n            <summary>\n            Returns true if the meshl surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidTriangleMesh\">\n            <summary>\n            Is the mesh a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidClosedMesh\">\n            <summary>\n            Is the mesh a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidClosedTriangleMesh\">\n            <summary>\n            Is the mesh a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsUpdated\">\n            <summary>\n            Has the update function been called.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetIsUpdatedToFalse\">\n            <summary>\n            Mark the mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearIndexMaps(System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex index map.</param>\n            <param name=\"faces\">True to clear the face index map.</param>\n            <param name=\"edges\">True to clear the edges index map.</param>\n            <param name=\"halfedges\">True to clear the halfedges index map.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearProperyMaps\">\n            <summary>\n            Clear the property maps.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BuildIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Build the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it but can be create ahead of time.\n            </summary>\n            <param name=\"vertices\">True to build the vertex index maps.</param>\n            <param name=\"faces\">True to build the face index maps.</param>\n            <param name=\"edges\">True to build the edge index maps.</param>\n            <param name=\"halfedges\">True to build the halfedge index maps.</param>\n            <param name=\"force\">The index maps wont be build if the mesh knows they are already built and upto date.\n            Setting force to true will build them always.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PrintIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"vertices\"></param>\n            <param name=\"faces\"></param>\n            <param name=\"edges\"></param>\n            <param name=\"halfedges\"></param>\n            <param name=\"force\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddVertex(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Adds a vertex to the mesh.\n            </summary>\n            <param name=\"point\">The vertices position</param>\n            <returns>The vertices index in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddEdge(System.Int32,System.Int32)\">\n            <summary>\n            Adds a edge between the two vertices.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <returns>The index of the edge in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddTriangle(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a triangle face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddQuad(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a quad face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddPentagon(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a pentagon face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <param name=\"v4\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddHexagon(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a hexagon face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <param name=\"v4\">The index of the vertex in the mesh.</param>\n            <param name=\"v5\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddPolygon(System.Int32[],System.Int32)\">\n            <summary>\n            Add a polygon face to the mesh.\n            </summary>\n            <param name=\"indices\">The indices of the points in the mesm.</param>\n            <param name=\"count\">The indices array length.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.HasGarbage\">\n            <summary>\n            Checks if any vertices, halfedges, edges, or faces are marked as removed.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CollectGarbage\">\n            <summary>\n            Really removes vertices, halfedges, edges, and faces which are marked removed.\n            By garbage collecting elements get new indices. In case you store indices in an \n            auxiliary data structure or in a property these indices are potentially no \n            longer refering to the right elements.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.DoesRecycleGarbage\">\n            <summary>\n            Controls the recycling or not of simplices previously marked as removed \n            upon addition of new elements.\n            When set to true (default value), new elements are first picked in the \n            garbage(if any) while if set to false only new elements are created.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertex(System.Int32)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <returns>The vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFace(System.Int32)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedge(System.Int32)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <returns>THe healfedge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexDegree(System.Int32)\">\n            <summary>\n            Returns the number of incident halfedges of vertex.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>Returns the number of incident halfedges of vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FaceDegree(System.Int32)\">\n            <summary>\n            Returns the number of incident halfedges of face.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>Returns the number of incident halfedges of face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexIsIsolated(System.Int32)\">\n            <summary>\n            Returns whether vertex is isolated.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>Returns whether vertex is isolated.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexIsBorder(System.Int32,System.Boolean)\">\n            <summary>\n            Returns whether vertex is a border vertex.\n            If the data contained in the Surface_mesh is not\n            a 2-manifold, then this operation is not \n            guaranteed to return the right result.\n            </summary>\n            <param name=\"vertex\">he index of the vertex in the mesh.</param>\n            <param name=\"check_all_incident_halfedges\">With the default value for \n            check_all_incident_halfedges the function iteratates over the incident \n            halfedges. With check_all_incident_halfedges == false the function \n            returns true, if the incident halfedge associated to vertex is a\n            border halfedge, or if the vertex is isolated.</param>\n            <returns>Returns whether vertex is a border vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.EdgeIsBorder(System.Int32)\">\n            <summary>\n            Returns whether edge is a border edge, i.e., if any of its two halfedges is a border halfedge.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>Returns whether edge is a border edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.NextHalfedge(System.Int32)\">\n            <summary>\n            Returns the next halfedge within the incident face.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the next halfedge within the incident face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PreviousHalfedge(System.Int32)\">\n            <summary>\n            Returns the previous halfedge within the incident face.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the previous halfedge within the incident face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.OppositeHalfedge(System.Int32)\">\n            <summary>\n            Returns the opposite halfedge of halfedge.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the opposite halfedge of halfedge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SourceVertex(System.Int32)\">\n            <summary>\n            Returns the vertex the halfedge emanates from.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the vertex the halfedge emanates from.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.TargetVertex(System.Int32)\">\n            <summary>\n            Returns the vertex the halfedge points to.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the vertex the halfedge points to.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveVertex(System.Int32)\">\n            <summary>\n            Removes vertex from the halfedge data structure without adjusting anything.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveEdge(System.Int32)\">\n            <summary>\n            Removes the two halfedges corresponding to edge from the halfedge\n            data structure without adjusting anything.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveFace(System.Int32)\">\n            <summary>\n            Removes face from the halfedge data structure without adjusting anything.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexRemoved(System.Int32)\">\n            <summary>\n            Has this vertex been marked to be removed.\n            </summary>\n            <param name=\"index\">The vertices index in the mesh.</param>\n            <returns>Has this vertex been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsFaceRemoved(System.Int32)\">\n            <summary>\n            Has this face been marked to be removed.\n            </summary>\n            <param name=\"index\">The faces index in the mesh.</param>\n            <returns>Has this face been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeRemoved(System.Int32)\">\n            <summary>\n            Has this halfedge been marked to be removed.\n            </summary>\n            <param name=\"index\">The halfedge index in the mesh.</param>\n            <returns>Has this halfedge been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeRemoved(System.Int32)\">\n            <summary>\n            Has this edge been marked to be removed.\n            </summary>\n            <param name=\"index\">The edges index in the mesh.</param>\n            <returns>Has this edge been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single vertex.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single edge.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single halfedge.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsFaceValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single face.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The paoint array length.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexBorder(System.Int32,System.Boolean)\">\n            <summary>\n            Whether v is a border vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"check_all_incident_halfedges\">With the default value for \n            check_all_incident_halfedges the function iteratates over the incident halfedges. \n            With check_all_incident_halfedges == false the function returns true, \n            if the incident halfedge associated to vertex v is a border halfedge, \n            or if the vertex is isolated.</param>\n            <returns>Whether v is a border vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeBorder(System.Int32)\">\n            <summary>\n            Whether half edge is a border halfege, that is if its incident face is null.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <returns>Whether half edge is a border halfege.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeBorder(System.Int32)\">\n            <summary>\n            Whether e is a border edge, i.e., if any of its two halfedges is a border halfedge.\n            </summary>\n            <param name=\"index\">The edges index.</param>\n            <returns>Whether e is a border edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BuildAABBTree\">\n            <summary>\n            Build the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReleaseAABBTree\">\n            <summary>\n            Release the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindBoundingBox\">\n            <summary>\n            Find the bounding box of the meshes points.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReadOFF(System.String)\">\n            <summary>\n            Read the mesh from a off file format.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.WriteOFF(System.String)\">\n            <summary>\n            Write the mesh to off file format.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.DoesSelfIntersect\">\n            <summary>\n            Tests if a set of faces of a triangulated surface mesh self-intersects.\n            Must be a triangle mesh.\n            </summary>\n            <returns>True/Fasle if a valid triangle mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfValid\">\n            <summary>\n            Perform an expensive validity check on the data structure.\n            </summary>\n            <returns>If the mesh is valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfTriangleMesh\">\n            <summary>\n            Find if all the faces in the mesh are triangles.\n            </summary>\n            <returns>True if all the faces in the mesh are triangles, Will be undetermined if no a valid mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfQuadMesh\">\n            <summary>\n            Find if all the faces in the mesh are quads.\n            </summary>\n            <returns>True if all the faces in the mesh are quads, Will be undetermined if no a valid mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfClosed\">\n            <summary>\n            Find if the mesh is closed, ie has no border edges.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindArea\">\n            <summary>\n            Computes the area of a range of faces\n            of a given triangulated surface mesh.\n            </summary>\n            <returns>The area or 0 if mesh is not valid triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindCentroid\">\n            <summary>\n            computes the centroid of a volume bounded \n            by a closed triangulated surface mesh.\n            </summary>\n            <returns>The centroid or 0 if mesh is not valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindVolume\">\n            <summary>\n            Computes the volume of the domain bounded by a \n            closed triangulated surface mesh.\n            </summary>\n            <returns>The volume or 0 if mesh is not valid closed triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfDoesBoundAVolume\">\n            <summary>\n            Indicates if the mesh bounds a volume.\n            Must be a closed and triangulated.\n            </summary>\n            <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.DoIntersect(CGALDotNet.Polyhedra.SurfaceMesh3,System.Boolean)\">\n            <summary>\n            Returns true if there exists a face of this poly and \n            a face of other mesh which intersect, and false otherwise.\n            Must be a triangle mesh\n            </summary>\n            <param name=\"mesh\">The other triangle poly.</param>\n            <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n            the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n            <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ComputeVertexNormals\">\n            <summary>\n            Compute the vertex normal map.\n            Will only be computed if mesh has\n            changed since last computation or \n            no current nomral maps have been computed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ComputeFaceNormals\">\n            <summary>\n            Compute the face normal map.\n            Will only be computed if mesh has\n            changed since last computation or \n            no current nomral maps have been computed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            Will be compute if they have not aready.\n            </summary>\n            <param name=\"normals\">The normal map array.</param>\n            <param name=\"count\">The normal maps array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            Will be compute if they have not aready.\n            </summary>\n            <param name=\"normals\">The normal map array.</param>\n            <param name=\"count\">The normal maps array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ToArray\">\n            <summary>\n            Return all the points in the mesh in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ToList\">\n            <summary>\n            Return all the points in the mesh in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Update\">\n            <summary>\n            Update the mesh if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PrintVertices\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline2`1\">\n            <summary>\n            Generic polyline definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polylines points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.ToString\">\n            <summary>\n            The polyline as a string.\n            </summary>\n            <returns>The polyline as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.Copy\">\n            <summary>\n            Copy the polyline.\n            </summary>\n            <returns>The copied polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.ToPoylgon(System.Double)\">\n            <summary>\n            Create a polygon from the line.\n            </summary>\n            <param name=\"threshold\">Threshold for the firat and last points being equal.</param>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline2\">\n            <summary>\n            The abstract polyline definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Count\">\n            <summary>\n            The number of points in the polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.First\">\n            <summary>\n            Get the first point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Last\">\n            <summary>\n            Get the last point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Kernel\">\n            <summary>\n            The polylines kernel.\n            Contains the functions to the unmanaged CGAL polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polyline.\n            Getting a point clamps to the last point in polyline.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Clear\">\n            <summary>\n            Clear the polyline of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Reverse\">\n            <summary>\n            Reverse the polints in the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.RemoveLast\">\n            <summary>\n            Remove the last point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"start\">The starting index.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Add(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the point to the end of the poylline.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.IsClosed(System.Double)\">\n            <summary>\n            Does the first and last point match.\n            </summary>\n            <param name=\"threshold\">The distance threshold that counts as match.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polyline.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polylines last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the polyline.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the polyline points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the polyline segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.SetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polyline then \n            the new points will be appended to end of polyline.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.FindLength\">\n            <summary>\n            Finds the length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.FindSquareLength\">\n            <summary>\n            Finds the square length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the polyline.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Scale(System.Double)\">\n            <summary>\n            Scale the polyline.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the polyline with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ToArray\">\n            <summary>\n            Return all the points in the polyline in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ToList\">\n            <summary>\n            Return all the points in the polyline in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Convert``1\">\n            <summary>\n            Convert the polyline to a new polyline with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polyline into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline3`1\">\n            <summary>\n            Generic polyline definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polylines points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.ToString\">\n            <summary>\n            The polyline as a string.\n            </summary>\n            <returns>The polyline as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.Copy\">\n            <summary>\n            Copy the polyline.\n            </summary>\n            <returns>The copied polyline.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline3\">\n            <summary>\n            The abstract polyline definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Count\">\n            <summary>\n            The number of points in the polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.First\">\n            <summary>\n            Get the first point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Last\">\n            <summary>\n            Get the last point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Kernel\">\n            <summary>\n            The polylines kernel.\n            Contains the functions to the unmanaged CGAL polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polyline.\n            Getting a point clamps to the last point in polyline.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Clear\">\n            <summary>\n            Clear the polyline of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Reverse\">\n            <summary>\n            Reverse the polints in the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.RemoveLast\">\n            <summary>\n            Remove the last point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Insert(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"start\">The starting index.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Add(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Add the point to the end of the poylline.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.IsClosed(System.Double)\">\n            <summary>\n            Does the first and last point match.\n            </summary>\n            <param name=\"threshold\">The distance threshold that counts as match.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polyline.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polylines last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get all the points in the polyline.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Get all the polyline points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get all the polyline segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polyline then \n            the new points will be appended to end of polyline.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.FindLength\">\n            <summary>\n            Finds the length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.FindSquareLength\">\n            <summary>\n            Finds the square length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the polyline.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the polyline.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ToArray\">\n            <summary>\n            Return all the points in the polyline in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ToList\">\n            <summary>\n            Return all the points in the polyline in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Convert``1\">\n            <summary>\n            Convert the polyline to a new polyline with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polyline into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.HeatMethod`1\">\n            <summary>\n            The heat method is an algorithm that solves the single- or multiple-source shortest \n            path problem by returning an approximation of the geodesic distance for all vertices\n            of a triangle mesh to the closest vertex in a given set of source vertices. \n            The geodesic distance between two vertices of a mesh is the distance when walking \n            on the surface, potentially through the interior of faces. Two vertices that are \n            close in 3D space may be far away on the surface.\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.HeatMethod`1.Instance\">\n            <summary>\n            Create a static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.#ctor\">\n            <summary>\n            Create a new instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new instance from a existing pointer to a unmanaged object.\n            </summary>\n            <param name=\"ptr\">The unmanaged objects pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.EstimateGeodesicDistances(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32,System.Collections.Generic.List{System.Double},System.Boolean)\">\n            <summary>\n            Find the distances for each vertex in the mesh to the vertex at the provided index.\n            </summary>\n            <param name=\"mesh\">The mesh containing the vertices.</param>\n            <param name=\"index\">The vertices index to find the distances to.</param>\n            <param name=\"distances\">The distances for each vertex in the mesh.</param>\n            <param name=\"useIDT\">Should the intrinsitic delaunay triangulation be used. \n            This will improve the results for meshes that have bad triangle quality.</param>\n            <returns>The maximum distance value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.EstimateGeodesicDistances(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Collections.Generic.List{System.Double})\">\n            <summary>\n            Find the distances for each vertex in the mesh to the vertex at the provided index.\n            </summary>\n            <param name=\"mesh\">The mesh containing the vertices.</param>\n            <param name=\"index\">The vertices index to find the distances to.</param>\n            <param name=\"distances\">The distances for each vertex in the mesh.\n            This will improve the results for meshes that have bad triangle quality.</param>\n            <returns>The maximum distance value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new instance.\n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new instance from a existing pointer to a unmanaged object.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\">The unmanaged objects pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.HeatMethod.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.GetDistances(System.Int32,System.Collections.Generic.List{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n            <param name=\"distances\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.GetDistance(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.ClearDistances\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingBoolean`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingBoolean`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Op(CGALDotNet.Processing.POLYHEDRA_BOOLEAN,CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"op\"></param>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Op(CGALDotNet.Processing.POLYHEDRA_BOOLEAN,CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"op\"></param>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Union(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Union(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Difference(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Difference(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Intersection(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Intersection(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingBoolean\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingBoolean.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingConnections`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingConnections`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.UnconnectedComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Returns the number of unconnect components in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>Returns the number of unconnect components in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ConnectedFaces(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Returns a list of face indices that are part of the same component as the provided face index.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faceIndex\">The faces index in the mesh.</param>\n            <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ConnectedFaces(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Returns a list of face indices that are part of the same component as the provided face index.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faceIndex\">The faces index in the mesh.</param>\n            <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.SplitUnconnectedComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Split each component in the mesh into individual meshes.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"results\">The split meshes.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.SplitUnconnectedComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Collections.Generic.List{CGALDotNet.Polyhedra.SurfaceMesh3{`0}})\">\n            <summary>\n            Split each component in the mesh into individual meshes.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"results\">The split meshes.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargeComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Removes connected components with less than a given number of faces.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargeComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Removes connected components with less than a given number of faces.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargestComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Removes the small connected components and all isolated vertices.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargestComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Removes the small connected components and all isolated vertices.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingConnections\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingConnections.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingFeatures`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingFeatures`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.DetectSharpEdges(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Detects the edges that are considered to be sharp with respect to the given angle bound.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.DetectSharpEdges(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Detects the edges that are considered to be sharp with respect to the given angle bound.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.EdgeLengthMinMaxAvg(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.EdgeLengthMinMaxAvg(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.FaceAreaMinMaxAvg(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the min, max and average face areas in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.FaceAreaMinMaxAvg(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the min, max and average face areas in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.SharpEdgesSegmentation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32},System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            Detects the sharp edges of mesh according to angle as the DetectSharpEdges function does. \n            The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n            a surface patch id for each face.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n            <param name=\"featurePatches\">The face indices for each patch found.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.SharpEdgesSegmentation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            Detects the sharp edges of pmesh according to angle as the DetectSharpEdges function does. \n            The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n            a surface patch id for each face.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featurePatches\">The face indices for each patch found.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingFeatures\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingFeatures.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.GetFeatureEdges(CGALDotNet.MESH_TYPE,System.IntPtr,System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"meshPtr\"></param>\n            <param name=\"num_edges\"></param>\n            <param name=\"featureEdges\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.GetFeaturePatches(CGALDotNet.MESH_TYPE,System.IntPtr,System.Int32,System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"meshPtr\"></param>\n            <param name=\"num_patches\"></param>\n            <param name=\"featurePatches\"></param>\n            <exception cref=\"T:System.NotImplementedException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingLocate`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingLocate`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.RandomLocationOnMesh(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find a random point on mesh surface.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>A random point on mesh surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.RandomLocationOnMesh(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find a random point on mesh surface.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>A random point on mesh surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.LocateFace(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Find the face the ray intersects with.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"ray\">Th ray.</param>\n            <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.LocateFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Find the face the ray intersects with.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"ray\">Th ray.</param>\n            <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ClosestFace(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest face to the point.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"point\">Th point.</param>\n            <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ClosestFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest face to the point.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"point\">Th point.</param>\n            <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingLocate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingLocate.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingMeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingMeshing`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Extrude(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n            The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n            </summary>\n            <param name=\"mesh\">The a valid closed mesh.</param>\n            <param name=\"dir\">The direction vector.</param>\n            <returns>The extuded mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Extrude(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n            The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n            </summary>\n            <param name=\"mesh\">The a valid closed mesh.</param>\n            <param name=\"dir\">The direction vector.</param>\n            <returns>The extuded mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Fair(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Int32)\">\n            <summary>\n            Fairs a region on a triangle mesh based on a ring of k vertices from the index vertex.\n            The points of the selected vertices are relocated to yield an as-smooth-as-possible surface patch,\n            based on solving a linear bi-Laplacian system with boundary constraints\n            The region described by vertices might contain multiple disconnected components.\n            Note that the mesh connectivity is not altered in any way, only vertex locations get updated.\n            Fairing might fail if fixed vertices, which are used as boundary conditions, \n            do not suffice to solve constructed linear system.\n            Note that if the vertex range to which fairing is applied contains all the vertices of the triangle mesh, \n            fairing does not fail, but the mesh gets shrinked to the origin.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"index\">The vertex index in the mesh to start hthe k ring region from.</param>\n            <param name=\"k_ring\">The number of vertics to expand the region to.</param>\n            <returns>If the fairing was successfully run.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Refine(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Refine(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.IsotropicRemeshing(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double,System.Int32)\">\n            <summary>\n            Remeshes a triangulated region of a meshgon mesh.\n            This operation sequentially performs edge splits, edge collapses, edge flips, \n            tangential relaxation and projection to the initial surface to generate \n            a smooth mesh with a prescribed edge length.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of times to perform the remeshing.</param>\n            <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n            If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.IsotropicRemeshing(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double,System.Int32)\">\n            <summary>\n            Remeshes a triangulated region of a meshgon mesh.\n            This operation sequentially performs edge splits, edge collapses, edge flips, \n            tangential relaxation and projection to the initial surface to generate \n            a smooth mesh with a prescribed edge length.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of times to perform the remeshing.</param>\n            <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n            If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.RandomPerturbation(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            randomly perturbs the locations of vertices of a triangulated surface mesh.\n            By default, the vertices are re-projected onto the input surface after \n            perturbation.Note that no geometric checks are done after the perturbation \n            (face orientation might become incorrect and self-intersections might be introduced).\n            </summary>\n            <param name=\"mesh\">A mesh.</param>\n            <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.RandomPerturbation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            randomly perturbs the locations of vertices of a triangulated surface mesh.\n            By default, the vertices are re-projected onto the input surface after \n            perturbation.Note that no geometric checks are done after the perturbation \n            (face orientation might become incorrect and self-intersections might be introduced).\n            </summary>\n            <param name=\"mesh\">A mesh.</param>\n            <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SmoothMeshByAngle(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Int32)\">\n            <summary>\n            Smooths a triangulated mesh.\n            This function attempts to make the triangle angle and area distributions as uniform \n            as possible by moving(non-constrained) vertices.\n            Angle-based smoothing does not change the combinatorial information of the mesh.\n            Area-based smoothing might change the combinatorial information, unless specified otherwise.\n            It is also possible to make the smoothing algorithm \"safer\" by rejecting moves that, \n            when applied, would worsen the quality of the mesh, e.g.that would decrease the value\n            of the smallest angle around a vertex or create self-intersections.\n            Optionally, the points are reprojected after each iteration.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"featureAngle\">The edge angle that counts a feature and wont be smoothed.</param>\n            <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SplitLongEdges(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n            Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n            of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n            <returns>The number of new edges added to the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SplitLongEdges(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n            Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n            of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n            <returns>The number of new edges added to the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFace(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Triangulate a single face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"face\">The faces index in the mesh.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Triangulate a single face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"face\">The faces index in the mesh.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFaces(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32[],System.Int32)\">\n            <summary>\n            Triangulate a range of faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faces\">The faces to triangulate.</param>\n            <param name=\"count\">The length of the face array.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFaces(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32[],System.Int32)\">\n            <summary>\n            Triangulate a range of faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faces\">The faces to triangulate.</param>\n            <param name=\"count\">The length of the face array.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingMeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingMeshing.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingOrientation`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingOrientation`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.DoesBoundAVolume(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Indicates if mesh bounds a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.DoesBoundAVolume(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Indicates if mesh bounds a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.IsOutwardOriented(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Tests whether a closed triangle mesh has a positive orientation.\n            A closed triangle mesh is considered to have a positive orientation\n            if the normal vectors to all its faces point outside the domain bounded \n            by the triangle mesh.The normal vector to each face is chosen pointing\n            on the side of the face where its sequence of vertices is seen counterclockwise.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.IsOutwardOriented(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Tests whether a closed triangle mesh has a positive orientation.\n            A closed triangle mesh is considered to have a positive orientation\n            if the normal vectors to all its faces point outside the domain bounded \n            by the triangle mesh.The normal vector to each face is chosen pointing\n            on the side of the face where its sequence of vertices is seen counterclockwise.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Processing.ORIENTATE,CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n            <param name=\"mesh\">A valid closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Processing.ORIENTATE,CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n            <param name=\"mesh\">A valid closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.OrientToBoundAVolume(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Orients the connected components of tm to make it bound a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.OrientToBoundAVolume(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Orients the connected components of tm to make it bound a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ReverseFaceOrientations(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Reverses for each face the order of the vertices along the face boundary.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ReverseFaceOrientations(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Reverses for each face the order of the vertices along the face boundary.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingOrientation\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingOrientation.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingRepair`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingRepair`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateEdgeCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the number of degenerate edges in the mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of degenerate edges in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateTriangleCount(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the number of degenerate faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The number of degenerate faces in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateTriangleCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the number of degenerate faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The number of degenerate faces in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NeedleTriangleCount(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            Checks whether a triangle face is needle.\n            A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n            <returns>The number of needle triangles.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NeedleTriangleCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            Checks whether a triangle face is needle.\n            A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n            <returns>The number of needle triangles.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NonManifoldVertexCount(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Collects the non-manifold vertices (if any) present in the mesh.\n            A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n            for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n            the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The non manifold vertex count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NonManifoldVertexCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Collects the non-manifold vertices (if any) present in the mesh.\n            A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n            for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n            the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The non manifold vertex count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RepairPolygonSoup(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n             <summary>\n             Cleans a given polygon soup through various repairing operations.\n            \n             More precisely, this function carries out the following tasks, in the same order as they are listed:\n            \n             merging of duplicate points.\n             simplification of polygons to remove geometrically identical consecutive vertices;\n             splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n             The splitting process results in multiple non-pinched polygons;\n             removal of invalid polygons, that is polygons with fewer than 2 vertices;\n             removal of duplicate polygons.\n             removal of isolated points.\n             </summary>\n             <param name=\"mesh\">The polygon mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RepairPolygonSoup(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n             <summary>\n             Cleans a given polygon soup through various repairing operations.\n            \n             More precisely, this function carries out the following tasks, in the same order as they are listed:\n            \n             merging of duplicate points.\n             simplification of polygons to remove geometrically identical consecutive vertices;\n             splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n             The splitting process results in multiple non-pinched polygons;\n             removal of invalid polygons, that is polygons with fewer than 2 vertices;\n             removal of duplicate polygons.\n             removal of isolated points.\n             </summary>\n             <param name=\"mesh\">The polygon mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBoundaryCycles(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n            Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n            target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched boundaries.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBoundaryCycles(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n            Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n            target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched boundaries.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBorders(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Stitches together border halfedges in a polygon mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched borders.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBorders(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Stitches together border halfedges in a polygon mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched borders.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RemoveIsolatedVertices(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Removes the isolated vertices from any polygon mesh.\n            A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of vertices that were removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RemoveIsolatedVertices(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Removes the isolated vertices from any polygon mesh.\n            A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of vertices that were removed.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingRepair\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingRepair.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingSlicer`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingSlicer`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Shapes.Plane3d,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the line formed from the intersection of the plane and the mesh.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"results\">The polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Shapes.Plane3d,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the line formed from the intersection of the plane and the mesh.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"results\">The polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the lines formed by slicing the mesh from the start\n            point to the end point creating a plane at each increment.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"start\">The point to start from.</param>\n            <param name=\"end\">The point to end at.</param>\n            <param name=\"increment\">Amount to increment each plane.</param>\n            <param name=\"results\">he polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the lines formed by slicing the mesh from the start\n            point to the end point creating a plane at each increment.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"start\">The point to start from.</param>\n            <param name=\"end\">The point to end at.</param>\n            <param name=\"increment\">Amount to increment each plane.</param>\n            <param name=\"results\">he polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.GetLines(System.Int32,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n            <param name=\"results\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingSlicer\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingSlicer.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SurfaceSimplification`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.SurfaceSimplification`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SurfaceSimplification\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.SurfaceSimplification.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.Simplify(CGALDotNet.Polyhedra.Polyhedron3,System.Double)\">\n            <summary>\n            Simplify the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.Simplify(CGALDotNet.Polyhedra.SurfaceMesh3,System.Double)\">\n            <summary>\n            Simplify the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SUBDIVISION_METHOD\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SubdivisionSurface`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.SubdivisionSurface`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide(CGALDotNet.Processing.SUBDIVISION_METHOD,CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"method\"></param>\n            <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide(CGALDotNet.Processing.SUBDIVISION_METHOD,CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"method\"></param>\n            <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_CatmullClark(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_CatmullClark(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Loop(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Loop(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_DoSabin(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Sqrt3(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Sqrt3(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SubdivisionSurface\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.SubdivisionSurface.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.BaseTriangulation2\">\n            <summary>\n            Base triangulation class for Triangulation, DelaunayTriangulation,\n            ConstrainedTriangulation and ConstrainedDelaunayTriangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.Kernel\">\n            <summary>\n            The triangulations kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.VertexCount\">\n            <summary>\n            The number of verices in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.TriangleCount\">\n            <summary>\n            The number of triangles in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.IndiceCount\">\n            <summary>\n            The number of indices need to represent the\n            triangulation (number of triangles * 3).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.BuildStamp\">\n            <summary>\n            A number that will change if the unmanaged \n            triangulation model changes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.IsValid(System.Int32)\">\n            <summary>\n            Is this a valid triangulation.\n            </summary>\n            <param name=\"level\"></param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.ForceSetIndices\">\n            <summary>\n            Force the face and vertex indices to be set.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d)\">\n             <summary>\n             Inserts point p in the triangulation.\n            If point coincides with an already existing vertex the triangulation remains unchanged.\n            If point is on an edge, the two incident faces are split in two.\n            If point is strictly inside a face of the triangulation, the face is split in three.\n            If point is strictly outside the convex hull, p is linked to all visible points on the \n            convex hull to form the new triangulation.\n             </summary>\n             <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n             <summary>\n             Inserts points into the triangulation.\n            If point coincides with an already existing vertex the triangulation remains unchanged.\n            If point is on an edge, the two incident faces are split in two.\n            If point is strictly inside a face of the triangulation, the face is split in three.\n            If point is strictly outside the convex hull, p is linked to all visible points on the \n            convex hull to form the new triangulation.\n             </summary>\n             <param name=\"points\">The points to insert.</param>\n             <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a array of all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get a array of the triangle indices.\n            </summary>\n            <param name=\"indices\"></param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d@)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <param name=\"point\">The vertices point.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertex(System.Int32,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Get a vertex.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertex(System.Int32)\">\n            <summary>\n            Get the vertex.\n            </summary>\n            <param name=\"index\">The vertexs index.</param>\n            <returns>The vertexs</returns>\n            <exception cref=\"T:System.ArgumentException\">If vertex with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertices(CGALDotNet.Triangulations.TriVertex2[],System.Int32)\">\n            <summary>\n            Get a array of all the vertices.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFace(System.Int32,CGALDotNet.Triangulations.TriFace2@)\">\n            <summary>\n            Get a triangule face.\n            </summary>\n            <param name=\"index\">The faces index</param>\n            <param name=\"face\">The face</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFace(System.Int32)\">\n            <summary>\n            Get the face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The Faces</returns>\n            <exception cref=\"T:System.ArgumentException\">If face with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFaces(CGALDotNet.Triangulations.TriFace2[],System.Int32)\">\n            <summary>\n            Get a array of all the triangle faces.\n            </summary>\n            <param name=\"faces\">A array of faces.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetSegment(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Segment2d@)\">\n            <summary>\n            Get the segment between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetSegment(System.Int32,System.Int32)\">\n            <summary>\n            Get the segment between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>The segment</returns>\n            <exception cref=\"T:System.ArgumentException\">If segment with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle2d@)\">\n            <summary>\n            Get a faces triangle.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"triangle\">The triangle</param>\n            <returns>True if the face was found</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangle(System.Int32)\">\n            <summary>\n            Get the triangle.\n            </summary>\n            <param name=\"index\">The triangles index.</param>\n            <returns>The triangle</returns>\n            <exception cref=\"T:System.ArgumentException\">If triangle with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangles(CGALDotNetGeometry.Shapes.Triangle2d[],System.Int32)\">\n            <summary>\n            Get a array of all the triangles.\n            </summary>\n            <param name=\"triangles\">A array of triangules.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenter(System.Int32,CGALDotNetGeometry.Numerics.Point2d@)\">\n            <summary>\n            Get a faces circumcenter.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"circumcenter\">The circumcenter. A circle\n            that passes through all three of the triangules vertices.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenter(System.Int32)\">\n            <summary>\n            Get the circumcenter.\n            </summary>\n            <param name=\"index\">The circumcenters index.</param>\n            <returns>The circumcenter</returns>\n            <exception cref=\"T:System.ArgumentException\">If circumcenter with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenters(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a array of all the circumcenters.\n            </summary>\n            <param name=\"circumcenters\">A array of circumcenters.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.NeighbourIndex(System.Int32,System.Int32)\">\n            <summary>\n            Get the index of the faces neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index.</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>The index of the neighbour face in the triangulation. \n            -1 if there is no neighbour face at this index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateFace(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriFace2@)\">\n            <summary>\n            Locate the face the point hits.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"face\">The face the point has hit.</param>\n            <returns>True if the point hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Locate the closest vertex to point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The distance the point must be within to count as hitting the vertex.</param>\n            <param name=\"vertex\">The closest vertex.</param>\n            <returns>True if point hit a face and found a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Triangulations.TriEdge2@)\">\n            <summary>\n            Locate the closest  edge and segment to point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The distance the point must be within to count as hitting the edge.</param>\n            <param name=\"edge\">The closest edge.</param>\n            <returns>True if the point hit a face and found a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.RemoveVertex(System.Int32)\">\n            <summary>\n            Remove the vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <returns>True if removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.FlipEdge(System.Int32,System.Int32)\">\n            <summary>\n            Flip a edge between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>True if the edge was flipped.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the triangulation.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the triangulation.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Scale(System.Double)\">\n            <summary>\n            Scale the triangulation.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the triangulation with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.BaseTriangulation3\">\n            <summary>\n            Base triangulation class for Triangulation, DelaunayTriangulation \n            and ConstrainedTriangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.Kernel\">\n            <summary>\n            The triangulations kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.BuildStamp\">\n            <summary>\n            Returns the buildStamp.\n            The build stamp will change if \n            the triangulation model has changed\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.Dimension\">\n            <summary>\n            Returns the dimension of the affine hull.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.VertexCount\">\n            <summary>\n            Returns the number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteVertexCount\">\n            <summary>\n            Returns the number of finite vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TetrahedronCount\">\n            <summary>\n            Returns the number of cells or 0 if Dimension less than 3.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteTetrahedronCount\">\n            <summary>\n            The number of finite cells.\n            Returns 0 if Dimension less than 3.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.EdgeCount\">\n            <summary>\n            The number of edges.\n            Returns 0 if Dimension less than 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteEdgeCount\">\n            <summary>\n            The number of finite edges.\n            Returns 0 if Dimension less than 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TriangleCount\">\n            <summary>\n            The number of facets.\n            Returns 0 if Dimension less than 2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteTriangleCount\">\n            <summary>\n            The number of facets.\n            Returns 0 if Dimension less than 2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TetrahdronIndiceCount\">\n            <summary>\n            The number of indices needed for the finite tetrahedrons.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.IsValid\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Insert(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Inserts the point p in the triangulation.\n            If point p coincides with an already existing vertex the triangulation remains unchanged.\n            If point p lies in the convex hull of the points, it is added naturally: \n            if it lies inside a cell, the cell is split into four cells, if it lies \n            on a facet, the two incident cells are split into three cells, if it lies\n            on an edge, all the cells incident to this edge are split into two cells.\n            If point p is strictly outside the convex hull but in the affine hull, p \n            is linked to all visible points on the convex hull to form the new triangulation.\n            If point p is outside the affine hull of the points, p is linked to all the points,\n            and the dimension of the triangulation is incremented. All the points now belong to \n            the boundary of the convex hull, so, the infinite vertex is linked to all the points \n            to triangulate the new infinite face.\n            </summary>\n            <param name=\"point\">The point to insert</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Insert(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Insert all the points in the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"count\">The arrays length</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.InsertInCell(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Insert a vertex into a cell.\n            </summary>\n            <param name=\"index\">The cells index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Locate(CGALDotNetGeometry.Numerics.Point3d,CGALDotNet.Triangulations.TriCell3@)\">\n            <summary>\n            If the point query lies inside the convex hull of the points, the cell that contains the query in its interior is returned.\n            If query lies on a facet, an edge or on a vertex, one of the cells having query on its boundary is returned.\n            If the point query lies outside the convex hull of the points, an infinite cell with vertices { p,q,r,∞} is\n            returned such that the tetrahedron(p, q, r, query) is positively oriented(the rest of the triangulation lies\n            on the other side of facet (p, q, r)).\n            Note that locate works even in degenerate dimensions: in dimension 2 (resp. 1, 0) the Cell_handle returned\n            is the one that represents the facet(resp.edge, vertex) containing the query point.\n            The optional argument start is used as a starting place for the search.\n            The optional argument could_lock_zone is used by the concurrency-safe version of the triangulation.When the\n            pointer is not null, the locate will try to lock all the cells along the walk. If it succeeds,\n            could_lock_zone is true, otherwise it is false. In any case, the locked cells are not unlocked by locate,\n            leaving this choice to the user. \n            </summary>\n            <param name=\"point\">The point to query</param>\n            <param name=\"cell\">The cell thats closest to point.</param>\n            <returns>The closest cell to point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCircumcenters(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the centroids of each cell.\n            </summary>\n            <param name=\"circumcenters\">The array of points</param>\n            <param name=\"count\">The array of points length</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The array to copy into.</param>\n            <param name=\"count\">The arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Get all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The array to copy into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetVertices(CGALDotNet.Triangulations.TriVertex3[],System.Int32)\">\n            <summary>\n            Get the triangulation vertices.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetVertex(System.Int32,CGALDotNet.Triangulations.TriVertex3@)\">\n            <summary>\n            Get a triangulation vertex.\n            </summary>\n            <param name=\"index\">The vertices index</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCells(CGALDotNet.Triangulations.TriCell3[],System.Int32)\">\n            <summary>\n            Get the triangulation vertices.\n            </summary>\n            <param name=\"cells\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCell(System.Int32,CGALDotNet.Triangulations.TriCell3@)\">\n            <summary>\n            Get a triangulation vertex.\n            </summary>\n            <param name=\"index\">The vertices index</param>\n            <param name=\"cell\">The vertex.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetSegmentIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the cells edges in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the cells triangles in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetTetrahedronIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the tetrahedron cells in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1\">\n            <summary>\n            The generic constrained triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2\">\n            <summary>\n            The abstract triangulation class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the constrained triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.ConstrainedEdgeCount\">\n            <summary>\n            The number of constrainted edges in the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Insert(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Insert(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.IncidentConstraintCount(System.Int32)\">\n            <summary>\n            Get the number of constrainted edges incident to this vertex.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>The number of constrainted edges to the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.HasIncidentConstraint(System.Int32)\">\n            <summary>\n            Does this vertex have a constrainted edge.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>Does this vertex have a constrainted edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Add a segment as a constraint.\n            </summary>\n            <param name=\"segment\">The segment to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the two points as a segment constraint.\n            </summary>\n            <param name=\"a\">The segments point a.</param>\n            <param name=\"b\">The segments point b.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Add a list of segments as constraint to the triangulation.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The length of the segment array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstraints(CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint edges in the triangulation.\n            </summary>\n            <param name=\"constraints\">The edge array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint segments in the triangulation.\n            </summary>\n            <param name=\"constraints\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetIncidentConstraints(System.Int32,CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get the constraints incident to the vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n            <param name=\"constraints\">The array of edges.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.RemoveConstraint(System.Int32,System.Int32)\">\n            <summary>\n            Remove a constraint between a face and its neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index in the triangultion.</param>\n            <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.RemoveIncidentConstraints(System.Int32)\">\n            <summary>\n            Remove all constraints incident to a vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstrainedDomainIndices(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Get the triangle indices for domain in the triangultion.\n            Used to triangulate polygons.\n            </summary>\n            <param name=\"indices\">The indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedTriangulation2`1\">\n            <summary>\n            The generic constrained triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedTriangulation2\">\n            <summary>\n            The abstract triangulation class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the constrained triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedTriangulation2.ConstrainedEdgeCount\">\n            <summary>\n            The number of constrainted edges in the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Insert(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Insert(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.IncidentConstraintCount(System.Int32)\">\n            <summary>\n            Get the number of constrainted edges incident to this vertex.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>The number of constrainted edges to the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.HasIncidentConstraint(System.Int32)\">\n            <summary>\n            Does this vertex have a constrainted edge.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>Does this vertex have a constrainted edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Add a segment as a constraint.\n            </summary>\n            <param name=\"segment\">The segment to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the two points as a segment constraint.\n            </summary>\n            <param name=\"a\">The segments point a.</param>\n            <param name=\"b\">The segments point b.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Add a list of segments as constraint to the triangulation.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The length of the segment array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstraints(CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint edges in the triangulation.\n            </summary>\n            <param name=\"constraints\">The edge array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint segments in the triangulation.\n            </summary>\n            <param name=\"constraints\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetIncidentConstraints(System.Int32,CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get the constraints incident to the vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n            <param name=\"constraints\">The array of edges.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.RemoveConstraint(System.Int32,System.Int32)\">\n            <summary>\n            Remove a constraint between a face and its neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index in the triangultion.</param>\n            <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.RemoveIncidentConstraints(System.Int32)\">\n            <summary>\n            Remove all constraints incident to a vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstrainedDomainIndices(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Get the triangle indices for domain in the triangultion.\n            Used to triangulate polygons.\n            </summary>\n            <param name=\"indices\">The indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation2`1\">\n            <summary>\n            The generic delaunay triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerne</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Insert(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Insert(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation2\">\n            <summary>\n            The anstract base class for the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.DelaunayTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n            the triangulation is modified such that the new position of vertex same as point.</param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoCount(System.Int32@,System.Int32@)\">\n            <summary>\n            If the dual voronoi diagram of the triangulation is taken\n            How many segments and rays would be produced.\n            </summary>\n            <param name=\"numSegments\">The number of segments.</param>\n            <param name=\"numRays\">The number of rays.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoiSegments\">\n            <summary>\n            Get a array of the voronoi's segments.\n            </summary>\n            <returns>A array of the voronoi's segments.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoiRays\">\n            <summary>\n            Get a array of the voronois rays.\n            These are the segment at edge of triangulation that \n            a end point can not be determined.\n            </summary>\n            <returns>A array of the voronoi's rays.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation3`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Refine(System.Double,System.Int32)\">\n            <summary>\n            Refine the triangulation.\n            </summary>\n            <param name=\"targetEdgeLength\">The target edge lengths.</param>\n            <param name=\"iterations\">The number of iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation3\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.DelaunayTriangulation3.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.Move(System.Int32,CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Move a vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"point\">The point to move to.</param>\n            <param name=\"ifNoCollision\">Should the vertex only be moved if there is no coliision.</param>\n            <returns>If the vertex was moved.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.NearestVertex(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the index of the nearest vertex to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The index of the nearest vertex to the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.NearestVertexInCell(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the index of the nearest vertex to the point.\n            Presumes poimt is in a cell.\n            </summary>\n            <param name=\"index\">The cells index.</param>\n            <param name=\"point\">The point.</param>\n            <returns>The index of the nearest vertex to the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.RemoveVertex(System.Int32)\">\n            <summary>\n            Remobe a vertex.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <returns>True if vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation2`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.Triangulation2`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.InsertPolygon(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the points of the polygon into the triagulation.\n            May no have the same edges as polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to insert/</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.InsertPolygon(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the points of the polygon into the triagulation.\n            May no have the same edges as polygon.\n            </summary>\n            <param name=\"pwh\">The polygon to insert/</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation2\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.Triangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n            the triangulation is modified such that the new position of vertex same as point.</param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation3`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.Triangulation3`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.Refine(System.Double,System.Int32)\">\n            <summary>\n            Refine the triangulation.\n            </summary>\n            <param name=\"targetEdgeLength\">The target edge lengths.</param>\n            <param name=\"iterations\">The number of iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation3\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.Triangulation3.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriCell3\">\n            <summary>\n            From Index to HalfEdgeIndex must match layout\n            of the unmanaged TriFace2 in the TriFace2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.IsInfinite\">\n            <summary>\n            Is this the infinite cell.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.Index\">\n            <summary>\n            The cells index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.VertexIndices\">\n            <summary>\n            The cells 4 vertices.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.NeighborIndices\">\n            <summary>\n            The cells 4 neighbor cells.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.op_Equality(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two cells equal.\n            </summary>\n            <param name=\"f1\">The first cell.</param>\n            <param name=\"f2\">The second cell.</param>\n            <returns>True if the cells are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.op_Inequality(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two cells not equal.\n            </summary>\n            <param name=\"f1\">The first cell.</param>\n            <param name=\"f2\">The second cell.</param>\n            <returns>True if the cells are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.Equals(CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are these cells equal.\n            </summary>\n            <param name=\"cell\">The other cell.</param>\n            <returns>True if the cells are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetHashCode\">\n            <summary>\n            The cells hash code.\n            </summary>\n            <returns>The cells hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetVertexIndex(System.Int32)\">\n            <summary>\n            Get a vertex index.\n            </summary>\n            <param name=\"i\">The vertices index 0-3.</param>\n            <returns>The vertices index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetNeighborIndex(System.Int32)\">\n            <summary>\n            Get a neighbor cell index.\n            </summary>\n            <param name=\"i\">The neighbor cell index 0-3.</param>\n            <returns>A neighbor cell index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateVertices(CGALDotNet.Triangulations.TriVertex3[])\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"vertices\">The vertices array.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateNeighbors(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateNeighbors(CGALDotNet.Triangulations.TriCell3[])\">\n            <summary>\n            Enumerate the neighbors of the cell.\n            </summary>\n            <param name=\"cells\">The cell array.</param>\n            <returns>The cell neighbors.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.VerticesEqual(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two vertex arrays equal.\n            </summary>\n            <param name=\"c1\"></param>\n            <param name=\"c2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.NeighborEqual(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two neighbor arrays equal.\n            </summary>\n            <param name=\"c1\"></param>\n            <param name=\"c2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriEdge2\">\n            <summary>\n            From Index to TwinIndex must match layout\n            of the unmanaged TriEdge2 in the TriEdge2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.FaceIndex\">\n            <summary>\n            The edges face index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.NeighbourIndex\">\n            <summary>\n            The neighbours index in the face array betwen 0 and 2.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.Segment\">\n            <summary>\n            The edges segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"faceIndex\">The face index in the triangulation</param>\n            <param name=\"neighbourIndex\">The neighbours index in the face array betwen 0 and 2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.op_Equality(CGALDotNet.Triangulations.TriEdge2,CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are the two edges equal.\n            </summary>\n            <param name=\"e1\">The first edge.</param>\n            <param name=\"e2\">The second edge.</param>\n            <returns>True if the edges are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.op_Inequality(CGALDotNet.Triangulations.TriEdge2,CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are the two edges not equal.\n            </summary>\n            <param name=\"e1\">The first edge.</param>\n            <param name=\"e2\">The second edge.</param>\n            <returns>True if the edges are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.Equals(CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"edge\">The other edge.</param>\n            <returns>True if the edges are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.GetHashCode\">\n            <summary>\n            The edges hash code.\n            </summary>\n            <returns>The edges hash code.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriFace2\">\n            <summary>\n            From Index to HalfEdgeIndex must match layout\n            of the unmanaged TriFace2 in the TriFace2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.IsInfinite\">\n            <summary>\n            Is this the infinite face.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.Index\">\n            <summary>\n            The faces index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.VertexIndex\">\n            <summary>\n            The faces 3 vertices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.op_Equality(CGALDotNet.Triangulations.TriFace2,CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are the two faces equal.\n            </summary>\n            <param name=\"f1\">The first face.</param>\n            <param name=\"f2\">The second face.</param>\n            <returns>True if the faces are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.op_Inequality(CGALDotNet.Triangulations.TriFace2,CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are the two faces not equal.\n            </summary>\n            <param name=\"f1\">The first face.</param>\n            <param name=\"f2\">The second face.</param>\n            <returns>True if the faces are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.Equals(CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"face\">The other face.</param>\n            <returns>True if the faces are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.GetHashCode\">\n            <summary>\n            The faces hash code.\n            </summary>\n            <returns>The faces hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.GetVertexIndex(System.Int32)\">\n            <summary>\n            Get a vertex index and wrap around array.\n            </summary>\n            <param name=\"i\">The vertices index wrapped to 0-2.</param>\n            <returns>The vertices index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation2)\">\n            <summary>\n            Enumerate the vertices of the face.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The face vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.EnumerateVertices(CGALDotNet.Triangulations.TriVertex2[])\">\n            <summary>\n            Enumerate the vertices of the face.\n            </summary>\n            <param name=\"vertices\">The vertices array.</param>\n            <returns>The face vertices.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriVertex2\">\n            <summary>\n            From Point to HalfEdgeIndex must match layout\n            of the unmanaged TriVertex2 in the TriVertex2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.IsInfinite\">\n            <summary>\n            Is this a infinite vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Degree\">\n            <summary>\n            The number of egdes connected to the vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Index\">\n            <summary>\n            The vertices index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.FaceIndex\">\n            <summary>\n            The one of the vertexs the vertex is connected to.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.op_Equality(CGALDotNet.Triangulations.TriVertex2,CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are the two vertexs equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.op_Inequality(CGALDotNet.Triangulations.TriVertex2,CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are the two vertexs not equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.Equals(CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are these vertexs equal.\n            </summary>\n            <param name=\"vertex\">The other vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.GetHashCode\">\n            <summary>\n            The vertexs hash code.\n            </summary>\n            <returns>The vertexs hash code.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriVertex3\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.IsInfinite\">\n            <summary>\n            Is this a infinte vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Degree\">\n            <summary>\n            The vertices degree is the \n            number of edges connecting to it.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Index\">\n            <summary>\n            The vertices index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.CellIndex\">\n            <summary>\n            The one of the cells the vertex is connected to.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.op_Equality(CGALDotNet.Triangulations.TriVertex3,CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are the two vertices equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.op_Inequality(CGALDotNet.Triangulations.TriVertex3,CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are the two vertices not equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.Equals(CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are these vertexs equal.\n            </summary>\n            <param name=\"vertex\">The other vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.GetHashCode\">\n            <summary>\n            The vertexs hash code.\n            </summary>\n            <returns>The vertexs hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate around all the other vertices in this vertexs cell.\n            </summary>\n            <param name=\"tri\">The triangulation the vertex belongs to.</param>\n            <returns>All the other vertices in this vertexs cell</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.EnumerateVertices(CGALDotNet.Triangulations.TriVertex3[],CGALDotNet.Triangulations.TriCell3[])\">\n            <summary>\n            Enumerate around all the other vertices in this vertexs cell.\n            </summary>\n            <param name=\"vertices\">A array of the other vertices in the triangulation.</param>\n            <param name=\"cells\">A array of the other cells in the triangulation.</param>\n            <returns>All the other vertices in this vertexs cell</returns>\n        </member>\n        <member name=\"T:CGALDotNet.ArrayCache\">\n            <summary>\n            Cache to reuse arrays.\n            Thread safe?\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Point2dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Point2d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Point2d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Segment2dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Segment2d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Segment2d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Point3dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Point3d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Point3d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.HPoint3dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of HPoint3d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of HPoint3d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.IntArray1(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of ints that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of ints that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.IntArray2(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of ints that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of ints that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.MakeNewArray(System.Array,System.Int32)\">\n            <summary>\n            Should a new array be created.\n            </summary>\n            <param name=\"arr\">The current array.</param>\n            <param name=\"count\">The required new array size.</param>\n            <returns>Creates a new array if disabled, the current one is null or to small.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ErrorUtil.CheckArray(System.Array,System.Int32)\">\n            <summary>\n            Check a array that is passed to the c++ dll.\n            If the array is invalid it will cause a hard crash.\n            Array can be null if count is 0;\n            </summary>\n            <param name=\"array\"></param>\n            <param name=\"count\"></param>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "Binaries/CGALDotNetGeometry.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>CGALDotNetGeometry</name>\n    </assembly>\n    <members>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Addition(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Add two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Addition(CGALDotNetGeometry.Colors.ColorHSV,System.Single)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Addition(System.Single,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Subtraction(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Subtract two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Subtraction(CGALDotNetGeometry.Colors.ColorHSV,System.Single)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Subtraction(System.Single,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Multiply(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Multiply two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Multiply(CGALDotNetGeometry.Colors.ColorHSV,System.Single)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Multiply(System.Single,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Division(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Divide two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Division(CGALDotNetGeometry.Colors.ColorHSV,System.Single)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Equality(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.op_Inequality(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Are these colors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.Equals(System.Object)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.AlmostEqual(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV,System.Single)\">\n            <summary>\n            Are these colors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.Equals(CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.GetHashCode\">\n            <summary>\n            colors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.ToString\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.ToString(System.String)\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.FromBytes(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            color from bytes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.Distance(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            The distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.SqrDistance(CGALDotNetGeometry.Colors.ColorHSV,CGALDotNetGeometry.Colors.ColorHSV)\">\n            <summary>\n            The square distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.ToRGB(System.Single,System.Single,System.Single)\">\n            <summary>\n            Convert to RGB color space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorHSV.GenerateSpectrum(System.Int32)\">\n            <summary>\n            Generates a list of colors with hues ranging from 0 360\n            and a saturation and value of 1. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Addition(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Add two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Addition(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Addition(System.Single,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Subtraction(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Subtract two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Subtraction(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Subtraction(System.Single,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Multiply(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Multiply two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Multiply(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Multiply(System.Single,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Division(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Divide two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Division(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Equality(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.op_Inequality(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Are these colors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Equals(System.Object)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.AlmostEqual(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Are these colors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Equals(CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.GetHashCode\">\n            <summary>\n            colors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.ToString\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.ToString(System.String)\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.FromBytes(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            color from bytes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Distance(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            The distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.SqrDistance(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB)\">\n            <summary>\n            The square distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Min(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Max(CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Clamp(CGALDotNetGeometry.Colors.ColorRGB,System.Single,System.Single)\">\n            <summary>\n            Clamp the each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Lerp(CGALDotNetGeometry.Colors.ColorRGB,CGALDotNetGeometry.Colors.ColorRGB,System.Single)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.ToHSV(System.Single,System.Single,System.Single)\">\n            <summary>\n            Convert to HSV color space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.RainbowPalatte\">\n            <summary>\n            Create a palette of 6 colors from the rainbow.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.Palette\">\n            <summary>\n            Create a palette of colors.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGB.CustomPalette(System.Int32,System.Single,System.Single)\">\n            <summary>\n            Create a custom palette of hues with the same saturation and value.\n            </summary>\n            <param name=\"hues\">The number of hues in the palette.</param>\n            <param name=\"saturation\">The saturation of the colors.</param>\n            <param name=\"value\">The values of the colors.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Addition(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Add two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Addition(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Add color and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Addition(System.Single,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Add color and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Subtraction(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Subtract two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Subtraction(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Subtract color and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Subtraction(System.Single,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Subtract color and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Multiply(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Multiply two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Multiply(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Multiply a color and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Multiply(System.Single,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Multiply a color and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Division(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Divide two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Division(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Divide a color and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Equality(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.op_Inequality(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Are these colors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Equals(System.Object)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.AlmostEqual(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Are these colors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Equals(CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            Are these colors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.GetHashCode\">\n            <summary>\n            colors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.ToString\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.ToString(System.String)\">\n            <summary>\n            color as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.FromBytes(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            color from bytes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Distance(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            The distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.SqrDistance(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA)\">\n            <summary>\n            The square distance between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.FromBytes(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            color from ints.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Min(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Max(CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Clamp(CGALDotNetGeometry.Colors.ColorRGBA,System.Single,System.Single)\">\n            <summary>\n            Clamp the each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.Lerp(CGALDotNetGeometry.Colors.ColorRGBA,CGALDotNetGeometry.Colors.ColorRGBA,System.Single)\">\n            <summary>\n            Lerp between two colors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Colors.ColorRGBA.ToHSV\">\n            <summary>\n            Convert to HSV color space.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Degree\">\n            <summary>\n            Represents a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.angle\">\n            <summary>\n            The angle in degrees.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Degree.radian\">\n            <summary>\n            The degrees angle in radians.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.A0\">\n            <summary>\n            0 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.A90\">\n            <summary>\n            90 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.A180\">\n            <summary>\n            180 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.A270\">\n            <summary>\n            270 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Degree.A360\">\n            <summary>\n            360 degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.#ctor(System.Double)\">\n            <summary>\n            Create a new degree from a value.\n            </summary>\n            <param name=\"angle\">The angle in degrees.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Addition(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Add two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Addition(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Add angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_UnaryNegation(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Negate the angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Add angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Subtraction(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Subtract two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Subtraction(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Subtract angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Subtract angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Multiply(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Multiply two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Multiply(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Multiply a angle and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Multiply a angle and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Division(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Divide two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Division(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Divide a angle and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_LessThan(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Is the degree less than the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_LessThanOrEqual(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Is the degree less than or equal to the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_GreaterThan(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Is the degree greater than the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_GreaterThanOrEqual(CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Is the degree greater than or equal to the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_LessThan(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Is the degree less than the other degree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_LessThanOrEqual(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Is the degree less than or equal to the other degree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_GreaterThan(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Is the degree greater than the other degree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_GreaterThanOrEqual(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Is the degree greater than or equal to the other degree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Implicit(CGALDotNetGeometry.Numerics.Radian)~CGALDotNetGeometry.Numerics.Degree\">\n            <summary>\n            Cast from a radian to degrees.\n            </summary>\n            <param name=\"v\">The angle in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Equality(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.op_Inequality(CGALDotNetGeometry.Numerics.Degree,CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Are these angles not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.Equals(System.Object)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.Equals(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.GetHashCode\">\n            <summary>\n            Angles hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.ToString\">\n            <summary>\n            Angles as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.ToString(System.String)\">\n            <summary>\n            Angles as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Degree.Rounded(System.Int32)\">\n            <summary>\n            A rounded angle.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded angle</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.HPoint2d\">\n            <summary>\n            A Homogenous 2D point struct.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2d.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2d.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2d.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2d.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.#ctor(System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.#ctor(System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2d.Cartesian\">\n            <summary>\n            Convert from homogenous to cartesian space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Addition(CGALDotNetGeometry.Numerics.HPoint2d,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Addition(CGALDotNetGeometry.Numerics.HPoint2d,System.Double)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Multiply(CGALDotNetGeometry.Numerics.HPoint2d,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Multiply(CGALDotNetGeometry.Numerics.HPoint2d,System.Double)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Division(CGALDotNetGeometry.Numerics.HPoint2d,System.Double)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Division(System.Double,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Equality(CGALDotNetGeometry.Numerics.HPoint2d,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.op_Inequality(CGALDotNetGeometry.Numerics.HPoint2d,CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Equals(CGALDotNetGeometry.Numerics.HPoint2d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.AlmostEqual(CGALDotNetGeometry.Numerics.HPoint2d,CGALDotNetGeometry.Numerics.HPoint2d,System.Double)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2d.RandomPoints(System.Int32,System.Int32,System.Double,CGALDotNetGeometry.Shapes.Box2d)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"weight\">The number of points weight.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.HPoint2f\">\n            <summary>\n            A Homogenous 2D point struct.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2f.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2f.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2f.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint2f.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.#ctor(System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.#ctor(System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint2f.Cartesian\">\n            <summary>\n            Convert from homogenous to cartesian space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Addition(CGALDotNetGeometry.Numerics.HPoint2f,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Addition(CGALDotNetGeometry.Numerics.HPoint2f,System.Single)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Multiply(CGALDotNetGeometry.Numerics.HPoint2f,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Multiply(CGALDotNetGeometry.Numerics.HPoint2f,System.Single)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Division(CGALDotNetGeometry.Numerics.HPoint2f,System.Single)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Division(System.Single,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Equality(CGALDotNetGeometry.Numerics.HPoint2f,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.op_Inequality(CGALDotNetGeometry.Numerics.HPoint2f,CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Equals(CGALDotNetGeometry.Numerics.HPoint2f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.AlmostEqual(CGALDotNetGeometry.Numerics.HPoint2f,CGALDotNetGeometry.Numerics.HPoint2f,System.Single)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint2f.RandomPoints(System.Int32,System.Int32,System.Single,CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"weight\">The number of points weight.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3d.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.#ctor(System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.#ctor(System.Double,System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.Cartesian\">\n            <summary>\n            Convert from homogenous to cartesian space.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.Vector3d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3d.Vector4d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Addition(CGALDotNetGeometry.Numerics.HPoint3d,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Addition(CGALDotNetGeometry.Numerics.HPoint3d,System.Double)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Multiply(CGALDotNetGeometry.Numerics.HPoint3d,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Multiply(CGALDotNetGeometry.Numerics.HPoint3d,System.Double)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Division(CGALDotNetGeometry.Numerics.HPoint3d,System.Double)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Division(System.Double,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Equality(CGALDotNetGeometry.Numerics.HPoint3d,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.op_Inequality(CGALDotNetGeometry.Numerics.HPoint3d,CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Equals(CGALDotNetGeometry.Numerics.HPoint3d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.AlmostEqual(CGALDotNetGeometry.Numerics.HPoint3d,CGALDotNetGeometry.Numerics.HPoint3d,System.Double)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3d.RandomPoints(System.Int32,System.Int32,System.Double,CGALDotNetGeometry.Shapes.Box3d)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"weight\">The number of points weight.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.HPoint3f.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.#ctor(System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.#ctor(System.Single,System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.Cartesian\">\n            <summary>\n            Convert from homogenous to cartesian space.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.Vector3f\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.HPoint3f.Vector4d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Addition(CGALDotNetGeometry.Numerics.HPoint3f,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Addition(CGALDotNetGeometry.Numerics.HPoint3f,System.Single)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Multiply(CGALDotNetGeometry.Numerics.HPoint3f,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Multiply(CGALDotNetGeometry.Numerics.HPoint3f,System.Single)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Division(CGALDotNetGeometry.Numerics.HPoint3f,System.Single)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Division(System.Single,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Equality(CGALDotNetGeometry.Numerics.HPoint3f,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.op_Inequality(CGALDotNetGeometry.Numerics.HPoint3f,CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Equals(CGALDotNetGeometry.Numerics.HPoint3f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.AlmostEqual(CGALDotNetGeometry.Numerics.HPoint3f,CGALDotNetGeometry.Numerics.HPoint3f,System.Single)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.HPoint3f.RandomPoints(System.Int32,System.Int32,System.Single,CGALDotNetGeometry.Shapes.Box3f)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"weight\">The number of points weight.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Index2\">\n            <summary>\n            WARNING - Must match layout of unmanaged c++ CGAL struct in Index.h file.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.Wrap(System.Int32,System.Int32)\">\n            <summary>\n            Wrap a value between 0 and count-1 (inclusive).\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.Mirror(System.Int32,System.Int32)\">\n            <summary>\n            Mirror a value between 0 and count-1 (inclusive).\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.IsPow2(System.Int32)\">\n            <summary>\n            Is number a power of 2.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.NearestPow2(System.Int32)\">\n            <summary>\n            Return the closest pow2 number to num.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.LowerPow2(System.Int32)\">\n            <summary>\n            Return the closest pow2 number thats less than num.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.IntPow(System.Int32,System.Int32)\">\n            <summary>\n            Simple int pow function.\n            System Math.Pow may produce precision errors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.Binomial(System.Int32,System.Int32)\">\n            <summary>\n            Return the Binomial coefficients.\n            </summary>\n            <param name=\"k\">N</param>\n            <param name=\"i\">n</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.Factorial(System.Int32)\">\n            <summary>\n            Returns the factorial of number.\n            Must be less than or equal MAX_FACTORIAL or overflow will occur.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.FactorialBI(System.Int32)\">\n            <summary>\n            Returns the factorial of number using a BigInteger.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.Permutations(System.Int32)\">\n            <summary>\n            Given N objects, how many unique sets exist.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.PermutationsOrderedWithRepeats(System.Int32,System.Int32)\">\n            <summary>\n            Given N objects, how many unique sets exist of size n \n            where the order matters and objects may repeat.\n            </summary>\n            <param name=\"n\">The size of the sets</param>\n            <param name=\"N\">The total number of objects</param>\n            <returns>The number of sets possible</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.PermutationsUnorderedWithRepeats(System.Int32,System.Int32)\">\n            <summary>\n            Given N objects, how many unique sets exist of size n \n            where the order does not matters and objects may repeat.\n            </summary>\n            <param name=\"n\">The size of the sets</param>\n            <param name=\"N\">The total number of objects</param>\n            <returns>The number of sets possible</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.PermutationsOrderedWithoutRepeats(System.Int32,System.Int32)\">\n            <summary>\n            Given N objects, how many unique sets exist of size n \n            where the order matters and objects may not repeat.\n            </summary>\n            <param name=\"n\">The size of the sets</param>\n            <param name=\"N\">The total number of objects</param>\n            <returns>The number of sets possible</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.PermutationsUnorderedWithoutRepeats(System.Int32,System.Int32)\">\n            <summary>\n            Given N objects, how many unique sets exist of size n \n            where the order does not matters and objects may not repeat.\n            </summary>\n            <param name=\"n\">The size of the sets</param>\n            <param name=\"N\">The total number of objects</param>\n            <returns>The number of sets possible</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.MathUtil.CreateFactorialTable\">\n            <summary>\n            Creates a look up table for factorials.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix2x2d\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*2). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2d.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2d.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2d.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.#ctor(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.#ctor(System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.#ctor(System.Double[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2d.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Addition(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Multiply  a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2d,System.Double)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Implicit(CGALDotNetGeometry.Numerics.Matrix2x2f)~CGALDotNetGeometry.Numerics.Matrix2x2d\">\n            <summary>\n            Cast to double matrix from a float matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Equality(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.op_Inequality(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.Equals(CGALDotNetGeometry.Numerics.Matrix2x2d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix2x2d,CGALDotNetGeometry.Numerics.Matrix2x2d,System.Double)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.TryInverse(CGALDotNetGeometry.Numerics.Matrix2x2d@)\">\n            <summary>\n            The Inverse of the matrix copied into mInv.\n            Returns false if the matrix has no inverse.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Set the ith column from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Set the ith row from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2d.ToMatrix3x3d\">\n            <summary>\n            Convert to a float precision 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix2x2f\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*2). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2f.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2f.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix2x2f.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.#ctor(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.#ctor(System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.#ctor(System.Single[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix2x2f.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Addition(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Multiply  a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix2x2f,System.Single)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Explicit(CGALDotNetGeometry.Numerics.Matrix2x2d)~CGALDotNetGeometry.Numerics.Matrix2x2f\">\n            <summary>\n            Cast to float matrix from a double matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Equality(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.op_Inequality(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.Equals(CGALDotNetGeometry.Numerics.Matrix2x2f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix2x2f,CGALDotNetGeometry.Numerics.Matrix2x2f,System.Single)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.TryInverse(CGALDotNetGeometry.Numerics.Matrix2x2f@)\">\n            <summary>\n            The Inverse of the matrix copied into mInv.\n            Returns false if the matrix has no inverse.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Set the ith column from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Set the ith row from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix2x2f.ToMatrix3x3f\">\n            <summary>\n            Convert to a single precision 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix3x3d\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*3). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3d.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3d.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3d.m20\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3d.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.#ctor(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.#ctor(System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.#ctor(System.Double[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.HasScale\">\n            <summary>\n            Does the matric have scale.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3d.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Addition(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Multiply a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Multiply  a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3d,System.Double)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Implicit(CGALDotNetGeometry.Numerics.Matrix3x3f)~CGALDotNetGeometry.Numerics.Matrix3x3d\">\n            <summary>\n            Cast to double matrix from a float matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Equality(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.op_Inequality(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Equals(CGALDotNetGeometry.Numerics.Matrix3x3d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix3x3d,CGALDotNetGeometry.Numerics.Matrix3x3d,System.Double)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.TryInverse(CGALDotNetGeometry.Numerics.Matrix3x3d@)\">\n            <summary>\n            The Inverse of the matrix copied into mInv.\n            Returns false if the matrix has no inverse.\n            A matrix multipled by its inverse is the idenity.\n            Invert a 3x3 using cofactors.  This is about 8 times faster than\n            the Numerical Recipes code which uses Gaussian elimination.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Set the ith column from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Set the ith row from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.ToMatrix4x4d\">\n            <summary>\n            Convert to a REAL precision 4 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Translate(CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Create a translation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a translation out of a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Scale(CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Scale(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a scale out of a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Scale(System.Double)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3d.Rotate(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a rotation out of a vector.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix3x3f\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*3). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3f.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3f.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3f.m20\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix3x3f.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.#ctor(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.#ctor(System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.#ctor(System.Single[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.HasScale\">\n            <summary>\n            Does the matric have scale.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix3x3f.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Addition(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Multiply a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Multiply a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix3x3f,System.Single)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Explicit(CGALDotNetGeometry.Numerics.Matrix3x3d)~CGALDotNetGeometry.Numerics.Matrix3x3f\">\n            <summary>\n            Cast to float matrix from a double matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Equality(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.op_Inequality(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Equals(CGALDotNetGeometry.Numerics.Matrix3x3f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix3x3f,CGALDotNetGeometry.Numerics.Matrix3x3f,System.Single)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.TryInverse(CGALDotNetGeometry.Numerics.Matrix3x3f@)\">\n            <summary>\n            The Inverse of the matrix copied into mInv.\n            Returns false if the matrix has no inverse.\n            A matrix multipled by its inverse is the idenity.\n            Invert a 3x3 using cofactors.  This is about 8 times faster than\n            the Numerical Recipes code which uses Gaussian elimination.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Set the ith column from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Set the ith row from avector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.ToMatrix4x4f\">\n            <summary>\n            Convert to a single precision 4 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Translate(CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Create a translation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Translate(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Create a translation out of a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Scale(CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Scale(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Create a scale out of a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Scale(System.Single)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix3x3f.Rotate(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Create a rotation out of a vector.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix4x4d\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*4). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4d.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4d.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4d.m20\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4d.m30\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4d.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.#ctor(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.#ctor(System.Double)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.#ctor(System.Double[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.HasScale\">\n            <summary>\n            Does the matric have scale.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Adjoint\">\n            <summary>\n            The adjoint of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4d.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Addition(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Multiply a vector by a matrix.\n            Acts like z is 0, and w is 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Multiply a vector by a matrix.\n            Acts like w is 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Multiply a point by a matrix.\n            Acts like z is 0, and w is 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Multiply a point by a matrix.\n            Acts like w is 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Multiply a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4d,System.Double)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Implicit(CGALDotNetGeometry.Numerics.Matrix4x4f)~CGALDotNetGeometry.Numerics.Matrix4x4d\">\n            <summary>\n            Cast to double matrix from a float matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Equality(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.op_Inequality(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Equals(CGALDotNetGeometry.Numerics.Matrix4x4d)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix4x4d,CGALDotNetGeometry.Numerics.Matrix4x4d,System.Double)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Minor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            The minor of a matrix. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.TryInverse(CGALDotNetGeometry.Numerics.Matrix4x4d@)\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Set the ith column from a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Set the ith row from a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.ToMatrix3x3d\">\n            <summary>\n            Convert to a 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.TranslateRotateScale(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a translation, rotation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.TranslateRotate(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Create a translation and rotation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.TranslateScale(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a translation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.RotateScale(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a rotation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a translation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Scale(System.Double)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Rotate(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a rotation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Perspective(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a perspective matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.Ortho(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a ortho matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4d.LookAt(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Creates the matrix need to look at target from position.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Matrix4x4f\">\n            <summary>\n            Matrix is column major. Data is accessed as: row + (column*4). \n            Matrices can be indexed like 2D arrays but in an expression like mat[a, b], \n            a refers to the row index, while b refers to the column index \n            (note that this is the opposite way round to Cartesian coordinates).\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4f.m00\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4f.m10\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4f.m20\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4f.m30\">\n            <summary>\n            The matrix\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Matrix4x4f.Identity\">\n            <summary>\n            The Matrix Idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.#ctor(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            A matrix from the following column vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.#ctor(System.Single)\">\n            <summary>\n            A matrix from the following varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.#ctor(System.Single[0:,0:])\">\n            <summary>\n            A matrix copied from a array of varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Item(System.Int32)\">\n            <summary>\n            Access the varible at index i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Item(System.Int32,System.Int32)\">\n            <summary>\n            Access the varible at index ij\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.IsIdentity\">\n            <summary>\n            Is this the identity matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.HasScale\">\n            <summary>\n            Does the matric have scale.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Transpose\">\n            <summary>\n            The transpose of the matrix. The rows and columns are flipped.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Determinant\">\n            <summary>\n            The determinate of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Adjoint\">\n            <summary>\n            The adjoint of a matrix. \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Matrix4x4f.Inverse\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Addition(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Add two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Subtraction(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Subtract two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Multiply two matrices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Multiply a vector by a matrix.\n            Acts like z is 0, and w is 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Multiply a vector by a matrix.\n            Acts like w is 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Multiply a point by a matrix.\n            Acts like z is 0, and w is 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Multiply a point by a matrix.\n            Acts like w is 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Multiply a vector by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Multiply a point by a matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(CGALDotNetGeometry.Numerics.Matrix4x4f,System.Single)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Multiply a matrix by a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Explicit(CGALDotNetGeometry.Numerics.Matrix4x4d)~CGALDotNetGeometry.Numerics.Matrix4x4f\">\n            <summary>\n            Cast to float matrix from a double matrix.\n            </summary>\n            <param name=\"m\">The other matrix</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Equality(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.op_Inequality(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Are these matrices not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Equals(System.Object)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Equals(CGALDotNetGeometry.Numerics.Matrix4x4f)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.AlmostEqual(CGALDotNetGeometry.Numerics.Matrix4x4f,CGALDotNetGeometry.Numerics.Matrix4x4f,System.Single)\">\n            <summary>\n            Are these matrices equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.GetHashCode\">\n            <summary>\n            Matrices hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.ToString\">\n            <summary>\n            A matrix as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Minor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            The minor of a matrix. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.TryInverse(CGALDotNetGeometry.Numerics.Matrix4x4f@)\">\n            <summary>\n            The inverse of the matrix.\n            A matrix multipled by its inverse is the idenity.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.GetColumn(System.Int32)\">\n            <summary>\n            Get the ith column as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.SetColumn(System.Int32,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Set the ith column from a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.GetRow(System.Int32)\">\n            <summary>\n            Get the ith row as a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.SetRow(System.Int32,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Set the ith row from a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.ToMatrix3x3f\">\n            <summary>\n            Convert to a 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.TranslateRotateScale(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a translation, rotation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.TranslateRotate(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Create a translation and rotation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.TranslateScale(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a translation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.RotateScale(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a rotation and scale.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Translate(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a translation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Scale(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Scale(System.Single)\">\n            <summary>\n            Create a scale out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Create a rotation out of a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Rotate(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Create a rotation out of a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Perspective(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Create a perspective matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.Ortho(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Create a ortho matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Matrix4x4f.LookAt(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Creates the matrix need to look at target from position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2d.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.xy0\">\n            <summary>\n            2D point to 3D point with z as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.x0y\">\n            <summary>\n            2D point to 3D point with y as z.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.xy1\">\n            <summary>\n            2D point to 3D point with z as 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.xy00\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.xy01\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.#ctor(System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.#ctor(System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.IsFinite\">\n            <summary>\n            Are all the components ofpoint finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Vector2d\">\n            <summary>\n            Point as a vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Homogenous\">\n            <summary>\n            Point as a homogenous point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.ToHomogenous(System.Double)\">\n            <summary>\n            Point as a homogenous point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Addition(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Add two point and vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Addition(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Addition(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Subtraction(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Subtraction(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Subtract a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Subtraction(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Multiply(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Multiply(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Division(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Division(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Implicit(CGALDotNetGeometry.Numerics.Point2f)~CGALDotNetGeometry.Numerics.Point2d\">\n            <summary>\n            Cast from Point2f to Point2d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Implicit(CGALDotNetGeometry.Numerics.Point2i)~CGALDotNetGeometry.Numerics.Point2d\">\n            <summary>\n            Cast from Point2i to Point2d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Equality(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.op_Inequality(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.AlmostEqual(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Equals(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Distance(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.SqrDistance(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Direction(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Min(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Min(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Max(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Max(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Clamp(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Clamp(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Lerp(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2d.RandomPoints(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2f.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.xy0\">\n            <summary>\n            2D point to 3D point with z as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.x0y\">\n            <summary>\n            2D point to 3D point with y as z.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.xy1\">\n            <summary>\n            2D point to 3D point with z as 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.xy00\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.xy01\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.#ctor(System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.#ctor(System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.#ctor(System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.IsFinite\">\n            <summary>\n            Are all the components of point finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Vector2f\">\n            <summary>\n            Point as a vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.Magnitude\">\n            <summary>\n            The length of the point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Addition(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Add two point and vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Addition(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Addition(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Subtraction(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Subtraction(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Subtract a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Subtraction(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Multiply(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Multiply(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Division(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Division(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Explicit(CGALDotNetGeometry.Numerics.Point2d)~CGALDotNetGeometry.Numerics.Point2f\">\n            <summary>\n            Cast from Point2d to Point2f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Implicit(CGALDotNetGeometry.Numerics.Point2i)~CGALDotNetGeometry.Numerics.Point2f\">\n            <summary>\n            Cast from Point2i to Point2f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Equality(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.op_Inequality(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.AlmostEqual(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Equals(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Distance(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.SqrDistance(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Direction(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Min(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Min(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Max(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Max(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Clamp(CGALDotNetGeometry.Numerics.Point2f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Clamp(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Lerp(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2f.RandomPoints(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.MaxValue\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point2i.MinValue\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.xy0\">\n            <summary>\n            2D point to 3D point with z as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.x0y\">\n            <summary>\n            2D point to 3D point with y as z.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.xy1\">\n            <summary>\n            2D point to 3D point with z as 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.xy00\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.xy01\">\n            <summary>\n            2D point to 4D point with z as 0 and w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.#ctor(System.Int32)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Vector2f\">\n            <summary>\n            Convert to float vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Vector2d\">\n            <summary>\n            Convert to double vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Point2f\">\n            <summary>\n            Convert to float point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Point2d\">\n            <summary>\n            Convert to double point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point2i.SqrMagnitude\">\n            <summary>\n            The length of the point squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Addition(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Addition(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Addition(System.Int32,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Subtraction(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Subtraction(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Subtraction(System.Int32,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Multiply(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Multiply(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Multiply(System.Int32,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Division(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Division(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Division(System.Int32,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Explicit(CGALDotNetGeometry.Numerics.Point2f)~CGALDotNetGeometry.Numerics.Point2i\">\n            <summary>\n            Cast from Point2f to Point2i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Explicit(CGALDotNetGeometry.Numerics.Point2d)~CGALDotNetGeometry.Numerics.Point2i\">\n            <summary>\n            Cast from Point2d to Point2i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Equality(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.op_Inequality(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Equals(CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Distance(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.SqrDistance(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Direction(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Direction between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Min(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Min(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Max(CGALDotNetGeometry.Numerics.Point2i,System.Int32)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Max(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Clamp(CGALDotNetGeometry.Numerics.Point2i,System.Int32,System.Int32)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point2i.Clamp(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3d.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.xzy\">\n            <summary>\n            3D point to 3D swizzle point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.xy\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.xz\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.zy\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.xyz0\">\n            <summary>\n            3D point to 4D point with w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.xyz1\">\n            <summary>\n            3D point to 4D point with w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.#ctor(System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.IsFinite\">\n            <summary>\n            Are all the components ofpoint finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Vector3d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Vector4d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Homogenous\">\n            <summary>\n            Point as a homogenous point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.ToHomogenous(System.Double)\">\n            <summary>\n            Point as a homogenous point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Addition(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Add two point and vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Addition(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Addition(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Subtraction(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Subtraction(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Subtract a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Subtraction(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Multiply(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Multiply(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Division(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Division(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Implicit(CGALDotNetGeometry.Numerics.Point3f)~CGALDotNetGeometry.Numerics.Point3d\">\n            <summary>\n            Cast from Point43f to Point3d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Implicit(CGALDotNetGeometry.Numerics.Point3i)~CGALDotNetGeometry.Numerics.Point3d\">\n            <summary>\n            Cast from Point3i to Point3d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Equality(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.op_Inequality(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Equals(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.AlmostEqual(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Distance(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.SqrDistance(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Direction(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Min(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Min(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Max(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Max(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Clamp(CGALDotNetGeometry.Numerics.Point3d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Clamp(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Lerp(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3d.RandomPoints(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Box3d)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3f.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.xzy\">\n            <summary>\n            3D point to 3D swizzle point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.xy\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.xz\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.zy\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.xyz0\">\n            <summary>\n            3D point to 4D point with w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.xyz1\">\n            <summary>\n            3D point to 4D point with w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.#ctor(System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.IsFinite\">\n            <summary>\n            Are all the components ofpoint finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Vector3f\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Vector4d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Addition(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Add two point and vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Addition(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Addition(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Subtraction(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Subtraction(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Subtract a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Subtraction(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Multiply(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Multiply(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Division(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Division(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Explicit(CGALDotNetGeometry.Numerics.Point3d)~CGALDotNetGeometry.Numerics.Point3f\">\n            <summary>\n            Cast from Point3d to Point3f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Implicit(CGALDotNetGeometry.Numerics.Point3i)~CGALDotNetGeometry.Numerics.Point3f\">\n            <summary>\n            Cast from Point3i to Point3f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Equality(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.op_Inequality(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Equals(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.AlmostEqual(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Distance(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.SqrDistance(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Direction(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Min(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Min(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Max(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Max(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Clamp(CGALDotNetGeometry.Numerics.Point3f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Clamp(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Lerp(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3f.RandomPoints(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Box3f)\">\n            <summary>\n            Create a array of random points.\n            </summary>\n            <param name=\"seed\">The seed</param>\n            <param name=\"count\">The number of points to create.</param>\n            <param name=\"range\">The range of the points.</param>\n            <returns>The point array.</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.MaxValue\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point3i.MinValue\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.xzy\">\n            <summary>\n            3D point to 3D swizzle point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.xy\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.xz\">\n            <summary>\n            3D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.xyz0\">\n            <summary>\n            3D point to 4D point with w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.xyz1\">\n            <summary>\n            3D point to 4D point with w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.#ctor(System.Int32)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.#ctor(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Vector3f\">\n            <summary>\n            Convert to float vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Vector3d\">\n            <summary>\n            Convert to double vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Point3f\">\n            <summary>\n            Convert to float point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Point3d\">\n            <summary>\n            Convert to double point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point3i.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Addition(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Addition(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Addition(System.Int32,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Subtraction(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Subtraction(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Subtraction(System.Int32,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Multiply(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Multiply(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Multiply(System.Int32,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Division(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Division(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Division(System.Int32,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Explicit(CGALDotNetGeometry.Numerics.Point3f)~CGALDotNetGeometry.Numerics.Point3i\">\n            <summary>\n            Cast from Point3f to Point3i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Explicit(CGALDotNetGeometry.Numerics.Point3d)~CGALDotNetGeometry.Numerics.Point3i\">\n            <summary>\n            Cast from Point3d to Point3i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Equality(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.op_Inequality(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Equals(CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Distance(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.SqrDistance(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Direction(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Direction between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Min(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Min(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Max(CGALDotNetGeometry.Numerics.Point3i,System.Int32)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Max(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Clamp(CGALDotNetGeometry.Numerics.Point3i,System.Int32,System.Int32)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point3i.Clamp(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.UnitW\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4d.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.xy\">\n            <summary>\n            4D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.xyz\">\n            <summary>\n            4D point to 3D point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.#ctor(System.Double)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.IsFinite\">\n            <summary>\n            Are all the components ofpoint finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Vector3d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Vector4d\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Addition(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Addition(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Add a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Addition(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Subtraction(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Subtraction(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Add a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Subtraction(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Multiply(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Multiply(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Division(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Division(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Implicit(CGALDotNetGeometry.Numerics.Point4f)~CGALDotNetGeometry.Numerics.Point4d\">\n            <summary>\n            Cast from Point4f to Point4d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Implicit(CGALDotNetGeometry.Numerics.Point4i)~CGALDotNetGeometry.Numerics.Point4d\">\n            <summary>\n            Cast from Point4i to Point4d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Equality(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.op_Inequality(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Equals(CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.AlmostEqual(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Distance(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.SqrDistance(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Direction(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Min(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Min(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Max(CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Max(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Clamp(CGALDotNetGeometry.Numerics.Point4d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Clamp(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Lerp(CGALDotNetGeometry.Numerics.Point4d,CGALDotNetGeometry.Numerics.Point4d,System.Double)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4d.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.UnitW\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.Half\">\n            <summary>\n            A point of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.PositiveInfinity\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4f.NegativeInfinity\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.xy\">\n            <summary>\n            4D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.xyz\">\n            <summary>\n            4D point to 3D point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.#ctor(System.Single)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.IsFinite\">\n            <summary>\n            Are all the components of point finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Finite\">\n            <summary>\n            Make a point with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.IsNAN\">\n            <summary>\n            Are any of the points components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.NoNAN\">\n            <summary>\n            Make a point with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Vector3f\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Vector4f\">\n            <summary>\n            Point as vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Addition(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Addition(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Add a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Addition(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Subtraction(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Subtraction(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Subtract a point and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Subtraction(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Multiply(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Multiply(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Division(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Division(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Explicit(CGALDotNetGeometry.Numerics.Point4d)~CGALDotNetGeometry.Numerics.Point4f\">\n            <summary>\n            Cast from Point4d to Point4f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Implicit(CGALDotNetGeometry.Numerics.Point4i)~CGALDotNetGeometry.Numerics.Point4f\">\n            <summary>\n            Cast from Point4i to Point4f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Equality(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.op_Inequality(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Equals(CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.AlmostEqual(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Are these points equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Distance(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.SqrDistance(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Square distance between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Direction(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f,System.Boolean)\">\n            <summary>\n            Direction between two points.\n            </summary>\n            <param name=\"v0\">The first point.</param>\n            <param name=\"v1\">The second point.</param>\n            <param name=\"normalize\">Should the vector be normalized.</param>\n            <returns>The vector from v0 to v1.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Min(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Min(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Max(CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Max(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Clamp(CGALDotNetGeometry.Numerics.Point4f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Clamp(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Lerp(CGALDotNetGeometry.Numerics.Point4f,CGALDotNetGeometry.Numerics.Point4f,System.Single)\">\n            <summary>\n            Lerp between two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Rounded(System.Int32)\">\n            <summary>\n            A rounded point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Floor\">\n            <summary>\n            Floor each component if point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4f.Ceilling\">\n            <summary>\n            Ceilling each component if point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.UnitZ\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.UnitW\">\n            <summary>\n            The unit z point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.MaxValue\">\n            <summary>\n            A point of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Point4i.MinValue\">\n            <summary>\n            A point of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.xy\">\n            <summary>\n            4D point to 2D point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.xyz\">\n            <summary>\n            4D point to 3D point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.#ctor(System.Int32)\">\n            <summary>\n            A point all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            A point from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Item(System.Int32)\">\n            <summary>\n            Array accessor for variables. \n            </summary>\n            <param name=\"i\">The variables index.</param>\n            <returns>The variable value</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Vector4f\">\n            <summary>\n            Convert to float vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Vector4d\">\n            <summary>\n            Convert to double vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Point4f\">\n            <summary>\n            Convert to float point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Point4d\">\n            <summary>\n            Convert to double point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Sum\">\n            <summary>\n            The sum of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Product\">\n            <summary>\n            The product of the points components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.Absolute\">\n            <summary>\n            The points absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Point4i.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Addition(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Add two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Addition(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Addition(System.Int32,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Add point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_UnaryNegation(CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Negate point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Subtraction(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Subtract two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Subtraction(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Subtraction(System.Int32,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Subtract point and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Multiply(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Multiply two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Multiply(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Multiply(System.Int32,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Multiply a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Division(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Divide two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Division(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            Divide a point and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Division(System.Int32,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Divide a scalar and a point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Explicit(CGALDotNetGeometry.Numerics.Point4f)~CGALDotNetGeometry.Numerics.Point4i\">\n            <summary>\n            Cast from Point4f to Point4i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Explicit(CGALDotNetGeometry.Numerics.Point4d)~CGALDotNetGeometry.Numerics.Point4i\">\n            <summary>\n            Cast from Point4d to Point4i.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Equality(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.op_Inequality(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Are these points not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Equals(System.Object)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Equals(CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Are these points equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Min(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            The minimum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Min(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            The minimum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Max(CGALDotNetGeometry.Numerics.Point4i,System.Int32)\">\n            <summary>\n            The maximum value between s and each component in point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Max(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            The maximum value between each component in points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Clamp(CGALDotNetGeometry.Numerics.Point4i,System.Int32,System.Int32)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Point4i.Clamp(CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i,CGALDotNetGeometry.Numerics.Point4i)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A Quaternion from varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.#ctor(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            A Quaternion from a vector axis and angle.\n            The axis is the up direction and the angle is the rotation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.#ctor(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            A quaternion with the rotation required to\n            rotation from the from direction to the to direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3d.Conjugate\">\n            <summary>\n            Returns the conjugate of a quaternion value.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3d.Inverse\">\n            <summary>\n            The inverse of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3d.Magnitude\">\n            <summary>\n            The length of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3d.SqrMagnitude\">\n            <summary>\n            The sqr length of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3d.Normalized\">\n            <summary>\n            The a normalized quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Subtraction(CGALDotNetGeometry.Numerics.Quaternion3d,System.Double)\">\n            <summary>\n            Subtract a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Negate a quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Subtraction(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Subtract two quaternions.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Addition(CGALDotNetGeometry.Numerics.Quaternion3d,System.Double)\">\n            <summary>\n            Add a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Addition(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Add two quaternions.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3d,System.Double)\">\n            <summary>\n            Multiply a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Division(CGALDotNetGeometry.Numerics.Quaternion3d,System.Double)\">\n            <summary>\n            Divide a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Multiply two quternions together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Multiply a quaternion and a vector together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Multiply(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Multiply a quaternion and a vector together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Equality(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.op_Inequality(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Are these Quaternions not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.Equals(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.Equals(System.Object)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.GetHashCode\">\n            <summary>\n            Quaternions hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.ToString\">\n            <summary>\n            Quaternion as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.ToString(System.String)\">\n            <summary>\n            Quaternion as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.ToMatrix3x3d\">\n            <summary>\n            Convert to a single precision 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.ToMatrix4x4d\">\n            <summary>\n            Convert to a single precision 4 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.Normalize\">\n            <summary>\n            The normalize the quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.Dot(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            The dot product of two quaternion..\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.Slerp(CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Quaternion3d,System.Double)\">\n            <summary>\n            Slerp the quaternion from the from rotation to the to rotation by t.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.FromEuler(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a rotation out of a vector.\n            Uses Unity euler axis (+x right, +y up, +z forward)\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.RotateX(System.Double)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the x-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the x-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.RotateY(System.Double)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the y-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the y-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3d.RotateZ(System.Double)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the z-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the z-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A Quaternion from varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A Quaternion from varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.#ctor(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            A Quaternion from a vector axis and angle.\n            The axis is the up direction and the angle is the rotation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.#ctor(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            A quaternion with the rotation required to\n            rotation from the from direction to the to direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3f.Conjugate\">\n            <summary>\n            Returns the conjugate of a quaternion value.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3f.Inverse\">\n            <summary>\n            The inverse of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3f.Magnitude\">\n            <summary>\n            The length of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3f.SqrMagnitude\">\n            <summary>\n            The sqr length of the quaternion.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Quaternion3f.Normalized\">\n            <summary>\n            The a normalized quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Subtraction(CGALDotNetGeometry.Numerics.Quaternion3f,System.Single)\">\n            <summary>\n            Subtract a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Subtraction(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Subtract two quaternions.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Negate a quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Addition(CGALDotNetGeometry.Numerics.Quaternion3f,System.Single)\">\n            <summary>\n            Add a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Addition(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Add two quaternions.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3f,System.Single)\">\n            <summary>\n            Multiply a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Division(CGALDotNetGeometry.Numerics.Quaternion3f,System.Single)\">\n            <summary>\n            Divide a quaternion and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Multiply two quaternions together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Multiply(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Multiply a quaternion and a vector together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Multiply(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Multiply a quaternion and a vector together.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Equality(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.op_Inequality(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Are these Quaternions not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.Equals(CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.Equals(System.Object)\">\n            <summary>\n            Are these Quaternions equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.GetHashCode\">\n            <summary>\n            Quaternions hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.ToString\">\n            <summary>\n            Quaternion as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.ToString(System.String)\">\n            <summary>\n            Quaternion as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.ToMatrix3x3f\">\n            <summary>\n            Convert to a single precision 3 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.ToMatrix4x4f\">\n            <summary>\n            Convert to a single precision 4 dimension matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.Normalize\">\n            <summary>\n            The normalize the quaternion.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.Dot(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f)\">\n            <summary>\n            The dot product of two quaternion..\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.Slerp(CGALDotNetGeometry.Numerics.Quaternion3f,CGALDotNetGeometry.Numerics.Quaternion3f,System.Single)\">\n            <summary>\n            Slerp the quaternion from the from rotation to the to rotation by t.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.FromEuler(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Create a rotation out of a vector.\n            Uses Unity euler axis (+x right, +y up, +z forward)\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.RotateX(System.Single)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the x-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the x-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.RotateY(System.Single)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the y-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the y-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Quaternion3f.RotateZ(System.Single)\">\n            <summary>\n            Returns a 4x4 matrix that rotates around the z-axis by a given number of degrees.\n            </summary>\n            <param name=\"angle\">\n            The clockwise rotation angle when looking along the z-axis towards the origin in degrees.\n            </param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Numerics.Radian\">\n            <summary>\n            Represents a angle in degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.angle\">\n            <summary>\n            The angle in radians.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Radian.degree\">\n            <summary>\n            The radian angle in degees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.PI\">\n            <summary>\n            Pi.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A0\">\n            <summary>\n            0 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A45\">\n            <summary>\n            90 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A90\">\n            <summary>\n            90 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A180\">\n            <summary>\n            180 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A270\">\n            <summary>\n            270 degrees.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Radian.A360\">\n            <summary>\n            360 degrees.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.#ctor(System.Double)\">\n            <summary>\n            Create a new radian from a value.\n            </summary>\n            <param name=\"angle\">The angle in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Addition(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Add two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Addition(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Add angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_UnaryNegation(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Negate the angle.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Add angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Subtraction(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Subtract two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Subtraction(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Subtract angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Subtract angle and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Multiply(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Multiply two angles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Multiply(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Multiply a angle and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_LessThan(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Is the radian less than the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_LessThanOrEqual(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Is the radian less than or equal to the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_GreaterThan(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Is the radian greater than the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_GreaterThanOrEqual(CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Is the radian greater than or equal to the scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_LessThan(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Is the radian less than the other radian.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_LessThanOrEqual(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Is the radian less than or equal to the other radian.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_GreaterThan(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Is the radian greater than the other radian.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_GreaterThanOrEqual(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Is the radian greater than or equal to the other radian.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Multiply a angle and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Implicit(CGALDotNetGeometry.Numerics.Degree)~CGALDotNetGeometry.Numerics.Radian\">\n            <summary>\n            Cast from a degrees to radians.\n            </summary>\n            <param name=\"v\">The angle in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Equality(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.op_Inequality(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Are these angles not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.Equals(System.Object)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.Equals(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Are these angles equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.GetHashCode\">\n            <summary>\n            Angles hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.ToString\">\n            <summary>\n            Angles as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.ToString(System.String)\">\n            <summary>\n            Angles as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Radian.Rounded(System.Int32)\">\n            <summary>\n            A rounded angle.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n            <returns>The rounded angle</returns>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2d.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.x0y\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.xy0\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.xy01\">\n            <summary>\n            Convert to a 4 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.x0y1\">\n            <summary>\n            Convert to a 4 dimension vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.#ctor(System.Double)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.#ctor(System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Point2d\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.PerpendicularCCW\">\n            <summary>\n            Counter clock-wise perpendicular.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.PerpendicularCW\">\n            <summary>\n            Clock-wise perpendicular.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2d.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Addition(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Addition(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Multiply(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Multiply(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Division(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Division(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Implicit(CGALDotNetGeometry.Numerics.Vector2f)~CGALDotNetGeometry.Numerics.Vector2d\">\n            <summary>\n            Cast from Vector2f to Vector2f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Equality(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.op_Inequality(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.AlmostEqual(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Equals(CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.CompareTo(CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Dot(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Dot(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.AbsDot(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Cross(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Project(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Project vector v onto u.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Reflect(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Given an incident vector i and a normal vector n.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Refract(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d,System.Single)\">\n            <summary>\n            Returns the refraction vector given the incident vector i, \n            the normal vector n and the refraction index eta.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Angle180(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 180.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Angle360(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 360.\n            Angle represents moving ccw from a to b.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Min(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Min(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Max(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Max(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Clamp(CGALDotNetGeometry.Numerics.Vector2d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Clamp(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Lerp(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Slerp(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            Slerp between two vectors arc.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2d.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector2f.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.x0y\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.xy0\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.xy01\">\n            <summary>\n            Convert to a 4 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.x0y1\">\n            <summary>\n            Convert to a 4 dimension vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.#ctor(System.Single)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.#ctor(System.Single,System.Single)\">\n            <summary>\n            A vector from the variables.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.#ctor(System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Point2f\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.PerpendicularCCW\">\n            <summary>\n            Counter clock-wise perpendicular.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.PerpendicularCW\">\n            <summary>\n            Clock-wise perpendicular.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector2f.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Addition(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Addition(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Multiply(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Multiply(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Division(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Division(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Explicit(CGALDotNetGeometry.Numerics.Vector2d)~CGALDotNetGeometry.Numerics.Vector2f\">\n            <summary>\n            Cast from Vector2d to Vector2f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Equality(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.op_Inequality(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.AlmostEqual(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Equals(CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.CompareTo(CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Dot(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Dot(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.AbsDot(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Cross(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Project(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Project vector v onto u.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Reflect(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Given an incident vector i and a normal vector n.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Refract(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Returns the refraction vector given the incident vector i, \n            the normal vector n and the refraction index eta.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Angle180(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 180.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Angle360(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 360.\n            Angle represents moving ccw from a to b.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Min(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Min(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Max(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Max(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Clamp(CGALDotNetGeometry.Numerics.Vector2f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Clamp(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Lerp(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Slerp(CGALDotNetGeometry.Numerics.Vector2f,CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            Slerp between two vectors arc.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector2f.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.UnitZ\">\n            <summary>\n            The unit z vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3d.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.xzy\">\n            <summary>\n            3D vector to 3D swizzle vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.xy\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.xz\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.zy\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.xyz0\">\n            <summary>\n            3D vector to 4D vector with w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.xyz1\">\n            <summary>\n            3D vector to 4D vector with w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.#ctor(System.Double)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.#ctor(CGALDotNetGeometry.Numerics.Vector2d,System.Double)\">\n            <summary>\n            A vector from a 2d vector and the z varible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Point3d\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3d.TangentSpaceNormal\">\n            <summary>\n            Convert a normalized vector to tangent space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Addition(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Addition(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Multiply(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Multiply(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Division(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Division(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Implicit(CGALDotNetGeometry.Numerics.Vector3f)~CGALDotNetGeometry.Numerics.Vector3d\">\n            <summary>\n            Cast from Vector3f to Vector3d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Equality(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.op_Inequality(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.AlmostEqual(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Equals(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.CompareTo(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Dot(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Dot(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.AbsDot(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Angle180(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 180.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Cross(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Cross(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Cross(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Cross a vector andpoint.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Cross(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Cross two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Project(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Project vector v onto u.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Reflect(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Given an incident vector i and a normal vector n.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Refract(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,System.Single)\">\n            <summary>\n            Returns the refraction vector given the incident vector i, \n            the normal vector n and the refraction index eta.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Orthonormal(CGALDotNetGeometry.Numerics.Vector3d@,CGALDotNetGeometry.Numerics.Vector3d@,CGALDotNetGeometry.Numerics.Vector3d@)\">\n            <summary>\n            Create a set of orthonormal vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Min(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Min(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Max(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Max(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Clamp(CGALDotNetGeometry.Numerics.Vector3d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Clamp(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Lerp(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Slerp(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Slerp between two vectors arc.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3d.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.UnitZ\">\n            <summary>\n            The unit z vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector3f.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.xzy\">\n            <summary>\n            3D vector to 3D swizzle vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.xy\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.xz\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.zy\">\n            <summary>\n            3D vector to 2D vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.xyz0\">\n            <summary>\n            3D vector to 4D vector with w as 0.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.xyz1\">\n            <summary>\n            3D vector to 4D vector with w as 1.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.#ctor(System.Single)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.#ctor(CGALDotNetGeometry.Numerics.Vector2f,System.Single)\">\n            <summary>\n            A vector from a 2d vector and the z varible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Point3f\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector3f.TangentSpaceNormal\">\n            <summary>\n            Convert a normalized vector to tangent space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Addition(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Addition(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Multiply(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Multiply(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Division(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Division(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Explicit(CGALDotNetGeometry.Numerics.Vector3d)~CGALDotNetGeometry.Numerics.Vector3f\">\n            <summary>\n            Cast from Vector3d to Vector3f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Equality(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.op_Inequality(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.AlmostEqual(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Equals(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.CompareTo(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Dot(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Dot(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.AbsDot(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Angle180(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Angle between two vectors in degrees from 0 to 180.\n            A and b origin treated as 0,0 and do not need to be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Cross(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Cross(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Cross two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Cross(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Cross a vector andpoint.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Cross(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Cross two points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Project(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Project vector v onto u.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Reflect(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Given an incident vector i and a normal vector n.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Refract(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Returns the refraction vector given the incident vector i, \n            the normal vector n and the refraction index eta.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Orthonormal(CGALDotNetGeometry.Numerics.Vector3f@,CGALDotNetGeometry.Numerics.Vector3f@,CGALDotNetGeometry.Numerics.Vector3f@)\">\n            <summary>\n            Create a set of orthonormal vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Min(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Min(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Max(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Max(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Clamp(CGALDotNetGeometry.Numerics.Vector3f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Clamp(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Lerp(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Slerp(CGALDotNetGeometry.Numerics.Vector3f,CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Slerp between two vectors arc.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector3f.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.UnitZ\">\n            <summary>\n            The unit z vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.UnitW\">\n            <summary>\n            The unit w vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4d.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.xy\">\n            <summary>\n            Convert to a 2 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.xz\">\n            <summary>\n            Convert to a 2 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.xyz\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.xyz0\">\n            <summary>\n            A copy of the vector with w as 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.#ctor(System.Double)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.#ctor(CGALDotNetGeometry.Numerics.Vector2d,System.Double,System.Double)\">\n            <summary>\n            A vector from a 2d vector and the z and w varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.#ctor(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            A vector from a 3d vector and the w varible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Point4d\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4d.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Addition(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Addition(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Addition(System.Double,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Subtraction(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Subtraction(System.Double,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Multiply(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Multiply(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Multiply(System.Double,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Division(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Division(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Division(System.Double,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Implicit(CGALDotNetGeometry.Numerics.Vector4f)~CGALDotNetGeometry.Numerics.Vector4d\">\n            <summary>\n            Cast from Vector4f to Vector4d.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Equality(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.op_Inequality(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.AlmostEqual(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Equals(CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.CompareTo(CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Dot(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Dot(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Point4d)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.AbsDot(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Min(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Min(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Max(CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Max(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Clamp(CGALDotNetGeometry.Numerics.Vector4d,System.Double,System.Double)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Clamp(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Lerp(CGALDotNetGeometry.Numerics.Vector4d,CGALDotNetGeometry.Numerics.Vector4d,System.Double)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4d.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.UnitZ\">\n            <summary>\n            The unit z vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.UnitW\">\n            <summary>\n            The unit w vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.Half\">\n            <summary>\n            A vector of 0.5.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.PositiveInfinity\">\n            <summary>\n            A vector of positive infinity.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Numerics.Vector4f.NegativeInfinity\">\n            <summary>\n            A vector of negative infinity.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.xy\">\n            <summary>\n            Convert to a 2 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.xz\">\n            <summary>\n            Convert to a 2 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.xyz\">\n            <summary>\n            Convert to a 3 dimension vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.xyz0\">\n            <summary>\n            A copy of the vector with w as 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.#ctor(System.Single)\">\n            <summary>\n            A vector all with the value v.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            A vector from the varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.#ctor(CGALDotNetGeometry.Numerics.Vector2f,System.Single,System.Single)\">\n            <summary>\n            A vector from a 2d vector and the z and w varibles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.#ctor(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            A vector from a 3d vector and the w varible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.IsFinite\">\n            <summary>\n            Are all the components of vector finite.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Finite\">\n            <summary>\n            Make a vector with no non finite conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.IsNAN\">\n            <summary>\n            Are any of the vectors components nan.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.NoNAN\">\n            <summary>\n            Make a vector with no nan conponents.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Point4f\">\n            <summary>\n            Convert the vector to a point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Sum\">\n            <summary>\n            The sum of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Product\">\n            <summary>\n            The product of the vectors components.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Magnitude\">\n            <summary>\n            The length of the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.SqrMagnitude\">\n            <summary>\n            The length of the vector squared.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Normalized\">\n            <summary>\n            The vector normalized.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Numerics.Vector4f.Absolute\">\n            <summary>\n            The vectors absolute values.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Addition(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Add two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Addition(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Addition(System.Single,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Add vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_UnaryNegation(CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Negate vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Subtract two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Subtraction(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Subtraction(System.Single,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Subtract vector and scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Multiply(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Multiply two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Multiply(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Multiply(System.Single,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Multiply a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Division(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Divide two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Division(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Divide a vector and a scalar.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Division(System.Single,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Divide a scalar and a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Explicit(CGALDotNetGeometry.Numerics.Vector4d)~CGALDotNetGeometry.Numerics.Vector4f\">\n            <summary>\n            Cast from Vector4d to Vector4f.\n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Equality(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.op_Inequality(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Are these vectors not equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Equals(System.Object)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.AlmostEqual(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Are these vectors equal given the error.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Equals(CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Are these vectors equal.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.GetHashCode\">\n            <summary>\n            Vectors hash code. \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.CompareTo(CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Compare two vectors by axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.ToString\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.ToString(System.String)\">\n            <summary>\n            Vector as a string.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Dot(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            The dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Dot(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Point4f)\">\n            <summary>\n            The dot product of vector and point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.AbsDot(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            The abs dot product of two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Min(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            The minimum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Min(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            The minimum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Max(CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            The maximum value between s and each component in vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Max(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            The maximum value between each component in vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Clamp(CGALDotNetGeometry.Numerics.Vector4f,System.Single,System.Single)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Clamp(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f)\">\n            <summary>\n            Clamp each component to specified min and max.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Lerp(CGALDotNetGeometry.Numerics.Vector4f,CGALDotNetGeometry.Numerics.Vector4f,System.Single)\">\n            <summary>\n            Lerp between two vectors.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Rounded(System.Int32)\">\n            <summary>\n            Round vector.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Floor\">\n            <summary>\n            Floor each component of vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Numerics.Vector4f.Ceilling\">\n            <summary>\n            Ceilling each component of vector.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box2d\">\n            <summary>\n            A 2D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2d.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2d.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.#ctor(System.Double,System.Double)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Corner00\">\n            <summary>\n            The boxes lower left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Corner10\">\n            <summary>\n            The boxes lower right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Corner11\">\n            <summary>\n            The boxes upper right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Corner01\">\n            <summary>\n            The boxes upper left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2d.Area\">\n            <summary>\n            The area of the box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Equals(CGALDotNetGeometry.Shapes.Box2d)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.GetCornersXZ(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3d},System.Double)\">\n            <summary>\n            Copy the boxes corner points in the array.\n            Convert the 2d points into 3d points with the\n            y component now as the z component.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n            <param name=\"y\">The 3d points y value.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Enlarge(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Enlarge(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Shapes.Box2d)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Expand(CGALDotNetGeometry.Shapes.Box2d,System.Double)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Intersects(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Contains(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Contains(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Closest(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.SignedDistance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside box field is positive.\n            If point is inside box field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.Round(System.Int32)\">\n            <summary>\n            Round the boxes components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.CalculateBounds(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Caculate the bounding box of a set of segments.\n            </summary>\n            <param name=\"segments\">The segments.</param>\n            <returns>The bounding box</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box2f\">\n            <summary>\n            A 2D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2f.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2f.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.#ctor(System.Single,System.Single)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.#ctor(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Corner00\">\n            <summary>\n            The boxes lower left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Corner10\">\n            <summary>\n            The boxes lower right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Corner11\">\n            <summary>\n            The boxes upper right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Corner01\">\n            <summary>\n            The boxes upper left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2f.Area\">\n            <summary>\n            The area of the box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Equals(CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2f})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.GetCornersXZ(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3f},System.Single)\">\n            <summary>\n            Copy the boxes corner points in the array.\n            Convert the 2f points into 3f points with the\n            y component now as the z component.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n            <param name=\"y\">The 3f points y value.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Enlarge(CGALDotNetGeometry.Shapes.Box2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Enlarge(CGALDotNetGeometry.Shapes.Box2f,CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Expand(CGALDotNetGeometry.Shapes.Box2f,System.Single)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Intersects(CGALDotNetGeometry.Shapes.Box2f,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Contains(CGALDotNetGeometry.Shapes.Box2f,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Contains(CGALDotNetGeometry.Numerics.Point2f,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Closest(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.SignedDistance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside box field is positive.\n            If point is inside box field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.Round(System.Int32)\">\n            <summary>\n            Round the boxes components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2f})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.CalculateBounds(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Shapes.Segment2f})\">\n            <summary>\n            Caculate the bounding box of a set of segments.\n            </summary>\n            <param name=\"segments\">The segments.</param>\n            <returns>The bounding box</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box2i\">\n            <summary>\n            A 2D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2i.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box2i.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.#ctor(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Corner00\">\n            <summary>\n            The boxes lower left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Corner10\">\n            <summary>\n            The boxes lower right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Corner11\">\n            <summary>\n            The boxes upper right corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Corner01\">\n            <summary>\n            The boxes upper left corner.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box2i.Area\">\n            <summary>\n            The area of the box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.EnumeratePerimeter\">\n            <summary>\n            Enumerate each point on the boxes perimeter.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.EnumerateBounds\">\n            <summary>\n            Enumerate each point in the box.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Equals(CGALDotNetGeometry.Shapes.Box2i)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2i})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.GetCornersXZ(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3i},System.Int32)\">\n            <summary>\n            Copy the boxes corner points in the array.\n            Convert the 2i points into 3i points with the\n            y component now as the z component.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 4.</param>\n            <param name=\"y\">The 3i points y value.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Enlarge(CGALDotNetGeometry.Shapes.Box2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Enlarge(CGALDotNetGeometry.Shapes.Box2i,CGALDotNetGeometry.Shapes.Box2i)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Expand(CGALDotNetGeometry.Shapes.Box2i,System.Int32)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Intersects(CGALDotNetGeometry.Shapes.Box2i,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Contains(CGALDotNetGeometry.Shapes.Box2i,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Contains(CGALDotNetGeometry.Numerics.Point2i,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.Closest(CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2i})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box2i.CalculateBounds(CGALDotNetGeometry.Numerics.Point2i,CGALDotNetGeometry.Numerics.Point2i)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box3d\">\n            <summary>\n            A 3D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3d.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3d.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.#ctor(System.Double,System.Double)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Depth\">\n            <summary>\n            The size of the box on the z axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.Volume\">\n            <summary>\n            The volume of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3d.SurfaceArea\">\n            <summary>\n            THe boxes surface area.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Equals(CGALDotNetGeometry.Shapes.Box3d)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point4d})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Enlarge(CGALDotNetGeometry.Shapes.Box3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Enlarge(CGALDotNetGeometry.Shapes.Box3d,CGALDotNetGeometry.Shapes.Box3d)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Expand(CGALDotNetGeometry.Shapes.Box3d,System.Double)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Intersects(CGALDotNetGeometry.Shapes.Box3d,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Contains(CGALDotNetGeometry.Shapes.Box3d,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Contains(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Closest(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.SignedDistance(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside box field is positive.\n            If point is inside box field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.Round(System.Int32)\">\n            <summary>\n            Round the boxes components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.CalculateBounds(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Shapes.Segment3d})\">\n            <summary>\n            Caculate the bounding box of a set of segments.\n            </summary>\n            <param name=\"segments\">The segments.</param>\n            <returns>The bounding box</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box3f\">\n            <summary>\n            A 3D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3f.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3f.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.#ctor(System.Single,System.Single)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Depth\">\n            <summary>\n            The size of the box on the z axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.Volume\">\n            <summary>\n            The volume of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3f.SurfaceArea\">\n            <summary>\n            THe boxes surface area.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Equals(CGALDotNetGeometry.Shapes.Box3f)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3f})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point4d})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Enlarge(CGALDotNetGeometry.Shapes.Box3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Enlarge(CGALDotNetGeometry.Shapes.Box3f,CGALDotNetGeometry.Shapes.Box3f)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Expand(CGALDotNetGeometry.Shapes.Box3f,System.Single)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Intersects(CGALDotNetGeometry.Shapes.Box3f,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Contains(CGALDotNetGeometry.Shapes.Box3f,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Contains(CGALDotNetGeometry.Numerics.Point3f,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Closest(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.SignedDistance(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside box field is positive.\n            If point is inside box field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.Round(System.Int32)\">\n            <summary>\n            Round the boxes components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3f})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.CalculateBounds(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Shapes.Segment3f})\">\n            <summary>\n            Caculate the bounding box of a set of segments.\n            </summary>\n            <param name=\"segments\">The segments.</param>\n            <returns>The bounding box</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Box3i\">\n            <summary>\n            A 3D box represented by its min and max values.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3i.Min\">\n            <summary>\n            The boxes min point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Box3i.Max\">\n            <summary>\n            The boxes max point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.#ctor(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Construct a new box.\n            </summary>\n            <param name=\"min\">The boxes min point.</param>\n            <param name=\"max\">The boxes max point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Center\">\n            <summary>\n            The center of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Size\">\n            <summary>\n            The size of the boxes sides.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Width\">\n            <summary>\n            The size of the box on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Height\">\n            <summary>\n            The size of the box on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Depth\">\n            <summary>\n            The size of the box on the z axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.Volume\">\n            <summary>\n            The volume of the box.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Box3i.SurfaceArea\">\n            <summary>\n            THe boxes surface area.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Equals(System.Object)\">\n            <summary>\n            Is the box equal to this obj.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the box equal to this obj.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Equals(CGALDotNetGeometry.Shapes.Box3i)\">\n            <summary>\n            Is the box equal to the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <returns>Is the box equal to the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.GetHashCode\">\n            <summary>\n            The boxes hash code.\n            </summary>\n            <returns>The boxes hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.GetCorners\">\n            <summary>\n            Get the boxes corner points as a array.\n            </summary>\n            <returns>The boxes corner points as a array</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3i})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.GetCorners(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point4d})\">\n            <summary>\n            Copy the boxes corner points in the array.\n            </summary>\n            <param name=\"corners\">A array that has a size of at least 8.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Enlarge(CGALDotNetGeometry.Shapes.Box3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Returns the bounding box containing this box and the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Enlarge(CGALDotNetGeometry.Shapes.Box3i,CGALDotNetGeometry.Shapes.Box3i)\">\n            <summary>\n            Returns the bounding box containing this box and the given box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Expand(CGALDotNetGeometry.Shapes.Box3i,System.Int32)\">\n            <summary>\n            Return a new box expanded by the amount.\n            </summary>\n            <param name=\"box\">The box to expand.</param>\n            <param name=\"amount\">The amount to expand.</param>\n            <returns>The expanded box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Intersects(CGALDotNetGeometry.Shapes.Box3i,System.Boolean)\">\n            <summary>\n            Returns true if this box intersects the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Returns true if this box intersects the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Contains(CGALDotNetGeometry.Shapes.Box3i,System.Boolean)\">\n            <summary>\n            Does the box fully contain the other box.\n            </summary>\n            <param name=\"box\">The other box.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>Does the box fully contain the other box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Contains(CGALDotNetGeometry.Numerics.Point3i,System.Boolean)\">\n            <summary>\n            Does the box contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">True if on border counts as inside.</param>\n            <returns>True if the box contains the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.Closest(CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Find the closest point to the box.\n            If point inside box return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3i})\">\n            <summary>\n            Caculate the bounding box of the points.\n            </summary>\n            <param name=\"points\">The points.</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Box3i.CalculateBounds(CGALDotNetGeometry.Numerics.Point3i,CGALDotNetGeometry.Numerics.Point3i)\">\n            <summary>\n            Calculate the bounds of 2 points.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point</param>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2d.Radius2\">\n            <summary>\n            The squared radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2d.Diameter\">\n            <summary>\n            The circles diameter.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2d.Area\">\n            <summary>\n            The circles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2d.Circumference\">\n            <summary>\n            the circles circumference.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2d.Bounds\">\n            <summary>\n            Calculate the bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.GetHashCode\">\n            <summary>\n            The circles hashcode.\n            </summary>\n            <returns>The circles hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Closest(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the closest point to the circle.\n            If point inside circle return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.SignedDistance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside circle field is positive.\n            If point is inside circle field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Contains(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the circle contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>true if circle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Contains(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Does the circle fully contain the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>Does the circle fully contain the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Intersects(CGALDotNetGeometry.Shapes.Circle2d,System.Boolean)\">\n            <summary>\n            Does this circle intersect with the other circle.\n            </summary>\n            <param name=\"circle\">The other circle</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>True if the circles intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Intersects(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Does the circle intersect the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>Does the circle intersect the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.Enlarge(CGALDotNetGeometry.Shapes.Circle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Enlarge the circle so it contains the point p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.InCircle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true if the point d is inside the circle defined by the points a, b, c.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.CircumCircle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Creates a circle that has both points on its circumference.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.CircumCircle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Creates a circle that has all 3 points on its circumference.\n            From MathWorld: http://mathworld.wolfram.com/Circumcircle.html.\n            Fails if the points are colinear.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.CalculateBounds(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Creates a circle that contains all three point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Calculate the bounding circle that contains \n            all the points in the list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2d.ExtremePoints(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Finds which axis contains the two most extreme points\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2f.Radius2\">\n            <summary>\n            The squared radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2f.Diameter\">\n            <summary>\n            The circles diameter.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2f.Area\">\n            <summary>\n            The circles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2f.Circumference\">\n            <summary>\n            the circles circumference.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Circle2f.Bounds\">\n            <summary>\n            Calculate the bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.GetHashCode\">\n            <summary>\n            The circles hashcode.\n            </summary>\n            <returns>The circles hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Closest(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Find the closest point to the circle.\n            If point inside circle return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.SignedDistance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside circle field is positive.\n            If point is inside circle field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Contains(CGALDotNetGeometry.Numerics.Point2f,System.Boolean)\">\n            <summary>\n            Does the circle contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>true if circle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Contains(CGALDotNetGeometry.Shapes.Box2f,System.Boolean)\">\n            <summary>\n            Does the circle fully contain the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>Does the circle fully contain the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Intersects(CGALDotNetGeometry.Shapes.Circle2f,System.Boolean)\">\n            <summary>\n            Does this circle intersect with the other circle.\n            </summary>\n            <param name=\"circle\">The other circle</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>True if the circles intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Intersects(CGALDotNetGeometry.Shapes.Box2f,System.Boolean)\">\n            <summary>\n            Does the circle intersect the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"includeBorder\">Does the border conunt as inside the circle.</param>\n            <returns>Does the circle intersect the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.Enlarge(CGALDotNetGeometry.Shapes.Circle2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Enlarge the circle so it contains the point p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.InCircle(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Returns true if the point d is inside the circle defined by the points a, b, c.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.CircumCircle(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Creates a circle that has both points on its circumference.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.CircumCircle(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Creates a circle that has all 3 points on its circumference.\n            From MathWorld: http://mathworld.wolfram.com/Circumcircle.html.\n            Fails if the points are colinear.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.CalculateBounds(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Creates a circle that contains all three point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2f})\">\n            <summary>\n            Calculate the bounding circle that contains \n            all the points in the list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Circle2f.ExtremePoints(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point2f})\">\n            <summary>\n            Finds which axis contains the two most extreme points\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Line2d\">\n            <summary>\n             Represents a line from three coefficients\n             a, b and c, where ax + by + c = 0 holds.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n             Create a new line from three coefficients\n             a, b and c, where ax + by + c = 0 holds.\n            </summary>\n            <param name=\"a\">The constant in ax.</param>\n            <param name=\"b\">The constant in by</param>\n            <param name=\"c\">The constant c</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.#ctor(System.Double,System.Double)\">\n            <summary>\n             Create a new line from the slope and the y \n             intercept, where y = mx + b holds.\n            </summary>\n            <param name=\"m\">The lines slope.</param>\n            <param name=\"b\">The y intercept.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a new line that passes through the two points.\n            </summary>\n            <param name=\"p1\">Point 1.</param>\n            <param name=\"p2\">Point 2.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.Slope\">\n            <summary>\n            Find the slope of the line.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.IsAscending\">\n            <summary>\n            Determines whether the line is ascending\n            (that is, makes an angle with the positive\n            direction of the X axis that lies in (0, pi/2).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.IsVertical\">\n            <summary>\n            Determines whether the line is vertical\n            (that is, makes an angle with the positive\n            direction of the X axis that is equal to pi/2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.IsDescending\">\n            <summary>\n            Determines whether the line is descending\n            (that is, makes an angle with the positive\n            direction of the X axis that lies in (pi/2, pi).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.IsHorizontal\">\n            <summary>\n            Determines whether the line is horizontal\n            (that is, makes an angle with the positive\n            direction of the X axis that is equal to pi.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.IsUndefined\">\n            <summary>\n            Determines whether the line is undefined\n            (e.g.two equal points were passed to the constructor).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2d.Angle\">\n            <summary>\n            Calculates the angle that the line makes\n            with the positive direction of the X axis.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.Equals(System.Object)\">\n            <summary>\n            Is the line equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the line equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.Equals(CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            Is the line equal to the other line.\n            </summary>\n            <param name=\"line\">The other line.</param>\n            <returns>Is the line equal to the other line.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.GetHashCode\">\n            <summary>\n            The lines hash code.\n            </summary>\n            <returns>The lines hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.X(System.Double)\">\n            <summary>\n            Calculates the X coordinate of a point on the line by its Y coordinate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.Y(System.Double)\">\n            <summary>\n            Calculates the Y coordinate of a point on the line by its X coordinate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.PointOnLine(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Determines whether the point lies on the line.\n            </summary>\n            <param name=\"p\"></param>\n            <returns>if the point lies on the line</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.PerpendicularLine(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Calculates the perpendicular line that\n            passes through the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.IsLeftPoint(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Determines whether the point lies\n            on the left side of the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.IsRightPoint(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Determines whether the point lies\n            on the right side of the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.AreEquivalent(CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            Determine if the two lines are the equivalent\n            even though they may have a different equation.\n            </summary>\n            <param name=\"line\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2d.Intersects(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d@)\">\n            <summary>\n            Calculates the intersection of two lines.\n            </summary>\n            <param name=\"line\">the other line</param>\n            <param name=\"p\">intersection point</param>\n            <returns>if lines intersect</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Line2f\">\n            <summary>\n             Represents a line from three coefficients\n             a, b and c, where ax + by + c = 0 holds.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.#ctor(System.Single,System.Single,System.Single)\">\n            <summary>\n             Create a new line from three coefficients\n             a, b and c, where ax + by + c = 0 holds.\n            </summary>\n            <param name=\"a\">The constant in ax.</param>\n            <param name=\"b\">The constant in by</param>\n            <param name=\"c\">The constant c</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.#ctor(System.Single,System.Single)\">\n            <summary>\n             Create a new line from the slope and the y \n             intercept, where y = mx + b holds.\n            </summary>\n            <param name=\"m\">The lines slope.</param>\n            <param name=\"b\">The y intercept.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.#ctor(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Create a new line that passes through the two points.\n            </summary>\n            <param name=\"p1\">Point 1.</param>\n            <param name=\"p2\">Point 2.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.Slope\">\n            <summary>\n            Find the slope of the line.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.IsAscending\">\n            <summary>\n            Determines whether the line is ascending\n            (that is, makes an angle with the positive\n            direction of the X axis that lies in (0, pi/2).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.IsVertical\">\n            <summary>\n            Determines whether the line is vertical\n            (that is, makes an angle with the positive\n            direction of the X axis that is equal to pi/2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.IsDescending\">\n            <summary>\n            Determines whether the line is descending\n            (that is, makes an angle with the positive\n            direction of the X axis that lies in (pi/2, pi).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.IsHorizontal\">\n            <summary>\n            Determines whether the line is horizontal\n            (that is, makes an angle with the positive\n            direction of the X axis that is equal to pi.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.IsUndefined\">\n            <summary>\n            Determines whether the line is undefined\n            (e.g.two equal points were passed to the constructor).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Line2f.Angle\">\n            <summary>\n            Calculates the angle that the line makes\n            with the positive direction of the X axis.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.Equals(System.Object)\">\n            <summary>\n            Is the line equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the line equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.Equals(CGALDotNetGeometry.Shapes.Line2f)\">\n            <summary>\n            Is the line equal to the other line.\n            </summary>\n            <param name=\"line\">The other line.</param>\n            <returns>Is the line equal to the other line.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.GetHashCode\">\n            <summary>\n            The lines hash code.\n            </summary>\n            <returns>The lines hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.X(System.Single)\">\n            <summary>\n            Calculates the X coordinate of a point on the line by its Y coordinate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.Y(System.Single)\">\n            <summary>\n            Calculates the Y coordinate of a point on the line by its X coordinate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.PointOnLine(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Determines whether the point lies on the line.\n            </summary>\n            <param name=\"p\"></param>\n            <returns>if the point lies on the line</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.PerpendicularLine(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Calculates the perpendicular line that\n            passes through the given point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.IsLeftPoint(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Determines whether the point lies\n            on the left side of the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.IsRightPoint(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Determines whether the point lies\n            on the right side of the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.AreEquivalent(CGALDotNetGeometry.Shapes.Line2f)\">\n            <summary>\n            Determine if the two lines are the equivalent\n            even though they may have a different equation.\n            </summary>\n            <param name=\"line\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line2f.Intersects(CGALDotNetGeometry.Shapes.Line2f,CGALDotNetGeometry.Numerics.Point2f@)\">\n            <summary>\n            Calculates the intersection of two lines.\n            </summary>\n            <param name=\"line\">the other line</param>\n            <param name=\"p\">intersection point</param>\n            <returns>if lines intersect</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Line3d\">\n            <summary>\n            A 3D Line struct represented by a position and a direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Line3d.Position\">\n            <summary>\n            The Lines position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Line3d.Direction\">\n            <summary>\n            The Lines direction.\n            Might not be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Construct a Line from a point and the direction.\n            </summary>\n            <param name=\"position\">The Lines position.</param>\n            <param name=\"direction\">The Lines direction (will be normalized)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.op_Equality(CGALDotNetGeometry.Shapes.Line3d,CGALDotNetGeometry.Shapes.Line3d)\">\n            <summary>\n            Check if the two Lines are equal.\n            </summary>\n            <param name=\"l1\">The first Line.</param>\n            <param name=\"l2\">The second Line.</param>\n            <returns>True if the two Lines are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.op_Inequality(CGALDotNetGeometry.Shapes.Line3d,CGALDotNetGeometry.Shapes.Line3d)\">\n            <summary>\n            Check if the two Lines are not equal.\n            </summary>\n            <param name=\"l1\">The first Line.</param>\n            <param name=\"l2\">The second Line.</param>\n            <returns>True if the two Lines are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.Equals(System.Object)\">\n            <summary>\n            Is the Line equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the Line equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.Equals(CGALDotNetGeometry.Shapes.Line3d)\">\n            <summary>\n            Is the Line equal to the other Line.\n            </summary>\n            <param name=\"Line\">The over Line.</param>\n            <returns>Is the Line equal to the other Line.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.GetHashCode\">\n            <summary>\n            The Lines hashcode.\n            </summary>\n            <returns>The Lines hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.ToString\">\n            <summary>\n            The Lines as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.Normalize\">\n            <summary>\n            Normalize the lines direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3d.Round(System.Int32)\">\n            <summary>\n            Round the Lines position and direction.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Line3f\">\n            <summary>\n            A 3f Line struct represented by a position and a direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Line3f.Position\">\n            <summary>\n            The Lines position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Line3f.Direction\">\n            <summary>\n            The Lines direction.\n            Might not be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Construct a Line from a point and the direction.\n            </summary>\n            <param name=\"position\">The Lines position.</param>\n            <param name=\"direction\">The Lines direction (will be normalized)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.op_Equality(CGALDotNetGeometry.Shapes.Line3f,CGALDotNetGeometry.Shapes.Line3f)\">\n            <summary>\n            Check if the two Lines are equal.\n            </summary>\n            <param name=\"l1\">The first Line.</param>\n            <param name=\"l2\">The second Line.</param>\n            <returns>True if the two Lines are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.op_Inequality(CGALDotNetGeometry.Shapes.Line3f,CGALDotNetGeometry.Shapes.Line3f)\">\n            <summary>\n            Check if the two Lines are not equal.\n            </summary>\n            <param name=\"l1\">The first Line.</param>\n            <param name=\"l2\">The second Line.</param>\n            <returns>True if the two Lines are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.Equals(System.Object)\">\n            <summary>\n            Is the Line equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the Line equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.Equals(CGALDotNetGeometry.Shapes.Line3f)\">\n            <summary>\n            Is the Line equal to the other Line.\n            </summary>\n            <param name=\"Line\">The over Line.</param>\n            <returns>Is the Line equal to the other Line.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.GetHashCode\">\n            <summary>\n            The Lines hashcode.\n            </summary>\n            <returns>The Lines hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.ToString\">\n            <summary>\n            The Lines as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.Normalize\">\n            <summary>\n            Normalize the lines direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Line3f.Round(System.Int32)\">\n            <summary>\n            Round the Lines position and direction.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Plane3d\">\n            <summary>\n            Plane struct defined by a position and direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3d.UnitX\">\n            <summary>\n            A plane facing the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3d.UnitY\">\n            <summary>\n            A plane facing the y axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3d.UnitZ\">\n            <summary>\n            A plane facing the z axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3d.Position\">\n            <summary>\n            The planes position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3d.Normal\">\n            <summary>\n            The planes direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.#ctor(CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"normal\">The planes direction.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"position\">The planes position.</param>\n            <param name=\"normal\">The planes direction.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.#ctor(CGALDotNetGeometry.Numerics.Vector3d,System.Double)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"normal\">The planes direction.</param>\n            <param name=\"distance\">The planes distance from the origin.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            From three noncollinear points (ordered ccw).\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Plane3d.Distance\">\n            <summary>\n            The planes distance from the origin.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Plane3d.SqrDistance\">\n            <summary>\n            The planes square distance from the origin.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.op_Equality(CGALDotNetGeometry.Shapes.Plane3d,CGALDotNetGeometry.Shapes.Plane3d)\">\n            <summary>\n            Check if the two planes are equal.\n            </summary>\n            <param name=\"p1\">The first plane.</param>\n            <param name=\"p2\">The second plane.</param>\n            <returns>True if the planes are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.op_Inequality(CGALDotNetGeometry.Shapes.Plane3d,CGALDotNetGeometry.Shapes.Plane3d)\">\n            <summary>\n            Check if the two planes are not equal.\n            </summary>\n            <param name=\"p1\">The first plane.</param>\n            <param name=\"p2\">The second plane.</param>\n            <returns>True if the planes are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.Equals(System.Object)\">\n            <summary>\n            Check if this plane is equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Are these planes equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.Equals(CGALDotNetGeometry.Shapes.Plane3d)\">\n            <summary>\n            Check if this plane is equal to the other plane.\n            </summary>\n            <param name=\"plane\">The other plane.</param>\n            <returns>Are these planes equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.GetHashCode\">\n            <summary>\n            The planes hash code.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.ToString\">\n            <summary>\n            The plane as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3d.Closest(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            The closest point on the plane to the point p.\n            </summary>\n            <param name=\"p\">The point.</param>\n            <returns>The closest point on the plane.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Plane3f\">\n            <summary>\n            Plane struct defined by a position and direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3f.UnitX\">\n            <summary>\n            A plane facing the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3f.UnitY\">\n            <summary>\n            A plane facing the y axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3f.UnitZ\">\n            <summary>\n            A plane facing the z axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3f.Position\">\n            <summary>\n            The planes position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Plane3f.Normal\">\n            <summary>\n            The planes direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.#ctor(CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"normal\">The planes direction.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"position\">The planes position.</param>\n            <param name=\"normal\">The planes direction.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.#ctor(CGALDotNetGeometry.Numerics.Vector3f,System.Single)\">\n            <summary>\n            Create a new plane.\n            </summary>\n            <param name=\"normal\">The planes direction.</param>\n            <param name=\"distance\">The planes distance from the origin.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            From three noncollinear points (ordered ccw).\n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Plane3f.Distance\">\n            <summary>\n            The planes distance from the origin.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Plane3f.SqrDistance\">\n            <summary>\n            The planes square distance from the origin.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.op_Equality(CGALDotNetGeometry.Shapes.Plane3f,CGALDotNetGeometry.Shapes.Plane3f)\">\n            <summary>\n            Check if the two planes are equal.\n            </summary>\n            <param name=\"p1\">The first plane.</param>\n            <param name=\"p2\">The second plane.</param>\n            <returns>True if the planes are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.op_Inequality(CGALDotNetGeometry.Shapes.Plane3f,CGALDotNetGeometry.Shapes.Plane3f)\">\n            <summary>\n            Check if the two planes are not equal.\n            </summary>\n            <param name=\"p1\">The first plane.</param>\n            <param name=\"p2\">The second plane.</param>\n            <returns>True if the planes are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.Equals(System.Object)\">\n            <summary>\n            Check if this plane is equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Are these planes equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.Equals(CGALDotNetGeometry.Shapes.Plane3f)\">\n            <summary>\n            Check if this plane is equal to the other plane.\n            </summary>\n            <param name=\"plane\">The other plane.</param>\n            <returns>Are these planes equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.GetHashCode\">\n            <summary>\n            The planes hash code.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.ToString\">\n            <summary>\n            The plane as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Plane3f.Closest(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            The closest point on the plane to the point p.\n            </summary>\n            <param name=\"p\">The point.</param>\n            <returns>The closest point on the plane.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Ray2d\">\n            <summary>\n            A 2D ray.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray2d.Position\">\n            <summary>\n            The rays position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray2d.Direction\">\n            <summary>\n            The rays direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Construct a new ray.\n            </summary>\n            <param name=\"position\">The rays position.</param>\n            <param name=\"direction\">The rays directio</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Equals(System.Object)\">\n            <summary>\n            Is the ray equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the ray equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Equals(CGALDotNetGeometry.Shapes.Ray2d)\">\n            <summary>\n            Is the ray equal to the other ray.\n            </summary>\n            <param name=\"ray\">The other ray.</param>\n            <returns>Is the ray equal to the other ray.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.GetHashCode\">\n            <summary>\n            The rays hashcode.\n            </summary>\n            <returns>The rays hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Round(System.Int32)\">\n            <summary>\n            Round the rays components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.GetPosition(System.Double)\">\n            <summary>\n            Get the position offset along the ray at t.\n            </summary>\n            <param name=\"t\">The amount to offset.</param>\n            <returns>The position at t.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Intersection(CGALDotNetGeometry.Shapes.Ray2d)\">\n            <summary>\n            Intersection point between two rays.\n            Presumes there is a intersection.\n            </summary>\n            <param name=\"ray\">The other ray.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Intersects(CGALDotNetGeometry.Shapes.Ray2d,System.Double@,System.Double@)\">\n            <summary>\n            Intersection between two rays.\n            </summary>\n            <param name=\"ray\">The other ray</param>\n            <param name=\"s\">Intersection point = Position + s * Direction.</param>\n            <param name=\"t\">Intersection point = ray.Position + t * ray.Direction.</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Intersects(CGALDotNetGeometry.Shapes.Segment2d,System.Double@,System.Double@)\">\n            <summary>\n            Intersection between ray and segment.\n            </summary>\n            <param name=\"seg\">the segment</param>\n            <param name=\"s\">Intersection point = Position + s * Direction</param>\n            <param name=\"t\">Intersection point = A + t * (B - A)</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Intersects(CGALDotNetGeometry.Shapes.Circle2d,System.Double@)\">\n            <summary>\n            Intersection between ray and circle.\n            </summary>\n            <param name=\"circle\">the circle</param>\n            <param name=\"t\">Intersection point = Position + t * Direction</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2d.Intersects(CGALDotNetGeometry.Shapes.Box2d,System.Double@)\">\n            <summary>\n            Intersection between ray and box.\n            </summary>\n            <param name=\"box\">the box</param>\n            <param name=\"t\">Intersection point = Position + t * Direction</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Ray2f\">\n            <summary>\n            A 2D ray.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray2f.Position\">\n            <summary>\n            The rays position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray2f.Direction\">\n            <summary>\n            The rays direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.#ctor(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Vector2f)\">\n            <summary>\n            Construct a new ray.\n            </summary>\n            <param name=\"position\">The rays position.</param>\n            <param name=\"direction\">The rays directio</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Equals(System.Object)\">\n            <summary>\n            Is the ray equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the ray equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Equals(CGALDotNetGeometry.Shapes.Ray2f)\">\n            <summary>\n            Is the ray equal to the other ray.\n            </summary>\n            <param name=\"ray\">The other ray.</param>\n            <returns>Is the ray equal to the other ray.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.GetHashCode\">\n            <summary>\n            The rays hashcode.\n            </summary>\n            <returns>The rays hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.GetPosition(System.Single)\">\n            <summary>\n            Get the position offset along the ray at t.\n            </summary>\n            <param name=\"t\">The amount to offset.</param>\n            <returns>The position at t.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Intersection(CGALDotNetGeometry.Shapes.Ray2f)\">\n            <summary>\n            Intersection point between two rays.\n            Presumes there is a intersection.\n            </summary>\n            <param name=\"ray\">The other ray.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Intersects(CGALDotNetGeometry.Shapes.Ray2f,System.Single@,System.Single@)\">\n            <summary>\n            Intersection between two rays.\n            </summary>\n            <param name=\"ray\">The other ray</param>\n            <param name=\"s\">Intersection point = Position + s * Direction.</param>\n            <param name=\"t\">Intersection point = ray.Position + t * ray.Direction.</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Intersects(CGALDotNetGeometry.Shapes.Segment2f,System.Single@,System.Single@)\">\n            <summary>\n            Intersection between ray and segment.\n            </summary>\n            <param name=\"seg\">the segment</param>\n            <param name=\"s\">Intersection point = Position + s * Direction</param>\n            <param name=\"t\">Intersection point = A + t * (B - A)</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Intersects(CGALDotNetGeometry.Shapes.Circle2f,System.Single@)\">\n            <summary>\n            Intersection between ray and circle.\n            </summary>\n            <param name=\"circle\">the circle</param>\n            <param name=\"t\">Intersection point = Position + t * Direction</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray2f.Intersects(CGALDotNetGeometry.Shapes.Box2f,System.Single@)\">\n            <summary>\n            Intersection between ray and box.\n            </summary>\n            <param name=\"box\">the box</param>\n            <param name=\"t\">Intersection point = Position + t * Direction</param>\n            <returns>If rays intersect</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Ray3d\">\n            <summary>\n            A 3D ray struct represented by a position and a direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray3d.Position\">\n            <summary>\n            The rays position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray3d.Direction\">\n            <summary>\n            The rays direction.\n            Might not be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Construct a ray from a point and the direction.\n            </summary>\n            <param name=\"position\">The rays position.</param>\n            <param name=\"direction\">The rays direction (will be normalized)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.op_Equality(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Check if the two rays are equal.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>True if the two rays are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.op_Inequality(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Check if the two rays are not equal.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>True if the two rays are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.Equals(System.Object)\">\n            <summary>\n            Is the ray equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the ray equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.Equals(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Is the ray equal to the other ray.\n            </summary>\n            <param name=\"ray\">The over ray.</param>\n            <returns>Is the ray equal to the other ray.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.GetHashCode\">\n            <summary>\n            The rays hashcode.\n            </summary>\n            <returns>The rays hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.ToString\">\n            <summary>\n            The rays as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Ray3d.Magnitude\">\n            <summary>\n            The rays directions magnidute.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Ray3d.SqrMagnitude\">\n            <summary>\n            The rays directions square magnidute.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.GetPosition(System.Double)\">\n            <summary>\n            Get the position offset along the ray at t.\n            </summary>\n            <param name=\"t\">The amount to offset.</param>\n            <returns>The position at t.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.Normalize\">\n            <summary>\n            Normalize the lines direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3d.Round(System.Int32)\">\n            <summary>\n            Round the rays position and direction.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Ray3f\">\n            <summary>\n            A 3D ray struct represented by a position and a direction.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray3f.Position\">\n            <summary>\n            The rays position.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Ray3f.Direction\">\n            <summary>\n            The rays direction.\n            Might not be normalized.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Vector3f)\">\n            <summary>\n            Construct a ray from a point and the direction.\n            </summary>\n            <param name=\"position\">The rays position.</param>\n            <param name=\"direction\">The rays direction (will be normalized)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.op_Equality(CGALDotNetGeometry.Shapes.Ray3f,CGALDotNetGeometry.Shapes.Ray3f)\">\n            <summary>\n            Check if the two rays are equal.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>True if the two rays are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.op_Inequality(CGALDotNetGeometry.Shapes.Ray3f,CGALDotNetGeometry.Shapes.Ray3f)\">\n            <summary>\n            Check if the two rays are not equal.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>True if the two rays are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.Equals(System.Object)\">\n            <summary>\n            Is the ray equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the ray equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.Equals(CGALDotNetGeometry.Shapes.Ray3f)\">\n            <summary>\n            Is the ray equal to the other ray.\n            </summary>\n            <param name=\"ray\">The over ray.</param>\n            <returns>Is the ray equal to the other ray.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.GetHashCode\">\n            <summary>\n            The rays hashcode.\n            </summary>\n            <returns>The rays hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.ToString\">\n            <summary>\n            The rays as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Ray3f.Magnitude\">\n            <summary>\n            The rays directions magnidute.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Ray3f.SqrMagnitude\">\n            <summary>\n            The rays directions square magnidute.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.GetPosition(System.Single)\">\n            <summary>\n            Get the position offset along the ray at t.\n            </summary>\n            <param name=\"t\">The amount to offset.</param>\n            <returns>The position at t.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.Normalize\">\n            <summary>\n            Normalize the lines direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Ray3f.Round(System.Int32)\">\n            <summary>\n            Round the rays position and direction.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Segment2d\">\n            <summary>\n            A 2D segment.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment2d.A\">\n            <summary>\n            The segments first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment2d.B\">\n            <summary>\n            The segments second point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Construct a new segment.\n            </summary>\n            <param name=\"a\">The segments first point.</param>\n            <param name=\"b\">The segments second point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Construct a new segment.\n            </summary>\n            <param name=\"ax\">The segments first points x value.</param>\n            <param name=\"ay\">The segments first points y value.</param>\n            <param name=\"bx\">The segments second points x value.</param>\n            <param name=\"by\">The segments second points y value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Center\">\n            <summary>\n            The segments center.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Length\">\n            <summary>\n            The segments length.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.SqrLength\">\n            <summary>\n            The segments square length.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Tangent\">\n            <summary>\n            The segments tangent vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Normal\">\n            <summary>\n            The segments normal vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.LeftMost\">\n            <summary>\n            The left most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.RightMost\">\n            <summary>\n            The right most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.BottomMost\">\n            <summary>\n            The bottom most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.TopMost\">\n            <summary>\n            The top most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Reversed\">\n            <summary>\n            THe segment flipped, a is now b, b is now a.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2d.Bounds\">\n            <summary>\n            The segments bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Equals(System.Object)\">\n            <summary>\n            Is the segment equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the segment equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Equals(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Is the segment equal to the other segment.\n            </summary>\n            <param name=\"seg\">The other segment.</param>\n            <returns>Is the segment equal to the other segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.GetHashCode\">\n            <summary>\n            The segments hashcode.\n            </summary>\n            <returns>The segments hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Distance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The points distance from the segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.SqrDistance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The points sqr distance from the segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Round(System.Int32)\">\n            <summary>\n            Round the segments points.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Contains(CGALDotNetGeometry.Numerics.Point2d,System.Double)\">\n            <summary>\n            Does the point line on the segemnts.\n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.SignedDistance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Return the signed distance to the point. \n            Always positive.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Intersects(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Does the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Intersects(CGALDotNetGeometry.Shapes.Segment2d,System.Double@)\">\n            <summary>\n            Do the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n            <param name=\"t\">Intersection point = A + t * (B - A)</param>\n            <returns>If they intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Intersects(CGALDotNetGeometry.Shapes.Segment2d,System.Double@,System.Double@)\">\n            <summary>\n            Do the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n            <param name=\"s\">Intersection point = A + s * (B - A)</param>\n            <param name=\"t\">Intersection point = seg.A + t * (seg.B - seg.A)</param>\n            <returns>If they intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Intersects(CGALDotNetGeometry.Shapes.Box2d)\">\n            <summary>\n            Does the segment intersect this box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Closest(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"p\">point</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Closest(CGALDotNetGeometry.Numerics.Point2d,System.Double@)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"p\">point</param>\n            <param name=\"t\">closest point = A + t * (B - A)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Closest(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2d.Closest(CGALDotNetGeometry.Shapes.Segment2d,System.Double@,System.Double@)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n            <param name=\"s\">closest point = A + s * (B - A)</param>\n            <param name=\"t\">other closest point = seg.A + t * (seg.B - seg.A)</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Segment2f\">\n            <summary>\n            A 2D segment.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment2f.A\">\n            <summary>\n            The segments first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment2f.B\">\n            <summary>\n            The segments second point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.#ctor(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Construct a new segment.\n            </summary>\n            <param name=\"a\">The segments first point.</param>\n            <param name=\"b\">The segments second point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.#ctor(System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Construct a new segment.\n            </summary>\n            <param name=\"ax\">The segments first points x value.</param>\n            <param name=\"ay\">The segments first points y value.</param>\n            <param name=\"bx\">The segments second points x value.</param>\n            <param name=\"by\">The segments second points y value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Center\">\n            <summary>\n            The segments center.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Length\">\n            <summary>\n            The segments length.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.SqrLength\">\n            <summary>\n            The segments square length.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Tangent\">\n            <summary>\n            The segments tangent vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Normal\">\n            <summary>\n            The segments normal vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.LeftMost\">\n            <summary>\n            The left most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.RightMost\">\n            <summary>\n            The right most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.BottomMost\">\n            <summary>\n            The bottom most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.TopMost\">\n            <summary>\n            The top most point of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Reversed\">\n            <summary>\n            The segment flipped, a is now b, b is now a.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment2f.Bounds\">\n            <summary>\n            The segments bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Equals(System.Object)\">\n            <summary>\n            Is the segment equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is the segment equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Equals(CGALDotNetGeometry.Shapes.Segment2f)\">\n            <summary>\n            Is the segment equal to the other segment.\n            </summary>\n            <param name=\"seg\">The other segment.</param>\n            <returns>Is the segment equal to the other segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.GetHashCode\">\n            <summary>\n            The segments hashcode.\n            </summary>\n            <returns>The segments hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Distance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The points distance from the segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.SqrDistance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The points sqr distance from the segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Round(System.Int32)\">\n            <summary>\n            Round the segments points.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Contains(CGALDotNetGeometry.Numerics.Point2f,System.Single)\">\n            <summary>\n            Does the point line on the segemnts.\n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.SignedDistance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Return the signed distance to the point. \n            Always positive.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Intersects(CGALDotNetGeometry.Shapes.Segment2f)\">\n            <summary>\n            Does the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Intersects(CGALDotNetGeometry.Shapes.Segment2f,System.Single@)\">\n            <summary>\n            Do the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n            <param name=\"t\">Intersection point = A + t * (B - A)</param>\n            <returns>If they intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Intersects(CGALDotNetGeometry.Shapes.Segment2f,System.Single@,System.Single@)\">\n            <summary>\n            Do the two segments intersect.\n            </summary>\n            <param name=\"seg\">other segment</param>\n            <param name=\"s\">Intersection point = A + s * (B - A)</param>\n            <param name=\"t\">Intersection point = seg.A + t * (seg.B - seg.A)</param>\n            <returns>If they intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Intersects(CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Does the segment intersect this box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Closest(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"p\">point</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Closest(CGALDotNetGeometry.Numerics.Point2f,System.Single@)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"p\">point</param>\n            <param name=\"t\">closest point = A + t * (B - A)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Closest(CGALDotNetGeometry.Shapes.Segment2f)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment2f.Closest(CGALDotNetGeometry.Shapes.Segment2f,System.Single@,System.Single@)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n            <param name=\"s\">closest point = A + s * (B - A)</param>\n            <param name=\"t\">other closest point = seg.A + t * (seg.B - seg.A)</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Segment3d\">\n            <summary>\n            A 3D segment.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment3d.A\">\n            <summary>\n            The segments first (aka source) point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment3d.B\">\n            <summary>\n            The segments second (aka target) point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a new segment.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new segment.\n            </summary>\n            <param name=\"ax\">The first points x value.</param>\n            <param name=\"ay\">The first points y value.</param>\n            <param name=\"az\">The first points z value.</param>\n            <param name=\"bx\">The second points x value.</param>\n            <param name=\"by\">The second points y value.</param>\n            <param name=\"bz\">The second points z value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3d.Length\">\n            <summary>\n            The length of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3d.SqrLength\">\n            <summary>\n            The square length of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3d.Reversed\">\n            <summary>\n            The segment flipped, a is now b, b is now a.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3d.Bounds\">\n            <summary>\n            The bounding box of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3d.Item(System.Int32)\">\n            <summary>\n            Array acess to the segments points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-2)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Equals(System.Object)\">\n            <summary>\n            Is the segment equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the segment equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Equals(CGALDotNetGeometry.Shapes.Segment3d)\">\n            <summary>\n            Is the segment equal to the other segment.\n            </summary>\n            <param name=\"seg\">The other segment.</param>\n            <returns>Is the segment equal to the other segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.GetHashCode\">\n            <summary>\n            The segments hash code.\n            </summary>\n            <returns>The segments hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.ToString\">\n            <summary>\n            The segment as a string.\n            </summary>\n            <returns>The segment as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Round(System.Int32)\">\n            <summary>\n            Round the segments points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Contains(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Does the point line on the segemnts.\n            </summary>\n            <param name=\"point\"></param>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.SignedDistance(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Return the signed distance to the point. \n            Always positive.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Closest(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"point\">point</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Closest(CGALDotNetGeometry.Numerics.Point3d,System.Double@)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"point\">point</param>\n            <param name=\"t\">closest point = A + t * (B - A)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Closest(CGALDotNetGeometry.Shapes.Segment3d)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3d.Closest(CGALDotNetGeometry.Shapes.Segment3d,System.Double@,System.Double@)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n            <param name=\"s\">closest point = A + s * (B - A)</param>\n            <param name=\"t\">other closest point = seg.A + t * (seg.B - seg.A)</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Segment3f\">\n            <summary>\n            A 3D segment.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment3f.A\">\n            <summary>\n            The segments first (aka source) point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Segment3f.B\">\n            <summary>\n            The segments second (aka target) point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a new segment.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Create a new segment.\n            </summary>\n            <param name=\"ax\">The first points x value.</param>\n            <param name=\"ay\">The first points y value.</param>\n            <param name=\"az\">The first points z value.</param>\n            <param name=\"bx\">The second points x value.</param>\n            <param name=\"by\">The second points y value.</param>\n            <param name=\"bz\">The second points z value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3f.Length\">\n            <summary>\n            The length of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3f.SqrLength\">\n            <summary>\n            The square length of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3f.Reversed\">\n            <summary>\n            The segment flipped, a is now b, b is now a.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3f.Bounds\">\n            <summary>\n            The bounding box of the segment.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Segment3f.Item(System.Int32)\">\n            <summary>\n            Array acess to the segments points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-2)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Equals(System.Object)\">\n            <summary>\n            Is the segment equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the segment equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Equals(CGALDotNetGeometry.Shapes.Segment3f)\">\n            <summary>\n            Is the segment equal to the other segment.\n            </summary>\n            <param name=\"seg\">The other segment.</param>\n            <returns>Is the segment equal to the other segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.GetHashCode\">\n            <summary>\n            The segments hash code.\n            </summary>\n            <returns>The segments hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.ToString\">\n            <summary>\n            The segment as a string.\n            </summary>\n            <returns>The segment as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Round(System.Int32)\">\n            <summary>\n            Round the segments points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Contains(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Does the point line on the segemnts.\n            </summary>\n            <param name=\"point\"></param>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.SignedDistance(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Return the signed distance to the point. \n            Always positive.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Closest(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"point\">point</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Closest(CGALDotNetGeometry.Numerics.Point3f,System.Single@)\">\n            <summary>\n            The closest point on segment to point.\n            </summary>\n            <param name=\"point\">point</param>\n            <param name=\"t\">closest point = A + t * (B - A)</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Closest(CGALDotNetGeometry.Shapes.Segment3f)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Segment3f.Closest(CGALDotNetGeometry.Shapes.Segment3f,System.Single@,System.Single@)\">\n            <summary>\n            The closest segment spanning two other segments.\n            </summary>\n            <param name=\"seg\">the other segment</param>\n            <param name=\"s\">closest point = A + s * (B - A)</param>\n            <param name=\"t\">other closest point = seg.A + t * (seg.B - seg.A)</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.SegmentIndex\">\n            <summary>\n            A segment represented by indices instead of points.\n            The indices represent a index into a array of points.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.SegmentIndex.A\">\n            <summary>\n            The segments first point index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.SegmentIndex.B\">\n            <summary>\n            The segments seconds point index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.SegmentIndex.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Consturct a new segment.\n            </summary>\n            <param name=\"a\">The segments first point index.</param>\n            <param name=\"b\">The segments second point index.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.SegmentIndex.HasNullIndex\">\n            <summary>\n            Does the segment have a null index.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.SegmentIndex.Reversed\">\n            <summary>\n            The segment reverse where a is now b and b is now a.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.SegmentIndex.Equals(System.Object)\">\n            <summary>\n            Is the segment equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the segment equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.SegmentIndex.Equals(CGALDotNetGeometry.Shapes.SegmentIndex)\">\n            <summary>\n            Is the segment equal to the other segment.\n            </summary>\n            <param name=\"seg\">The other segment.</param>\n            <returns>Is the segment equal to the other segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.SegmentIndex.GetHashCode\">\n            <summary>\n            The segments hash code.\n            </summary>\n            <returns>The segments hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.SegmentIndex.ToString\">\n            <summary>\n            The segment as a string.\n            </summary>\n            <returns>The segment as a string.</returns>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Sphere3d\">\n            <summary>\n            A 3D sphere.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Sphere3d.Center\">\n            <summary>\n            The shperes center point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Sphere3d.Radius\">\n            <summary>\n            The spheres radius.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,System.Double)\">\n            <summary>\n            Construct a new sphere.\n            </summary>\n            <param name=\"center\">The shperes center point.</param>\n            <param name=\"radius\">The spheres radius.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3d.Radius2\">\n            <summary>\n            The squared radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3d.Diameter\">\n            <summary>\n            The spheres diameter.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3d.Area\">\n            <summary>\n            The spheres area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3d.SurfaceArea\">\n            <summary>\n            The spheres surface area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3d.Bounds\">\n            <summary>\n            Calculate the bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Equals(System.Object)\">\n            <summary>\n            Is this sphere equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is this sphere equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Equals(CGALDotNetGeometry.Shapes.Sphere3d)\">\n            <summary>\n            Is this sphere equal to the other sphere.\n            </summary>\n            <param name=\"sphere\">The other sphere.</param>\n            <returns>Is this sphere equal to the other sphere.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.GetHashCode\">\n            <summary>\n            The spheres hashcode.\n            </summary>\n            <returns>The spheres hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Enlarge(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Enlarge the sphere so it contains the point p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Round(System.Int32)\">\n            <summary>\n            Round the spheres components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Closest(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest point to the sphere.\n            If point inside sphere return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.SignedDistance(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside sphere field is positive.\n            If point is inside spher field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Contains(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the sphere contain the point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>true if sphere contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Contains(CGALDotNetGeometry.Shapes.Box3d,System.Boolean)\">\n            <summary>\n            Does the sphere fully contain the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>oes the sphere fully contain the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Intersects(CGALDotNetGeometry.Shapes.Sphere3d,System.Boolean)\">\n            <summary>\n            Does this sphere intersect with the other sphere.\n            </summary>\n            <param name=\"sphere\">The other sphere</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>True if the spheres intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.Intersects(CGALDotNetGeometry.Shapes.Box3d,System.Boolean)\">\n            <summary>\n            Does the sphere intersect the box.\n            </summary>\n            <param name=\"box\"></param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>Does the sphere intersect the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.CircumSphere(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Creates a sphere that has both points on its surface.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.CircumSphere(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Creates a sphere that has all 4 points on its surface.\n            From MathWorld: http://mathworld.wolfram.com/Circumsphere.html.\n            Fails if the points are colinear.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.CalculateBounds(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Creates a sphere that contains all three points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Calculate the minimum bounding sphere that contains \n            all the points in the list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3d.ExtremePoints(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Finds which axis contains the two most extreme points\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Sphere3f\">\n            <summary>\n            A 3D sphere.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Sphere3f.Center\">\n            <summary>\n            The shperes center point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Sphere3f.Radius\">\n            <summary>\n            The spheres radius.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,System.Single)\">\n            <summary>\n            Construct a new sphere.\n            </summary>\n            <param name=\"center\">The shperes center point.</param>\n            <param name=\"radius\">The spheres radius.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3f.Radius2\">\n            <summary>\n            The squared radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3f.Diameter\">\n            <summary>\n            The spheres diameter.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3f.Area\">\n            <summary>\n            The spheres area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3f.SurfaceArea\">\n            <summary>\n            The spheres surface area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Sphere3f.Bounds\">\n            <summary>\n            Calculate the bounding box.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Equals(System.Object)\">\n            <summary>\n            Is this sphere equal to the other object.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>Is this sphere equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Equals(CGALDotNetGeometry.Shapes.Sphere3f)\">\n            <summary>\n            Is this sphere equal to the other sphere.\n            </summary>\n            <param name=\"sphere\">The other sphere.</param>\n            <returns>Is this sphere equal to the other sphere.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.GetHashCode\">\n            <summary>\n            The spheres hashcode.\n            </summary>\n            <returns>The spheres hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Enlarge(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Enlarge the sphere so it contains the point p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Round(System.Int32)\">\n            <summary>\n            Round the spheres components.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Closest(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Find the closest point to the sphere.\n            If point inside sphere return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.SignedDistance(CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Return the signed distance to the point. \n            If point is outside sphere field is positive.\n            If point is inside spher field is negative.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Contains(CGALDotNetGeometry.Numerics.Point3f,System.Boolean)\">\n            <summary>\n            Does the sphere contain the point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>true if sphere contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Contains(CGALDotNetGeometry.Shapes.Box3f,System.Boolean)\">\n            <summary>\n            Does the sphere fully contain the box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>oes the sphere fully contain the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Intersects(CGALDotNetGeometry.Shapes.Sphere3f,System.Boolean)\">\n            <summary>\n            Does this sphere intersect with the other sphere.\n            </summary>\n            <param name=\"sphere\">The other sphere</param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>True if the spheres intersect</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.Intersects(CGALDotNetGeometry.Shapes.Box3f,System.Boolean)\">\n            <summary>\n            Does the sphere intersect the box.\n            </summary>\n            <param name=\"box\"></param>\n            <param name=\"inculdeBorder\">Does the border count as being in side the sphere.</param>\n            <returns>Does the sphere intersect the box.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.CircumSphere(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Creates a sphere that has both points on its surface.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.CircumSphere(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Creates a sphere that has all 4 points on its surface.\n            From MathWorld: http://mathworld.wolfram.com/Circumsphere.html.\n            Fails if the points are colinear.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.CalculateBounds(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Creates a sphere that contains all three points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.CalculateBounds(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3f})\">\n            <summary>\n            Calculate the minimum bounding sphere that contains \n            all the points in the list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Sphere3f.ExtremePoints(System.Collections.Generic.IList{CGALDotNetGeometry.Numerics.Point3f})\">\n            <summary>\n            Finds which axis contains the two most extreme points\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Tetrahedron3d\">\n            <summary>\n            A 3D tetrahedron.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3d.A\">\n            <summary>\n            The tetrahedrons first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3d.B\">\n            <summary>\n            The tetrahedrons second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3d.C\">\n            <summary>\n            The tetrahedrons third point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3d.D\">\n            <summary>\n            The tetrahedrons fourth point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a new tetrahedron.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n            <param name=\"c\">The third point.</param>\n            <param name=\"d\">The fourth point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Tetrahedron3d.Bounds\">\n            <summary>\n            The bounding box of the tetrahedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Tetrahedron3d.Item(System.Int32)\">\n            <summary>\n            Array acess to the tetrahedrons points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-3)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.Equals(System.Object)\">\n            <summary>\n            Is the tetrahedron equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the tetrahedron equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.Equals(CGALDotNetGeometry.Shapes.Tetrahedron3d)\">\n            <summary>\n            Is the tetrahedron equal to the other tetrahedron.\n            </summary>\n            <param name=\"tri\">The other tetrahedron.</param>\n            <returns>Is the tetrahedron equal to the other tetrahedron.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.GetHashCode\">\n            <summary>\n            The tetrahedrons hash code.\n            </summary>\n            <returns>The tetrahedrons hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.ToString\">\n            <summary>\n            The tetrahedron as a string.\n            </summary>\n            <returns>The tetrahedron as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3d.Round(System.Int32)\">\n            <summary>\n            Round the tetrahedrons points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Tetrahedron3f\">\n            <summary>\n            A 3D tetrahedron.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3f.A\">\n            <summary>\n            The tetrahedrons first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3f.B\">\n            <summary>\n            The tetrahedrons second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3f.C\">\n            <summary>\n            The tetrahedrons third point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Tetrahedron3f.D\">\n            <summary>\n            The tetrahedrons fourth point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a new tetrahedron.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n            <param name=\"c\">The third point.</param>\n            <param name=\"d\">The fourth point.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Tetrahedron3f.Bounds\">\n            <summary>\n            The bounding box of the tetrahedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Tetrahedron3f.Item(System.Int32)\">\n            <summary>\n            Array acess to the tetrahedrons points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-3)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.Equals(System.Object)\">\n            <summary>\n            Is the tetrahedron equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the tetrahedron equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.Equals(CGALDotNetGeometry.Shapes.Tetrahedron3f)\">\n            <summary>\n            Is the tetrahedron equal to the other tetrahedron.\n            </summary>\n            <param name=\"tri\">The other tetrahedron.</param>\n            <returns>Is the tetrahedron equal to the other tetrahedron.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.GetHashCode\">\n            <summary>\n            The tetrahedrons hash code.\n            </summary>\n            <returns>The tetrahedrons hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.ToString\">\n            <summary>\n            The tetrahedron as a string.\n            </summary>\n            <returns>The tetrahedron as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Tetrahedron3f.Round(System.Int32)\">\n            <summary>\n            Round the tetrahedrons points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Triangle2d\">\n            <summary>\n            A 2D triangle.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2d.A\">\n            <summary>\n            The triangles first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2d.B\">\n            <summary>\n            The triangles second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2d.C\">\n            <summary>\n            The triangles third point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Construct a new triangle.\n            </summary>\n            <param name=\"a\">The triangles first point.</param>\n            <param name=\"b\">The triangles second point.</param>\n            <param name=\"c\">The triangles third point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Construct a new triangle.\n            </summary>\n            <param name=\"ax\">The triangles first points x value.</param>\n            <param name=\"ay\">The triangles first points y value.</param>\n            <param name=\"bx\">The triangles second points x value.</param>\n            <param name=\"by\">The triangles second points y value.</param>\n            <param name=\"cx\">The triangles third points x value.</param>\n            <param name=\"cy\">The triangles third points y value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.Center\">\n            <summary>\n            The average of the triangles positions.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.IsCCW\">\n            <summary>\n            Is the triangle orientated ccw.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.Area\">\n            <summary>\n            The triangles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.SignedArea\">\n            <summary>\n            The triangles signed area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.SideLengths\">\n            <summary>\n            The side lengths are given as\n            a = sqrt((cx - bx)^2 + (cy - by)^2) -- side BC opposite of A\n            b = sqrt((cx - ax)^2 + (cy - ay)^2) -- side CA opposite of B\n            c = sqrt((ax - bx)^2 + (ay - by)^2) -- side AB opposite of C\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.Angles\">\n            <summary>\n            The side lengths are given as\n            ang_a = acos((b^2 + c^2 - a^2)  / (2 * b * c)) -- angle at A\n            ang_b = acos((c^2 + a^2 - b^2)  / (2 * c * a)) -- angle at B\n            ang_c = acos((a^2 + b^2 - c^2)  / (2 * a * b)) -- angle at C\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.SemiPerimeter\">\n            <summary>\n            The semiperimeter is given as\n            s = (a + b + c) / 2\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.InRadius\">\n            <summary>\n            The inradius is given as\n            r = D / s\n            This is the radius of the largest circle that can\n            fit within the triangle. Not the same as the \n            circum circles radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.CircumRadius\">\n            <summary>\n            The circumradius is given as\n              R = a * b * c / (4 * D)\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.CircumCircle\">\n            <summary>\n            The circum circle formed by the \n            triangles points.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.Altitudes\">\n            <summary>\n            The altitudes are given as\n              alt_a = 2 * D / a -- altitude above side a\n              alt_b = 2 * D / b -- altitude above side b\n              alt_c = 2 * D / c -- altitude above side c\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2d.AspectRatio\">\n            <summary>\n            The aspect ratio may be given as the ratio of the longest to the\n            shortest edge or, more commonly as the ratio of the circumradius \n            to twice the inradius\n              ar = R / (2 * r)\n                 = a * b * c / (8 * (s - a) * (s - b) * (s - c))\n                 = a * b * c / ((b + c - a) * (c + a - b) * (a + b - c))\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Equals(System.Object)\">\n            <summary>\n            Is the triangle equal to the other object.\n            </summary>\n            <param name=\"obj\">The  other object.</param>\n            <returns>Is the triangle equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Equals(CGALDotNetGeometry.Shapes.Triangle2d)\">\n            <summary>\n            Is the triangle equal to the other riangle.\n            </summary>\n            <param name=\"tri\">The  other riangle.</param>\n            <returns>Is the triangle equal to the other riangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.GetHashCode\">\n            <summary>\n            The triangles hashcode.\n            </summary>\n            <returns>The triangles hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Round(System.Int32)\">\n            <summary>\n            Round the triangles components.\n            </summary>\n            <param name=\"digits\">The digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.CrossProductArea(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The cross product area which is the \n            same as double the signed area.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Barycentric(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Return th barycentric coordinates\n            with respect to p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Closest(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the closest point to the triangle.\n            If point inside triangle return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.SignedDistance(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns the signed distance to surface of triangle.\n            </summary>\n            <returns>positive if outside triangle, negative if inside and 0 on boundary</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Contains(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does triangle contain point.\n            </summary>\n            <param name=\"p\">point</param>\n            <returns>true if triangle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.ContainsCCW(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does triangle contain point.\n            Asumes triangle is CCW;\n            </summary>\n            <param name=\"p\">point</param>\n            <returns>true if triangle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2d.Intersects(CGALDotNetGeometry.Shapes.Box2d)\">\n            <summary>\n            Does the triangle intersect this box.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Triangle2f\">\n            <summary>\n            A 2D triangle.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2f.A\">\n            <summary>\n            The triangles first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2f.B\">\n            <summary>\n            The triangles second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle2f.C\">\n            <summary>\n            The triangles third point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.#ctor(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Construct a new triangle.\n            </summary>\n            <param name=\"a\">The triangles first point.</param>\n            <param name=\"b\">The triangles second point.</param>\n            <param name=\"c\">The triangles third point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Construct a new triangle.\n            </summary>\n            <param name=\"ax\">The triangles first points x value.</param>\n            <param name=\"ay\">The triangles first points y value.</param>\n            <param name=\"bx\">The triangles second points x value.</param>\n            <param name=\"by\">The triangles second points y value.</param>\n            <param name=\"cx\">The triangles third points x value.</param>\n            <param name=\"cy\">The triangles third points y value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.Center\">\n            <summary>\n            The average of the triangles positions.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.IsCCW\">\n            <summary>\n            Is the triangle orientated ccw.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.Area\">\n            <summary>\n            The triangles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.SignedArea\">\n            <summary>\n            The triangles signed area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.SideLengths\">\n            <summary>\n            The side lengths are given as\n            a = sqrt((cx - bx)^2 + (cy - by)^2) -- side BC opposite of A\n            b = sqrt((cx - ax)^2 + (cy - ay)^2) -- side CA opposite of B\n            c = sqrt((ax - bx)^2 + (ay - by)^2) -- side AB opposite of C\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.Angles\">\n            <summary>\n            The side lengths are given as\n            ang_a = acos((b^2 + c^2 - a^2)  / (2 * b * c)) -- angle at A\n            ang_b = acos((c^2 + a^2 - b^2)  / (2 * c * a)) -- angle at B\n            ang_c = acos((a^2 + b^2 - c^2)  / (2 * a * b)) -- angle at C\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.SemiPerimeter\">\n            <summary>\n            The semiperimeter is given as\n            s = (a + b + c) / 2\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.InRadius\">\n            <summary>\n            The inradius is given as\n            r = D / s\n            This is the radius of the largest circle that can\n            fit within the triangle. Not the same as the \n            circum circles radius.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.CircumRadius\">\n            <summary>\n            The circumradius is given as\n              R = a * b * c / (4 * D)\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.CircumCircle\">\n            <summary>\n            The circum circle formed by the \n            triangles points.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.Altitudes\">\n            <summary>\n            The altitudes are given as\n              alt_a = 2 * D / a -- altitude above side a\n              alt_b = 2 * D / b -- altitude above side b\n              alt_c = 2 * D / c -- altitude above side c\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle2f.AspectRatio\">\n            <summary>\n            The aspect ratio may be given as the ratio of the longest to the\n            shortest edge or, more commonly as the ratio of the circumradius \n            to twice the inradius\n              ar = R / (2 * r)\n                 = a * b * c / (8 * (s - a) * (s - b) * (s - c))\n                 = a * b * c / ((b + c - a) * (c + a - b) * (a + b - c))\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Equals(System.Object)\">\n            <summary>\n            Is the triangle equal to the other object.\n            </summary>\n            <param name=\"obj\">The  other object.</param>\n            <returns>Is the triangle equal to the other object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Equals(CGALDotNetGeometry.Shapes.Triangle2f)\">\n            <summary>\n            Is the triangle equal to the other riangle.\n            </summary>\n            <param name=\"tri\">The  other riangle.</param>\n            <returns>Is the triangle equal to the other riangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.GetHashCode\">\n            <summary>\n            The triangles hashcode.\n            </summary>\n            <returns>The triangles hashcode.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Round(System.Int32)\">\n            <summary>\n            Round the triangles components.\n            </summary>\n            <param name=\"digits\">The digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.CrossProductArea(CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f,CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            The cross product area which is the \n            same as double the signed area.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Barycentric(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Return th barycentric coordinates\n            with respect to p.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Closest(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Find the closest point to the triangle.\n            If point inside triangle return point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.SignedDistance(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Returns the signed distance to surface of triangle.\n            </summary>\n            <returns>positive if outside triangle, negative if inside and 0 on boundary</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Contains(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Does triangle contain point.\n            </summary>\n            <param name=\"p\">point</param>\n            <returns>true if triangle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.ContainsCCW(CGALDotNetGeometry.Numerics.Point2f)\">\n            <summary>\n            Does triangle contain point.\n            Asumes triangle is CCW;\n            </summary>\n            <param name=\"p\">point</param>\n            <returns>true if triangle contains point</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle2f.Intersects(CGALDotNetGeometry.Shapes.Box2f)\">\n            <summary>\n            Does the triangle intersect this box.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Triangle3d\">\n            <summary>\n            A 3D triangle.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3d.A\">\n            <summary>\n            The triangles first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3d.B\">\n            <summary>\n            The triangles second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3d.C\">\n            <summary>\n            The triangles third point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.#ctor(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Create a new triangle.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n            <param name=\"c\">The third point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new triangle.\n            </summary>\n            <param name=\"ax\">The first points x value.</param>\n            <param name=\"ay\">The first points y value.</param>\n            <param name=\"az\">The first points z value.</param>\n            <param name=\"bx\">The second points x value.</param>\n            <param name=\"by\">The second points y value.</param>\n            <param name=\"bz\">The second points z value.</param>\n            <param name=\"cx\">The third points x value.</param>\n            <param name=\"cy\">The third points y value.</param>\n            <param name=\"cz\">The third points z value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle3d.Bounds\">\n            <summary>\n            The bounding box of the triangle.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle3d.Item(System.Int32)\">\n            <summary>\n            Array acess to the triangles points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-2)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.Equals(System.Object)\">\n            <summary>\n            Is the triangle equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the triangle equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.Equals(CGALDotNetGeometry.Shapes.Triangle3d)\">\n            <summary>\n            Is the triangle equal to the other triangle.\n            </summary>\n            <param name=\"tri\">The other triangle.</param>\n            <returns>Is the triangle equal to the other triangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.GetHashCode\">\n            <summary>\n            The triangles hash code.\n            </summary>\n            <returns>The triangles hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.ToString\">\n            <summary>\n            The triangle as a string.\n            </summary>\n            <returns>The triangle as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3d.Round(System.Int32)\">\n            <summary>\n            Round the triangles points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.Triangle3f\">\n            <summary>\n            A 3D triangle.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3f.A\">\n            <summary>\n            The triangles first point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3f.B\">\n            <summary>\n            The triangles second point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.Triangle3f.C\">\n            <summary>\n            The triangles third point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.#ctor(CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f,CGALDotNetGeometry.Numerics.Point3f)\">\n            <summary>\n            Create a new triangle.\n            </summary>\n            <param name=\"a\">The first point.</param>\n            <param name=\"b\">The second point.</param>\n            <param name=\"c\">The third point.</param>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.#ctor(System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single,System.Single)\">\n            <summary>\n            Create a new triangle.\n            </summary>\n            <param name=\"ax\">The first points x value.</param>\n            <param name=\"ay\">The first points y value.</param>\n            <param name=\"az\">The first points z value.</param>\n            <param name=\"bx\">The second points x value.</param>\n            <param name=\"by\">The second points y value.</param>\n            <param name=\"bz\">The second points z value.</param>\n            <param name=\"cx\">The third points x value.</param>\n            <param name=\"cy\">The third points y value.</param>\n            <param name=\"cz\">The third points z value.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle3f.Bounds\">\n            <summary>\n            The bounding box of the triangle.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.Triangle3f.Item(System.Int32)\">\n            <summary>\n            Array acess to the triangles points.\n            </summary>\n            <param name=\"i\">The index of the point to access (0-2)</param>\n            <returns>The point at index i.</returns>\n            <exception cref=\"T:System.IndexOutOfRangeException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.Equals(System.Object)\">\n            <summary>\n            Is the triangle equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the triangle equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.Equals(CGALDotNetGeometry.Shapes.Triangle3f)\">\n            <summary>\n            Is the triangle equal to the other triangle.\n            </summary>\n            <param name=\"tri\">The other triangle.</param>\n            <returns>Is the triangle equal to the other triangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.GetHashCode\">\n            <summary>\n            The triangles hash code.\n            </summary>\n            <returns>The triangles hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.ToString\">\n            <summary>\n            The triangle as a string.\n            </summary>\n            <returns>The triangle as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.Triangle3f.Round(System.Int32)\">\n            <summary>\n            Round the triangles points.\n            </summary>\n            <param name=\"digits\">number of digits to round to.</param>\n        </member>\n        <member name=\"T:CGALDotNetGeometry.Shapes.TriangleIndex\">\n            <summary>\n            A triangle represented by indices instead of points.\n            The indices represent a index into a array of points.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.TriangleIndex.A\">\n            <summary>\n            The triangles first point index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.TriangleIndex.B\">\n            <summary>\n            The triangles second point index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNetGeometry.Shapes.TriangleIndex.C\">\n            <summary>\n            The triangles third point index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.TriangleIndex.#ctor(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Consturct a new triangle.\n            </summary>\n            <param name=\"a\">The triangles first point index.</param>\n            <param name=\"b\">The triangles second point index.</param>\n            <param name=\"c\">The triangles third point index.</param>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.TriangleIndex.HasNullIndex\">\n            <summary>\n            Does the triangle have a null index.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNetGeometry.Shapes.TriangleIndex.Reversed\">\n            <summary>\n            The triangle reversed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.TriangleIndex.Equals(System.Object)\">\n            <summary>\n            Is the triangle equal to this object.\n            </summary>\n            <param name=\"obj\">The object.</param>\n            <returns>Is the triangle equal to this object.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.TriangleIndex.Equals(CGALDotNetGeometry.Shapes.TriangleIndex)\">\n            <summary>\n            Is the triangle equal to the other triangle.\n            </summary>\n            <param name=\"tri\">The other triangle.</param>\n            <returns>Is the triangle equal to the other triangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.TriangleIndex.GetHashCode\">\n            <summary>\n            The triangles hash code.\n            </summary>\n            <returns>The triangles hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNetGeometry.Shapes.TriangleIndex.ToString\">\n            <summary>\n            The triangle as a string.\n            </summary>\n            <returns>The triangle as a string.</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrFace2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Arrangements\n{\n    public struct ArrFace2\n    {\n        public bool IsFictitious;\n\n        public bool IsUnbounded;\n\n        public bool HasOuterEdges;\n\n        public int HoleCount;\n\n        public int Index;\n\n        public int HalfEdgeIndex;\n\n        public override string ToString()\n        {\n            return string.Format(\"[ArrFace2: Index={0}, HalfEdgeIndex={1}, IsFictitious={2}, IsUnbounded={3}, HasOuterEdges={4}, HoleCount={5}]\",\n                Index, HalfEdgeIndex, IsFictitious, IsUnbounded, HasOuterEdges, HoleCount);\n        }\n\n        public IEnumerable<ArrHalfedge2> EnumerateEdges(Arrangement2 arr)\n        {\n            int count = arr.HalfEdgeCount;\n\n            if (HalfEdgeIndex >= 0 && HalfEdgeIndex < count)\n            {\n                ArrHalfedge2 edge;\n                arr.GetHalfEdge(HalfEdgeIndex, out edge);\n\n                foreach (var e in edge.EnumerateEdges(arr))\n                    yield return e;\n            }\n            else\n            {\n                yield break;\n            }\n        }\n\n        public IEnumerable<ArrVertex2> EnumerateVertices(Arrangement2 arr)\n        {\n            int count = arr.HalfEdgeCount;\n\n            if (HalfEdgeIndex >= 0 && HalfEdgeIndex < count)\n            {\n                ArrHalfedge2 edge;\n                arr.GetHalfEdge(HalfEdgeIndex, out edge);\n\n                foreach (var e in edge.EnumerateVertices(arr))\n                    yield return e;\n            }\n            else\n            {\n                yield break;\n            }\n        }\n    \n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrHalfEdge2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    public struct ArrHalfedge2\n    {\n        public bool IsFictitious;\n\n        public int Index;\n\n        public int SourceIndex;\n\n        public int TargetIndex;\n\n        public int FaceIndex;\n\n        public int NextIndex;\n\n        public int PreviousIndex;\n\n        public int TwinIndex;\n\n        public override string ToString()\n        {\n            return string.Format(\"[ArrHalfEdge2: Index={0}, FaceIndex={1}, IsFictitious={2}]\",\n                Index, FaceIndex, IsFictitious);\n        }\n\n        public Segment2d GetSegment(ArrVertex2[] vertices)\n        {\n            if (SourceIndex == CGALGlobal.NULL_INDEX)\n                throw new ArgumentException(\"Source index is null\");\n\n            if (TargetIndex == CGALGlobal.NULL_INDEX)\n                throw new ArgumentException(\"Target index is null\");\n\n            var a = vertices[SourceIndex].Point;\n            var b = vertices[TargetIndex].Point;\n            \n            return new Segment2d(a, b);\n        }\n\n        public IEnumerable<ArrHalfedge2> EnumerateEdges(Arrangement2 arr)\n        {\n            var start = this;\n            var e = start;\n\n            int count = arr.HalfEdgeCount;\n\n            do\n            {\n                yield return e;\n\n                if (e.NextIndex >= 0 && e.NextIndex < count)\n                    arr.GetHalfEdge(e.NextIndex, out e);\n                else\n                    yield break;\n\n            }\n            while (e.Index != start.Index);\n        }\n\n        public IEnumerable<ArrVertex2> EnumerateVertices(Arrangement2 arr)\n        {\n            var start = this;\n            var e = start;\n\n            int vertCount = arr.VertexCount;\n            int edgeCount = arr.HalfEdgeCount;\n\n            do\n            {\n                if (e.SourceIndex >= 0 && e.SourceIndex < vertCount)\n                {\n                    ArrVertex2 vert;\n                    arr.GetVertex(e.SourceIndex, out vert);\n                    yield return vert;\n                }\n\n                if (e.NextIndex >= 0 && e.NextIndex < edgeCount)\n                    arr.GetHalfEdge(e.NextIndex, out e);\n                else\n                    yield break;\n            }\n            while (e.Index != start.Index);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrQuery.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Arrangements\n{\n    public enum ARR_LOCATOR\n    {\n        NONE,\n        NAIVE,\n        WALK,\n        LANDMARKS,\n        TRAPEZOID\n    };\n\n    public enum ARR_ELEMENT_HIT\n    {\n        NONE,\n        VERTEX,\n        HALF_EDGE,\n        FACE\n    };\n\n    public struct ArrQuery\n    {\n        public ARR_ELEMENT_HIT Element;\n\n        public int Index;\n\n        public override string ToString()\n        {\n            return string.Format(\"[ArrQuery: Element={0}, Index={1}]\", Element, Index);\n        }\n    }\n \n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrVertex2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n\n    public struct ArrVertex2\n    {\n        public Point2d Point;\n\n        public int Degree;\n\n        public bool IsIsolated;\n\n        public int Index;\n\n        public int FaceIndex;\n\n        public int HalfEdgeIndex;\n\n        public override string ToString()\n        {\n            return string.Format(\"[ArrVertex2: Point={0}, Index={1}, FaceIndex={2}, Degree={3}, IsIsolated={4}]\",\n                Point, Index, FaceIndex, Degree, IsIsolated);\n        }\n\n        public IEnumerable<ArrHalfedge2> EnumerateHalfedges(Arrangement2 arr)\n        {\n            ArrHalfedge2 start;\n            arr.GetHalfEdge(HalfEdgeIndex, out start);\n            ArrHalfedge2 e = start;\n\n            int count = arr.HalfEdgeCount;\n\n            do\n            {\n                yield return e;\n\n                ArrHalfedge2 twin, next;\n\n                if (e.TwinIndex >= 0 && e.TwinIndex < count)\n                    arr.GetHalfEdge(e.TwinIndex, out twin);\n                else\n                    yield break;\n\n                if (e.NextIndex >= 0 && e.NextIndex < count)\n                    arr.GetHalfEdge(twin.NextIndex, out next);\n                else\n                    yield break;\n\n                e = next;\n            }\n            while (e.Index != start.Index);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/Arrangement2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Triangulations;\nusing CGALDotNet.Meshing;\n\nnamespace CGALDotNet.Arrangements\n{\n\n    /// <summary>\n    /// The generic arrangment class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Arrangement2<K> : Arrangement2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public Arrangement2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a arrangement from a unmanaged ptr.\n        /// </summary>\n        /// <param name=\"ptr\">The unmanaged pointer.</param>\n        internal Arrangement2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The arrangement as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Arrangement2<{0}>: Vertices={1}, HalfEdges={2}, Faces={3}, Locator={4}]\",\n                Kernel.Name, VertexCount, HalfEdgeCount, FaceCount, Locator);\n        }\n\n        /// <summary>\n        /// Assigns the contents of another arrangement. \n        /// </summary>\n        /// <param name=\"other\">The other arrangement.</param>\n        public void Assign(Arrangement2<K> other)\n        {\n            Kernel.Assign(Ptr, other.Ptr);\n        }\n\n        /// <summary>\n        /// Computes the overlay of two arrangements and return as a new arrangement.\n        /// </summary>\n        /// <param name=\"other\">The other arrangement.</param>\n        /// <returns>The overlay of both arrangements.</returns>\n        public Arrangement2<K> Overlay(Arrangement2<K> other)\n        {\n            var ptr = Kernel.Overlay(Ptr, other.Ptr);\n            return new Arrangement2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Create a deep copy of this arrangment.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Arrangement2<K> Copy()\n        {\n            var copy = new Arrangement2<K>();\n            Kernel.Assign(copy.Ptr, Ptr);\n            return copy;\n        }\n\n        /// <summary>\n        /// Insert the polygon into this arrangement.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon.</param>\n        /// <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        public void InsertPolygon(Polygon2<K> polygon, bool nonIntersecting)\n        {\n            Kernel.InsertPolygon(Ptr, polygon.Ptr, nonIntersecting);\n        }\n\n        /// <summary>\n        /// Insert the polygon into this arrangement.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon.</param>\n        /// <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        public void InsertPolygon(PolygonWithHoles2<K> polygon, bool nonIntersecting)\n        {\n            Kernel.InsertPolygon(Ptr, polygon.Ptr, nonIntersecting);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract base class.\n    /// </summary>\n    public abstract class Arrangement2 : CGALObject\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        private Arrangement2()\n        {\n            CreateLocator(ARR_LOCATOR.WALK);   \n        }\n\n        /// <summary>\n        /// Create a arrangement from the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The kernel.</param>\n        internal Arrangement2(CGALKernel kernel)\n        {\n            Kernel = kernel.ArrangementKernel2;\n            Ptr = Kernel.Create();\n            CreateLocator(ARR_LOCATOR.WALK);\n        }\n\n        /// <summary>\n        /// Create a arrangement from the kernel and unmanaged pointer.\n        /// </summary>\n        /// <param name=\"kernel\">The kernel.</param>\n        /// <param name=\"ptr\">The unmanaged pointer.</param>\n        internal Arrangement2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.ArrangementKernel2;\n            CreateLocator(ARR_LOCATOR.WALK);\n        }\n\n        /// <summary>\n        /// The arrangements kernel.\n        /// </summary>\n        protected private ArrangementKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// The number of vertices in the arrangement.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// The number of vertices in the arrangement that are i\n        /// </summary>\n        public int IsolatedVerticesCount => Kernel.IsolatedVerticesCount(Ptr);\n\n        /// <summary>\n        /// returns the number of arrangement vertices that lie at infinity a\n        /// nd are not associated with valid points.\n        /// Such vertices are not considered to be regular arrangement \n        /// vertices and VertexCount does not count them.\n        /// </summary>\n        public int VerticesAtInfinityCount => Kernel.VerticesAtInfinityCount(Ptr);\n\n        /// <summary>\n        /// The number of half edges.\n        /// </summary>\n        public int HalfEdgeCount => Kernel.HalfEdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of edges. two half edges count as one edge.\n        /// </summary>\n        public int EdgeCount => Kernel.EdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of faces in the arrangement not counting\n        /// the unbounded face.\n        /// </summary>\n        public int FaceCount => Kernel.FaceCount(Ptr) - UnboundedFaceCount;\n\n        /// <summary>\n        /// returns the number of unbounded faces in the arrangement.\n        /// Such faces are not considered to be regular arrangement \n        /// faces and FaceCount does not count them.\n        /// </summary>\n        public int UnboundedFaceCount => Kernel.UnboundedFaceCount(Ptr);\n\n        /// <summary>\n        /// The type of locator used to find element \n        /// in the arrangement when queried.\n        /// Default is walk which is the best in most cases\n        /// </summary>\n        public ARR_LOCATOR Locator { get; private set; }\n\n        /// <summary>\n        /// Is the arrangement empty.\n        /// </summary>\n        public bool IsEmpty => Kernel.IsEmpty(Ptr);\n\n        /// <summary>\n        /// A number that will change if the unmanaged \n        /// arrangement model changes.\n        /// </summary>\n        public int BuildStamp => Kernel.BuildStamp(Ptr);\n\n        /// <summary>\n        /// Clear the arrangement.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// In particular, the functions checks the topological structure of the arrangement \n        /// and assures that it is valid. In addition, the function performs several simple \n        /// geometric tests to ensure the validity of some of the geometric properties of \n        /// the arrangement. Namely, it checks that all arrangement vertices are associated \n        /// with distinct points, and that the halfedges around every vertex are ordered clockwise.\n        /// </summary>\n        /// <returns></returns>\n        public bool IsValid()\n        {\n            return Kernel.IsValid(Ptr);\n        }\n\n        /// <summary>\n        /// Get a copy of all the points in the arrangement.\n        /// </summary>\n        /// <param name=\"points\">A point array that is the length of the vertex count.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get a copy of all the segments in the arrangment.\n        /// </summary>\n        /// <param name=\"segments\">A segment array that is the length of the edge count.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetSegments(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get a copy of all the vertices in the arrangement.\n        /// </summary>\n        /// <param name=\"vertices\">A vertices array that is the length of the vertex count.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetVertices(ArrVertex2[] vertices, int count)\n        {\n            ErrorUtil.CheckArray(vertices, count);\n            Kernel.GetVertices(Ptr, vertices, count);\n        }\n\n        /// <summary>\n        /// Get the vertex from the arrangement.\n        /// </summary>\n        /// <param name=\"index\">The index of the vertex.</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool GetVertex(int index, out ArrVertex2 vertex)\n        {\n            return Kernel.GetVertex(Ptr, index, out vertex);\n        }\n\n        /// <summary>\n        /// Get a copy of all the half edges in the arrangement.\n        /// </summary>\n        /// <param name=\"edges\">A half edge array that is the length of the half edge count.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetHalfEdges(ArrHalfedge2[] edges, int count)\n        {\n            ErrorUtil.CheckArray(edges, count);\n            Kernel.GetHalfEdges(Ptr, edges, count);\n        }\n\n        /// <summary>\n        /// Get the half edge from the arrangement.\n        /// </summary>\n        /// <param name=\"index\">The index of the half edge.</param>\n        /// <param name=\"edge\">The half edge.</param>\n        /// <returns>True if the half edge was found.</returns>\n        public bool GetHalfEdge(int index, out ArrHalfedge2 edge)\n        {\n            return Kernel.GetHalfEdge(Ptr, index, out edge);\n        }\n\n        /// <summary>\n        /// Get a copy of all the faces in the arrangement.\n        /// </summary>\n        /// <param name=\"faces\">A face array that is the length of the facee count.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetFaces(ArrFace2[] faces, int count)\n        {\n            ErrorUtil.CheckArray(faces, count);\n            Kernel.GetFaces(Ptr, faces, count);\n        }\n\n        /// <summary>\n        /// Get the face from the arrangement.\n        /// </summary>\n        /// <param name=\"index\">The index of the half edge.</param>\n        /// <param name=\"face\">The face.</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetFace(int index, out ArrFace2 face)\n        {\n            return Kernel.GetFace(Ptr, index, out face);\n        }\n\n        /// <summary>\n        /// Create the locator used to find query the arrangement.\n        /// </summary>\n        /// <param name=\"locator\">The locator type.</param>\n        public void CreateLocator(ARR_LOCATOR locator)\n        {\n            if (Locator == locator)\n                return;\n\n            Locator = locator;\n            Kernel.CreateLocator(Ptr, locator);\n        }\n\n        /// <summary>\n        /// Release the locator. Default will be used..\n        /// Default is walk which is the best in most cases.\n        /// </summary>\n        public void ReleaseLocator()\n        {\n            if (Locator == ARR_LOCATOR.NONE)\n                return;\n\n            Locator = ARR_LOCATOR.NONE;\n            Kernel.ReleaseLocator(Ptr);\n        }\n\n        /// <summary>\n        /// Query what the point hits in the arrangment.\n        /// </summary>\n        /// <param name=\"point\">The point to query.</param>\n        /// <param name=\"result\">What was hit.</param>\n        /// <returns>True if something was hit.</returns>\n        public bool PointQuery(Point2d point, out ArrQuery result)\n        {\n            return Kernel.PointQuery(Ptr, point, out result);\n        }\n\n        /// <summary>\n        /// Query multiple points in the arrangment.\n        /// </summary>\n        /// <param name=\"points\">The points to query.</param>\n        /// <param name=\"results\">The results for each point.</param>\n        /// <returns>True if any point hit something.</returns>\n        public bool BatchedPointQuery(Point2d[] points, ArrQuery[] results)\n        {\n            ErrorUtil.CheckArray(points, points.Length);\n            ErrorUtil.CheckArray(results, results.Length);\n\n            return Kernel.BatchedPointQuery(Ptr, points, results, points.Length);\n        }\n\n        /// <summary>\n        /// Query using a ray going up or down (y axis) from the query point.\n        /// </summary>\n        /// <param name=\"point\">The point to start at.</param>\n        /// <param name=\"up\">True to shoot ray up, false to shoot down.</param>\n        /// <param name=\"result\">The result of what was hits.</param>\n        /// <returns>True if some thing was hit.</returns>\n        public bool VerticalRayQuery(Point2d point, bool up, out ArrQuery result)\n        {\n            return Kernel.RayQuery(Ptr, point, up, out result);\n        }\n\n        /// <summary>\n        /// Locate the vertex at this point.\n        /// </summary>\n        /// <param name=\"point\">The point to locate vertex at.</param>\n        /// <param name=\"vert\">The vertex.</param>\n        /// <returns>True if a vertex was located.</returns>\n        public bool LocateVertex(Point2d point, out ArrVertex2 vert)\n        {\n            vert = new ArrVertex2();\n            if (Kernel.PointQuery(Ptr, point, out ArrQuery result))\n            {\n                if (result.Element == ARR_ELEMENT_HIT.VERTEX)\n                {\n                    Kernel.GetVertex(Ptr, result.Index, out vert);\n                    return true;\n                }\n                else\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Locate the closest vertex in the hit face\n        /// </summary>\n        /// <param name=\"point\">The point</param>\n        /// <param name=\"radius\">The radius te closest vertex has to be within.</param>\n        /// <param name=\"vertex\">The closest vertex.</param>\n        /// <returns>True if point hit a face and found a vertex.</returns>\n        public bool LocateVertex(Point2d point, double radius, out ArrVertex2 vertex)\n        {\n            //Locate the face the point hit.\n            vertex = new ArrVertex2();\n            if (LocateFace(point, out ArrFace2 face))\n            {\n                //Find the closest vertex in the face to the point.\n                double min = double.PositiveInfinity;\n                var closest = new ArrVertex2();\n\n                foreach (var vert in face.EnumerateVertices(this))\n                {\n                    if (vert.Index == -1) continue;\n\n                    var sqdist = Point2d.SqrDistance(vert.Point, point);\n                    if (sqdist < min)\n                    {\n                        min = sqdist;\n                        closest = vert;\n                    }\n\n                }\n\n                if (min == double.PositiveInfinity || min > radius * radius)\n                    return false;\n                else\n                {\n                    vertex = closest;\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Locate the edge at this point.\n        /// </summary>\n        /// <param name=\"point\">The point to locate edge at.</param>\n        /// <param name=\"edge\">The edge.</param>\n        /// <returns>True if a edge was located.</returns>\n        public bool LocateEdge(Point2d point, out ArrHalfedge2 edge)\n        {\n            edge = new ArrHalfedge2();\n            if (Kernel.PointQuery(Ptr, point, out ArrQuery result))\n            {\n                if (result.Element == ARR_ELEMENT_HIT.HALF_EDGE)\n                {\n                    Kernel.GetHalfEdge(Ptr, result.Index, out edge);\n                    return true;\n                }\n                else\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Locate the closest edge in the hit face.\n        /// </summary>\n        /// <param name=\"point\">The point</param>\n        /// <param name=\"edge\">The closest edge.</param>\n        /// <param name=\"radius\">The radius from the point a edge counts as being clicked on.</param>\n        /// <returns>True if the point hit a face and found a edge.</returns>\n        public bool LocateEdge(Point2d point, double radius, out ArrHalfedge2 edge)\n        {\n            //Locate the face the point hit.\n            edge = new ArrHalfedge2();\n            if (LocateFace(point, out ArrFace2 face))\n            {\n                //Find the closest edge to the point in the face.\n                double min = double.PositiveInfinity;\n                var closest = new ArrHalfedge2();\n\n                foreach (var e in face.EnumerateEdges(this))\n                {\n                    ArrVertex2 v1, v2;\n                    if (!GetVertex(e.SourceIndex, out v1)) continue;\n                    if (!GetVertex(e.TargetIndex, out v2)) continue;\n\n                    var seg = new Segment2d(v1.Point, v2.Point);\n                    var sqdist = seg.SqrDistance(point);\n\n                    if (sqdist < min)\n                    {\n                        min = sqdist;\n                        closest = e;\n                    }\n\n                }\n\n                if (min == double.PositiveInfinity || min > radius * radius)\n                    return false;\n                else\n                {\n                    edge = closest;\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Locate the faces at this point.\n        /// </summary>\n        /// <param name=\"point\">The point to locate face at.</param>\n        /// <param name=\"face\">The face.</param>\n        /// <returns>True if a face was located.</returns>\n        public bool LocateFace(Point2d point, out ArrFace2 face)\n        {\n            face = new ArrFace2();\n            if(Kernel.PointQuery(Ptr, point, out ArrQuery result))\n            {\n                if(result.Element == ARR_ELEMENT_HIT.FACE)\n                {\n                    Kernel.GetFace(Ptr, result.Index, out face);\n                    return true;\n                }\n                else\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Find if the arrangement has a element that intersects the segment.\n        /// </summary>\n        /// <param name=\"segment\">The segment.</param>\n        /// <returns>True if the segment intersects something in the arrangement.</returns>\n        public bool IntersectsSegment(Segment2d segment)\n        {\n            return Kernel.IntersectsSegment(Ptr, segment);\n        }\n\n        /// <summary>\n        /// Inserts a given point into a given arrangement.\n        /// It uses a given point-location object to locate the given point in the given arrangement.\n        /// If the point conincides with an existing vertex, there is nothing left to do. if it lies \n        /// on an edge, the edge is split at the point. Otherwise, the point is contained inside a face, \n        /// and is inserted as an isolated vertex inside this face.\n        /// </summary>\n        /// <param name=\"point\">The point to insert.</param>\n        public void InsertPoint(Point2d point)\n        {\n            Kernel.InsertPoint(Ptr, point);\n        }\n\n        /// <summary>\n        /// Insert the segment in to the arrangement.\n        /// </summary>\n        /// <param name=\"a\">The segments start point.</param>\n        /// <param name=\"b\">The segments end point.</param>\n        /// <param name=\"nonIntersecting\">True if the segment is know not to \n        /// hit anything currently in the arrangement.</param>\n        public void InsertSegment(Point2d a, Point2d b, bool nonIntersecting)\n        {\n            Kernel.InsertSegment(Ptr, new Segment2d(a, b), nonIntersecting);\n        }\n\n        /// <summary>\n        /// Insert a segment into the arrangement.\n        /// </summary>\n        /// <param name=\"segment\"></param>\n        /// <param name=\"nonIntersecting\">True if the segment is know not to \n        /// hit anything currently in the arrangement.</param>\n        public void InsertSegment(Segment2d segment, bool nonIntersecting)\n        {\n            Kernel.InsertSegment(Ptr, segment, nonIntersecting);\n        }\n\n        /// <summary>\n        /// Insert a array of segments into the arrangement.\n        /// </summary>\n        /// <param name=\"segments\">The segment array</param>\n        /// <param name=\"count\">The segment arrays length.</param>\n        /// <param name=\"nonIntersecting\">True if the segments are known not to \n        /// hit anything currently in the arrangement.</param>\n        public void InsertSegments(Segment2d[] segments, int count, bool nonIntersecting)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.InsertSegments(Ptr, segments, count, nonIntersecting);\n        }\n\n        /// <summary>\n        /// Attempts to removed a given vertex from a given arrangement.\n        /// The vertex can be removed if it is either an isolated vertex, \n        /// (and has no incident edge,) or if it is a redundant vertex.That is, \n        /// it has exactly two incident edges, whose associated curves can be \n        /// merged to form a single x-monotone curve.The function returns a \n        /// boolean value that indicates whether it succeeded removing the \n        /// vertex from the arrangement.\n        /// </summary>\n        /// <param name=\"index\">The index of the vertex in the arrangement.</param>\n        /// <returns>True if the vertex was removed.</returns>\n        public bool RemoveVertex(int index)\n        {\n            return Kernel.RemoveVertexByIndex(Ptr, index);\n        }\n\n        /// <summary>\n        /// Attempts to removed a given vertex from a given arrangement.\n        /// The vertex can be removed if it is either an isolated vertex, \n        /// (and has no incident edge,) or if it is a redundant vertex.That is, \n        /// it has exactly two incident edges, whose associated curves can be \n        /// merged to form a single x-monotone curve.The function returns a \n        /// boolean value that indicates whether it succeeded removing the \n        /// vertex from the arrangement.\n        /// </summary>\n        /// <param name=\"point\">The poisition of the vertex in the arrangement.</param>\n        /// <returns>True if the vertex was removed.</returns>\n        public bool RemoveVertex(Point2d point)\n        {\n            return Kernel.RemoveVertexByPoint(Ptr, point);\n        }\n\n        /// <summary>\n        /// Removes an edge at the index from the arrangement.\n        /// Once the edge is removed, if the vertices associated with its endpoints \n        /// become isolated, they are removed as well.\n        /// </summary>\n        /// <param name=\"index\">The index of the one of the half edges in the arrangement.</param>\n        /// <returns>True if the edge was removed.</returns>\n        public bool RemoveEdge(int index)\n        {\n            return Kernel.RemoveEdgeByIndex(Ptr, index);\n        }\n\n        /// <summary>\n        /// Removes an edge at the index from the arrangement.\n        /// Once the edge is removed, if the vertices associated with its endpoints \n        /// become isolated, they are removed as well.\n        /// </summary>\n        /// <param name=\"segment\">A segment with the same positions as the edge in the arrangement.</param>\n        /// <returns>True if the edge was removed.</returns>\n        public bool RemoveEdge(Segment2d segment)\n        {\n            return Kernel.RemoveEdgeBySegment(Ptr, segment);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"printElements\"></param>\n        public void Print(StringBuilder builder, bool printElements)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Isolated Vertex Count = \" + IsolatedVerticesCount);\n            builder.AppendLine(\"Vertex at Infinity Count = \" + VerticesAtInfinityCount);\n            builder.AppendLine(\"Edge Count = \" + EdgeCount);\n            builder.AppendLine(\"Unbounded Face Count = \" + UnboundedFaceCount);\n\n            if (printElements)\n            {\n                builder.AppendLine();\n\n                PrintVertices(builder);\n                PrintHalfEdges(builder);\n                PrintFaces(builder);\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Isolated Vertex Count = \" + IsolatedVerticesCount);\n            builder.AppendLine(\"Vertex at Infinity Count = \" + VerticesAtInfinityCount);\n            builder.AppendLine(\"Edge Count = \" + EdgeCount);\n            builder.AppendLine(\"Unbounded Face Count = \" + UnboundedFaceCount);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintVertices(StringBuilder builder)\n        {\n            builder.AppendLine(\"Arrangement Vertices.\\n\");\n\n            var vertices = new ArrVertex2[VertexCount];\n            GetVertices(vertices, vertices.Length);\n\n            foreach (var v in vertices)\n            {\n                builder.AppendLine(v.ToString());\n                builder.AppendLine(\"Index = \" + v.Index);\n                builder.AppendLine(\"Face Index = \" + v.FaceIndex);\n                builder.AppendLine(\"HalfEdge Index = \" + v.HalfEdgeIndex);\n                builder.AppendLine();\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintHalfEdges(StringBuilder builder)\n        {\n            builder.AppendLine(\"Arrangement Half Edges.\\n\");\n\n            var edges = new ArrHalfedge2[HalfEdgeCount];\n            GetHalfEdges(edges, edges.Length);\n\n            foreach (var e in edges)\n            {\n                builder.AppendLine(e.ToString());\n                builder.AppendLine(\"Index = \" + e.Index);\n                builder.AppendLine(\"Source Index = \" + e.SourceIndex);\n                builder.AppendLine(\"Target Index = \" + e.TargetIndex);\n                builder.AppendLine(\"Face Index = \" + e.FaceIndex);\n                builder.AppendLine(\"Next Index = \" + e.NextIndex);\n                builder.AppendLine(\"Previous Index = \" + e.PreviousIndex);\n                builder.AppendLine(\"Twin Index = \" + e.TwinIndex);\n                builder.AppendLine();\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintFaces(StringBuilder builder)\n        {\n            builder.AppendLine(\"Arrangement Faces.\\n\");\n\n            var faces = new ArrFace2[FaceCount];\n            GetFaces(faces, faces.Length);\n\n            foreach (var e in faces)\n            {\n                builder.AppendLine(e.ToString());\n                builder.AppendLine(\"Index = \" + e.Index);\n                builder.AppendLine(\"HalfEdge Index = \" + e.HalfEdgeIndex);\n                builder.AppendLine();\n            }\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrangementKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    internal abstract class ArrangementKernel2 : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract bool IsValid(IntPtr ptr);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract bool IsEmpty(IntPtr ptr);\n\n        internal abstract int BuildStamp(IntPtr ptr);\n\n        internal abstract void Assign(IntPtr ptr, IntPtr ptrOther);\n\n        internal abstract IntPtr Overlay(IntPtr ptr, IntPtr ptrOther);\n\n        internal abstract int VertexCount(IntPtr ptr);\n\n        internal abstract int IsolatedVerticesCount(IntPtr ptr);\n\n        internal abstract int VerticesAtInfinityCount(IntPtr ptr);\n\n        internal abstract int HalfEdgeCount(IntPtr ptr);\n\n        internal abstract int FaceCount(IntPtr ptr);\n\n        internal abstract int EdgeCount(IntPtr ptr);\n\n        internal abstract int UnboundedFaceCount(IntPtr ptr);\n\n        internal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n        \n        internal abstract void GetSegments(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void GetVertices(IntPtr ptr, ArrVertex2[] vertices, int count);\n\n        internal abstract bool GetVertex(IntPtr ptr, int index, out ArrVertex2 arrVertex);\n\n        internal abstract void GetHalfEdges(IntPtr ptr, ArrHalfedge2[] edges, int count);\n\n        internal abstract bool GetHalfEdge(IntPtr ptr, int index, out ArrHalfedge2 arrEdge);\n\n        internal abstract void GetFaces(IntPtr ptr, ArrFace2[] faces, int count);\n\n        internal abstract bool GetFace(IntPtr ptr, int index, out ArrFace2 arrFace);\n\n        internal abstract int GetFaceHoleCount(IntPtr ptr, int index);\n\n        internal abstract int GetHoleVertexCount(IntPtr ptr, int faceIndex, int holeIndex);\n\n        internal abstract void CreateLocator(IntPtr ptr, ARR_LOCATOR type);\n\n        internal abstract void ReleaseLocator(IntPtr ptr);\n\n        internal abstract bool PointQuery(IntPtr ptr, Point2d point, out ArrQuery result);\n\n        internal abstract bool BatchedPointQuery(IntPtr ptr, Point2d[] points, ArrQuery[] results, int count);\n\n        internal abstract bool RayQuery(IntPtr ptr, Point2d point, bool up, out ArrQuery result);\n\n        internal abstract bool IntersectsSegment(IntPtr ptr, Segment2d segment);\n\n        internal abstract void InsertPoint(IntPtr ptr, Point2d point);\n\n        internal abstract void InsertPolygon(IntPtr ptr, IntPtr polyPtr, bool nonItersecting);\n\n        internal abstract void InsertPolygonWithHoles(IntPtr ptr, IntPtr pwhPtr, bool nonItersecting);\n\n        internal abstract void InsertSegment(IntPtr ptr, Segment2d segment, bool nonItersecting);\n\n        internal abstract void InsertSegments(IntPtr ptr, Segment2d[] segments, int count, bool nonItersecting);\n\n        internal abstract bool RemoveVertexByIndex(IntPtr ptr, int index);\n\n        internal abstract bool RemoveVertexByPoint(IntPtr ptr, Point2d point);\n\n        internal abstract bool RemoveEdgeByIndex(IntPtr ptr, int index);\n\n        internal abstract bool RemoveEdgeBySegment(IntPtr ptr, Segment2d segment);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/ArrangementKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    internal class ArrangementKernel2_EEK : ArrangementKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly ArrangementKernel2 Instance = new ArrangementKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return Arrangement2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Arrangement2_EEK_Release(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr)\n        {\n            return Arrangement2_EEK_IsValid(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Arrangement2_EEK_Clear(ptr);\n        }\n\n        internal override bool IsEmpty(IntPtr ptr)\n        {\n            return Arrangement2_EEK_IsEmpty(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return Arrangement2_EEK_BuildStamp(ptr);\n        }\n\n        internal override void Assign(IntPtr ptr, IntPtr ptrOther)\n        {\n            Arrangement2_EEK_Assign(ptr, ptrOther);\n        }\n\n        internal override IntPtr Overlay(IntPtr ptr, IntPtr ptrOther)\n        {\n            return Arrangement2_EEK_Overlay(ptr, ptrOther);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_VertexCount(ptr);\n        }\n\n        internal override int IsolatedVerticesCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_IsolatedVerticesCount(ptr);\n        }\n\n        internal override int VerticesAtInfinityCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_VerticesAtInfinityCount(ptr);\n        }\n\n        internal override int HalfEdgeCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_HalfEdgeCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_FaceCount(ptr);\n        }\n\n        internal override int EdgeCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_EdgeCount(ptr);\n        }\n\n        internal override int UnboundedFaceCount(IntPtr ptr)\n        {\n            return Arrangement2_EEK_UnboundedFaceCount(ptr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Arrangement2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            Arrangement2_EEK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void GetVertices(IntPtr ptr, ArrVertex2[] vertices, int count)\n        {\n            Arrangement2_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out ArrVertex2 arrVertex)\n        {\n            return Arrangement2_EEK_GetVertex(ptr, index, out arrVertex);\n        }\n\n        internal override void GetHalfEdges(IntPtr ptr, ArrHalfedge2[] edges, int count)\n        {\n            Arrangement2_EEK_GetHalfEdges(ptr, edges, count);\n        }\n\n        internal override bool GetHalfEdge(IntPtr ptr, int index, out ArrHalfedge2 arrEdge)\n        {\n            return Arrangement2_EEK_GetHalfEdge(ptr, index, out arrEdge);\n        }\n\n        internal override void GetFaces(IntPtr ptr, ArrFace2[] faces, int count)\n        {\n            Arrangement2_EEK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out ArrFace2 arrFace)\n        {\n            return Arrangement2_EEK_GetFace(ptr, index, out arrFace);\n        }\n\n        internal override int GetFaceHoleCount(IntPtr ptr, int index)\n        {\n            return Arrangement2_EEK_GetFaceHoleCount(ptr, index);\n        }\n\n        internal override int GetHoleVertexCount(IntPtr ptr, int faceIndex, int holeIndex)\n        {\n            return Arrangement2_EEK_GetHoleVertexCount(ptr, faceIndex, holeIndex);\n        }\n\n        internal override void CreateLocator(IntPtr ptr, ARR_LOCATOR type)\n        {\n            Arrangement2_EEK_CreateLocator(ptr, type);\n        }\n\n        internal override void ReleaseLocator(IntPtr ptr)\n        {\n            Arrangement2_EEK_ReleaseLocator(ptr);\n        }\n\n        internal override bool PointQuery(IntPtr ptr, Point2d point, out ArrQuery result)\n        {\n            return Arrangement2_EEK_PointQuery(ptr, point, out result);\n        }\n\n        internal override bool BatchedPointQuery(IntPtr ptr, Point2d[] points, ArrQuery[] results, int count)\n        {\n            return Arrangement2_EEK_BatchedPointQuery(ptr, points, results, count);\n        }\n\n        internal override bool RayQuery(IntPtr ptr, Point2d point, bool up, out ArrQuery result)\n        {\n            return Arrangement2_EEK_RayQuery(ptr, point, up, out result);\n        }\n\n        internal override bool IntersectsSegment(IntPtr ptr, Segment2d segment)\n        {\n            return Arrangement2_EEK_IntersectsSegment(ptr, segment);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            Arrangement2_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPolygon(IntPtr ptr, IntPtr polyPtr, bool nonItersecting)\n        {\n            Arrangement2_EEK_InsertPolygon(ptr, polyPtr, nonItersecting);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr ptr, IntPtr pwhPtr, bool nonItersecting)\n        {\n            Arrangement2_EEK_InsertPolygonWithHoles(ptr, pwhPtr, nonItersecting);\n        }\n\n        internal override void InsertSegment(IntPtr ptr, Segment2d segment, bool nonItersecting)\n        {\n            Arrangement2_EEK_InsertSegment(ptr, segment, nonItersecting);\n        }\n\n        internal override void InsertSegments(IntPtr ptr, Segment2d[] segments, int count, bool nonItersecting)\n        {\n            Arrangement2_EEK_InsertSegments(ptr, segments, count, nonItersecting);\n        }\n\n        internal override bool RemoveVertexByIndex(IntPtr ptr, int index)\n        {\n            return Arrangement2_EEK_RemoveVertexByIndex(ptr, index);\n        }\n\n        internal override bool RemoveVertexByPoint(IntPtr ptr, Point2d point)\n        {\n            return Arrangement2_EEK_RemoveVertexByPoint(ptr, point);\n        }\n\n        internal override bool RemoveEdgeByIndex(IntPtr ptr, int index)\n        {\n            return Arrangement2_EEK_RemoveEdgeByIndex(ptr, index);\n        }\n\n        internal override bool RemoveEdgeBySegment(IntPtr ptr, Segment2d segment)\n        {\n            return Arrangement2_EEK_RemoveEdgeBySegment(ptr, segment);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Arrangement2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_IsValid(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_IsEmpty(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_Assign(IntPtr ptr, IntPtr ptrOther);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Arrangement2_EEK_Overlay(IntPtr ptr, IntPtr ptrOther);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_IsolatedVerticesCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_VerticesAtInfinityCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_HalfEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_EdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_UnboundedFaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_GetVertices(IntPtr ptr, [Out] ArrVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_GetVertex(IntPtr ptr, int index, [Out] out ArrVertex2 arrVertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_GetHalfEdges(IntPtr ptr, [Out] ArrHalfedge2[] edges, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_GetHalfEdge(IntPtr ptr, int index, [Out] out ArrHalfedge2 arrEdge);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_GetFaces(IntPtr ptr, [Out] ArrFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_GetFace(IntPtr ptr, int index, [Out] out ArrFace2 arrFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_GetFaceHoleCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Arrangement2_EEK_GetHoleVertexCount(IntPtr ptr, int faceIndex, int holeIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_CreateLocator(IntPtr ptr, ARR_LOCATOR type);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_ReleaseLocator(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_PointQuery(IntPtr ptr, Point2d point, [Out] out ArrQuery result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_BatchedPointQuery(IntPtr ptr, [Out] Point2d[] points, [Out] ArrQuery[] results, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_RayQuery(IntPtr ptr, Point2d point, bool up, [Out] out ArrQuery result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_IntersectsSegment(IntPtr ptr, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_InsertPolygon(IntPtr ptr, IntPtr polyPtr, bool nonItersecting);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_InsertPolygonWithHoles(IntPtr ptr, IntPtr pwhPtr, bool nonItersecting);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_InsertSegment(IntPtr ptr, Segment2d segment, bool nonItersecting);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Arrangement2_EEK_InsertSegments(IntPtr ptr, [In] Segment2d[] points, int count, bool nonItersecting);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_RemoveVertexByIndex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_RemoveVertexByPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_RemoveEdgeByIndex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Arrangement2_EEK_RemoveEdgeBySegment(IntPtr ptr, Segment2d segment);\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/SweepLine.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    /// <summary>\n    /// The generic sweep line class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel.</typeparam>\n    public sealed class SweepLine<K> : SweepLine where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instanceof a sweep line.\n        /// </summary>\n        public static readonly SweepLine<K> Instance = new SweepLine<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public SweepLine() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a unmanaged pointer.\n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal SweepLine(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The sweep line as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[SweepLine<{0}>: ]\", Kernel.Name);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract sweep line.\n    /// </summary>\n    public abstract class SweepLine : CGALObject\n    {\n        /// <summary>\n        /// The default sweep line.\n        /// </summary>\n        private SweepLine()\n        {\n\n        }\n\n        /// <summary>\n        /// Create from the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">A kernel that implements a sweep line.</param>\n        internal SweepLine(CGALKernel kernel)\n        {\n            Kernel = kernel.SweepLineKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Create from the kernel and unmanaged pointer.\n        /// </summary>\n        /// <param name=\"kernel\">A kernel that implements a sweep line.</param>\n        /// <param name=\"ptr\">A unmanaged pointer to a sweep line.</param>\n        internal SweepLine(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.SweepLineKernel;\n        }\n\n        /// <summary>\n        /// The sweep line kernel.\n        /// </summary>\n        protected private SweepLineKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Do any of the segments in the array intersect.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>Do any of the segments in the array intersect.</returns>\n        public bool DoIntersect(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            return Kernel.DoIntersect(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Compute all the sub segemnts from the intersection \n        /// of the segments in the array.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>The sub segments.</returns>\n        public Segment2d[] ComputeSubcurves(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n\n            int len = Kernel.ComputeSubcurves(Ptr, segments, count);\n            var subSegments = new Segment2d[len];\n\n            if (len > 0)\n            {\n                GetSegments(subSegments, len);\n                ClearSegmentBuffer();\n            }\n\n            return subSegments;\n        }\n\n        /// <summary>\n        /// Compute all the intersection points from the \n        /// segments in the array.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>The intersection points.</returns>\n        public Point2d[] ComputeIntersectionPoints(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n\n            int len = Kernel.ComputeIntersectionPoints(Ptr, segments, count);\n            var points = new Point2d[len];\n\n            if (len > 0)\n            {\n                GetPoints(points, len);\n                ClearPointBuffer();\n            }\n\n            return points;\n        }\n\n        /// <summary>\n        /// Get all the points in the point buffer.\n        /// </summary>\n        /// <param name=\"points\">A point array the size of the point buffer.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        private void GetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get all the segments in the point buffer.\n        /// </summary>\n        /// <param name=\"segments\">A segment array the size of the segment buffer.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        private void GetSegments(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Clear the point buffer.\n        /// </summary>\n        private void ClearPointBuffer()\n        {\n            Kernel.ClearPointBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// Clear the segment buffer.\n        /// </summary>\n        private void ClearSegmentBuffer()\n        {\n            Kernel.ClearSegmentBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        private int PointBufferSize()\n        {\n            return Kernel.PointBufferSize(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        private int SegmentBufferSize()\n        {\n            return Kernel.SegmentBufferSize(Ptr);\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/SweepLineKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    internal abstract class SweepLineKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract void ClearPointBuffer(IntPtr ptr);\n\n\t\tinternal abstract void ClearSegmentBuffer(IntPtr ptr);\n\n\t\tinternal abstract int PointBufferSize(IntPtr ptr);\n\n\t\tinternal abstract int SegmentBufferSize(IntPtr ptr);\n\n\t\tinternal abstract bool DoIntersect(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\tinternal abstract int ComputeSubcurves(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\tinternal abstract int ComputeIntersectionPoints(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\tinternal abstract void GetSegments(IntPtr ptr, Segment2d[] segments, int count);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/SweepLineKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    internal class SweepLineKernel_EEK : SweepLineKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly SweepLineKernel Instance = new SweepLineKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return SweepLine2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SweepLine2_EEK_Release(ptr);\n        }\n\n        internal override void ClearPointBuffer(IntPtr ptr)\n        {\n            SweepLine2_EEK_ClearPointBuffer(ptr);\n        }\n\n        internal override void ClearSegmentBuffer(IntPtr ptr)\n        {\n            SweepLine2_EEK_ClearSegmentBuffer(ptr);\n        }\n\n        internal override int PointBufferSize(IntPtr ptr)\n        {\n            return SweepLine2_EEK_PointBufferSize(ptr);\n        }\n\n        internal override int SegmentBufferSize(IntPtr ptr)\n        {\n            return SweepLine2_EEK_SegmentBufferSize(ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EEK_DoIntersect(ptr, segments, count);\n        }\n\n        internal override int ComputeSubcurves(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EEK_ComputeSubcurves(ptr, segments, count);\n        }\n\n        internal override int ComputeIntersectionPoints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EEK_ComputeIntersectionPoints(ptr, segments, count);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            SweepLine2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            SweepLine2_EEK_GetSegments(ptr, segments, count);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SweepLine2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EEK_ClearPointBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EEK_ClearSegmentBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EEK_PointBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EEK_SegmentBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SweepLine2_EEK_DoIntersect(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EEK_ComputeSubcurves(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EEK_ComputeIntersectionPoints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EEK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Arrangements/SweepLineKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Arrangements\n{\n    internal class SweepLineKernel_EIK : SweepLineKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly SweepLineKernel Instance = new SweepLineKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return SweepLine2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SweepLine2_EIK_Release(ptr);\n        }\n\n        internal override void ClearPointBuffer(IntPtr ptr)\n        {\n            SweepLine2_EIK_ClearPointBuffer(ptr);\n        }\n\n        internal override void ClearSegmentBuffer(IntPtr ptr)\n        {\n            SweepLine2_EIK_ClearSegmentBuffer(ptr);\n        }\n\n        internal override int PointBufferSize(IntPtr ptr)\n        {\n            return SweepLine2_EIK_PointBufferSize(ptr);\n        }\n\n        internal override int SegmentBufferSize(IntPtr ptr)\n        {\n            return SweepLine2_EIK_SegmentBufferSize(ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EIK_DoIntersect(ptr, segments, count);\n        }\n\n        internal override int ComputeSubcurves(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EIK_ComputeSubcurves(ptr, segments, count);\n        }\n\n        internal override int ComputeIntersectionPoints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            return SweepLine2_EIK_ComputeIntersectionPoints(ptr, segments, count);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            SweepLine2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            SweepLine2_EIK_GetSegments(ptr, segments, count);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SweepLine2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EIK_ClearPointBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EIK_ClearSegmentBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EIK_PointBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EIK_SegmentBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SweepLine2_EIK_DoIntersect(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EIK_ComputeSubcurves(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SweepLine2_EIK_ComputeIntersectionPoints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SweepLine2_EIK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/CGALDotNet.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>\n    <GenerateDocumentationFile>True</GenerateDocumentationFile>\n    <DocumentationFile>F:\\Projects\\Visual Studio Projects\\CGALDotNet\\CGALDotNet\\CGALDotNet.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DocumentationFile>F:\\Projects\\Visual Studio Projects\\CGALDotNet\\CGALDotNet\\CGALDotNet.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <Target Name=\"PostBuild\" AfterTargets=\"PostBuildEvent\">\n    <Exec Command=\"xcopy &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1\\CGALDotNet.dll&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;xcopy &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1\\CGALDotNet.pdb&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;xcopy &quot;$(ProjectDir)CGALDotNet.xml&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;&#xD;&#xA;xcopy &quot;$(SolutionDir)x64\\$(ConfigurationName)\\CGALWrapper.dll&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\gmp.dll&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\mpfr-6.dll&quot; &quot;F:\\Projects\\Unity Projects\\CGALDotNetUnity\\Assets\\CGALDotNet\\Plugins&quot; /y&#xD;&#xA;\" />\n  </Target>\n\n  <ItemGroup>\n    <None Include=\"..\\.editorconfig\" Link=\".editorconfig\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Folder Include=\"Circular\\\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"CGALDotNetGeometry\">\n      <HintPath>..\\..\\CGALDotNetGeometry\\CGALDotNetGeometry\\bin\\Release\\netcoreapp3.1\\CGALDotNetGeometry.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "CGALDotNet/CGALDotNet.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>CGALDotNet</name>\n    </assembly>\n    <members>\n        <member name=\"T:CGALDotNet.Arrangements.Arrangement2`1\">\n            <summary>\n            The generic arrangment class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.#ctor\">\n            <summary>\n            The default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a arrangement from a unmanaged ptr.\n            </summary>\n            <param name=\"ptr\">The unmanaged pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.ToString\">\n            <summary>\n            The arrangement as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Assign(CGALDotNet.Arrangements.Arrangement2{`0})\">\n            <summary>\n            Assigns the contents of another arrangement. \n            </summary>\n            <param name=\"other\">The other arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Overlay(CGALDotNet.Arrangements.Arrangement2{`0})\">\n            <summary>\n            Computes the overlay of two arrangements and return as a new arrangement.\n            </summary>\n            <param name=\"other\">The other arrangement.</param>\n            <returns>The overlay of both arrangements.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.Copy\">\n            <summary>\n            Create a deep copy of this arrangment.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.InsertPolygon(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Insert the polygon into this arrangement.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2`1.InsertPolygon(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Boolean)\">\n            <summary>\n            Insert the polygon into this arrangement.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <param name=\"nonIntersecting\">If the polygon intersects anything else in the arramgement.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.Arrangement2\">\n            <summary>\n            The abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor\">\n            <summary>\n            The default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a arrangement from the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a arrangement from the kernel and unmanaged pointer.\n            </summary>\n            <param name=\"kernel\">The kernel.</param>\n            <param name=\"ptr\">The unmanaged pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.Kernel\">\n            <summary>\n            The arrangements kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.VertexCount\">\n            <summary>\n            The number of vertices in the arrangement.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.IsolatedVerticesCount\">\n            <summary>\n            The number of vertices in the arrangement that are i\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.VerticesAtInfinityCount\">\n            <summary>\n            returns the number of arrangement vertices that lie at infinity a\n            nd are not associated with valid points.\n            Such vertices are not considered to be regular arrangement \n            vertices and VertexCount does not count them.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.HalfEdgeCount\">\n            <summary>\n            The number of half edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.EdgeCount\">\n            <summary>\n            The number of edges. two half edges count as one edge.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.FaceCount\">\n            <summary>\n            The number of faces in the arrangement not counting\n            the unbounded face.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.UnboundedFaceCount\">\n            <summary>\n            returns the number of unbounded faces in the arrangement.\n            Such faces are not considered to be regular arrangement \n            faces and FaceCount does not count them.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.Locator\">\n            <summary>\n            The type of locator used to find element \n            in the arrangement when queried.\n            Default is walk which is the best in most cases\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.IsEmpty\">\n            <summary>\n            Is the arrangement empty.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.Arrangement2.BuildStamp\">\n            <summary>\n            A number that will change if the unmanaged \n            arrangement model changes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Clear\">\n            <summary>\n            Clear the arrangement.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.IsValid\">\n            <summary>\n            In particular, the functions checks the topological structure of the arrangement \n            and assures that it is valid. In addition, the function performs several simple \n            geometric tests to ensure the validity of some of the geometric properties of \n            the arrangement. Namely, it checks that all arrangement vertices are associated \n            with distinct points, and that the halfedges around every vertex are ordered clockwise.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a copy of all the points in the arrangement.\n            </summary>\n            <param name=\"points\">A point array that is the length of the vertex count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a copy of all the segments in the arrangment.\n            </summary>\n            <param name=\"segments\">A segment array that is the length of the edge count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetVertices(CGALDotNet.Arrangements.ArrVertex2[],System.Int32)\">\n            <summary>\n            Get a copy of all the vertices in the arrangement.\n            </summary>\n            <param name=\"vertices\">A vertices array that is the length of the vertex count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetVertex(System.Int32,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Get the vertex from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the vertex.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetHalfEdges(CGALDotNet.Arrangements.ArrHalfedge2[],System.Int32)\">\n            <summary>\n            Get a copy of all the half edges in the arrangement.\n            </summary>\n            <param name=\"edges\">A half edge array that is the length of the half edge count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetHalfEdge(System.Int32,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Get the half edge from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the half edge.</param>\n            <param name=\"edge\">The half edge.</param>\n            <returns>True if the half edge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetFaces(CGALDotNet.Arrangements.ArrFace2[],System.Int32)\">\n            <summary>\n            Get a copy of all the faces in the arrangement.\n            </summary>\n            <param name=\"faces\">A face array that is the length of the facee count.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.GetFace(System.Int32,CGALDotNet.Arrangements.ArrFace2@)\">\n            <summary>\n            Get the face from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the half edge.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.CreateLocator(CGALDotNet.Arrangements.ARR_LOCATOR)\">\n            <summary>\n            Create the locator used to find query the arrangement.\n            </summary>\n            <param name=\"locator\">The locator type.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.ReleaseLocator\">\n            <summary>\n            Release the locator. Default will be used..\n            Default is walk which is the best in most cases.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PointQuery(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrQuery@)\">\n            <summary>\n            Query what the point hits in the arrangment.\n            </summary>\n            <param name=\"point\">The point to query.</param>\n            <param name=\"result\">What was hit.</param>\n            <returns>True if something was hit.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.BatchedPointQuery(CGALDotNetGeometry.Numerics.Point2d[],CGALDotNet.Arrangements.ArrQuery[])\">\n            <summary>\n            Query multiple points in the arrangment.\n            </summary>\n            <param name=\"points\">The points to query.</param>\n            <param name=\"results\">The results for each point.</param>\n            <returns>True if any point hit something.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.VerticalRayQuery(CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Arrangements.ArrQuery@)\">\n            <summary>\n            Query using a ray going up or down (y axis) from the query point.\n            </summary>\n            <param name=\"point\">The point to start at.</param>\n            <param name=\"up\">True to shoot ray up, false to shoot down.</param>\n            <param name=\"result\">The result of what was hits.</param>\n            <returns>True if some thing was hit.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Locate the vertex at this point.\n            </summary>\n            <param name=\"point\">The point to locate vertex at.</param>\n            <param name=\"vert\">The vertex.</param>\n            <returns>True if a vertex was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Arrangements.ArrVertex2@)\">\n            <summary>\n            Locate the closest vertex in the hit face\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The radius te closest vertex has to be within.</param>\n            <param name=\"vertex\">The closest vertex.</param>\n            <returns>True if point hit a face and found a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Locate the edge at this point.\n            </summary>\n            <param name=\"point\">The point to locate edge at.</param>\n            <param name=\"edge\">The edge.</param>\n            <returns>True if a edge was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Arrangements.ArrHalfedge2@)\">\n            <summary>\n            Locate the closest edge in the hit face.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"edge\">The closest edge.</param>\n            <param name=\"radius\">The radius from the point a edge counts as being clicked on.</param>\n            <returns>True if the point hit a face and found a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.LocateFace(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Arrangements.ArrFace2@)\">\n            <summary>\n            Locate the faces at this point.\n            </summary>\n            <param name=\"point\">The point to locate face at.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if a face was located.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.IntersectsSegment(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Find if the arrangement has a element that intersects the segment.\n            </summary>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if the segment intersects something in the arrangement.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertPoint(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Inserts a given point into a given arrangement.\n            It uses a given point-location object to locate the given point in the given arrangement.\n            If the point conincides with an existing vertex, there is nothing left to do. if it lies \n            on an edge, the edge is split at the point. Otherwise, the point is contained inside a face, \n            and is inserted as an isolated vertex inside this face.\n            </summary>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegment(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Insert the segment in to the arrangement.\n            </summary>\n            <param name=\"a\">The segments start point.</param>\n            <param name=\"b\">The segments end point.</param>\n            <param name=\"nonIntersecting\">True if the segment is know not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegment(CGALDotNetGeometry.Shapes.Segment2d,System.Boolean)\">\n            <summary>\n            Insert a segment into the arrangement.\n            </summary>\n            <param name=\"segment\"></param>\n            <param name=\"nonIntersecting\">True if the segment is know not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.InsertSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Insert a array of segments into the arrangement.\n            </summary>\n            <param name=\"segments\">The segment array</param>\n            <param name=\"count\">The segment arrays length.</param>\n            <param name=\"nonIntersecting\">True if the segments are known not to \n            hit anything currently in the arrangement.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveVertex(System.Int32)\">\n            <summary>\n            Attempts to removed a given vertex from a given arrangement.\n            The vertex can be removed if it is either an isolated vertex, \n            (and has no incident edge,) or if it is a redundant vertex.That is, \n            it has exactly two incident edges, whose associated curves can be \n            merged to form a single x-monotone curve.The function returns a \n            boolean value that indicates whether it succeeded removing the \n            vertex from the arrangement.\n            </summary>\n            <param name=\"index\">The index of the vertex in the arrangement.</param>\n            <returns>True if the vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveVertex(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Attempts to removed a given vertex from a given arrangement.\n            The vertex can be removed if it is either an isolated vertex, \n            (and has no incident edge,) or if it is a redundant vertex.That is, \n            it has exactly two incident edges, whose associated curves can be \n            merged to form a single x-monotone curve.The function returns a \n            boolean value that indicates whether it succeeded removing the \n            vertex from the arrangement.\n            </summary>\n            <param name=\"point\">The poisition of the vertex in the arrangement.</param>\n            <returns>True if the vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveEdge(System.Int32)\">\n            <summary>\n            Removes an edge at the index from the arrangement.\n            Once the edge is removed, if the vertices associated with its endpoints \n            become isolated, they are removed as well.\n            </summary>\n            <param name=\"index\">The index of the one of the half edges in the arrangement.</param>\n            <returns>True if the edge was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.RemoveEdge(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Removes an edge at the index from the arrangement.\n            Once the edge is removed, if the vertices associated with its endpoints \n            become isolated, they are removed as well.\n            </summary>\n            <param name=\"segment\">A segment with the same positions as the edge in the arrangement.</param>\n            <returns>True if the edge was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Print(System.Text.StringBuilder,System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n            <param name=\"printElements\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintVertices(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintHalfEdges(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.PrintFaces(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.Arrangement2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.SweepLine`1\">\n            <summary>\n            The generic sweep line class.\n            </summary>\n            <typeparam name=\"K\">The kernel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Arrangements.SweepLine`1.Instance\">\n            <summary>\n            A static instanceof a sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a unmanaged pointer.\n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine`1.ToString\">\n            <summary>\n            The sweep line as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Arrangements.SweepLine\">\n            <summary>\n            The abstract sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor\">\n            <summary>\n            The default sweep line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create from the kernel.\n            </summary>\n            <param name=\"kernel\">A kernel that implements a sweep line.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create from the kernel and unmanaged pointer.\n            </summary>\n            <param name=\"kernel\">A kernel that implements a sweep line.</param>\n            <param name=\"ptr\">A unmanaged pointer to a sweep line.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Arrangements.SweepLine.Kernel\">\n            <summary>\n            The sweep line kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.DoIntersect(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Do any of the segments in the array intersect.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Do any of the segments in the array intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ComputeSubcurves(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Compute all the sub segemnts from the intersection \n            of the segments in the array.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>The sub segments.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ComputeIntersectionPoints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Compute all the intersection points from the \n            segments in the array.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>The intersection points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the point buffer.\n            </summary>\n            <param name=\"points\">A point array the size of the point buffer.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the segments in the point buffer.\n            </summary>\n            <param name=\"segments\">A segment array the size of the segment buffer.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ClearPointBuffer\">\n            <summary>\n            Clear the point buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ClearSegmentBuffer\">\n            <summary>\n            Clear the segment buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.PointBufferSize\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.SegmentBufferSize\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Arrangements.SweepLine.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.CGALGlobal\">\n            <summary>\n            Global utility functions.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALGlobal.Version\">\n            <summary>\n            Get the version of CGAL in use.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALGlobal.EigenVersion\">\n            <summary>\n            Get the version of eigen being used.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNet.Geometry.Vector2{CGALDotNet.EIK},CGALDotNet.Geometry.Vector2{CGALDotNet.EIK})\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNet.Geometry.Vector2{CGALDotNet.EEK},CGALDotNet.Geometry.Vector2{CGALDotNet.EEK})\">\n            <summary>\n            Returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Angle(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            returns OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>OBTUSE, RIGHT or ACUTE depending on the \n            angle formed by the two vectors u and v.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Returns an approximation of the angle between u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns an approximation of the angle between p-q and r-q.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Returns an approximation of the angle between u and v.\n            </summary>\n            <param name=\"u\">The first vector.</param>\n            <param name=\"v\">The second vector.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxAngle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns an approximation of the angle between p-q and r-q.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <returns>The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.ApproxDihedralAngle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns an approximation of the signed dihedral angle \n            in the tetrahedron pqrs of edge pq.\n            p,q,r and p,q,s are not collinear.\n            </summary>\n            <param name=\"p\">The first tetrahedrons point.</param>\n            <param name=\"q\">The second tetrahedrons point.</param>\n            <param name=\"r\">The third tetrahedrons point.</param>\n            <param name=\"s\">The fourth tetrahedrons point.</param>\n            <returns>The sign is negative if orientation(p,q,r,s) \n            is CGAL::NEGATIVE and positive otherwise.\n            The angle is given in degrees.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreOrderedAlongLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if the three points are collinear \n            and q lies between p and r.\n            Note that true is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, if the three points are \n            collinear and q lies between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.AreStrictlyOrderedAlongLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            returns true, if the three points are collinear \n            and q lies strictly between p and r.\n            Note that false is returned, if q==p or q==r.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, iff the three points are \n            collinear and q lies strictly between p and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>returns true, if p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Collinear(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if p, q, and r are collinear\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true, iff p, q, and r are collinear</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Barycenter(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Compute the barycenter of the points p1, p2 and p3 \n            with corresponding weights w1, w2 and w3 as 1.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Compute the barycenter of the points.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Constructs the bisector line of the two points p and q.\n            The bisector is oriented in such a way that p lies on its positive side.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns>Constructs the bisector line of the two points p and q.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Bisector(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>\n            Constructs the bisector of the two lines l1 and l2.\n            \n            In the general case, the bisector has the direction of\n            the vector which is the sum of the normalized directions \n            of the two lines, and which passes through the intersection \n            of l1 and l2. If l1 and l2 are parallel, then the bisector \n            is defined as the line which has the same direction as l1, \n            and which is at the same distance from l1 and l2. \n            If Kernel::FT is not a model of FieldWithSqrt an \n            approximation of the square root will be used in this \n            function, impacting the exactness of the result even \n            with an (exact) multiprecision number type.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The second line.</param>\n            <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Coplanar(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Returns true, if p, q, r, and s are coplanar.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns>Returns true, if p, q, r, and s are coplanar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.CoplanarOrientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            If p,q,r are collinear, then CGAL_COLLINEAR is returned.\n            If not, then p,q,r define a plane p. The return value in this \n            case is either CGAL_POSITIVE or CGAL_NEGATIVE, but we don't \n            specify it explicitly. However, we guarantee that all calls to\n            this predicate over 3 points in p will return a coherent \n            orientation if considered a 2D orientation in p\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>If p,q,r are collinear, then CGAL_COLLINEAR is returned.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.CoplanarOrientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Let P be the plane defined by the points p, q, and r.\n            Note that the order defines the orientation of P. The function computes \n            the orientation of points p, q, and s in P: If p, q, s are collinear, \n            CGAL_COLLINEAR is returned. If P and the plane defined by p, q,\n            and s have the same orientation, CGAL_POSITIVE is returned; \n            otherwise CGAL_NEGATIVE is returned.\n            p, q, r, and s are coplanar and p, q, and r are not collinear.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.EquidistantLine(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Constructs the line which is at the same distance from the three points p, q and r.\n            p, q and r are not collinear.\n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"q\"></param>\n            <param name=\"r\"></param>\n            <returns>Constructs the line which is at the same distance from the three points p, q and r.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.LeftTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true if p, q, and r form a left turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a left turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.RightTurn(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns true if p, q, and r form a right turn.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>Returns true if p, q, and r form a right turn.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Vector2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            returns LEFT_TURN if u and v form a left turn, returns \n            RIGHT_TURN if u and v form a right turn, and returns \n            COLLINEAR if u and v are collinear.\n            </summary>\n            <param name=\"u\"></param>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Vector2{CGALDotNet.EIK},CGALDotNet.Geometry.Vector2{CGALDotNet.EIK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNet.Geometry.Vector2{CGALDotNet.EEK},CGALDotNet.Geometry.Vector2{CGALDotNet.EEK})\">\n            <summary>\n            Returns LEFT_TURN, if r lies to the left of the oriented \n            line l defined by p and q, returns RIGHT_TURN if r lies \n            to the right of l, and returns COLLINEAR if r lies on l.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            returns POSITIVE, if s lies on the positive side of the \n            oriented plane h defined by p, q, and r, returns NEGATIVE\n            if s lies on the negative side of h, and returns COPLANAR \n            if s lies on h.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <param name=\"s\">The fourth point</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Orientation(CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            returns NEGATIVE if u, v and w are negatively oriented, \n            POSITIVE if u, v and w are positively oriented,\n            and COPLANAR if u, v and w are coplanar.\n            </summary>\n            <param name=\"u\"></param>\n            <param name=\"v\"></param>\n            <param name=\"w\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.OrthogonalVector(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            computes an orthogonal vector of the plane defined by p, q\n            and r, which is directed to the positive side of this plane.\n            </summary>\n            <param name=\"p\">The first point.</param>\n            <param name=\"q\">The second point.</param>\n            <param name=\"r\">The third point.</param>\n            <returns>computes an orthogonal vector of the plane</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if l1 and l2 are parallel or if one of those \n            (or both) is degenerate.\n            </summary>\n            <param name=\"l1\">The first line.</param>\n            <param name=\"l2\">The seconed line.</param>\n            <returns>returns true, if l1 and l2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Shapes.Ray2d)\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Ray2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Ray2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if r1 and r2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"r1\">The first ray.</param>\n            <param name=\"r2\">The second ray.</param>\n            <returns>returns true, if r1 and r2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Segment2{CGALDotNet.EIK})\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALGlobal.Parallel(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Segment2{CGALDotNet.EEK})\">\n            <summary>\n            returns true, if s1 and s2 are parallel or if one of \n            those (or both) is degenerate.\n            </summary>\n            <param name=\"s1\">The first segment.</param>\n            <param name=\"s2\">The secong segment.</param>\n            <returns>returns true, if s1 and s2 are parallel</returns>\n        </member>\n        <member name=\"T:CGALDotNet.CGALObject\">\n            <summary>\n            Base class for objects that referrence a CGAL object.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.CGALObject.m_ptr\">\n            <summary>\n            The pointer to the unmanged CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.#ctor(System.IntPtr)\">\n            <summary>\n            Constructor taking a referrence to a CGAL object.\n            </summary>\n            <param name=\"ptr\">A pointer to a CGAL object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Finalize\">\n            <summary>\n            The destuctor.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALObject.IsDisposed\">\n            <summary>\n            Has the object been disposed.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.CGALObject.Ptr\">\n            <summary>\n            Get the ptr to the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Dispose\">\n            <summary>\n            Dispose the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ToString\">\n            <summary>\n            Print some information about the object.\n            </summary>\n            <returns>Print some information about the object.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Print\">\n            <summary>\n            Print the object into the console.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the object into a string builder.\n            </summary>\n            <param name=\"builder\">The builder to print into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Release\">\n            <summary>\n            Release the CGAL object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.Swap(System.IntPtr)\">\n            <summary>\n            Swap the unmanaged pointer with another.\n            The old ptr will be released first.\n            </summary>\n            <param name=\"ptr\">The new ptr. The old ptr will be released first.</param>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ReleasePtr\">\n            <summary>\n            Allow derived class to release the unmanaged memory.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Allow derived class to release the unmanaged memory.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.CGALObject.CheckPtr\">\n            <summary>\n            Check if the object is still valid.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Collections.NativeList`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"T\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Collections.NativeList`1.m_list\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList`1.IsSync\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.GetEnumerator\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList`1.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Clear\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Add(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.AddRange(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            \n            </summary>\n            <param name=\"items\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.CopyTo(`0[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"array\"></param>\n            <param name=\"startIndex\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Contains(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.IndexOf(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Insert(System.Int32,`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Remove(`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"item\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.RemoveAt(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Reverse\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.TrimExcess\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Get(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList`1.Set(System.Int32,`0)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"item\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Collections.NativeList\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.Capacity\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.Count\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Collections.NativeList.IsReadOnly\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Collections.NativeList.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenColumnVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.Collections.Generic.IList{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"list\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Normalized\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Transpose\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Adjoint\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenColumnVector.Conjugate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Dot(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Resize(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.Random(System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"seed\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenColumnVector.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EIGEN_SOLVER\">\n            <summary>\n            enum for egien solvers.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Create a new matrix filled with zeros.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number of columns.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double[0:,0:])\">\n            <summary>\n            Create a new matrix fill with the array contents.\n            </summary>\n            <param name=\"array\">The array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Collections.Generic.IList{CGALDotNet.Eigen.EigenColumnVector})\">\n            <summary>\n            Create a new matrix filled with the contents of the column vectors.\n            All column vectors must have the same dimension.\n            </summary>\n            <param name=\"columns\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 2 x 2 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 3 x 3 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a 4 x 4 matrix.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new matrix from a pointer.\n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Identity(System.Int32)\">\n            <summary>\n            Create a identity matrix.\n            </summary>\n            <param name=\"size\">The number of rows and columns of the matrix. Must be square.</param>\n            <returns>The identity matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Series(System.Int32,System.Int32)\">\n            <summary>\n            Create a matrix filled with the numbers 1, 2. 3, etc to end.\n            Used for debugging.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number columns.</param>\n            <returns>The Matrix.</returns>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Random(System.Int32,System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a new matrix fill with random numbers.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"columns\">The number columns.</param>\n            <param name=\"min\">The minimum random number generated.</param>\n            <param name=\"max\">The maximum random number generated.</param>\n            <param name=\"seed\">The random generators seed.</param>\n            <returns>The matrix.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Rows\">\n            <summary>\n            The number of rows in the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Columns\">\n            <summary>\n            The number of columns in the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Length\">\n            <summary>\n            The total size of the matrix which is \n            the rows times the number of columns.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Item(System.Int32)\">\n            <summary>\n            The single dimension array accessor.\n            </summary>\n            <param name=\"i\">The array index.</param>\n            <returns>The value at the index i.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Item(System.Int32,System.Int32)\">\n            <summary>\n            The double dimension array accessor.\n            </summary>\n            <param name=\"i\">The row index.</param>\n            <param name=\"j\">The column index.</param>\n            <returns>The value at the index i,j.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.ToString\">\n            <summary>\n            The matrix string info.\n            </summary>\n            <returns>The matrix string info.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Transpose\">\n            <summary>\n            The matrix transposed.\n            Flips a matrix over its diagonal that is, \n            it switches the row and column indices of the matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Conjugate\">\n            <summary>\n            The matrices conjugate.\n            The matrix obtained by replacing each element a(ij) with its complex conjugate, A^=(a^(ij)).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Adjoint\">\n            <summary>\n            The matrices adjoint.\n            The transpose of its cofactor matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsInvertible\">\n            <summary>\n            Is the matrix invertible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Inverse\">\n            <summary>\n            The inverse of a square matrix A, \n            sometimes called a reciprocal matrix, \n            is a matrix A^(-1) such that AA^(-1)=I.\n            DOes not check if the matrix is invertible.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Determinant\">\n            <summary>\n            The determinant is a scalar value that is a \n            function of the entries of a square matrix.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.Trace\">\n            <summary>\n            The trace of a square matrix is defined to be the \n            sum of elements on the main diagonal from the upper left to the lower right.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsSquare\">\n            <summary>\n            A square matrix has the same number of rows and columns.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsDiagonal\">\n            <summary>\n            A diagonal matrix is a matrix in which the entries \n            outside the main diagonal are all zero.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsUpperTriangular\">\n            <summary>\n            A square matrix is called upper triangular \n            if all the entries below the main diagonal are zero.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenMatrix.IsLowerTriangular\">\n            <summary>\n            A square matrix is called lower triangular \n            if all the entries above the main diagonal are zero.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,System.Double)\">\n            <summary>\n            Multiple each component in matrix by the scalar.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"s\">The scalar.</param>\n            <returns>The matrix with each component multiplied by the scalar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Division(CGALDotNet.Eigen.EigenMatrix,System.Double)\">\n            <summary>\n            Divide each component in matrix by the scalar.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"s\">The scalar.</param>\n            <returns>The matrix with each component divided by the scalar.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Multiple the two matrices.\n            The first matrices number of columns must \n            the same as the second matrices number of rows.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>The product matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Addition(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Add two matrices.\n            The matrices must be the same size.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>A matrix where each compoent is the sum of the other two matrices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Subtraction(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Subtract two matrices.\n            The matrices must be the same size.\n            </summary>\n            <param name=\"m1\">The first matrix.</param>\n            <param name=\"m2\">The second matrix.</param>\n            <returns>A matrix where each compoent is the difference of the other two matrices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.op_Multiply(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            Multiple a matrix and a column vector.\n            </summary>\n            <param name=\"m\">The matrix.</param>\n            <param name=\"v\">The column vector.</param>\n            <returns>The product column vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsIdentity(System.Double)\">\n            <summary>\n            Is this matrix the identity matrix.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Is this matrix the identity matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsZero(System.Double)\">\n            <summary>\n            Is this matrix filled with zeros.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Is this matrix filled with zeros.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsPositive\">\n            <summary>\n            Are all the values in this matrix positive.\n            </summary>\n            <returns>Are all the values in this matrix positive.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.HasNAN\">\n            <summary>\n            Does the matrix have a component that is nan.\n            </summary>\n            <returns>Does the matrix have a component that is nan.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.NoNAN\">\n            <summary>\n            Replaces all nan values in the matrix with 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsFinite\">\n            <summary>\n            Are all the values in the matrix finite (non-infinite and non-nan).\n            </summary>\n            <returns>Are all the values in the matrix finite (non-infinite and non-nan).</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.MakeFinite\">\n            <summary>\n            Replaces all infinite and nan values in matrix with 0.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.IsConst(System.Double)\">\n            <summary>\n            Are all the values in the matrix the same.\n            </summary>\n            <param name=\"eps\">The threshold the values in the \n            matrix can be to the expected value.</param>\n            <returns>Are all the values in the matrix the same.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SubMatrix(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Create a sub matrix from this matrix.\n            </summary>\n            <param name=\"startRow\">The row to start at.</param>\n            <param name=\"startCol\">THe column to start at.</param>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"cols\">The number of columns.</param>\n            <returns>A sub matrix from this matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SubMatrix(System.Int32,System.Int32)\">\n            <summary>\n            Create a sub matrix from this matrix.\n            </summary>\n            <param name=\"rows\">The number of rows.</param>\n            <param name=\"cols\">The number of columns.</param>\n            <returns>A sub matrix from this matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Solve(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EIGEN_SOLVER)\">\n            <summary>\n            Solve the linear system.\n            </summary>\n            <param name=\"v\">The vector to solve.</param>\n            <param name=\"solver\">The solver type.</param>\n            <returns>The solution vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Solve(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EIGEN_SOLVER)\">\n            <summary>\n            Solve the linear system.\n            </summary>\n            <param name=\"v\">The vector to solve.</param>\n            <param name=\"solver\">The solver type.</param>\n            <returns>The solution vector.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RelativeError(CGALDotNet.Eigen.EigenColumnVector,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            Find the relative error from the linear system.\n            </summary>\n            <param name=\"v\">The vector that was solved.</param>\n            <param name=\"x\">The vector that was the solution.</param>\n            <returns>The relative error.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RelativeError(CGALDotNet.Eigen.EigenMatrix,CGALDotNet.Eigen.EigenMatrix)\">\n            <summary>\n            Find the relative error from the linear system.\n            </summary>\n            <param name=\"v\">The vector that was solved.</param>\n            <param name=\"x\">The vector that was the solution.</param>\n            <returns>The relative error.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenValues(CGALDotNet.Eigen.EigenColumnVector@)\">\n            <summary>\n            Find the eigen values of the matrix.\n            </summary>\n            <param name=\"values\">The eigen values if found, null otherwise.</param>\n            <returns>True if the values could be determined.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenVectors(CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            Find the eigen vectors of the matrix.\n            </summary>\n            <param name=\"vectors\">The eigen vectors if found, null otherwise.</param>\n            <returns>True if the vectors could be determined.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.EigenValuesAndVectors(CGALDotNet.Eigen.EigenColumnVector@,CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"values\"></param>\n            <param name=\"vectors\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.TryInverse(CGALDotNet.Eigen.EigenMatrix@)\">\n            <summary>\n            Try and find the inverse of the matrix.\n            </summary>\n            <param name=\"inverse\">The inverse if found, null otherwise.</param>\n            <returns>True if the inverse was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.GetRow(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Row\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,CGALDotNet.Eigen.EigenRowVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Row\"></param>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetRow(System.Int32,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"row\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.GetColumn(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Column\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,CGALDotNet.Eigen.EigenColumnVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"Column\"></param>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.SetColumn(System.Int32,System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"column\"></param>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Round(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"digits\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Scale(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"s\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateX(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateY(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.RotateZ(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            \n            </summary>\n            <param name=\"radian\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Rotate(CGALDotNetGeometry.Numerics.Radian,CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Create a rotation from a angle and the rotation axis.\n            </summary>\n            <param name=\"radian\">The rotation amount.</param>\n            <param name=\"axis\">The axis to rotate on.</param>\n            <returns>The rotation matrix.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenMatrix.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenRowVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Double,System.Double,System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"z\"></param>\n            <param name=\"w\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.Collections.Generic.IList{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"list\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.ToString\">\n            <summary>\n            /\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Normalized\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Transpose\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Adjoint\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenRowVector.Conjugate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Dot(CGALDotNet.Eigen.EigenRowVector,CGALDotNet.Eigen.EigenRowVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.Random(System.Int32,System.Double,System.Double,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"seed\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenRowVector.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Eigen.EigenVector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.x\">\n            <summary>\n            The first value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.y\">\n            <summary>\n            The second value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.z\">\n            <summary>\n            The third value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.w\">\n            <summary>\n            The fourth value in the vector.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Item(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Dimension\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Eigen.EigenVector.Magnitude\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Normalize\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Resize(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"dimension\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsZero(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsPositive\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.HasNAN\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.NoNAN\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsFinite\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.MakeFinite\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.IsConst(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"eps\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Round(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"digits\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Eigen.EigenVector.AreSameSize(CGALDotNet.Eigen.EigenVector,CGALDotNet.Eigen.EigenVector)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Box2`1\">\n            <summary>\n            The generic Box wrapper for a CGAL object.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create box from min and max values.\n            </summary>\n            <param name=\"min\">The min x and y value.</param>\n            <param name=\"max\">The max x and y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create box from min and max points.\n            </summary>\n            <param name=\"min\">The min point.</param>\n            <param name=\"max\">The max point.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The iso rectangle pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.ToString\">\n            <summary>\n            The iso rectangle as a string.\n            </summary>\n            <returns>The iso rectangle as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the rectangle.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2`1.Copy\">\n            <summary>\n            Create a deep copy of the rectangle.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Box2\">\n            <summary>\n            The abstract iso rectangle definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"min\"></param>\n            <param name=\"max\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The geometry kernel.</param>\n            <param name=\"ptr\">The Box pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Kernel\">\n            <summary>\n            The iso rectangle kernel.\n            Contains the functions to the unmanaged CGAL object.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Min\">\n            <summary>\n            The rectangles min point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Max\">\n            <summary>\n            The rectangles max point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.Area\">\n            <summary>\n            The rectangles area.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Box2.IsDegenerate\">\n            <summary>\n            Is the rectangle degenerate.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            The side the rectangle the point is on.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>If the point is iside, outside or on boundary.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the rectangle contain the point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"includeBoundary\">Should a point on \n            the boundary count as being inside.</param>\n            <returns>Does the rectangle contain the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Box2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.CGALIntersections\">\n            <summary>\n            The static intersection class.\n            </summary>\n            <summary>\n            The static intersection class.\n            </summary>\n            <summary>\n            The static intersection class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Box2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Line2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Box2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Point2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Line2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Ray2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Segment2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Triangle2{CGALDotNet.EEK},CGALDotNet.Geometry.Point2{CGALDotNet.EEK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_DoIntersect_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_Intersection_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_PointPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EEK_SqrDistance_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNet.Geometry.Box2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Line2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNet.Geometry.Box2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Point2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Line2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Ray2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Segment2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNet.Geometry.Triangle2{CGALDotNet.EIK},CGALDotNet.Geometry.Point2{CGALDotNet.EIK})\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_DoIntersect_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_PointLine(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_Intersection_BoxPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_PointPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_LinePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_RayPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_SegmentPoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Geometry_EIK_SqrDistance_TrianglePoint(System.IntPtr,System.IntPtr)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.DoIntersect(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersection(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                         The Point SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance functions\n            \n            </summary>--------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.SqrDistance(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance functions\n            \n            </summary>-----------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_PointLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Linet DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_DoIntersect_BoxPoint(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box DoIntersect extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_PointLine(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Shapes.Line2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Point Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_Intersection_BoxPoint(CGALDotNetGeometry.Shapes.Box2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box Intersection extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_PointPoint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                          The Point SqrDistance extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_LinePoint(CGALDotNetGeometry.Shapes.Line2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_RayPoint(CGALDotNetGeometry.Shapes.Ray2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_SegmentPoint(CGALDotNetGeometry.Shapes.Segment2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.CGALIntersections.Intersections_Shapes_EIK_SqrDistance_TrianglePoint(CGALDotNetGeometry.Shapes.Triangle2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle SqrDistance extern functions\n            \n            </summary>------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The IsoRectancle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Point2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Vector2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.HPoint2_EEK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Line2_EEK_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Ray2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Segment2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Triangle2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EEK.Box2_EEK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Point2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Vector2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.HPoint2_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Line2_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Ray2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Segment2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Triangle2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Box2_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The IsoRectancle2 Class Functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Point2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Point2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Vector2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The Vector2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.HPoint2_EIK_Create\">\n            <summary>--------------------------------------------------------\n            \n                            The HPoint2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Line2_EIK_Create(System.Double,System.Double,System.Double)\">\n            <summary>--------------------------------------------------------\n            \n                            The Line2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Ray2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Ray2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Segment2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Segment2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Triangle2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Triangle2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.GeometryKernel2_EIK.Box2_EIK_Create(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>--------------------------------------------------------\n            \n                            The Box2 extern functions\n            \n            </summary>-------------------------------------------------------\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.HPoint2`1\">\n            <summary>\n            Weighted point class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor\">\n            <summary>\n            Create a new weighted point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double)\">\n            <summary>\n            Create a new weighted point from a value and weight as 1.\n            </summary>\n            <param name=\"v\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as 1.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as the w value.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n            <param name=\"w\">The points weight value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new weighted point from a pointer.\n            </summary>\n            <param name=\"ptr\">The pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2`1.Copy\">\n            <summary>\n            Create a deep copy of the point.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.HPoint2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new weighted point.\n            </summary>\n            <param name=\"kernel\">The points kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(System.Double,System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new weighted point from a x, y value and weight as the w value.\n            </summary>\n            <param name=\"x\">The points x value.</param>\n            <param name=\"y\">The points y value.</param>\n            <param name=\"w\">The points weight value.</param>\n            <param name=\"kernel\">The points kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new weighted point from a existing ponter and kernel.\n            </summary>\n            <param name=\"kernel\">The points kernel.</param>\n            <param name=\"ptr\">The points pointer</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.Kernel\">\n            <summary>\n            The points kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.ReleasePtr\">\n            <summary>\n            Release the pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the pointer.\n            </summary>\n            <param name=\"ptr\">The pointer to release.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.x\">\n            <summary>\n            Accessor or the points x value.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.HPoint2.y\">\n            <summary>\n            ccessor or the points y value.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the point.\n            </summary>\n            <param name=\"min\">The points min value.</param>\n            <param name=\"max\">The points max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Clamp01\">\n            <summary>\n            Clamp the point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.HPoint2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.INTERSECTION_RESULT_2D\">\n            <summary>\n            Enum for the type of intersection geomerty.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.IntersectionResult2d\">\n            <summary>\n            The intersection result struct.\n            May contain up tp 6 points of data.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Data\">\n            <summary>\n            The point data for the intersection.\n            Represents up to 6 points in xy order.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Count\">\n            <summary>\n            The number of points of data used.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Hit\">\n            <summary>\n            Was there a intersection.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.IsPolygon\">\n            <summary>\n            Is the intersection a polygon.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.IntersectionResult2d.Type\">\n            <summary>\n            The intersection geometry type.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Item(System.Int32)\">\n            <summary>\n            Array accessor for the point data.\n            </summary>\n            <param name=\"i\">The array index from 0 to 6.</param>\n            <returns>The point at index i.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.IntersectionResult2d.ToString\">\n            <summary>\n            Results information as string.\n            </summary>\n            <returns>esults information as string</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Point\">\n            <summary>\n            If result type was point get the point geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Line\">\n            <summary>\n            If result type was line get the line geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Ray\">\n            <summary>\n            If result type was ray get the ray geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Segment\">\n            <summary>\n            If result type was segment get the segment geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Box\">\n            <summary>\n            If result type was box get the box geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.Triangle\">\n            <summary>\n            If result type was triangle get the triangle geometry.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.IntersectionResult2d.PolygonPoints\">\n            <summary>\n            If result type was polygon get the points that\n            make up the polygon geometry.\n            Should only ever have at most 6 points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.IntersectionResult2d.Polygon``1\">\n            <summary>\n            The intersection result as a polygon.\n            </summary>\n            <typeparam name=\"K\">The polygons kernel.</typeparam>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Line2`1\">\n            <summary>\n            A CGALObject that represents a line on 2D space.\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Line2`1.Horizontal\">\n            <summary>\n            A horizontal line on the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Line2`1.Vertical\">\n            <summary>\n            A vertical line on the y axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(System.Double,System.Double,System.Double)\">\n            <summary>\n            Create a new line where ax + by + c = 0 holds.\n            </summary>\n            <param name=\"a\">The constant in ax.</param>\n            <param name=\"b\">The constant in by.</param>\n            <param name=\"c\">The constant.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a new line that passes through the two points.\n            </summary>\n            <param name=\"p1\">The first point.</param>\n            <param name=\"p2\">The second point.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            Create a line that passes through the point in the direction of the vector.\n            </summary>\n            <param name=\"p\">The point.</param>\n            <param name=\"v\">The vector.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a line from a existing pointer.\n            </summary>\n            <param name=\"ptr\">The pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2`1.Opposite\">\n            <summary>\n            Create a new line that faces in the opposite direction.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Perpendicular(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Create a new line that is perpendicular to current line.\n            </summary>\n            <param name=\"point\">A point the line should turn ccw when turning.</param>\n            <returns>The perpendicular line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the object.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the object.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Scale(System.Double)\">\n            <summary>\n            Scale the object.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Translate, rotate and scale the object.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in degrees.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2`1.Copy\">\n            <summary>\n            Create a deep copy of the line.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Line2\">\n            <summary>\n            The abstract class for the line object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(System.Double,System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"p\"></param>\n            <param name=\"v\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Kernel\">\n            <summary>\n            The lines kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.A\">\n            <summary>\n            The lines constant in ax.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.B\">\n            <summary>\n            The lines constant in by.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.C\">\n            <summary>\n            The lines constant.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsDegenerate\">\n            <summary>\n            Is the line degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsHorizontal\">\n            <summary>\n            Is the line horizontal on the x axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.IsVertical\">\n            <summary>\n            Is the line vertical on the y axis.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Line2.Vector\">\n            <summary>\n            Convert the line to a vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lie on the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOnNegativeSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lies on the negative/cw side of the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the negative/cw side of the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.HasOnPositiveSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Does the point lies on the positive/ccw side of the line.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>True if the point lies on the positive/ccw side of the line.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.X_On_Y(System.Double)\">\n            <summary>\n            The lines x value given a y value.\n            </summary>\n            <param name=\"y\">The y value.</param>\n            <returns>The lines x value given a y value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Y_On_X(System.Double)\">\n            <summary>\n            The lines y value given a x value.\n            </summary>\n            <param name=\"x\">The x value.</param>\n            <returns>The lines y value given a x value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Line2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Point2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.UnitX\">\n            <summary>\n            The unit x point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.UnitY\">\n            <summary>\n            The unit y point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.Zero\">\n            <summary>\n            A point of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.One\">\n            <summary>\n            A point of ones.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Point2`1.Half\">\n            <summary>\n            A point of halfs.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"v\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Point2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"x\"></param>\n            <param name=\"y\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.x\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Point2.y\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Round(System.Int32)\">\n            <summary>\n            Round the point.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the point.\n            </summary>\n            <param name=\"min\">The points min value.</param>\n            <param name=\"max\">The points max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Clamp01\">\n            <summary>\n            Clamp the point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Point2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Ray2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Ray2`1.UnitX\">\n            <summary>\n            The unit x ray.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Ray2`1.UnitY\">\n            <summary>\n            The unit y ray.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"position\"></param>\n            <param name=\"direction\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2`1.Opposite\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2`1.Line\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Ray2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Vector2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"position\"></param>\n            <param name=\"direction\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsHorizontal\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.IsVertical\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Position\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Ray2.Direction\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Ray2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Segment2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Segment2`1.Horizontal\">\n            <summary>\n            A horizontal line on the x axis.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Segment2`1.Vertical\">\n            <summary>\n            A vertical line on the y axis.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2`1.Line\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Segment2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.A\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.B\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Min\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Max\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsHorizontal\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.IsVertical\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.Vector\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Segment2.SqrLength\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.HasOn(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Segment2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Triangle2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the shape.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the shape.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Scale(System.Double)\">\n            <summary>\n            Scale the shape.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            \n            </summary>\n            <param name=\"translation\"></param>\n            <param name=\"rotation\"></param>\n            <param name=\"scale\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2`1.Copy\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Triangle2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n            <param name=\"c\"></param>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Shape\">\n            <summary>\n            Convert to shape struct.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.A\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.B\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.C\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.IsDegenerate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Area\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Triangle2.Orientation\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.OrientedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.Round(System.Int32)\">\n            <summary>\n            Round the shape.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Triangle2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Vector2`1\">\n            <summary>\n            A Vector2 object with kernel type K.\n            </summary>\n            <typeparam name=\"K\">The type of kernel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.UnitX\">\n            <summary>\n            The unit x vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.UnitY\">\n            <summary>\n            The unit y vector.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.Zero\">\n            <summary>\n            A vector of zeros.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Geometry.Vector2`1.One\">\n            <summary>\n            A vector of ones.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor\">\n            <summary>\n            Create a new Vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.Double)\">\n            <summary>\n            Create a new vector filled with the value.\n            </summary>\n            <param name=\"v\">The value to fill.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.Double,System.Double)\">\n            <summary>\n            Create a new vector with the values x and y.\n            </summary>\n            <param name=\"x\">The vectors x value.</param>\n            <param name=\"y\">The vectors y value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new vector from a existing pointer.\n            </summary>\n            <param name=\"ptr\">The pointer object.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2`1.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.ToString\">\n            <summary>\n            Vector information.\n            </summary>\n            <returns>The vectors string information.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2`1.Copy\">\n            <summary>\n            Create a deep copy of the vector.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Geometry.Vector2\">\n            <summary>\n            The vectors abstract bass class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new vector with the kernel.\n            </summary>\n            <param name=\"kernel\">The vectors kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(System.Double,System.Double,CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new vector from the x and y values.\n            </summary>\n            <param name=\"x\">The vectors x value.</param>\n            <param name=\"y\">The vectors y value.</param>\n            <param name=\"kernel\">The vectors kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new vector from a existing pointer.\n            </summary>\n            <param name=\"kernel\">The vectors kernel.</param>\n            <param name=\"ptr\">The existing pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.Kernel\">\n            <summary>\n            The vectors kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.Magnitude\">\n            <summary>\n            The vectors sqr magnitude.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.SqrMagnitude\">\n            <summary>\n            The vectors sqr magnitude.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.x\">\n            <summary>\n            Access the x component.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Geometry.Vector2.y\">\n            <summary>\n            Access the y component.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.ReleasePtr\">\n            <summary>\n            Release the vectors pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release a pointer to a vector.\n            </summary>\n            <param name=\"ptr\">The pointer to release.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Round(System.Int32)\">\n            <summary>\n            Round the vector.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Clamp(System.Double,System.Double)\">\n            <summary>\n            Clamp the vector.\n            </summary>\n            <param name=\"min\">The vectors min value.</param>\n            <param name=\"max\">The vectors max value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Clamp01\">\n            <summary>\n            Clamp the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Normalize\">\n            <summary>\n            Normalize the vector.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Geometry.Vector2.Convert``1\">\n            <summary>\n            Convert to another kernel.\n            Must provide a different kernel to convert to or\n            just a deep copy will be returned.\n            </summary>\n            <returns>The shape with another kernel type.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.HULL_METHOD\">\n            <summary>\n            The convex hull method to use.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull2`1\">\n            <summary>\n            The generic convex hull class.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Hulls.ConvexHull2`1.Instance\">\n            <summary>\n            The static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.CreateHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,CGALDotNet.Hulls.HULL_METHOD)\">\n            <summary>\n            Find the convex of the points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"method\">The hull ethod to use.</param>\n            <returns>A polygon that represents the convex hull.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.UpperHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Find the upper hull of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>A polygon that represents the upper hull.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2`1.LowerHull(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Find the lower hull of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>A polygon that represents the lower hull.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull2\">\n            <summary>\n            The convex hull abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct hull with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"P:CGALDotNet.Hulls.ConvexHull2.Kernel\">\n            <summary>\n            The hulls kernel type.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.IsStronglyConvexCCW(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Is this set of points ccw orderer.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Is this set of points ccw orderer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.IsStronglyConvexCW(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Is this set of points cw orderer.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n            <returns>Is this set of points cw orderer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.CheckCount(System.Int32)\">\n            <summary>\n            Checks if the minimum number of points have been provided.\n            </summary>\n            <param name=\"count\">The point array length.</param>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull3`1\">\n            <summary>\n            The generic convex hull class.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Hulls.ConvexHull3`1.Instance\">\n            <summary>\n            The static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.CreateHullAsPolyhedron(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Create the convex hull from a set of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length</param>\n            <returns>The hull as a polyhedron.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3`1.CreateHullAsSurfaceMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Create the convex hull from a set of points.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length</param>\n            <returns>The hull as a surface mesh.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Hulls.ConvexHull3\">\n            <summary>\n            The convex hull abstract base class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct hull with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"P:CGALDotNet.Hulls.ConvexHull3.Kernel\">\n            <summary>\n            The hulls kernel type.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.IsStronglyConvex(CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            Check if the points in the polyhedron are convex.\n            </summary>\n            <param name=\"poly\">The polyhedron.</param>\n            <returns>True if the polyhedron is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.IsStronglyConvex(CGALDotNet.Polyhedra.SurfaceMesh3)\">\n            <summary>\n            Check if the points in the mesh are convex.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>True if the mesh is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.CheckCount(System.Int32)\">\n            <summary>\n            Checks if the minimum number of points have been provided.\n            </summary>\n            <param name=\"count\">The point array length.</param>\n            <exception cref=\"T:System.ArgumentException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Hulls.ConvexHull3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.ConformingTriangulation2`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.ConformingTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Insert(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Insert(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.InsertConstraint(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.ConformingTriangulation2\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.ConformingTriangulation2.MAX_ANGLE_BOUNDS\">\n            <summary>\n            The max value the angle bounds can be.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.VertexCount\">\n            <summary>\n            The number of verices in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.TriangleCount\">\n            <summary>\n            The number of triangles in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.IndiceCount\">\n            <summary>\n            The number of indices need to represent the\n            triangulation (number of triangles * 3).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.ConformingTriangulation2.Kernel\">\n            <summary>\n            The conforming triangulation kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"point\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.GetIndices(System.Int32[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"indices\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the triangulation.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the triangulation.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Scale(System.Double)\">\n            <summary>\n            Scale the triangulation.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the triangulation with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"a\"></param>\n            <param name=\"b\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            \n            </summary>\n            <param name=\"segment\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"segments\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.MakeDelaunay\">\n            <summary>\n            Make the mesh delaunay.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.MakeGabriel\">\n            <summary>\n            Make the mesh \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Refine(System.Double,System.Double)\">\n            <summary>\n            Refine the mesh into smaller triangles.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Refine(System.Double,System.Double,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Refine the mesh into smaller triangles.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <param name=\"seeds\">Seeds point in polygons that are not to be refined.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.ConformingTriangulation2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.SkinSurfaceMeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.SkinSurfaceMeshing`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.CreateSkinPolyhedra(System.Double,System.Boolean,CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"shrinkFactor\"></param>\n            <param name=\"subdivde\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing`1.CreateSkinPolyhedra(System.Double,System.Boolean,CGALDotNetGeometry.Numerics.HPoint3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"shrinkFactor\"></param>\n            <param name=\"subdivde\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.SkinSurfaceMeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.SkinSurfaceMeshing.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.SkinSurfaceMeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.TetrahedralRemeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Meshing.TetrahedralRemeshing`1.Instance\">\n            <summary>\n            A static instance of the tetrahedral remeshing.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Meshing.TetrahedralRemeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Meshing.TetrahedralRemeshing.Kernel\">\n            <summary>\n            The tetrahedral remeshing kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.Remesh(System.Double,System.Int32,CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"targetLength\"></param>\n            <param name=\"iterations\"></param>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Meshing.TetrahedralRemeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.Polygon2`1\">\n            <summary>\n            Generic polygon definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polygons points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.ToString\">\n            <summary>\n            The polygon as a string.\n            </summary>\n            <returns>The polygon as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Copy\">\n            <summary>\n            Copy the polygon.\n            </summary>\n            <returns>The copied polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersects(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersects(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersection(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"results\">The intersection results.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Intersection(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"results\">The intersection results.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Refine(System.Double)\">\n            <summary>\n            Refine the polygon to a triangulation.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <returns>The base triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Refine(System.Double,System.Double)\">\n            <summary>\n            Refine the polygon to a triangulation.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n            <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n            <returns>The base triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Partition(System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}},CGALDotNet.Polygons.POLYGON_PARTITION)\">\n            <summary>\n            Partition the polygon into convex pieces.\n            Does not modify this polygon.\n            </summary>\n            <param name=\"results\">The convex partition.</param>\n            <param name=\"type\">The type of partition method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"threshold\">The simplification threshold.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Simplify(CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"param\">The simplification parameters.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Offset(CGALDotNet.Polygons.OFFSET,System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            offset the polygon. Does not modify this polygon.\n            </summary>\n            <param name=\"offset\">The type of offset.</param>\n            <param name=\"amount\">The amount to offset.</param>\n            <param name=\"results\">The offset results.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.ToPolyhedron3(System.Boolean)\">\n            <summary>\n            Create a polyhedron3 mesh with one polygon face.\n            </summary>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <returns>The new polyhedron mesh</returns>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2`1.Dual\">\n            <summary>\n            Get the dual polygon where every point s now a edge.\n            </summary>\n            <returns>The dual polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.Polygon2\">\n            <summary>\n            The abstract polygon definition.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.Polygon2.m_isSimple\">\n            <summary>\n            Is the polygon simple.\n            Must be updated to find if simple.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.Polygon2.m_orientation\">\n            <summary>\n            The polygons orientation.\n            Must be updated to find orientation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polygon kernel.</param>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Count\">\n            <summary>\n            The number of points in the polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsSimple\">\n            <summary>\n            Is this a simple polygon.\n            Certains actions can only be carried out on simple polygons.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Orientation\">\n            <summary>\n            The polygons orientation.\n            Certain actions depend on the polygons orientation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.ClockDir\">\n            <summary>\n            The orientation expressed as the clock direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsDegenerate\">\n            <summary>\n            Is the polygon degenerate.\n            Polygons with less than 3 points are degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsClockWise\">\n            <summary>\n            Is the polygon cw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsCounterClockWise\">\n            <summary>\n            Is the polygon ccw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.IsUpdated\">\n            <summary>\n            Is the polygon updated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Kernel\">\n            <summary>\n            The polygons kernel.\n            Contains the functions to the unmanaged CGAL polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.Polygon2.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetIsUpdatedToFalse\">\n            <summary>\n            Mark th mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.IsValid\">\n            <summary>\n            Valid polygons should be simple and ccw \n            for most algorithms to work on them.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.IsValidHole\">\n            <summary>\n            Valid hole polygons should be simple\n            and cw to add to a polygon with holes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Clear\">\n            <summary>\n            Clear the polygon of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Insert the point at the index into the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Insert a range of points into the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Add(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the point to the end of the poylgon.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polygon.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polygons last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the polygon.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the polygon points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the polygon segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.SetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polygon then \n            the new points will be appended to end of polygon.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Reverse\">\n            <summary>\n            Reverse the polygon.\n            Swithches the orientation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindBoundingBox\">\n            <summary>\n            Find the bounding box for the polygon.\n            </summary>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindIfSimple\">\n            <summary>\n            Find if the polygon is simple.\n            </summary>\n            <returns>True if simple.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindIfConvex\">\n            <summary>\n            Find if the polygon is convex.\n            Must be simple to determine.\n            </summary>\n            <returns>True if the polygon is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindOrientation\">\n            <summary>\n            Find the polygons orientation.\n            Must be simple to determine.\n            </summary>\n            <returns>The polygons orientations.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.OrientedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the orientated side the point lies on.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The orientated side of the polygon the point is on.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.BoundedSide(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Find the bounded side the point lies on.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The bounded side of the polygon the point is on.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindSignedArea\">\n            <summary>\n            Find the polygons signed area. \n            Must be simple to determine.\n            </summary>\n            <returns>The signed area is positive if polygon is ccw \n            and negation if cw.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindArea\">\n            <summary>\n            The area of the polygon.\n            Must be simple to determine.\n            </summary>\n            <returns>The abs of the signed area.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindPerimeter\">\n            <summary>\n            Find the perimeter.\n            This is the length of the polygon boundary.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.FindSquarePerimeter\">\n            <summary>\n            Find the square perimeter.\n            This is the square length of the polygon boundary.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does the polygon contain the points.\n            Must be simple to determine.\n            </summary>\n            <param name=\"point\">The point to find.</param>\n            <param name=\"inculdeBoundary\">Does the point on the boundary count</param>\n            <returns>True if the point is inside the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Round(System.Int32)\">\n            <summary>\n            Round each point it polygon to a number of digits.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Scale(System.Double)\">\n            <summary>\n            Scale the polygon.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the polygon with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ToArray\">\n            <summary>\n            Return all the points in the polygon in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ToList(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygon into a list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Convert``1\">\n            <summary>\n            Convert the polygon to a new polygon with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Truncate(System.Int32,System.Double)\">\n            <summary>\n            Truncate a point in the polygon by splitting\n            the point and shifting toward its neghbours.\n            </summary>\n            <param name=\"index\">The points index in mesh.</param>\n            <param name=\"amount\">The amount to truncale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polygon into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Update\">\n            <summary>\n            Update the polygon if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.Polygon2.Update(System.Boolean,CGALDotNet.ORIENTATION)\">\n            <summary>\n            Update the polygon directly without calling the update\n            function.\n            </summary>\n            <param name=\"isSimple\">Is the polygon simepl.</param>\n            <param name=\"orientation\">The polygons orientation.</param>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonAlgorithm.CheckInput\">\n            <summary>\n            Should the input polygon be checked.\n            Can disable for better performance if \n            it is know all input if valid.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonAlgorithm.CheckPolygon(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Check if the polygon is valid to offset.\n            Should be simple and ccw.\n            </summary>\n            <param name=\"polygon\">The polygon to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonAlgorithm.CheckPolygon(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Check if the polygon is valid to offset.\n            Should be simple and ccw.\n            </summary>\n            <param name=\"polygon\">The polygon to check.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_BOOLEAN\">\n            <summary>\n            The type of boolean ops.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonBoolean2`1\">\n            <summary>\n            Generic polygon boolean class.\n            </summary>\n            <typeparam name=\"K\">The type of kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonBoolean2`1.Instance\">\n            <summary>\n            A static instance to the boolean class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.#ctor\">\n            <summary>\n            Create a new object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Op(CGALDotNet.Polygons.POLYGON_BOOLEAN,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Perform the boolean op on the two polygons.\n            </summary>\n            <param name=\"op\">The type of op.</param>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The result of the op.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.DoIntersect(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Check if the polygons intesect.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <returns>If the polygons intesect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Join(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The union of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The union of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Intersect(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The intersection of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The intersection of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Difference(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.SymmetricDifference(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The symmetric difference of the two polygons.\n            </summary>\n            <param name=\"polygon1\">A simple ccw polygon.</param>\n            <param name=\"polygon2\">A simple ccw polygon.</param>\n            <param name=\"result\">The symmetric difference of the polygons.</param>\n            <returns>If the op was performed and the result list changed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.Complement(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            The complement of the polygon.\n            </summary>\n            <param name=\"polygon\">A simple ccw polygon.</param>\n            <param name=\"result\">The complement of the polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.CopyBuffer(System.Int32,System.Collections.Generic.List{CGALDotNet.Polygons.PolygonWithHoles2{`0}})\">\n            <summary>\n            Copy the unmanaged polygon objects created \n            into the result list.\n            </summary>\n            <param name=\"count\">The number of objects in the buffer.</param>\n            <param name=\"result\">The result lis.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2`1.CopyBufferItem(System.Int32)\">\n            <summary>\n            Copy the unmanaged polygon object.\n            </summary>\n            <param name=\"index\">The index of the polygon in the buffer.</param>\n            <returns>The polygon copy.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonBoolean2\">\n            <summary>\n            Abstract base class for polygon boolean.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonBoolean2.Kernel\">\n            <summary>\n            The polygon boolean kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2.ClearBuffer\">\n            <summary>\n            Clear the unmanaged buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonBoolean2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonFactory`1\">\n            <summary>\n            Factory for creating polygons.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.Create\">\n            <summary>\n            Create a empty polygon.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateTriangle(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a triangle.\n            </summary>\n            <param name=\"a\">The triangle first point.</param>\n            <param name=\"b\">The triangle second point.</param>\n            <param name=\"c\">The triangle third point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateTriangle(CGALDotNetGeometry.Shapes.Triangle2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a triangle.\n            </summary>\n            <param name=\"tri\">The triangle.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"min\">The boxs min point.</param>\n            <param name=\"max\">The boxs max point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(System.Double,System.Double,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"min\">The boxs min point.</param>\n            <param name=\"max\">The boxs max point.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateBox(CGALDotNetGeometry.Shapes.Box2d,System.Boolean)\">\n            <summary>\n            Create a polygon from a box.\n            </summary>\n            <param name=\"box\">The box.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The created polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateDounut(System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a polygon from a dounut.\n            Outer radius must be greater than inner.\n            </summary>\n            <param name=\"outer\">The outer radius.</param>\n            <param name=\"inner\">The inner radius</param>\n            <param name=\"segments\">The number of segments.</param>\n            <returns>The created polygon with holes</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateDounut(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Double,System.Int32)\">\n            <summary>\n            Create a polygon from a dounut.\n            Outer radius must be greater than inner.\n            </summary>\n            <param name=\"center\">The center position of the polygon.</param>\n            <param name=\"outer\">The outer radius.</param>\n            <param name=\"inner\">The inner radius</param>\n            <param name=\"segments\">The number of segments.</param>\n            <returns>The created polygon with holes</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"radius\">The radius of the circle.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"center\">The center of the circle.</param>\n            <param name=\"radius\">The radius of the circle.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.CreateCircle(CGALDotNetGeometry.Shapes.Circle2d,System.Int32,System.Boolean)\">\n            <summary>\n            Create a polygon from a circle.\n            </summary>\n            <param name=\"circle\">The cirlce.</param>\n            <param name=\"segments\">The number of segments.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochStar(System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"size\">The size of the polygon.</param>\n            <param name=\"iterations\">The number of times to sub divide.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochStar(CGALDotNetGeometry.Numerics.Point2d,System.Double,System.Int32,System.Boolean)\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"center\">The stars center.</param>\n            <param name=\"size\">The size of the polygon.</param>\n            <param name=\"iterations\">The number of times to sub divide.</param>\n            <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonFactory`1.KochNext(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n            </summary>\n            <param name=\"points\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION\">\n            <summary>\n            Decomposition stratergy for polygons.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION_PWH\">\n            <summary>\n            Decomposition stratergy for polygons with holes.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonMinkowski`1\">\n            <summary>\n            Generic Minkowski class.\n            </summary>\n            <typeparam name=\"K\">The type of kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonMinkowski`1.Instance\">\n            <summary>\n            A static instance to the Minkowski class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.#ctor\">\n            <summary>\n            Create a new object.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"decomp\">The decomposition method.</param>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.Sum(CGALDotNet.Polygons.MINKOWSKI_DECOMPOSITION_PWH,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Compute the Minkowski sum of two polygons.\n            </summary>\n            <param name=\"decomp\">The decomposition method.</param>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumSSAB(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            It is based on the angle-bisector decomposition method suggested by Chazelle and Dobkin [4],\n            which runs in O(n2) time. In addition, it applies a heuristic by Flato that reduces the number\n            of output polygons in many common cases. The convex decompositions that it produces usually \n            yield efficient running times for Minkowski sum computations. It starts by examining each pair \n            of reflex vertices in the input polygon, such that the entire interior of the diagonal \n            connecting these vertices is contained in the polygon. Out of all available pairs, the vertices\n            pi and pj are selected, such that the number of reflex vertices encountered when traversing \n            the boundary of the polygon from pi to pj in clockwise order is minimal. The polygon is split \n            by the diagonal pipj. This process is repeated recursively on both resulting sub-polygons. \n            In case it is not possible to eliminate two reflex vertices at once any more, each reflex \n            vertex is eliminated by a diagonal that is closest to the angle bisector emanating from this \n            vertex and having rational-coordinate endpoints on both sides.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumOptimalConvex(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses the dynamic-programming algorithm of Greene [6] for computing an optimal decomposition of \n            a polygon into a minimal number of convex sub-polygons. While this algorithm results in a small\n            number of convex polygons, it consumes rather many resources, as it runs in O(n4) time and O(n3) \n            space in the worst case, where n is the number of vertices in the input polygon.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumHertelMehlhorn(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n             Implements the approximation algorithm suggested by Hertel and Mehlhorn [8], which triangulates \n             the input polygon and then discards unnecessary triangulation edges. After triangulation (carried \n             out by the constrained-triangulation procedure of CGAL) the algorithm runs in O(n) time and space,\n             and guarantees that the number of sub-polygons it generates is not more than four times the optimum.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumGreeneConvex(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Implementation of Greene's approximation algorithm [6], which computes a convex decomposition of the \n            polygon based on its partitioning into y-monotone polygons. This algorithm runs in O(nlogn) time and \n            O(n) space, and has the same guarantee on the quality of approximation as Hertel and Mehlhorn's algorithm.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumVertical(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses vertical decomposition to decompose the underlying arrangement.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumVertical(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses vertical decomposition to decompose the underlying arrangement.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumTriangle(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski`1.SumTriangle(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n            </summary>\n            <param name=\"polygon\"></param>\n            <param name=\"shape\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonMinkowski\">\n            <summary>\n            Abstract base class for polygon minkowski.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonMinkowski.Kernel\">\n            <summary>\n            The polygon Minkowski kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonMinkowski.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonOffset2`1\">\n            <summary>\n            The generic polgon offset class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonOffset2`1.Instance\">\n            <summary>\n            Static instance of polygon offset.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.#ctor\">\n            <summary>\n            Create new polygon offset.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateOffset(CGALDotNet.Polygons.OFFSET,CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior or exterior offset.\n            </summary>\n            <param name=\"offset\">The offset type</param>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"amount\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateOffset(CGALDotNet.Polygons.OFFSET,CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior or exterior offset.\n            </summary>\n            <param name=\"offset\">The offset type</param>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"amount\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorOffset(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorOffset(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a interior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorOffset(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a exterior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorOffset(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Create a exterior offset.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"offset\">The offset amount</param>\n            <param name=\"results\">The offset polygon</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorSkeleton(CGALDotNet.Polygons.Polygon2{`0},System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the interior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateInteriorSkeleton(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the interior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorSkeleton(CGALDotNet.Polygons.Polygon2{`0},System.Double,System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the exterior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2`1.CreateExteriorSkeleton(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Double,System.Boolean,System.Collections.Generic.List{CGALDotNetGeometry.Shapes.Segment2d})\">\n            <summary>\n            Create the exterior skeleton of the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to offset.</param>\n            <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n            <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n            <param name=\"results\">The skeletons segments.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonOffset2\">\n            <summary>\n            The abstract polygon offset class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonOffset2.Kernel\">\n            <summary>\n            The offset kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.PolygonBufferSize\">\n            <summary>\n            Get the number off polygons in the buffer.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.SegmentBufferSize\">\n            <summary>\n            The size of the segment buffer.\n            </summary>\n            <returns>The number of segments in the buffer.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.GetBufferedPolygon(System.Int32)\">\n            <summary>\n            Get the unmanaged point to the polygon at the buffer index\n            </summary>\n            <param name=\"index\">The index in the buffer.</param>\n            <returns>The pointer</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.GetBufferedSegment(System.Int32)\">\n            <summary>\n            Get the segment from buffer.\n            </summary>\n            <param name=\"index\">The segments index.</param>\n            <returns>The segment.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ClearPolygonBuffer\">\n            <summary>\n            Clear the polygon buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ClearSegmentBuffer\">\n            <summary>\n            Clear the segment buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonOffset2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_PARTITION\">\n            <summary>\n            Type of polygon partitions.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonPartition2`1\">\n            <summary>\n            Generic polygon partition class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonPartition2`1.Instance\">\n            <summary>\n            Static instance of polygon partition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.#ctor\">\n            <summary>\n            Create new polygon partition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Is_Y_Monotone(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Is this polygon Y monotonic.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <returns>True if y monotonic.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Is_Y_Monotone(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Is this polygon Y monotonic.\n            </summary>\n            <param name=\"polygon\">The polygon.</param>\n            <returns>True if y monotonic.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.POLYGON_PARTITION,CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"type\">The type of partition to perfrom.</param>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Partition(CGALDotNet.Polygons.POLYGON_PARTITION,CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition a polygon.\n            </summary>\n            <param name=\"type\">The type of partition to perfrom.</param>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Y_Monotone(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition in to Y monotonic polygons.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.Y_Monotone(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition in to Y monotonic polygons.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ApproxConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.ApproxConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.GreeneApproxConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.GreeneApproxConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of\n            convex polygons produced is no more than four times the minimal number.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.OptimalConvex(CGALDotNet.Polygons.Polygon2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of \n            convex polygons produced is minimal.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.OptimalConvex(CGALDotNet.Polygons.PolygonWithHoles2{`0},System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Partition the polygon into convex polygons where the number of \n            convex polygons produced is minimal.\n            </summary>\n            <param name=\"polygon\">The polygon to partition.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2`1.CopyBufferAndClear(System.Int32,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            Copy the new polygons into the result array\n            and the clear the buffer.\n            </summary>\n            <param name=\"count\">The number of polygons in buffer.</param>\n            <param name=\"results\">The resulting polygons.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonPartition2\">\n            <summary>\n            The abstract base class.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonPartition2.Kernel\">\n            <summary>\n            The partition kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2.ClearBuffer\">\n            <summary>\n            Clear the unmanaged buffer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonPartition2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_SIMP_COST_FUNC\">\n            <summary>\n            Cost options for simplification.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_SIMP_STOP_FUNC\">\n            <summary>\n            Stop distance options for simplification.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplificationParams\">\n            <summary>\n            Paramaters for poylgon simplification.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonSimplificationParams.Default\">\n            <summary>\n            The default param settings.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplificationParams.ToString\">\n            <summary>\n            The param as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplification2`1\">\n            <summary>\n            Generic polygon simplification class.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonSimplification2`1.Instance\">\n            <summary>\n            Static instance of polygon simplification.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.Simplify(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyPtr(CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon ptr.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.Simplify(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary and all the holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyPtr(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary and all the holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygons ptr.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyBoundary(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons boundary.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyHoles(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygons holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2`1.SimplifyHole(CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonSimplificationParams,System.Int32)\">\n            <summary>\n            Simplify one of the polygons holes.\n            </summary>\n            <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n            <param name=\"param\">The simplification parameters.</param>\n            <param name=\"index\">The hole index to simplify.</param>\n            <returns>The simplified polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonSimplification2\">\n            <summary>\n            Abstract polygon simplification class.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonSimplification2.Kernel\">\n            <summary>\n            The simplification kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonSimplification2.ReleasePtr\">\n            <summary>\n            Release unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonVisibility`1\">\n            <summary>\n            The generic polgon visibility class\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Polygons.PolygonVisibility`1.Instance\">\n            <summary>\n            Static instance of polygon visibility.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.#ctor\">\n            <summary>\n            Create new polygon visibility.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.Polygon2{`0},CGALDotNet.Polygons.Polygon2{`0}@)\">\n            <summary>\n            Compute the visibility from a simple polygon with no holes.\n            This class implements the algorithm of B.Joe and R.B.Simpson [4]. The algorithm is a modification\n            and extension of the linear time algorithm of Lee [5]. It computes the visibility region from a \n            viewpoint that is in the interior or on the boundary of the polygon.\n            While scanning the boundary the algorithm uses a stack to manipulate the vertices, and ultimately\n            yields the visibility region.For each scanned edge, at most 2 points are pushed onto the stack.\n            Overall, at most 2 n points are pushed or popped. Thus, the time and space complexities of the\n            algorithm are O(n) even in case of degeneracies such as needles, where n is the number of the vertices of the polygon.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A simple polygon that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibility(CGALDotNet.Polygons.POLYGON_VISIBILITY,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes.\n            </summary>\n            <param name=\"method\">What method to use.</param>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibilityTEV(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes using the triangular expansion method.\n            The algorithm does not require preprocessing. It relies on the algorithm of T. \n            Asano [1] based on angular plane sweep, with a time complexity of O(nlogn) in the number of vertices.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility`1.ComputeVisibilityRSV(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Polygons.PolygonWithHoles2{`0},CGALDotNet.Polygons.PolygonWithHoles2{`0}@)\">\n            <summary>\n            Compute the visibility from a polygon with holes using the rotational sweep method.\n            The algorithm obtains a constrained triangulation from the input arrangement, then computes visibility by \n            expanding the triangle that contains the query point. Preprocessing takes O(n) time and O(n) space, where \n            n is the number of vertices of input polygon. The query time is O(nh), where h is the number of holes+1 of \n            input polygon. Thus, for simple polygons (or a polygon with a constant number of holes) the algorithm \n            complexity is linear, but it is O(n2) in the worst case, as the number of holes can be linear in n.\n            </summary>\n            <param name=\"point\">The visibility point.</param>\n            <param name=\"polygon\">A polygon with holes that contains the point.</param>\n            <param name=\"result\">The visibility result.</param>\n            <returns>True if result was computed</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonVisibility\">\n            <summary>\n            The abstract polygon visibility class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonVisibility.Kernel\">\n            <summary>\n            The offset kernel.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonVisibility.ReleasePtr\">\n            <summary>\n            Release the unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.POLYGON_ELEMENT\">\n            <summary>\n            Polygon with holes consists of a boundary and holes.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonWithHoles2`1\">\n            <summary>\n            Generic polygon definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor\">\n            <summary>\n            Default constuctor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Construct polygon with the boundary.\n            </summary>\n            <param name=\"boundary\">A CCW polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct polygon with the boundary points\n            </summary>\n            <param name=\"boundary\">A CCW set of points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polygons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ToString\">\n            <summary>\n            The polygon as a string.\n            </summary>\n            <returns>The polygon as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Copy\">\n            <summary>\n            Create a deep copy of the polygon.\n            </summary>\n            <returns>The copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Copy(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Create a deep copy of the polygon element.\n            </summary>\n            <param name=\"element\">The element type to copy.</param>\n            <param name=\"index\">If element os a hole thiss is the holes index.</param>\n            <returns>The copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.GetBoundary\">\n            <summary>\n            Get the boundary as a copy.\n            If unbounded will return a empty polygon.\n            </summary>\n            <returns>A copy of the hole polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.GetHole(System.Int32)\">\n            <summary>\n            Get the hole as a copy.\n            </summary>\n            <param name=\"index\">The holes index</param>\n            <returns>A copy of the hole polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.AddHole(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Add a polygon as a holes.\n            Holes must simple and CW.\n            </summary>\n            <param name=\"polygon\">The hole polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ToList\">\n            <summary>\n            Create a copy of boundary and hole polygons.\n            </summary>\n            <returns>The list of polygons.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Intersects(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Intersects(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Do the polygons intersect.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <returns>Do the polygons intersect.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.ConnectHoles\">\n            <summary>\n            Connect all the holes of the polygon \n            and return as a polygon. \n            Will result in a non simple polygon.\n            </summary>\n            <returns>The connected non-simple polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Partition(System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}},CGALDotNet.Polygons.POLYGON_PARTITION)\">\n            <summary>\n            Partition the polygon into convex pieces.\n            </summary>\n            <param name=\"results\">The convex partition.</param>\n            <param name=\"type\">The type of partition method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"threshold\">The simplification threshold.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Simplify(CGALDotNet.Polygons.PolygonSimplificationParams)\">\n            <summary>\n            Simplify the polygon.\n            </summary>\n            <param name=\"param\">The simplification parameters.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2`1.Offset(CGALDotNet.Polygons.OFFSET,System.Double,System.Collections.Generic.List{CGALDotNet.Polygons.Polygon2{`0}})\">\n            <summary>\n            offset the polygon. Does not modify this polygon.\n            </summary>\n            <param name=\"offset\">The type of offset.</param>\n            <param name=\"amount\">The amount to offset.</param>\n            <param name=\"results\">The offset results.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polygons.PolygonWithHoles2\">\n            <summary>\n            The abstract polygon definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct polygon with the kernel.\n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Construct the polygon with the kernel and boundary.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"boundary\">A CCW polygon.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct the polygon with the kernel and boundary.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"boundary\">A CCW set of points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct the polygon with the kernel and pointer.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsUnbounded\">\n            <summary>\n            Is the polygon unbounded. \n            ie no boundary polygon has been set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsBounded\">\n            <summary>\n            Is the polygon bounded. \n            ie a boundary polygon has been set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Count\">\n            <summary>\n            Number of points in the boindary polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.HoleCount\">\n            <summary>\n            The number of holes in polygon.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsSimple\">\n            <summary>\n            Is this a simple polygon.\n            Certains actions can only be carried out on simple polygons.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Orientation\">\n            <summary>\n            The polygons orientation.\n            Certain actions depend on the polygons orientation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.ClockDir\">\n            <summary>\n            The orientation expressed as the clock direction.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsDegenerate\">\n            <summary>\n            Is the polygon degenerate.\n            Polygons with less than 3 points are degenerate.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsClockWise\">\n            <summary>\n            Is the polygon cw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.IsCounterClockWise\">\n            <summary>\n            Is the polygon ccw orientated.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.Kernel\">\n            <summary>\n            The polygon kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polygons.PolygonWithHoles2.KernelName\">\n            <summary>\n            The type of kernel object uses.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.IsValid\">\n            <summary>\n            Valid polygon with holes must have a simple and ccw boundary\n            and all holes must be simple and cw.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.IsValidHole(CGALDotNet.Polygons.PolygonWithHoles2,CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Valid holes must be simple, cw and must be contained\n            within the boundary polygon.\n            </summary>\n            <param name=\"pwh\"></param>\n            <param name=\"hole\"></param>\n            <returns>True if the polygon is a valid hole.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Clear\">\n            <summary>\n            Clear the polygon.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ClearBoundary\">\n            <summary>\n            Clear the polygons boundary.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ClearHoles\">\n            <summary>\n            Clear the polygons holes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.PointCount(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Get the number of points of a polygon element.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Remove(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Remove a polygon.\n            Can remove the boundary or a hole.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.RemoveHole(System.Int32)\">\n            <summary>\n            Remove a hole from the polygon.\n            </summary>\n            <param name=\"index\">The holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Reverse(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Reverse the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetPoint(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32,System.Int32)\">\n            <summary>\n            Get a polygons point.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"pointIndex\">The index of the point in the polygon.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetPoints(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Get the points in the polygon element.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"points\">The point array to copy points into.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.SetPoint(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Set a polygons point.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"pointIndex\">The index of the point in the polygon.</param>\n            <param name=\"point\">The point to set.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.SetPoints(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Set all the points in the polygon. If the point array is longer\n            than the polygon is current the extra points are appended to the end.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"points\">The points to set.</param>\n            <param name=\"count\">The ararys length.</param>\n            <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Triangulate(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Triangulate the polygon.\n            </summary>\n            <param name=\"indices\">The triangle indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.AddHole(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Add a hole from a set of points.\n            </summary>\n            <param name=\"points\">A CW set of points.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfUnbounded\">\n            <summary>\n            Find if the polygon has a boundary.\n            </summary>\n            <returns>True if the polygon has a boundary.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindBoundingBox(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find the polygons bounding box.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The polygons bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfSimple(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find if the polygon is simple.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>True if the polygon is simple.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindIfConvex(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find if the polygon is convex.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>True if polygon is convex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindOrientation(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            Find the orientation of polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The orientation of the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.OrientedSide(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Find the orientated side the point is on.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"point\"></param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The orientated side of point compared to the polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindSignedArea(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            The signed area of the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The signed area is positive if polygon is ccw \n            and negation if cw.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.FindArea(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Int32)\">\n            <summary>\n            The area of the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n            <returns>The polygons area.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polygon.\n            </summary>\n            <returns>Each point in polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ToArray\">\n            <summary>\n            Return all the points in the polygon in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ToList(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygons boundary into a list.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.GetAllPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the points in the polygon boundary and holes.\n            </summary>\n            <param name=\"points\">The point array to copy into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Round(System.Int32)\">\n            <summary>\n            Round each point it polygon to a number of digits.\n            </summary>\n            <param name=\"digits\">The number of digits to round to.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Convert``1\">\n            <summary>\n            Convert the polygon to a new polygon with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ReleasePtr\">\n            <summary>\n            Release the unmanaged resoures.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ContainsPolygon(CGALDotNet.Polygons.Polygon2,System.Boolean)\">\n            <summary>\n            Does the polygon fully contain the other polygon.\n            </summary>\n            <param name=\"polygon\">The other polygon.</param>\n            <param name=\"inculdeBoundary\">Should the boundary be included.</param>\n            <returns>True if the polygon is contained within this polygon.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.ContainsPoint(CGALDotNetGeometry.Numerics.Point2d,System.Boolean)\">\n            <summary>\n            Does this polygon contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"inculdeBoundary\">Should points on the boundary be \n            counted as being inside the polygon.</param>\n            <returns>True if the polygon contain the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Translate(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,System.Int32)\">\n            <summary>\n            Translate the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Rotate(CGALDotNetGeometry.Numerics.Degree)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Rotate(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Degree,System.Int32)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Scale(System.Double)\">\n            <summary>\n            Rotate the polygon.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Scale(CGALDotNet.Polygons.POLYGON_ELEMENT,System.Double,System.Int32)\">\n            <summary>\n            Scale the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"scale\">The amount to scale.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double)\">\n            <summary>\n            Transform the polygon.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Transform(CGALDotNet.Polygons.POLYGON_ELEMENT,CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Degree,System.Double,System.Int32)\">\n            <summary>\n            Transform the polygon.\n            </summary>\n            <param name=\"element\">The element type.</param>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n            <param name=\"scale\">The amount to scale.</param>\n            <param name=\"index\">If element type is a hole this is the holes index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polygons.PolygonWithHoles2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print debug infomation.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.VertexCount\">\n            <summary>\n            Number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.FaceCount\">\n            <summary>\n            Number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.HalfedgeCount\">\n            <summary>\n            Number of halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.BorderEdgeCount\">\n            <summary>\n            Number of border edges.\n            Since each border edge of a polyhedral surface has exactly one \n            border halfedge, this number is equal to size of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValid\">\n            <summary>\n            Returns true if the polyhedral surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidTriangleMesh\">\n            <summary>\n            Is this a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidClosedMesh\">\n            <summary>\n            Is this a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.IsValidClosedTriangleMesh\">\n            <summary>\n            Is this a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map. </param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The length of the point array.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.IMesh.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\">The points index.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ComputeVertexNormals\">\n            <summary>\n            Computes the vertex normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ComputeFaceNormals\">\n            <summary>\n            Computes the face normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ReadOFF(System.String)\">\n            <summary>\n            Read data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.WriteOFF(System.String)\">\n            <summary>\n            Write data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.IMesh.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshFace3.Index\">\n            <summary>\n            The faces index\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshFace3.Halfedge\">\n            <summary>\n            THe faces edge\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshFace3.NullFace\">\n            <summary>\n            A face where all compents are null index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.op_Equality(CGALDotNet.Polyhedra.MeshFace3,CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.op_Inequality(CGALDotNet.Polyhedra.MeshFace3,CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.Equals(CGALDotNet.Polyhedra.MeshFace3)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.GetHashCode\">\n            <summary>\n            The faces hash code.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshFace3.EnumerateVertices(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all vertices in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next vertex</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.MeshFactory\">\n            <summary>\n            https://github.com/caosdoar/spheres/blob/master/src/spheres.cpp\n            https://github.com/mrdoob/three.js/tree/dev/src/geometries\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.IsBorder\">\n            <summary>\n            Is the edge a border to a hole.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Index\">\n            <summary>\n            The edges index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Source\">\n            <summary>\n            The edges  source vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Target\">\n            <summary>\n            The edges  target vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Opposite\">\n            <summary>\n            The edges opposite edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Next\">\n            <summary>\n            The edges next edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Previous\">\n            <summary>\n            The edges previous edge.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshHalfedge3.Face\">\n            <summary>\n            The edges face\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshHalfedge3.NullHalfedge\">\n            <summary>\n            A edge where everthing is set to null index.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.SourcePoint(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Get the source point. \n            </summary>\n            <param name=\"mesh\">The mesh the point belongs to.</param>\n            <returns>The  source point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point is null index.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.TargetPoint(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Get the target point. \n            </summary>\n            <param name=\"mesh\">The mesh the point belongs to.</param>\n            <returns>The  target point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point is null index.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.op_Equality(CGALDotNet.Polyhedra.MeshHalfedge3,CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.op_Inequality(CGALDotNet.Polyhedra.MeshHalfedge3,CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.Equals(CGALDotNet.Polyhedra.MeshHalfedge3)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.GetHashCode\">\n            <summary>\n            The edges hahe code\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshHalfedge3.EnumerateVertices(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all vertices in this edge loop.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next vertex</returns>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Degree\">\n            <summary>\n            The vertices degree is how mang edges connect to it.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Index\">\n            <summary>\n            The vertices index.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.MeshVertex3.Halfedge\">\n            <summary>\n            The vertices edge\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.MeshVertex3.NullVertex\">\n            <summary>\n            A vertex where all components are null.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.op_Equality(CGALDotNet.Polyhedra.MeshVertex3,CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.op_Inequality(CGALDotNet.Polyhedra.MeshVertex3,CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices not equal.\n            </summary>\n            <param name=\"v1\"></param>\n            <param name=\"v2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.Equals(CGALDotNet.Polyhedra.MeshVertex3)\">\n            <summary>\n            Are these vertices equal.\n            </summary>\n            <param name=\"v\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.GetHashCode\">\n            <summary>\n            The vertices hash code\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.MeshVertex3.EnumerateHalfedges(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Enmerate all edges surrounding the vertex.\n            </summary>\n            <param name=\"mesh\">The mesh the edges belong too.</param>\n            <returns>The next edge</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.NefPolyhedron3`1\">\n            <summary>\n            Generic nef polyhedron definition.\n            A 3D Nef polyhedron is a subset of the 3-dimensional space that is the result of forming\n            complements and intersections starting from a finite set H of 3-dimensional halfspaces.\n            Nef polyhedra are closed under all binary set operations, i.e., intersection, union, \n            difference, complement, and under the topological operations boundary, closure, and interior.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            creates a Nef polyhedron and initializes it to the empty \n            set if plane == EMPTY and to the whole space if space == COMPLETE.\n            </summary>\n            <param name=\"space\">The nef's space</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNetGeometry.Shapes.Plane3d,CGALDotNet.Polyhedra.NEF_BOUNDARY)\">\n            <summary>\n            creates a Nef polyhedron containing the halfspace on the \n            negative side of plane including plane if boundary==INCLUDED, \n            excluding plane if boundary==EXCLUDED.\n            </summary>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"boundary\">The boundary.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            creates a Nef polyhedron, which represents the same point \n            set as the polyhedral surface.\n            </summary>\n            <param name=\"polyhedra\">The polyhedron</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polyhedrons pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ToString\">\n            <summary>\n            The nef polyhdron as a string.\n            </summary>\n            <returns>The nef polyhedron as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Intersection(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the intersection of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Join(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the union of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Difference(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the difference between nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.SymmetricDifference(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Return the symmetric difference of nef and nef1.\n            </summary>\n            <param name=\"nef\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Complement\">\n            <summary>\n            Returns the complement of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Interior\">\n            <summary>\n            Returns the interior of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Boundary\">\n            <summary>\n            Returns the boundary of nef. \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Closure\">\n            <summary>\n            Returns the closure of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.Regularization\">\n            <summary>\n            Returns the regularization, i.e. the closure of the interior, of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.MinkowskiSum(CGALDotNet.Polyhedra.NefPolyhedron3{`0})\">\n            <summary>\n            Returns the MinkowskiSum.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ConvertToPolyhedron(CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            Converts nef into a Polyhedron.\n            nef must be simple to convert.\n            </summary>\n            <param name=\"poly\">The result of the conversion.</param>\n            <returns>True if nef is simple and the conversion was successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.ConvertToSurfaceMesh(CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            Converts nef into a surface mesh.\n            nef must be simple to convert.\n            </summary>\n            <param name=\"mesh\">The result of the conversion.</param>\n            <returns>True if nef is simple and the conversion was successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3`1.GetVolumes(System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Get a list of the nef volumes.\n            </summary>\n            <param name=\"volumes\">Get a list of the nef volumes.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.NefPolyhedron3\">\n            <summary>\n            The abstract nef polyhedra definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            creates a Nef polyhedron and initializes it to the empty \n            set if plane == EMPTY and to the whole space if space == COMPLETE.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"space\">The nef's space</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Shapes.Plane3d,CGALDotNet.Polyhedra.NEF_BOUNDARY)\">\n            <summary>\n            creates a Nef polyhedron containing the halfspace on the \n            negative side of plane including plane if boundary==INCLUDED, \n            excluding plane if boundary==EXCLUDED.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"boundary\">The boundary.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,CGALDotNet.Polyhedra.Polyhedron3)\">\n            <summary>\n            creates a Nef polyhedron, which represents the same point \n            set as the polyhedral surface.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"polyhedra\">The polyhedron</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyhedron kernel.</param>\n            <param name=\"ptr\">The polyhedrons pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.Kernel\">\n            <summary>\n            The polyhedron kernel.\n            Contains the functions to the unmanaged CGAL polhedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.EdgeCount\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.FaceCount\">\n            <summary>\n            Return the number of halfedge pairs.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.HalfEdgeCount\">\n            <summary>\n            Return the number of halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.HalfFaceCount\">\n            <summary>\n            Return the number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.VertexCount\">\n            <summary>\n            Return the number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.VolumeCount\">\n            <summary>\n            Return the number of volumes.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsEmpty\">\n            <summary>\n            Returns true, if nef is the empty point set.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsSimple\">\n            <summary>\n            Rreturns true, if nef is a 2-manifold.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.NefPolyhedron3.IsSpace\">\n            <summary>\n            Returns true, if nef is the complete 3D space.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.Clear(CGALDotNet.Polyhedra.NEF_CONTENT)\">\n            <summary>\n            Make nef the empty set if space == EMPTY and the complete \n            3D space if space == COMPLETE.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.IsValid\">\n            <summary>\n            Checks the integrity of nef.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.ConvexDecomposition\">\n            <summary>\n            Decompose the nef into convex volumes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the nef polyhedron into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.NefPolyhedron3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckInput\">\n            <summary>\n            Should the input polygon be checked.\n            Can disable for better performance if \n            it is know all input if valid.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is valid.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValid(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is valid.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidTriangleException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidTriangle(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid closed mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosed(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid closed mesh.\n            </summary>\n            <param name=\"mesh\">The polygon to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedTriangleException(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.PolyhedraAlgorithm.CheckIsValidClosedTriangle(CGALDotNet.Polyhedra.IMesh)\">\n            <summary>\n            Check if the mesh is a valid triangle mesh.\n            </summary>\n            <param name=\"mesh\">The mesh to check.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.Polyhedron3`1\">\n            <summary>\n            A polyhedral surface consists of vertices, edges, \n            facets and an incidence relation on them.\n             Each edge is represented by two halfedges with opposite orientations.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[])\">\n            <summary>\n            Construct from points and triangle indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Construct from points and polygon indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The meshs pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ToString\">\n            <summary>\n            The polyhdron as a string.\n            </summary>\n            <returns>The mesh as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Copy\">\n            <summary>\n            Create a deep copy of the mesh.\n            </summary>\n            <returns>A deep copy of the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"oriente\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Split(System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Split the mesh into its unconnected components.\n            </summary>\n            <param name=\"results\">Each unconnect component as a new mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.CreatePolygonMesh(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"polygon\">The faces polygon.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.Dual\">\n            <summary>\n            Create the dual mesh where each face becomes a vertex\n            and each vertex becomes a face.\n            Must be a valid closed mesh to create the dual.\n            </summary>\n            <returns>The duel mesh.</returns>\n            <exception cref=\"T:System.InvalidOperationException\">Is thrown if the mesh is not a valid closed mesh.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ToSurfaceMesh\">\n            <summary>\n            Convert to a surface mesh.\n            </summary>\n            <returns>The surface mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3`1.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.Polyhedron3\">\n            <summary>\n            The abstract polyhedra definition.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.Polyhedron3.m_isValid\">\n            <summary>\n            Cached values found by running Update.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The mesh kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The mesh kernel.</param>\n            <param name=\"ptr\">The meshs pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.Kernel\">\n            <summary>\n            The mesh kernel.\n            Contains the functions to the unmanaged CGAL polhedron.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.VertexCount\">\n            <summary>\n            Number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.FaceCount\">\n            <summary>\n            Number of faces.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.HalfedgeCount\">\n            <summary>\n            Number of half edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BorderEdgeCount\">\n            <summary>\n            Number of border edges.\n            Since each border edge of a polyhedral surface has exactly one \n            border halfedge, this number is equal to size of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BorderHalfEdgeCount\">\n            <summary>\n            Number of border halfedges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValid\">\n            <summary>\n            Returns true if the polyhedral surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidTriangleMesh\">\n            <summary>\n            Is the mesh a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidClosedMesh\">\n            <summary>\n            Is the mesh a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsValidClosedTriangleMesh\">\n            <summary>\n            Is the mesh a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.IsUpdated\">\n            <summary>\n            Has the update function been called.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetIsUpdatedToFalse\">\n            <summary>\n            Mark th mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClearIndexMaps(System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex index map.</param>\n            <param name=\"faces\">True to clear the face index map.</param>\n            <param name=\"edges\">True to clear the edges index map.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BuildIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Builds the vertex and/or face index maps if needed.\n            </summary>\n            <param name=\"vertices\">True to build the vertex index map.</param>\n            <param name=\"faces\">True to build the face index map.</param>\n            <param name=\"edges\">True to build the face index map.</param>\n            <param name=\"force\">True to force the build even if already built.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeTetrahedron(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            A tetrahedron is added to the polyhedral surface\n            with its vertices initialized to p1, p2, p3, and p4.\n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"p3\"></param>\n            <param name=\"p4\"></param>\n            <returns>A edge in the tetrahdron.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeTriangle(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            A triangle with border edges is added to the \n            polyhedral surface with its vertices initialized to p1, p2, and p3.\n            </summary>\n            <param name=\"p1\"></param>\n            <param name=\"p2\"></param>\n            <param name=\"p3\"></param>\n            <returns>A edge in the triangle.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The point array length.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetDualPolygonalIndices\">\n            <summary>\n            Get the dual meshes triangles, quads, pentagons and hexagons.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The indices</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.Polyhedron3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\">The points index.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polygon.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polygons last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPointClamp(System.Int32)\">\n            <summary>\n            Get the vertices point but wraps the index.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegment(System.Int32)\">\n            <summary>\n            Get the segment.\n            </summary>\n            <param name=\"index\">The segment index.</param>\n            <returns>The segment</returns>\n            <exception cref=\"T:System.ArgumentException\">If segmentwith the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangle(System.Int32)\">\n            <summary>\n            Get the triangle.\n            </summary>\n            <param name=\"index\">The triangle index.</param>\n            <returns>The triangle</returns>\n            <exception cref=\"T:System.ArgumentException\">If triangle with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertex(System.Int32)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertexs index.</param>\n            <returns>The vertexs</returns>\n            <exception cref=\"T:System.ArgumentException\">If vertex with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFace(System.Int32)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The faces</returns>\n            <exception cref=\"T:System.ArgumentException\">If face with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedge(System.Int32)\">\n            <summary>\n            Get the mesh Halfedge.\n            </summary>\n            <param name=\"index\">The Halfedges index.</param>\n            <returns>The Halfedges</returns>\n            <exception cref=\"T:System.ArgumentException\">If Halfedge with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ComputeVertexNormals\">\n            <summary>\n            Computes the vertex normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ComputeFaceNormals\">\n            <summary>\n            Computes the face normals if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            </summary>\n            <param name=\"normals\">The normals array.</param>\n            <param name=\"count\">The normals array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.NormalizeBorder\">\n            <summary>\n            sorts halfedges such that the non-border edges precede the border edges.\n            For each border edge the halfedge iterator will reference the halfedge \n            incident to the facet right before the halfedge incident to the hole.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.NormalizedBorderIsValid\">\n            <summary>\n            returns true if the border halfedges are in normalized representation, \n            which is when enumerating all halfedges with the iterator: \n            The non-border edges precede the border edges and for border edges,\n            the second halfedge is the border halfedge.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.DoesSelfIntersect\">\n            <summary>\n            Tests if a set of faces of a triangulated surface mesh self-intersects.\n            Must be a triangle mesh.\n            </summary>\n            <returns>True/Fasle if a valid triangle polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfValid(System.Int32)\">\n            <summary>\n            returns true if the polyhedral surface is combinatorially consistent.\n            For level == 1 the normalization of the border edges is checked too.\n            This method checks that each face is at least a triangle and that the\n            two incident facets of a non-border edge are distinct.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindBoundingBox\">\n            <summary>\n            Computes the bounding box.\n            </summary>\n            <returns>The bounding box.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindArea\">\n            <summary>\n            Computes the area of a range of faces\n            of a given triangulated surface mesh.\n            </summary>\n            <returns>The area or 0 if poyhedron is not valid triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindCentroid\">\n            <summary>\n            computes the centroid of a volume bounded \n            by a closed triangulated surface mesh.\n            </summary>\n            <returns>The centroid or 0 if poyhedron is not valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindVolume\">\n            <summary>\n            Computes the volume of the domain bounded by a \n            closed triangulated surface mesh.\n            </summary>\n            <returns>The volume or 0 if poyhedron is not valid closed triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfBivalent\">\n            <summary>\n            Returns true if all vertices have exactly two incident edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfTrivalent\">\n            <summary>\n            Returns true if all vertices have exactly three incident edges.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfTriangleMesh\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfQuadMesh\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n            <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindIfDoesBoundAVolume\">\n            <summary>\n            Indicates if the mesh bounds a volume.\n            Must be a closed and triangulated.\n            </summary>\n            <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.BuildAABBTree\">\n            <summary>\n            Builds the aabb tree used for location.\n            Tree will be automatically built if need so not \n            actually necessary to call this function.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReleaseAABBTree\">\n            <summary>\n            Will delete the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.DoIntersect(CGALDotNet.Polyhedra.Polyhedron3,System.Boolean)\">\n            <summary>\n            Returns true if there exists a face of this poly and \n            a face of other poly which intersect, and false otherwise.\n            Must be a triangle mesh\n            </summary>\n            <param name=\"poly\">The other triangle poly.</param>\n            <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n            the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n            <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReadOFF(System.String)\">\n            <summary>\n            Read data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.WriteOFF(System.String)\">\n            <summary>\n            Write data from a off file into the pollyhedron.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ToArray\">\n            <summary>\n            Return all the points in the mesh in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ToList\">\n            <summary>\n            Return all the points in the mesh in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.AddFacetToBorder(System.Int32,System.Int32)\">\n             <summary>\n             https://doc.cgal.org/latest/Polyhedron/classCGAL_1_1Polyhedron__3.html#a73119c0c90bf8612da003305af25a52a\n             creates a new facet within the hole incident to h and g by connecting the \n             vertex denoted by g with the vertex denoted by h with a new halfedge and \n             filling this separated part of the hole with a new facet, such that the \n             new facet is incident to g.\n            \n             Precondition\n             h->is_border(), g->is_border(), h != g, h->next() != g, \n             and g can be reached along the same hole starting with h.\n             </summary>\n             <param name=\"h\">a halfedge index</param>\n             <param name=\"g\">a halfedge index</param>\n             <returns> Returns the halfedge of the new edge that is incident to the new facet.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.AddVertexAndFacetToBorder(System.Int32,System.Int32)\">\n             <summary>\n             creates a new facet within the hole incident to h and g by connecting the \n             tip of g with the tip of h with two new halfedges and a new vertex and \n             filling this separated part of the hole with a new facet, such that the \n             new facet is incident to g.\n            \n             Precondition\n             h->is_border(), g->is_border(), h != g, and g can be reached along the same hole starting with h.\n             </summary>\n             <param name=\"h\">a halfedge index</param>\n             <param name=\"g\">a halfedge index</param>\n             <returns>Returns the halfedge of the new edge that is incident to the new facet and the new vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.CreateCenterVertex(System.Int32)\">\n            <summary>\n            barycentric triangulation of h->facet().\n            Creates a new vertex, a copy of h->vertex(), and connects it to each vertex incident \n            to h->facet() splitting h->facet() into triangles.h remains incident to the original \n            facet, all other triangles are copies of this facet.\n            Precondition\n            h is not a border halfedge.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the halfedge h->next() \n            after the operation, i.e., a halfedge pointing to the new vertex.The time is \n            proportional to the size of the facet.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseCenterVertex(System.Int32)\">\n            <summary>\n            reverses create_center_vertex().\n            Erases the vertex pointed to by g and all incident halfedges thereby merging all \n            incident facets.Only g->facet() remains. The neighborhood of g->vertex() may not \n            be triangulated, it can have larger facets.\n            Precondition\n            None of the incident facets of g->vertex() is a hole. There are at least two distinct facets incident to the facets that are incident to g->vertex(). (This prevents the operation from collapsing a volume into two facets glued together with opposite orientations, such as would happen with any vertex of a tetrahedron.)\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the halfedge g->prev(). \n            Thus, the invariant h == erase_center_vertex(create_center_vertex(h)) \n            holds if h is not a border halfedge.The time is proportional to the sum of the size of all incident facets.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseConnectedComponent(System.Int32)\">\n            <summary>\n            removes the incident facet of h and changes all halfedges incident to the facet \n            into border edges or removes them from the polyhedral surface if they were already border edges.\n            If this creates isolated vertices they get removed as well.See make_hole(h) for a more specialized variant.\n            Precondition\n            h->is_border() == false.\n            Supports_removal must be CGAL::Tag_true\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.EraseFacet(System.Int32)\">\n            <summary>\n            Erase a facet.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>returns a range of handles over the facets.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FillHole(System.Int32)\">\n            <summary>\n            fills a hole with a newly created facet.\n            Makes all border halfedges of the hole denoted \n            by h incident to the new facet.Returns h.\n            Precondition\n            h.is_border().\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.FlipEdge(System.Int32)\">\n            <summary>\n            performs an edge flip.\n            \n            Precondition\n            h != Halfedge_handle() and both facets incident to h are triangles.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>It returns h after rotating the edge h one vertex in the direction of the face orientation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinFacet(System.Int32)\">\n            <summary>\n            joins the two facets incident to h.\n            The facet incident to h->opposite() gets removed.Both facets might be holes. \n            \n            Precondition\n            The degree of both vertices incident to h is at least three(no antennas).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the predecessor of h around the facet. The invariant join_facet(split_facet(h, g)) \n            returns h and keeps the polyhedron unchanged.The time is proportional to the size of \n            the facet removed and the time to compute h->prev().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinLoop(System.Int32,System.Int32)\">\n            <summary>\n            glues the boundary of the two facets denoted by h and g together and returns h.\n            Both facets and the vertices along the facet denoted by g gets removed.Both facets may be holes.\n            The invariant join_loop(h, split_loop(h, i, j)) \n            Precondition\n            The facets denoted by h and g are different and have equal degree(i.e., number of edges).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>returns h and keeps the polyhedron unchanged.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.JoinVertex(System.Int32)\">\n            <summary>\n            joins the two vertices incident to h.\n            The vertex denoted by h->opposite() gets removed.\n            Precondition\n            The size of both facets incident to h is at least four(no multi-edges).\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the predecessor of h around the vertex, i.e.,\n            h->opposite()->prev(). The invariant join_vertex(split_vertex(h, g)) \n            returns h and keeps the polyhedron unchanged.The time is proportional \n            to the degree of the vertex removed and the time to compute h->prev() and h->opposite()->prev().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.MakeHole(System.Int32)\">\n            <summary>\n            removes the incident facet of h and changes all halfedges incident to the facet into border edges.\n            \n            Precondition\n            None of the incident halfedges of the facet is a border edge.\n            Supports_removal must be CGAL::Tag_true.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns h.See erase_facet(h) for a more generalized variant.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitEdge(System.Int32)\">\n            <summary>\n            splits the halfedge h into two halfedges inserting a new vertex that is a copy of h->opposite()->vertex().\n            Is equivalent to split_vertex(h->prev(), h->opposite())->opposite(). The call of prev() can make this method \n            slower than a direct call of split_vertex() if the previous halfedge is already known and computing \n            it would be costly when the halfedge data structure does not support the prev() member function.\n            \n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <returns>Returns the new halfedge now pointing to the inserted vertex.The new halfedge is followed \n            by the old halfedge, i.e., hnew->next() == h.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitFacet(System.Int32,System.Int32)\">\n            <summary>\n            splits the facet incident to h and g into two facets with a new diagonal between \n            the two vertices denoted by h and g respectively.\n            The second(new) facet is a copy of the first facet.\n            Precondition\n            h and g are incident to the same facet.h != g (no loops). h->next() != g and g->next() != h (no multi-edges).\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>Returns h->next() after the\n            operation, i.e., the new diagonal.The new face is to the right of the new diagonal,\n            the old face is to the left.The time is proportional to the distance from h to g around the facet.</returns>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitLoop(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            cuts the polyhedron into two parts along the cycle (h,i,j) (edge j runs on the backside of the three dimensional figure above).\n            Three new vertices(one copy for each vertex in the cycle) and three new halfedges(one copy for each halfedge in the cycle), \n            and two new triangles are created.h,i,j will be incident to the first new triangle.\n            Precondition\n            h, i, j denote distinct, consecutive vertices of the polyhedron and form a cycle: i.e., h->vertex() == i->opposite()->vertex(),\n            … , j->vertex() == h->opposite()->vertex(). The six facets incident to(h, i, j) are all distinct.\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <param name=\"k\">a halfedge index</param>\n            <returns>The return value will be the halfedge \n            incident to the second new triangle which is the copy of h-opposite().</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.SplitVertex(System.Int32,System.Int32)\">\n            <summary>\n            splits the vertex incident to h and g into two vertices, the old vertex remains and a\n            new copy is created, and connects them with a new edge.\n            Let hnew be h->next()->opposite() after the split, i.e., a halfedge of the new edge.\n            The split regroups the halfedges around the two vertices.The halfedge sequence hnew,\n            g->next()->opposite(), … , h remains around the old vertex, while the halfedge \n            sequence hnew->opposite(), h->next()->opposite() (before the split), … , g is \n            regrouped around the new vertex.\n            Precondition\n            h and g are incident to the same vertex. h != g (antennas are not allowed).\n            </summary>\n            <param name=\"h\">a halfedge index</param>\n            <param name=\"g\">a halfedge index</param>\n            <returns>The split returns hnew, i.e., the new halfedge \n            incident to the old vertex.The time is proportional to the distance from h to \n            g around the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Update\">\n            <summary>\n            Update the mesh if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintVertices(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintFaces(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.PrintHalfedges(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.Polyhedron3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.SurfaceMesh3`1\">\n            <summary>\n            This class is a data structure that can be used as halfedge data structure.\n            It is an alternative to the classes Polyhedron3.The main difference is that it is indexed based and not pointer based, \n            and that the mechanism for adding information to vertices, halfedges, edges, and faces is much simpler.\n            When elements are removed, they are only marked as removed, and a garbage collection function must be called to really remove them.\n            </summary>\n            <typeparam name=\"K\">The kernel type</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[])\">\n            <summary>\n            Construct from points and triangle indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[],CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Construct from points and polygon indices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The surface meshes pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ToString\">\n            <summary>\n            The mesh as a string.\n            </summary>\n            <returns>The mesh as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Copy\">\n            <summary>\n            Create a deep copy of the mesh.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"oriente\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Split(System.Collections.Generic.List{CGALDotNet.Polyhedra.SurfaceMesh3{`0}})\">\n            <summary>\n            Split the mesh into its unconnected components.\n            </summary>\n            <param name=\"results\">Each unconnect component as a new mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.Join(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Copy the other mesh to this one.\n            </summary>\n            <param name=\"other\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.CreatePolygonMesh(CGALDotNet.Polygons.Polygon2{`0},System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"polygon\">The faces polygon.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n            <exception cref=\"T:System.InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ToPolyhedronMesh\">\n            <summary>\n            Convert to a polyhedron mesh.\n            </summary>\n            <returns>The polyhedron mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3`1.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polyhedra.SurfaceMesh3\">\n            <summary>\n            The surface mesh abstract base class.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Polyhedra.SurfaceMesh3.m_isValid\">\n            <summary>\n            Cached values found by running Update.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct mesh with the kernel.\n            </summary>\n            <param name=\"kernel\">The kernel</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The surface meshes kernel.</param>\n            <param name=\"ptr\">The surface meshes pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.Kernel\">\n            <summary>\n            The meshes kernel type.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.VertexCount\">\n            <summary>\n            The number of vertices in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.HalfedgeCount\">\n            <summary>\n            The number of half edges in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.EdgeCount\">\n            <summary>\n            The number of edges in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.FaceCount\">\n            <summary>\n            The number of faces in the mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.BorderEdgeCount\">\n            <summary>\n            The number of border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.BuildStamp\">\n            <summary>\n            The current build stamp.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedVertexCount\">\n            <summary>\n            The number of vertices currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of vertices marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedHalfedgeCount\">\n            <summary>\n            The number of halfedges currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of half edges marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedEdgeCount\">\n            <summary>\n            The number of edges currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of edges marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.RemovedFaceCount\">\n            <summary>\n            The number of faces currenly maked to be removed\n            but have not. Calling collect garbage will remove them.\n            </summary>\n            <returns>The number of face marked to be removed.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValid\">\n            <summary>\n            Returns true if the meshl surface is combinatorially consistent.\n            Must be a valid mesh to check many other properties.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsClosed\">\n            <summary>\n            Returns true if there are no border edges.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsTriangle\">\n            <summary>\n            Returns true if all faces are triangles.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsQuad\">\n            <summary>\n            Returns true if all faces are quads.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidTriangleMesh\">\n            <summary>\n            Is the mesh a valid triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidClosedMesh\">\n            <summary>\n            Is the mesh a valid closed mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsValidClosedTriangleMesh\">\n            <summary>\n            Is the mesh a valid closed triangle mesh.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.IsUpdated\">\n            <summary>\n            Has the update function been called.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetIsUpdatedToFalse\">\n            <summary>\n            Mark the mesh as needing to be updated.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Clear\">\n            <summary>\n            Clear the mesh.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearIndexMaps(System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex index map.</param>\n            <param name=\"faces\">True to clear the face index map.</param>\n            <param name=\"edges\">True to clear the edges index map.</param>\n            <param name=\"halfedges\">True to clear the halfedges index map.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearNormalMaps(System.Boolean,System.Boolean)\">\n            <summary>\n            Clear the normal maps.\n            </summary>\n            <param name=\"vertices\">True to clear the vertex normal map.</param>\n            <param name=\"faces\">True to clear the face normal map</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClearProperyMaps\">\n            <summary>\n            Clear the property maps.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BuildIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Build the index maps.\n            The index maps are used to access the meshes elemnts by index.\n            They are automaticaly created when a elements is accessed\n            be a function requiring it but can be create ahead of time.\n            </summary>\n            <param name=\"vertices\">True to build the vertex index maps.</param>\n            <param name=\"faces\">True to build the face index maps.</param>\n            <param name=\"edges\">True to build the edge index maps.</param>\n            <param name=\"halfedges\">True to build the halfedge index maps.</param>\n            <param name=\"force\">The index maps wont be build if the mesh knows they are already built and upto date.\n            Setting force to true will build them always.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PrintIndices(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <param name=\"vertices\"></param>\n            <param name=\"faces\"></param>\n            <param name=\"edges\"></param>\n            <param name=\"halfedges\"></param>\n            <param name=\"force\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddVertex(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Adds a vertex to the mesh.\n            </summary>\n            <param name=\"point\">The vertices position</param>\n            <returns>The vertices index in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddEdge(System.Int32,System.Int32)\">\n            <summary>\n            Adds a edge between the two vertices.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <returns>The index of the edge in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddTriangle(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a triangle face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddQuad(System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a quad face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddPentagon(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a pentagon face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <param name=\"v4\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddHexagon(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Adds a hexagon face to the mesh.\n            </summary>\n            <param name=\"v0\">The index of the vertex in the mesh.</param>\n            <param name=\"v1\">The index of the vertex in the mesh.</param>\n            <param name=\"v2\">The index of the vertex in the mesh.</param>\n            <param name=\"v3\">The index of the vertex in the mesh.</param>\n            <param name=\"v4\">The index of the vertex in the mesh.</param>\n            <param name=\"v5\">The index of the vertex in the mesh.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.AddPolygon(System.Int32[],System.Int32)\">\n            <summary>\n            Add a polygon face to the mesh.\n            </summary>\n            <param name=\"indices\">The indices of the points in the mesm.</param>\n            <param name=\"count\">The indices array length.</param>\n            <returns>The index of the face in the mesh.</returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.HasGarbage\">\n            <summary>\n            Checks if any vertices, halfedges, edges, or faces are marked as removed.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CollectGarbage\">\n            <summary>\n            Really removes vertices, halfedges, edges, and faces which are marked removed.\n            By garbage collecting elements get new indices. In case you store indices in an \n            auxiliary data structure or in a property these indices are potentially no \n            longer refering to the right elements.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.DoesRecycleGarbage\">\n            <summary>\n            Controls the recycling or not of simplices previously marked as removed \n            upon addition of new elements.\n            When set to true (default value), new elements are first picked in the \n            garbage(if any) while if set to false only new elements are created.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:CGALDotNet.Polyhedra.SurfaceMesh3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polygon.\n            Getting a point wraps around the polygon.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPoint(System.Int32)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index in the mesh.</param>\n            <returns>The vertices point.</returns>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the points in the mesh.\n            </summary>\n            <param name=\"points\">The array to copy points into.</param>\n            <param name=\"count\">The point array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the point at the index.\n            </summary>\n            <param name=\"index\">The points index</param>\n            <param name=\"point\">The points</param>am>\n            <exception cref=\"T:System.ArgumentOutOfRangeException\">If index is out of range.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from a array.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The point arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetSegment(System.Int32,CGALDotNetGeometry.Shapes.Segment3d@)\">\n            <summary>\n            Get a halfedges segment.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if halfedge found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get a segment for  each halfedge in the mesh.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The segment array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle3d@)\">\n            <summary>\n            Get the faces triangle. \n            Presumes face is a triangle with no checks.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"triangle\">The faces triangle</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangles(CGALDotNetGeometry.Shapes.Triangle3d[],System.Int32)\">\n            <summary>\n            Get a triangle for each face in the mesh.\n            Presumes all faces are triangles with no checks.\n            </summary>\n            <param name=\"triangles\">The trainagle array.</param>\n            <param name=\"count\">The traingle  arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertex(System.Int32,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertex(System.Int32)\">\n            <summary>\n            Get the mesh vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <returns>The vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertices(CGALDotNet.Polyhedra.MeshVertex3[],System.Int32)\">\n            <summary>\n            Get the vertices in the mesh.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFace(System.Int32,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <param name=\"face\">The face.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFace(System.Int32)\">\n            <summary>\n            Get the mesh face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFaces(CGALDotNet.Polyhedra.MeshFace3[],System.Int32)\">\n            <summary>\n            Get the faces in the mesh.\n            </summary>\n            <param name=\"faces\">The face array.</param>\n            <param name=\"count\">The face array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedge(System.Int32,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <param name=\"halfedge\">The halfedge.</param>\n            <returns>True if the halfedge was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedge(System.Int32)\">\n            <summary>\n            Get the mesh halfedge.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <returns>THe healfedge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetHalfedges(CGALDotNet.Polyhedra.MeshHalfedge3[],System.Int32)\">\n            <summary>\n            Get the halfedges in the mesh.\n            </summary>\n            <param name=\"halfedges\">The halfedge array.</param>\n            <param name=\"count\">The halfedge array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexDegree(System.Int32)\">\n            <summary>\n            Returns the number of incident halfedges of vertex.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>Returns the number of incident halfedges of vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FaceDegree(System.Int32)\">\n            <summary>\n            Returns the number of incident halfedges of face.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>Returns the number of incident halfedges of face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexIsIsolated(System.Int32)\">\n            <summary>\n            Returns whether vertex is isolated.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>Returns whether vertex is isolated.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.VertexIsBorder(System.Int32,System.Boolean)\">\n            <summary>\n            Returns whether vertex is a border vertex.\n            If the data contained in the Surface_mesh is not\n            a 2-manifold, then this operation is not \n            guaranteed to return the right result.\n            </summary>\n            <param name=\"vertex\">he index of the vertex in the mesh.</param>\n            <param name=\"check_all_incident_halfedges\">With the default value for \n            check_all_incident_halfedges the function iteratates over the incident \n            halfedges. With check_all_incident_halfedges == false the function \n            returns true, if the incident halfedge associated to vertex is a\n            border halfedge, or if the vertex is isolated.</param>\n            <returns>Returns whether vertex is a border vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.EdgeIsBorder(System.Int32)\">\n            <summary>\n            Returns whether edge is a border edge, i.e., if any of its two halfedges is a border halfedge.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>Returns whether edge is a border edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.NextHalfedge(System.Int32)\">\n            <summary>\n            Returns the next halfedge within the incident face.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the next halfedge within the incident face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PreviousHalfedge(System.Int32)\">\n            <summary>\n            Returns the previous halfedge within the incident face.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the previous halfedge within the incident face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.OppositeHalfedge(System.Int32)\">\n            <summary>\n            Returns the opposite halfedge of halfedge.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the opposite halfedge of halfedge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.SourceVertex(System.Int32)\">\n            <summary>\n            Returns the vertex the halfedge emanates from.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the vertex the halfedge emanates from.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.TargetVertex(System.Int32)\">\n            <summary>\n            Returns the vertex the halfedge points to.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>Returns the vertex the halfedge points to.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveVertex(System.Int32)\">\n            <summary>\n            Removes vertex from the halfedge data structure without adjusting anything.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveEdge(System.Int32)\">\n            <summary>\n            Removes the two halfedges corresponding to edge from the halfedge\n            data structure without adjusting anything.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.RemoveFace(System.Int32)\">\n            <summary>\n            Removes face from the halfedge data structure without adjusting anything.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>True if face removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexRemoved(System.Int32)\">\n            <summary>\n            Has this vertex been marked to be removed.\n            </summary>\n            <param name=\"index\">The vertices index in the mesh.</param>\n            <returns>Has this vertex been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsFaceRemoved(System.Int32)\">\n            <summary>\n            Has this face been marked to be removed.\n            </summary>\n            <param name=\"index\">The faces index in the mesh.</param>\n            <returns>Has this face been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeRemoved(System.Int32)\">\n            <summary>\n            Has this halfedge been marked to be removed.\n            </summary>\n            <param name=\"index\">The halfedge index in the mesh.</param>\n            <returns>Has this halfedge been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeRemoved(System.Int32)\">\n            <summary>\n            Has this edge been marked to be removed.\n            </summary>\n            <param name=\"index\">The edges index in the mesh.</param>\n            <returns>Has this edge been marked to be removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single vertex.\n            </summary>\n            <param name=\"vertex\">The index of the vertex in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single edge.\n            </summary>\n            <param name=\"edge\">The index of the edge in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single halfedge.\n            </summary>\n            <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsFaceValid(System.Int32)\">\n            <summary>\n            Performs a validity check on a single face.\n            </summary>\n            <param name=\"face\">The index of the face in the mesh.</param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32[],System.Int32[])\">\n            <summary>\n            Create a mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateTriangleMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a triangle mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a quad mesh from the points and indices.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointCount\">The point arrays length.</param>\n            <param name=\"indices\">The meshes trinagles as a index array.</param>\n            <param name=\"indexCount\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreateTriangleQuadMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Create a mesh with quads and triangles.\n            </summary>\n            <param name=\"points\">The meshes points.</param>\n            <param name=\"pointsCount\">The point array length.</param>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"triangleCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreatePolygonalMesh(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,CGALDotNet.Polyhedra.PolygonalIndices)\">\n            <summary>\n            Create a mesh with riangles, quads, pentagons and hexagons.\n            </summary>\n            <param name=\"points\">The meshs points.</param>\n            <param name=\"pointsCount\">The length of the point array.</param>\n            <param name=\"indices\">The faces indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.CreatePolygonMesh(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Boolean)\">\n            <summary>\n            Create a mesh consisting of one polygon face.\n            </summary>\n            <param name=\"points\">The faces points</param>\n            <param name=\"count\">The paoint array length.</param>\n            <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetIndices(System.Int32[],System.Int32[])\">\n            <summary>\n            Get the triangle and quad indices.\n            </summary>\n            <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n            <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetQuadIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes quads.\n            </summary>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetTriangleQuadIndices(System.Int32[],System.Int32,System.Int32[],System.Int32)\">\n            <summary>\n            Get the meshes triangles and quads.\n            </summary>\n            <param name=\"triangles\">The meshes triangles.</param>\n            <param name=\"trianglesCount\">The triangle array length.</param>\n            <param name=\"quads\">The meshes quads.</param>\n            <param name=\"quadsCount\">The quads array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPolygonalIndices\">\n            <summary>\n            Get the meshes triangles, quads, pentagons and hexagons.\n            </summary>\n            <returns>The indices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsVertexBorder(System.Int32,System.Boolean)\">\n            <summary>\n            Whether v is a border vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"check_all_incident_halfedges\">With the default value for \n            check_all_incident_halfedges the function iteratates over the incident halfedges. \n            With check_all_incident_halfedges == false the function returns true, \n            if the incident halfedge associated to vertex v is a border halfedge, \n            or if the vertex is isolated.</param>\n            <returns>Whether v is a border vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsHalfedgeBorder(System.Int32)\">\n            <summary>\n            Whether half edge is a border halfege, that is if its incident face is null.\n            </summary>\n            <param name=\"index\">The halfedges index.</param>\n            <returns>Whether half edge is a border halfege.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.IsEdgeBorder(System.Int32)\">\n            <summary>\n            Whether e is a border edge, i.e., if any of its two halfedges is a border halfedge.\n            </summary>\n            <param name=\"index\">The edges index.</param>\n            <returns>Whether e is a border edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the mesh.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetDualPolygonalCount\">\n            <summary>\n            Count the number of triangles, quads and polygons in the dual mesh.\n            A dual mesh is were faces become vertices and vertices become faces.\n            </summary>\n            <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BuildAABBTree\">\n            <summary>\n            Build the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReleaseAABBTree\">\n            <summary>\n            Release the aabb tree.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindBoundingBox\">\n            <summary>\n            Find the bounding box of the meshes points.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReadOFF(System.String)\">\n            <summary>\n            Read the mesh from a off file format.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.WriteOFF(System.String)\">\n            <summary>\n            Write the mesh to off file format.\n            </summary>\n            <param name=\"filename\">The files name.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Triangulate\">\n            <summary>\n            Make all faces triangles.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.DoesSelfIntersect\">\n            <summary>\n            Tests if a set of faces of a triangulated surface mesh self-intersects.\n            Must be a triangle mesh.\n            </summary>\n            <returns>True/Fasle if a valid triangle mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfValid\">\n            <summary>\n            Perform an expensive validity check on the data structure.\n            </summary>\n            <returns>If the mesh is valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfTriangleMesh\">\n            <summary>\n            Find if all the faces in the mesh are triangles.\n            </summary>\n            <returns>True if all the faces in the mesh are triangles, Will be undetermined if no a valid mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfQuadMesh\">\n            <summary>\n            Find if all the faces in the mesh are quads.\n            </summary>\n            <returns>True if all the faces in the mesh are quads, Will be undetermined if no a valid mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfClosed\">\n            <summary>\n            Find if the mesh is closed, ie has no border edges.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindArea\">\n            <summary>\n            Computes the area of a range of faces\n            of a given triangulated surface mesh.\n            </summary>\n            <returns>The area or 0 if mesh is not valid triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindCentroid\">\n            <summary>\n            computes the centroid of a volume bounded \n            by a closed triangulated surface mesh.\n            </summary>\n            <returns>The centroid or 0 if mesh is not valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindVolume\">\n            <summary>\n            Computes the volume of the domain bounded by a \n            closed triangulated surface mesh.\n            </summary>\n            <returns>The volume or 0 if mesh is not valid closed triangle mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindIfDoesBoundAVolume\">\n            <summary>\n            Indicates if the mesh bounds a volume.\n            Must be a closed and triangulated.\n            </summary>\n            <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.BoundedSide(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find what side of the mesh the lies in.\n            </summary>\n            <param name=\"point\">The point to check.</param>\n            <returns>ON_BOUNDED_SIDE if point inside mesh, \n            ON_UNBOUNDED_SIDE if point not inside, \n            ON_BOUNDARY if point is on the surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ContainsPoint(CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Does the mesh contain the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n            <returns>True if the poly contains the point</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Locate the face the rays hits.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ClosestFace(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the face closest to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The hit result.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateFace(CGALDotNetGeometry.Shapes.Ray3d,CGALDotNet.Polyhedra.MeshFace3@)\">\n            <summary>\n            Locate the face hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"face\">The hit face.</param>\n            <returns>True if the ray hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateVertex(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshVertex3@)\">\n            <summary>\n            Locate the vertex hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n            <param name=\"vertex\">The hit vertex.</param>\n            <returns>True if the ray hit a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.LocateHalfedge(CGALDotNetGeometry.Shapes.Ray3d,System.Double,CGALDotNet.Polyhedra.MeshHalfedge3@)\">\n            <summary>\n            Locate the edge hit by the ray.\n            </summary>\n            <param name=\"ray\">The ray.</param>\n            <param name=\"radius\">The distance the edge has to be within hit point.</param>\n            <param name=\"edge\">The hit edge.</param>\n            <returns>True if the ray hit a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.DoIntersect(CGALDotNet.Polyhedra.SurfaceMesh3,System.Boolean)\">\n            <summary>\n            Returns true if there exists a face of this poly and \n            a face of other mesh which intersect, and false otherwise.\n            Must be a triangle mesh\n            </summary>\n            <param name=\"mesh\">The other triangle poly.</param>\n            <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n            the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n            <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindMinMaxAvgEdgeLength\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh\n            </summary>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.FindMinMaxAvgFaceArea\">\n            <summary>\n            Find the min, max and average face areas in the mesh\n            </summary>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Subdivide(System.Int32,CGALDotNet.Processing.SUBDIVISION_METHOD)\">\n            <summary>\n            Subdive the mesh.\n            </summary>\n            <param name=\"iterations\">The number of iterations to perfrom.</param>\n            <param name=\"method\">The subdivision method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Simplify(System.Double)\">\n            <summary>\n            Simplify the polyhedra.\n            </summary>\n            <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Refine(System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Orient(CGALDotNet.Processing.ORIENTATE)\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReverseFaceOrientation\">\n            <summary>\n            Reverses the orientation of the vertices in each face.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.KeepLargest(System.Int32)\">\n            <summary>\n            Remove all unconnected compontents except the largest.\n            Largest is defined by the face count.\n            </summary>\n            <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n            <returns>The number of components removed in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetCentroids(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get a centroid (the avergae face position) for each face in the mesh.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The points arrays lemgth.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ComputeVertexNormals\">\n            <summary>\n            Compute the vertex normal map.\n            Will only be computed if mesh has\n            changed since last computation or \n            no current nomral maps have been computed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ComputeFaceNormals\">\n            <summary>\n            Compute the face normal map.\n            Will only be computed if mesh has\n            changed since last computation or \n            no current nomral maps have been computed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetVertexNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the vertex normals.\n            Will be compute if they have not aready.\n            </summary>\n            <param name=\"normals\">The normal map array.</param>\n            <param name=\"count\">The normal maps array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetFaceNormals(CGALDotNetGeometry.Numerics.Vector3d[],System.Int32)\">\n            <summary>\n            Get the face normals.\n            Will be compute if they have not aready.\n            </summary>\n            <param name=\"normals\">The normal map array.</param>\n            <param name=\"count\">The normal maps array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the mesh.\n            </summary>\n            <returns>Each point in mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ToArray\">\n            <summary>\n            Return all the points in the mesh in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ToList\">\n            <summary>\n            Return all the points in the mesh in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Update\">\n            <summary>\n            Update the mesh if needed.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the mesh into a string builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.PrintVertices\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polyhedra.SurfaceMesh3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline2`1\">\n            <summary>\n            Generic polyline definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polylines points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.ToString\">\n            <summary>\n            The polyline as a string.\n            </summary>\n            <returns>The polyline as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.Copy\">\n            <summary>\n            Copy the polyline.\n            </summary>\n            <returns>The copied polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2`1.ToPoylgon(System.Double)\">\n            <summary>\n            Create a polygon from the line.\n            </summary>\n            <param name=\"threshold\">Threshold for the firat and last points being equal.</param>\n            <returns>The polygon.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline2\">\n            <summary>\n            The abstract polyline definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Count\">\n            <summary>\n            The number of points in the polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.First\">\n            <summary>\n            Get the first point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Last\">\n            <summary>\n            Get the last point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Kernel\">\n            <summary>\n            The polylines kernel.\n            Contains the functions to the unmanaged CGAL polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline2.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polyline.\n            Getting a point clamps to the last point in polyline.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Clear\">\n            <summary>\n            Clear the polyline of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Reverse\">\n            <summary>\n            Reverse the polints in the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.RemoveLast\">\n            <summary>\n            Remove the last point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"start\">The starting index.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Add(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the point to the end of the poylline.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.IsClosed(System.Double)\">\n            <summary>\n            Does the first and last point match.\n            </summary>\n            <param name=\"threshold\">The distance threshold that counts as match.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polyline.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polylines last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get all the points in the polyline.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point2d})\">\n            <summary>\n            Get all the polyline points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetSegments(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get all the polyline segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.SetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polyline then \n            the new points will be appended to end of polyline.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.FindLength\">\n            <summary>\n            Finds the length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.FindSquareLength\">\n            <summary>\n            Finds the square length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the polyline.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Scale(System.Double)\">\n            <summary>\n            Scale the polyline.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the polyline with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ToArray\">\n            <summary>\n            Return all the points in the polyline in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ToList\">\n            <summary>\n            Return all the points in the polyline in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Convert``1\">\n            <summary>\n            Convert the polyline to a new polyline with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polyline into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline2.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline3`1\">\n            <summary>\n            Generic polyline definition.\n            </summary>\n            <typeparam name=\"K\">The kernel type.</typeparam>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Create from a set of points.\n            </summary>\n            <param name=\"points\">The polylines points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create from a pointer.\n            </summary>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.ToString\">\n            <summary>\n            The polyline as a string.\n            </summary>\n            <returns>The polyline as a string.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3`1.Copy\">\n            <summary>\n            Copy the polyline.\n            </summary>\n            <returns>The copied polyline.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Polylines.Polyline3\">\n            <summary>\n            The abstract polyline definition.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"points\">The points to construct from.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Construct with a new kernel.\n            </summary>\n            <param name=\"kernel\">The polyline kernel.</param>\n            <param name=\"ptr\">The polylines pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Count\">\n            <summary>\n            The number of points in the polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Capacity\">\n            <summary>\n            The capacity of the point array.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.First\">\n            <summary>\n            Get the first point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Last\">\n            <summary>\n            Get the last point.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Kernel\">\n            <summary>\n            The polylines kernel.\n            Contains the functions to the unmanaged CGAL polyline.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Polylines.Polyline3.Item(System.Int32)\">\n            <summary>\n            Array accessor for the polyline.\n            Getting a point clamps to the last point in polyline.\n            </summary>\n            <param name=\"i\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Clear\">\n            <summary>\n            Clear the polyline of all points.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ShrinkCapacityToFitCount\">\n            <summary>\n            Shrink the capacity to match the point count.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Resize(System.Int32)\">\n            <summary>\n            Resize the point array.\n            New elements will default to zero.\n            </summary>\n            <param name=\"count\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Reverse\">\n            <summary>\n            Reverse the polints in the line.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Remove(System.Int32)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Remove(System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"start\">The starting index</param>\n            <param name=\"count\">The number of points to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.RemoveLast\">\n            <summary>\n            Remove the last point.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Insert(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Remove the point at the index from the array.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Insert(CGALDotNetGeometry.Numerics.Point3d[],System.Int32,System.Int32)\">\n            <summary>\n            Remove a range of points from the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"start\">The starting index.</param>\n            <param name=\"count\">The number of points to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Add(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Add the point to the end of the poylline.\n            </summary>\n            <param name=\"point\">The point to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.IsClosed(System.Double)\">\n            <summary>\n            Does the first and last point match.\n            </summary>\n            <param name=\"threshold\">The distance threshold that counts as match.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoint(System.Int32)\">\n            <summary>\n            Get the point a the index.\n            </summary>\n            <param name=\"index\">The points index to get.</param>\n            <returns>The point at index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPointWrapped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and wrap around the polyline.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPointClamped(System.Int32)\">\n            <summary>\n            Get the point at the index\n            and clamp to the polylines last point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point at the index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get all the points in the polyline.\n            </summary>\n            <param name=\"points\">The point array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Get all the polyline points.\n            </summary>\n            <param name=\"points\">The list to copy the data into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetSegments(CGALDotNetGeometry.Shapes.Segment3d[],System.Int32)\">\n            <summary>\n            Get all the polyline segments.\n            </summary>\n            <param name=\"segments\">The segment array to copy the data into.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.SetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Set the points at the index.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <param name=\"point\">The points value.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.SetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Set the points from the array.\n            If the array is larger than the polyline then \n            the new points will be appended to end of polyline.\n            </summary>\n            <param name=\"points\">The points array.</param>\n            <param name=\"count\">The array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.FindLength\">\n            <summary>\n            Finds the length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.FindSquareLength\">\n            <summary>\n            Finds the square length of the polyline.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the polyline.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the polyline.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the polyline.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.System#Collections#IEnumerable#GetEnumerator\">\n            <summary>\n            Enumerate all points in the polyline.\n            </summary>\n            <returns>Each point in polyline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ToArray\">\n            <summary>\n            Return all the points in the polyline in a array.\n            </summary>\n            <returns>The array.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ToList\">\n            <summary>\n            Return all the points in the polyline in a list.\n            </summary>\n            <returns>The list.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Convert``1\">\n            <summary>\n            Convert the polyline to a new polyline with a different kernel.\n            May result in different values due to precision issues.\n            </summary>\n            <typeparam name=\"T\">The new kernel type.</typeparam>\n            <returns>The new polline.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.Print(System.Text.StringBuilder)\">\n            <summary>\n            Print the polyline into a styring builder.\n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ReleasePtr\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Polylines.Polyline3.ReleasePtr(System.IntPtr)\">\n            <summary>\n            Release the unmanaged pointer.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.HeatMethod`1\">\n            <summary>\n            The heat method is an algorithm that solves the single- or multiple-source shortest \n            path problem by returning an approximation of the geodesic distance for all vertices\n            of a triangle mesh to the closest vertex in a given set of source vertices. \n            The geodesic distance between two vertices of a mesh is the distance when walking \n            on the surface, potentially through the interior of faces. Two vertices that are \n            close in 3D space may be far away on the surface.\n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.HeatMethod`1.Instance\">\n            <summary>\n            Create a static instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.#ctor\">\n            <summary>\n            Create a new instance.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.#ctor(System.IntPtr)\">\n            <summary>\n            Create a new instance from a existing pointer to a unmanaged object.\n            </summary>\n            <param name=\"ptr\">The unmanaged objects pointer.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.EstimateGeodesicDistances(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32,System.Collections.Generic.List{System.Double},System.Boolean)\">\n            <summary>\n            Find the distances for each vertex in the mesh to the vertex at the provided index.\n            </summary>\n            <param name=\"mesh\">The mesh containing the vertices.</param>\n            <param name=\"index\">The vertices index to find the distances to.</param>\n            <param name=\"distances\">The distances for each vertex in the mesh.</param>\n            <param name=\"useIDT\">Should the intrinsitic delaunay triangulation be used. \n            This will improve the results for meshes that have bad triangle quality.</param>\n            <returns>The maximum distance value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod`1.EstimateGeodesicDistances(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Collections.Generic.List{System.Double})\">\n            <summary>\n            Find the distances for each vertex in the mesh to the vertex at the provided index.\n            </summary>\n            <param name=\"mesh\">The mesh containing the vertices.</param>\n            <param name=\"index\">The vertices index to find the distances to.</param>\n            <param name=\"distances\">The distances for each vertex in the mesh.\n            This will improve the results for meshes that have bad triangle quality.</param>\n            <returns>The maximum distance value.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            Create a new instance.\n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            Create a new instance from a existing pointer to a unmanaged object.\n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\">The unmanaged objects pointer.</param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.HeatMethod.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.GetDistances(System.Int32,System.Collections.Generic.List{System.Double})\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n            <param name=\"distances\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.GetDistance(System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.ClearDistances\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.HeatMethod.ReleasePtr\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingBoolean`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingBoolean`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Op(CGALDotNet.Processing.POLYHEDRA_BOOLEAN,CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"op\"></param>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Op(CGALDotNet.Processing.POLYHEDRA_BOOLEAN,CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"op\"></param>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Union(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Union(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Difference(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Difference(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Intersection(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNet.Polyhedra.Polyhedron3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean`1.Intersection(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNet.Polyhedra.SurfaceMesh3{`0}@)\">\n            <summary>\n            \n            </summary>\n            <param name=\"mesh1\"></param>\n            <param name=\"mesh2\"></param>\n            <param name=\"result\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingBoolean\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingBoolean.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingBoolean.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingConnections`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingConnections`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.UnconnectedComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Returns the number of unconnect components in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>Returns the number of unconnect components in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ConnectedFaces(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Returns a list of face indices that are part of the same component as the provided face index.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faceIndex\">The faces index in the mesh.</param>\n            <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.ConnectedFaces(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Returns a list of face indices that are part of the same component as the provided face index.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faceIndex\">The faces index in the mesh.</param>\n            <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.SplitUnconnectedComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Collections.Generic.List{CGALDotNet.Polyhedra.Polyhedron3{`0}})\">\n            <summary>\n            Split each component in the mesh into individual meshes.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"results\">The split meshes.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.SplitUnconnectedComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Collections.Generic.List{CGALDotNet.Polyhedra.SurfaceMesh3{`0}})\">\n            <summary>\n            Split each component in the mesh into individual meshes.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"results\">The split meshes.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargeComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Removes connected components with less than a given number of faces.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargeComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Removes connected components with less than a given number of faces.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargestComponents(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Removes the small connected components and all isolated vertices.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections`1.KeepLargestComponents(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Removes the small connected components and all isolated vertices.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n            <returns>The number of components removed.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingConnections\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingConnections.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingConnections.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingFeatures`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingFeatures`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.DetectSharpEdges(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Detects the edges that are considered to be sharp with respect to the given angle bound.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.DetectSharpEdges(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Detects the edges that are considered to be sharp with respect to the given angle bound.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.EdgeLengthMinMaxAvg(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.EdgeLengthMinMaxAvg(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the min, max and average edge lengths in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average edge lengths in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.FaceAreaMinMaxAvg(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the min, max and average face areas in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.FaceAreaMinMaxAvg(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the min, max and average face areas in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <returns>The min, max and average face areas in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.SharpEdgesSegmentation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Int32},System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            Detects the sharp edges of mesh according to angle as the DetectSharpEdges function does. \n            The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n            a surface patch id for each face.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n            <param name=\"featurePatches\">The face indices for each patch found.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.SharpEdgesSegmentation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            Detects the sharp edges of pmesh according to angle as the DetectSharpEdges function does. \n            The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n            a surface patch id for each face.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n            the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n            if the angle between the two normal vectors of its incident facets is bigger than \n            the given bound, then the edge is marked as being a feature edge.</param>\n            <param name=\"featurePatches\">The face indices for each patch found.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingFeatures\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingFeatures.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.GetFeatureEdges(CGALDotNet.MESH_TYPE,System.IntPtr,System.Int32,System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"meshPtr\"></param>\n            <param name=\"num_edges\"></param>\n            <param name=\"featureEdges\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.GetFeaturePatches(CGALDotNet.MESH_TYPE,System.IntPtr,System.Int32,System.Collections.Generic.List{System.Collections.Generic.List{System.Int32}})\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"meshPtr\"></param>\n            <param name=\"num_patches\"></param>\n            <param name=\"featurePatches\"></param>\n            <exception cref=\"T:System.NotImplementedException\"></exception>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingFeatures.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingLocate`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingLocate`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.RandomLocationOnMesh(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find a random point on mesh surface.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>A random point on mesh surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.RandomLocationOnMesh(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find a random point on mesh surface.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <returns>A random point on mesh surface.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.LocateFace(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Find the face the ray intersects with.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"ray\">Th ray.</param>\n            <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.LocateFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Shapes.Ray3d)\">\n            <summary>\n            Find the face the ray intersects with.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"ray\">Th ray.</param>\n            <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ClosestFace(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest face to the point.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"point\">Th point.</param>\n            <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate`1.ClosestFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the closest face to the point.\n            </summary>\n            <param name=\"mesh\">The mesh.</param>\n            <param name=\"point\">Th point.</param>\n            <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingLocate\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingLocate.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingLocate.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingMeshing`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingMeshing`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Extrude(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n            The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n            </summary>\n            <param name=\"mesh\">The a valid closed mesh.</param>\n            <param name=\"dir\">The direction vector.</param>\n            <returns>The extuded mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Extrude(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Vector3d)\">\n            <summary>\n            Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n            The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n            </summary>\n            <param name=\"mesh\">The a valid closed mesh.</param>\n            <param name=\"dir\">The direction vector.</param>\n            <returns>The extuded mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Fair(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32,System.Int32)\">\n            <summary>\n            Fairs a region on a triangle mesh based on a ring of k vertices from the index vertex.\n            The points of the selected vertices are relocated to yield an as-smooth-as-possible surface patch,\n            based on solving a linear bi-Laplacian system with boundary constraints\n            The region described by vertices might contain multiple disconnected components.\n            Note that the mesh connectivity is not altered in any way, only vertex locations get updated.\n            Fairing might fail if fixed vertices, which are used as boundary conditions, \n            do not suffice to solve constructed linear system.\n            Note that if the vertex range to which fairing is applied contains all the vertices of the triangle mesh, \n            fairing does not fail, but the mesh gets shrinked to the origin.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"index\">The vertex index in the mesh to start hthe k ring region from.</param>\n            <param name=\"k_ring\">The number of vertics to expand the region to.</param>\n            <returns>If the fairing was successfully run.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Refine(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.Refine(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            Refines a triangle mesh\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"density_control_factor\">a factor to control density of the output mesh, \n            where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.IsotropicRemeshing(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double,System.Int32)\">\n            <summary>\n            Remeshes a triangulated region of a meshgon mesh.\n            This operation sequentially performs edge splits, edge collapses, edge flips, \n            tangential relaxation and projection to the initial surface to generate \n            a smooth mesh with a prescribed edge length.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of times to perform the remeshing.</param>\n            <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n            If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.IsotropicRemeshing(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double,System.Int32)\">\n            <summary>\n            Remeshes a triangulated region of a meshgon mesh.\n            This operation sequentially performs edge splits, edge collapses, edge flips, \n            tangential relaxation and projection to the initial surface to generate \n            a smooth mesh with a prescribed edge length.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of times to perform the remeshing.</param>\n            <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n            If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n            <returns>The number of new vertices added.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.RandomPerturbation(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            randomly perturbs the locations of vertices of a triangulated surface mesh.\n            By default, the vertices are re-projected onto the input surface after \n            perturbation.Note that no geometric checks are done after the perturbation \n            (face orientation might become incorrect and self-intersections might be introduced).\n            </summary>\n            <param name=\"mesh\">A mesh.</param>\n            <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.RandomPerturbation(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            randomly perturbs the locations of vertices of a triangulated surface mesh.\n            By default, the vertices are re-projected onto the input surface after \n            perturbation.Note that no geometric checks are done after the perturbation \n            (face orientation might become incorrect and self-intersections might be introduced).\n            </summary>\n            <param name=\"mesh\">A mesh.</param>\n            <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SmoothMeshByAngle(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Degree,System.Int32)\">\n            <summary>\n            Smooths a triangulated mesh.\n            This function attempts to make the triangle angle and area distributions as uniform \n            as possible by moving(non-constrained) vertices.\n            Angle-based smoothing does not change the combinatorial information of the mesh.\n            Area-based smoothing might change the combinatorial information, unless specified otherwise.\n            It is also possible to make the smoothing algorithm \"safer\" by rejecting moves that, \n            when applied, would worsen the quality of the mesh, e.g.that would decrease the value\n            of the smallest angle around a vertex or create self-intersections.\n            Optionally, the points are reprojected after each iteration.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"featureAngle\">The edge angle that counts a feature and wont be smoothed.</param>\n            <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SplitLongEdges(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n            Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n            of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n            <returns>The number of new edges added to the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.SplitLongEdges(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n            Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n            of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n            <returns>The number of new edges added to the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFace(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Triangulate a single face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"face\">The faces index in the mesh.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFace(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Triangulate a single face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"face\">The faces index in the mesh.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFaces(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32[],System.Int32)\">\n            <summary>\n            Triangulate a range of faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faces\">The faces to triangulate.</param>\n            <param name=\"count\">The length of the face array.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing`1.TriangulateFaces(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32[],System.Int32)\">\n            <summary>\n            Triangulate a range of faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"faces\">The faces to triangulate.</param>\n            <param name=\"count\">The length of the face array.</param>\n            <returns>True if successful.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingMeshing\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingMeshing.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingMeshing.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingOrientation`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingOrientation`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.DoesBoundAVolume(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Indicates if mesh bounds a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.DoesBoundAVolume(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Indicates if mesh bounds a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.IsOutwardOriented(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Tests whether a closed triangle mesh has a positive orientation.\n            A closed triangle mesh is considered to have a positive orientation\n            if the normal vectors to all its faces point outside the domain bounded \n            by the triangle mesh.The normal vector to each face is chosen pointing\n            on the side of the face where its sequence of vertices is seen counterclockwise.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.IsOutwardOriented(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Tests whether a closed triangle mesh has a positive orientation.\n            A closed triangle mesh is considered to have a positive orientation\n            if the normal vectors to all its faces point outside the domain bounded \n            by the triangle mesh.The normal vector to each face is chosen pointing\n            on the side of the face where its sequence of vertices is seen counterclockwise.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Processing.ORIENTATE,CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n            <param name=\"mesh\">A valid closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Processing.ORIENTATE,CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Orient the faces in the mesh.\n            </summary>\n            <param name=\"orientate\">The orientation method.</param>\n            <param name=\"mesh\">A valid closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.Orient(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.OrientToBoundAVolume(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Orients the connected components of tm to make it bound a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.OrientToBoundAVolume(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Orients the connected components of tm to make it bound a volume.\n            </summary>\n            <param name=\"mesh\">A closed triangle mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ReverseFaceOrientations(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Reverses for each face the order of the vertices along the face boundary.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation`1.ReverseFaceOrientations(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Reverses for each face the order of the vertices along the face boundary.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingOrientation\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingOrientation.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingOrientation.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingRepair`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingRepair`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateEdgeCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the number of degenerate edges in the mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of degenerate edges in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateTriangleCount(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Find the number of degenerate faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The number of degenerate faces in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.DegenerateTriangleCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Find the number of degenerate faces in the mesh.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The number of degenerate faces in the mesh.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NeedleTriangleCount(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Double)\">\n            <summary>\n            Checks whether a triangle face is needle.\n            A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n            <returns>The number of needle triangles.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NeedleTriangleCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Double)\">\n            <summary>\n            Checks whether a triangle face is needle.\n            A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n            <returns>The number of needle triangles.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NonManifoldVertexCount(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Collects the non-manifold vertices (if any) present in the mesh.\n            A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n            for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n            the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The non manifold vertex count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.NonManifoldVertexCount(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Collects the non-manifold vertices (if any) present in the mesh.\n            A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n            for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n            the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n            </summary>\n            <param name=\"mesh\">A triangle polygon mesh.</param>\n            <returns>The non manifold vertex count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RepairPolygonSoup(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n             <summary>\n             Cleans a given polygon soup through various repairing operations.\n            \n             More precisely, this function carries out the following tasks, in the same order as they are listed:\n            \n             merging of duplicate points.\n             simplification of polygons to remove geometrically identical consecutive vertices;\n             splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n             The splitting process results in multiple non-pinched polygons;\n             removal of invalid polygons, that is polygons with fewer than 2 vertices;\n             removal of duplicate polygons.\n             removal of isolated points.\n             </summary>\n             <param name=\"mesh\">The polygon mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RepairPolygonSoup(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n             <summary>\n             Cleans a given polygon soup through various repairing operations.\n            \n             More precisely, this function carries out the following tasks, in the same order as they are listed:\n            \n             merging of duplicate points.\n             simplification of polygons to remove geometrically identical consecutive vertices;\n             splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n             The splitting process results in multiple non-pinched polygons;\n             removal of invalid polygons, that is polygons with fewer than 2 vertices;\n             removal of duplicate polygons.\n             removal of isolated points.\n             </summary>\n             <param name=\"mesh\">The polygon mesh.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBoundaryCycles(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n            Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n            target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched boundaries.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBoundaryCycles(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n            Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n            target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched boundaries.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBorders(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Stitches together border halfedges in a polygon mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched borders.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.StitchBorders(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Stitches together border halfedges in a polygon mesh.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of stiched borders.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RemoveIsolatedVertices(CGALDotNet.Polyhedra.Polyhedron3{`0})\">\n            <summary>\n            Removes the isolated vertices from any polygon mesh.\n            A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of vertices that were removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair`1.RemoveIsolatedVertices(CGALDotNet.Polyhedra.SurfaceMesh3{`0})\">\n            <summary>\n            Removes the isolated vertices from any polygon mesh.\n            A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n            </summary>\n            <param name=\"mesh\">The polygon mesh.</param>\n            <returns>The number of vertices that were removed.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingRepair\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingRepair.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingRepair.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingSlicer`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.MeshProcessingSlicer`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Shapes.Plane3d,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the line formed from the intersection of the plane and the mesh.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"results\">The polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Shapes.Plane3d,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the line formed from the intersection of the plane and the mesh.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"plane\">The plane.</param>\n            <param name=\"results\">The polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.Polyhedron3{`0},CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the lines formed by slicing the mesh from the start\n            point to the end point creating a plane at each increment.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"start\">The point to start from.</param>\n            <param name=\"end\">The point to end at.</param>\n            <param name=\"increment\">Amount to increment each plane.</param>\n            <param name=\"results\">he polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.Slice(CGALDotNet.Polyhedra.SurfaceMesh3{`0},CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Point3d,System.Double,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            Find the lines formed by slicing the mesh from the start\n            point to the end point creating a plane at each increment.\n            </summary>\n            <param name=\"mesh\">The mesh. Is not modified.</param>\n            <param name=\"start\">The point to start from.</param>\n            <param name=\"end\">The point to end at.</param>\n            <param name=\"increment\">Amount to increment each plane.</param>\n            <param name=\"results\">he polylines from the intersection.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer`1.GetLines(System.Int32,System.Collections.Generic.List{CGALDotNet.Polylines.Polyline3{`0}})\">\n            <summary>\n            \n            </summary>\n            <param name=\"count\"></param>\n            <param name=\"results\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.MeshProcessingSlicer\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.MeshProcessingSlicer.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.MeshProcessingSlicer.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SurfaceSimplification`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.SurfaceSimplification`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SurfaceSimplification\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.SurfaceSimplification.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.Simplify(CGALDotNet.Polyhedra.Polyhedron3,System.Double)\">\n            <summary>\n            Simplify the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.Simplify(CGALDotNet.Polyhedra.SurfaceMesh3,System.Double)\">\n            <summary>\n            Simplify the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SurfaceSimplification.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SUBDIVISION_METHOD\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SubdivisionSurface`1\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"K\"></typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Processing.SubdivisionSurface`1.Instance\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide(CGALDotNet.Processing.SUBDIVISION_METHOD,CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"method\"></param>\n            <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide(CGALDotNet.Processing.SUBDIVISION_METHOD,CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"method\"></param>\n            <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_CatmullClark(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_CatmullClark(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Loop(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Loop(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_DoSabin(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Sqrt3(CGALDotNet.Polyhedra.Polyhedron3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface`1.Subdivide_Sqrt3(CGALDotNet.Polyhedra.SurfaceMesh3{`0},System.Int32)\">\n            <summary>\n            Subdive each face in the mesh.\n            </summary>\n            <param name=\"mesh\">A valid triangle mesh.</param>\n            <param name=\"iterations\">The number of subdivision iterations.</param>\n        </member>\n        <member name=\"T:CGALDotNet.Processing.SubdivisionSurface\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Processing.SubdivisionSurface.Kernel\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Processing.SubdivisionSurface.ReleasePtr\">\n            <summary>\n            Release the unmanaged resourses.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.BaseTriangulation2\">\n            <summary>\n            Base triangulation class for Triangulation, DelaunayTriangulation,\n            ConstrainedTriangulation and ConstrainedDelaunayTriangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel2,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.Kernel\">\n            <summary>\n            The triangulations kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.VertexCount\">\n            <summary>\n            The number of verices in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.TriangleCount\">\n            <summary>\n            The number of triangles in the triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.IndiceCount\">\n            <summary>\n            The number of indices need to represent the\n            triangulation (number of triangles * 3).\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation2.BuildStamp\">\n            <summary>\n            A number that will change if the unmanaged \n            triangulation model changes.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.IsValid(System.Int32)\">\n            <summary>\n            Is this a valid triangulation.\n            </summary>\n            <param name=\"level\"></param>\n            <returns>True if valid.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.ForceSetIndices\">\n            <summary>\n            Force the face and vertex indices to be set.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d)\">\n             <summary>\n             Inserts point p in the triangulation.\n            If point coincides with an already existing vertex the triangulation remains unchanged.\n            If point is on an edge, the two incident faces are split in two.\n            If point is strictly inside a face of the triangulation, the face is split in three.\n            If point is strictly outside the convex hull, p is linked to all visible points on the \n            convex hull to form the new triangulation.\n             </summary>\n             <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Insert(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n             <summary>\n             Inserts points into the triangulation.\n            If point coincides with an already existing vertex the triangulation remains unchanged.\n            If point is on an edge, the two incident faces are split in two.\n            If point is strictly inside a face of the triangulation, the face is split in three.\n            If point is strictly outside the convex hull, p is linked to all visible points on the \n            convex hull to form the new triangulation.\n             </summary>\n             <param name=\"points\">The points to insert.</param>\n             <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoints(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a array of all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The point array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get a array of the triangle indices.\n            </summary>\n            <param name=\"indices\"></param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoint(System.Int32,CGALDotNetGeometry.Numerics.Point2d@)\">\n            <summary>\n            Get the vertices point.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <param name=\"point\">The vertices point.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetPoint(System.Int32)\">\n            <summary>\n            Get the point.\n            </summary>\n            <param name=\"index\">The points index.</param>\n            <returns>The point</returns>\n            <exception cref=\"T:System.ArgumentException\">If point with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertex(System.Int32,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Get a vertex.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertex(System.Int32)\">\n            <summary>\n            Get the vertex.\n            </summary>\n            <param name=\"index\">The vertexs index.</param>\n            <returns>The vertexs</returns>\n            <exception cref=\"T:System.ArgumentException\">If vertex with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetVertices(CGALDotNet.Triangulations.TriVertex2[],System.Int32)\">\n            <summary>\n            Get a array of all the vertices.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFace(System.Int32,CGALDotNet.Triangulations.TriFace2@)\">\n            <summary>\n            Get a triangule face.\n            </summary>\n            <param name=\"index\">The faces index</param>\n            <param name=\"face\">The face</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFace(System.Int32)\">\n            <summary>\n            Get the face.\n            </summary>\n            <param name=\"index\">The faces index.</param>\n            <returns>The Faces</returns>\n            <exception cref=\"T:System.ArgumentException\">If face with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetFaces(CGALDotNet.Triangulations.TriFace2[],System.Int32)\">\n            <summary>\n            Get a array of all the triangle faces.\n            </summary>\n            <param name=\"faces\">A array of faces.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetSegment(System.Int32,System.Int32,CGALDotNetGeometry.Shapes.Segment2d@)\">\n            <summary>\n            Get the segment between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <param name=\"segment\">The segment.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetSegment(System.Int32,System.Int32)\">\n            <summary>\n            Get the segment between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>The segment</returns>\n            <exception cref=\"T:System.ArgumentException\">If segment with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangle(System.Int32,CGALDotNetGeometry.Shapes.Triangle2d@)\">\n            <summary>\n            Get a faces triangle.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"triangle\">The triangle</param>\n            <returns>True if the face was found</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangle(System.Int32)\">\n            <summary>\n            Get the triangle.\n            </summary>\n            <param name=\"index\">The triangles index.</param>\n            <returns>The triangle</returns>\n            <exception cref=\"T:System.ArgumentException\">If triangle with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetTriangles(CGALDotNetGeometry.Shapes.Triangle2d[],System.Int32)\">\n            <summary>\n            Get a array of all the triangles.\n            </summary>\n            <param name=\"triangles\">A array of triangules.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenter(System.Int32,CGALDotNetGeometry.Numerics.Point2d@)\">\n            <summary>\n            Get a faces circumcenter.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"circumcenter\">The circumcenter. A circle\n            that passes through all three of the triangules vertices.</param>\n            <returns>True if the face was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenter(System.Int32)\">\n            <summary>\n            Get the circumcenter.\n            </summary>\n            <param name=\"index\">The circumcenters index.</param>\n            <returns>The circumcenter</returns>\n            <exception cref=\"T:System.ArgumentException\">If circumcenter with the index not found.</exception>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.GetCircumcenters(CGALDotNetGeometry.Numerics.Point2d[],System.Int32)\">\n            <summary>\n            Get a array of all the circumcenters.\n            </summary>\n            <param name=\"circumcenters\">A array of circumcenters.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.NeighbourIndex(System.Int32,System.Int32)\">\n            <summary>\n            Get the index of the faces neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index.</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>The index of the neighbour face in the triangulation. \n            -1 if there is no neighbour face at this index.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateFace(CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriFace2@)\">\n            <summary>\n            Locate the face the point hits.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <param name=\"face\">The face the point has hit.</param>\n            <returns>True if the point hit a face.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateVertex(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Locate the closest vertex to point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The distance the point must be within to count as hitting the vertex.</param>\n            <param name=\"vertex\">The closest vertex.</param>\n            <returns>True if point hit a face and found a vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.LocateEdge(CGALDotNetGeometry.Numerics.Point2d,System.Double,CGALDotNet.Triangulations.TriEdge2@)\">\n            <summary>\n            Locate the closest  edge and segment to point.\n            </summary>\n            <param name=\"point\">The point</param>\n            <param name=\"radius\">The distance the point must be within to count as hitting the edge.</param>\n            <param name=\"edge\">The closest edge.</param>\n            <returns>True if the point hit a face and found a edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.RemoveVertex(System.Int32)\">\n            <summary>\n            Remove the vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <returns>True if removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.FlipEdge(System.Int32,System.Int32)\">\n            <summary>\n            Flip a edge between the face and a neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index</param>\n            <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n            <returns>True if the edge was flipped.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Translate(CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Translate the triangulation.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Rotate(CGALDotNetGeometry.Numerics.Radian)\">\n            <summary>\n            Rotate the triangulation.\n            </summary>\n            <param name=\"rotation\">The amount to rotate in radians.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Scale(System.Double)\">\n            <summary>\n            Scale the triangulation.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Transform(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Radian,System.Double)\">\n            <summary>\n            Transform the triangulation with a TRS matrix.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation2.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.BaseTriangulation3\">\n            <summary>\n            Base triangulation class for Triangulation, DelaunayTriangulation \n            and ConstrainedTriangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.#ctor(CGALDotNet.Triangulations.BaseTriangulationKernel3,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.Kernel\">\n            <summary>\n            The triangulations kernel.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.BuildStamp\">\n            <summary>\n            Returns the buildStamp.\n            The build stamp will change if \n            the triangulation model has changed\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.Dimension\">\n            <summary>\n            Returns the dimension of the affine hull.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.VertexCount\">\n            <summary>\n            Returns the number of vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteVertexCount\">\n            <summary>\n            Returns the number of finite vertices.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TetrahedronCount\">\n            <summary>\n            Returns the number of cells or 0 if Dimension less than 3.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteTetrahedronCount\">\n            <summary>\n            The number of finite cells.\n            Returns 0 if Dimension less than 3.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.EdgeCount\">\n            <summary>\n            The number of edges.\n            Returns 0 if Dimension less than 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteEdgeCount\">\n            <summary>\n            The number of finite edges.\n            Returns 0 if Dimension less than 1.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TriangleCount\">\n            <summary>\n            The number of facets.\n            Returns 0 if Dimension less than 2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.FiniteTriangleCount\">\n            <summary>\n            The number of facets.\n            Returns 0 if Dimension less than 2.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.BaseTriangulation3.TetrahdronIndiceCount\">\n            <summary>\n            The number of indices needed for the finite tetrahedrons.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Clear\">\n            <summary>\n            Clear the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.IsValid\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Insert(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Inserts the point p in the triangulation.\n            If point p coincides with an already existing vertex the triangulation remains unchanged.\n            If point p lies in the convex hull of the points, it is added naturally: \n            if it lies inside a cell, the cell is split into four cells, if it lies \n            on a facet, the two incident cells are split into three cells, if it lies\n            on an edge, all the cells incident to this edge are split into two cells.\n            If point p is strictly outside the convex hull but in the affine hull, p \n            is linked to all visible points on the convex hull to form the new triangulation.\n            If point p is outside the affine hull of the points, p is linked to all the points,\n            and the dimension of the triangulation is incremented. All the points now belong to \n            the boundary of the convex hull, so, the infinite vertex is linked to all the points \n            to triangulate the new infinite face.\n            </summary>\n            <param name=\"point\">The point to insert</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Insert(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Insert all the points in the array.\n            </summary>\n            <param name=\"points\">The points to insert.</param>\n            <param name=\"count\">The arrays length</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.InsertInCell(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Insert a vertex into a cell.\n            </summary>\n            <param name=\"index\">The cells index.</param>\n            <param name=\"point\">The point to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Locate(CGALDotNetGeometry.Numerics.Point3d,CGALDotNet.Triangulations.TriCell3@)\">\n            <summary>\n            If the point query lies inside the convex hull of the points, the cell that contains the query in its interior is returned.\n            If query lies on a facet, an edge or on a vertex, one of the cells having query on its boundary is returned.\n            If the point query lies outside the convex hull of the points, an infinite cell with vertices { p,q,r,∞} is\n            returned such that the tetrahedron(p, q, r, query) is positively oriented(the rest of the triangulation lies\n            on the other side of facet (p, q, r)).\n            Note that locate works even in degenerate dimensions: in dimension 2 (resp. 1, 0) the Cell_handle returned\n            is the one that represents the facet(resp.edge, vertex) containing the query point.\n            The optional argument start is used as a starting place for the search.\n            The optional argument could_lock_zone is used by the concurrency-safe version of the triangulation.When the\n            pointer is not null, the locate will try to lock all the cells along the walk. If it succeeds,\n            could_lock_zone is true, otherwise it is false. In any case, the locked cells are not unlocked by locate,\n            leaving this choice to the user. \n            </summary>\n            <param name=\"point\">The point to query</param>\n            <param name=\"cell\">The cell thats closest to point.</param>\n            <returns>The closest cell to point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCircumcenters(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get the centroids of each cell.\n            </summary>\n            <param name=\"circumcenters\">The array of points</param>\n            <param name=\"count\">The array of points length</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetPoints(CGALDotNetGeometry.Numerics.Point3d[],System.Int32)\">\n            <summary>\n            Get all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The array to copy into.</param>\n            <param name=\"count\">The arrays length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetPoints(System.Collections.Generic.List{CGALDotNetGeometry.Numerics.Point3d})\">\n            <summary>\n            Get all the points in the triangulation.\n            </summary>\n            <param name=\"points\">The array to copy into.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetVertices(CGALDotNet.Triangulations.TriVertex3[],System.Int32)\">\n            <summary>\n            Get the triangulation vertices.\n            </summary>\n            <param name=\"vertices\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetVertex(System.Int32,CGALDotNet.Triangulations.TriVertex3@)\">\n            <summary>\n            Get a triangulation vertex.\n            </summary>\n            <param name=\"index\">The vertices index</param>\n            <param name=\"vertex\">The vertex.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCells(CGALDotNet.Triangulations.TriCell3[],System.Int32)\">\n            <summary>\n            Get the triangulation vertices.\n            </summary>\n            <param name=\"cells\">The vertex array.</param>\n            <param name=\"count\">The vertex array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetCell(System.Int32,CGALDotNet.Triangulations.TriCell3@)\">\n            <summary>\n            Get a triangulation vertex.\n            </summary>\n            <param name=\"index\">The vertices index</param>\n            <param name=\"cell\">The vertex.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetSegmentIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the cells edges in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetTriangleIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the cells triangles in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.GetTetrahedronIndices(System.Int32[],System.Int32)\">\n            <summary>\n            Get the indices of the tetrahedron cells in the triangulation.\n            </summary>\n            <param name=\"indices\">The indices array.</param>\n            <param name=\"count\">The indices array length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Translate(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Translate each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Rotate(CGALDotNetGeometry.Numerics.Quaternion3d)\">\n            <summary>\n            Rotate each point in the mesh.\n            </summary>\n            <param name=\"rotation\">The amount to rotate.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Scale(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Scale each point in the mesh.\n            </summary>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Transform(CGALDotNetGeometry.Numerics.Point3d,CGALDotNetGeometry.Numerics.Quaternion3d,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Transform each point in the mesh.\n            </summary>\n            <param name=\"translation\">The amount to translate.</param>\n            <param name=\"rotation\">The amount to rotate.</param>\n            <param name=\"scale\">The amount to scale.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.BaseTriangulation3.ReleasePtr\">\n            <summary>\n            Release any unmanaged resources.\n            </summary>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1\">\n            <summary>\n            The generic constrained triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2\">\n            <summary>\n            The abstract triangulation class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the constrained triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.ConstrainedEdgeCount\">\n            <summary>\n            The number of constrainted edges in the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Insert(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Insert(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.IncidentConstraintCount(System.Int32)\">\n            <summary>\n            Get the number of constrainted edges incident to this vertex.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>The number of constrainted edges to the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.HasIncidentConstraint(System.Int32)\">\n            <summary>\n            Does this vertex have a constrainted edge.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>Does this vertex have a constrainted edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Add a segment as a constraint.\n            </summary>\n            <param name=\"segment\">The segment to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the two points as a segment constraint.\n            </summary>\n            <param name=\"a\">The segments point a.</param>\n            <param name=\"b\">The segments point b.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Add a list of segments as constraint to the triangulation.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The length of the segment array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstraints(CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint edges in the triangulation.\n            </summary>\n            <param name=\"constraints\">The edge array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint segments in the triangulation.\n            </summary>\n            <param name=\"constraints\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetIncidentConstraints(System.Int32,CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get the constraints incident to the vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n            <param name=\"constraints\">The array of edges.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.RemoveConstraint(System.Int32,System.Int32)\">\n            <summary>\n            Remove a constraint between a face and its neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index in the triangultion.</param>\n            <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.RemoveIncidentConstraints(System.Int32)\">\n            <summary>\n            Remove all constraints incident to a vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.GetConstrainedDomainIndices(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Get the triangle indices for domain in the triangultion.\n            Used to triangulate polygons.\n            </summary>\n            <param name=\"indices\">The indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedDelaunayTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedTriangulation2`1\">\n            <summary>\n            The generic constrained triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kernel</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.ConstrainedTriangulation2\">\n            <summary>\n            The abstract triangulation class.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the constrained triangulation.\n            </summary>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.ConstrainedTriangulation2.ConstrainedEdgeCount\">\n            <summary>\n            The number of constrainted edges in the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Insert(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"polygon\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Insert(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retain the poylgons edges.\n            </summary>\n            <param name=\"pwh\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNet.Polygons.Polygon2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNet.Polygons.PolygonWithHoles2)\">\n            <summary>\n            Insert the polygons points and the edges as constraints into the triangulation.\n            Will retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.IncidentConstraintCount(System.Int32)\">\n            <summary>\n            Get the number of constrainted edges incident to this vertex.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>The number of constrainted edges to the vertex.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.HasIncidentConstraint(System.Int32)\">\n            <summary>\n            Does this vertex have a constrainted edge.\n            </summary>\n            <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n            <returns>Does this vertex have a constrainted edge.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNetGeometry.Shapes.Segment2d)\">\n            <summary>\n            Add a segment as a constraint.\n            </summary>\n            <param name=\"segment\">The segment to add.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraint(CGALDotNetGeometry.Numerics.Point2d,CGALDotNetGeometry.Numerics.Point2d)\">\n            <summary>\n            Add the two points as a segment constraint.\n            </summary>\n            <param name=\"a\">The segments point a.</param>\n            <param name=\"b\">The segments point b.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.InsertConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Add a list of segments as constraint to the triangulation.\n            </summary>\n            <param name=\"segments\">The segment array.</param>\n            <param name=\"count\">The length of the segment array.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstraints(CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint edges in the triangulation.\n            </summary>\n            <param name=\"constraints\">The edge array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstraints(CGALDotNetGeometry.Shapes.Segment2d[],System.Int32)\">\n            <summary>\n            Get a array of all the constraint segments in the triangulation.\n            </summary>\n            <param name=\"constraints\">The segment array.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetIncidentConstraints(System.Int32,CGALDotNet.Triangulations.TriEdge2[],System.Int32)\">\n            <summary>\n            Get the constraints incident to the vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n            <param name=\"constraints\">The array of edges.</param>\n            <param name=\"count\">The ararys length.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.RemoveConstraint(System.Int32,System.Int32)\">\n            <summary>\n            Remove a constraint between a face and its neighbour.\n            </summary>\n            <param name=\"faceIndex\">The faces index in the triangultion.</param>\n            <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.RemoveIncidentConstraints(System.Int32)\">\n            <summary>\n            Remove all constraints incident to a vertex.\n            </summary>\n            <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.GetConstrainedDomainIndices(System.Collections.Generic.List{System.Int32})\">\n            <summary>\n            Get the triangle indices for domain in the triangultion.\n            Used to triangulate polygons.\n            </summary>\n            <param name=\"indices\">The indices.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.ConstrainedTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation2`1\">\n            <summary>\n            The generic delaunay triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerne</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Instance\">\n            <summary>\n            A static instance of the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.ToString\">\n            <summary>\n            The triangulation as string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Copy\">\n            <summary>\n            A deep copy of the triangulation.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Insert(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retatin the poylgons edges.\n            </summary>\n            <param name=\"polygon\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.Insert(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the polygons points into the triangulation.\n            May not retatin the poylgons edges.\n            </summary>\n            <param name=\"pwh\">The polygon to insert.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation2\">\n            <summary>\n            The anstract base class for the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.DelaunayTriangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the delaunay triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n            the triangulation is modified such that the new position of vertex same as point.</param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoCount(System.Int32@,System.Int32@)\">\n            <summary>\n            If the dual voronoi diagram of the triangulation is taken\n            How many segments and rays would be produced.\n            </summary>\n            <param name=\"numSegments\">The number of segments.</param>\n            <param name=\"numRays\">The number of rays.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoiSegments\">\n            <summary>\n            Get a array of the voronoi's segments.\n            </summary>\n            <returns>A array of the voronoi's segments.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.GetVoronoiRays\">\n            <summary>\n            Get a array of the voronois rays.\n            These are the segment at edge of triangulation that \n            a end point can not be determined.\n            </summary>\n            <returns>A array of the voronoi's rays.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation3`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.Refine(System.Double,System.Int32)\">\n            <summary>\n            Refine the triangulation.\n            </summary>\n            <param name=\"targetEdgeLength\">The target edge lengths.</param>\n            <param name=\"iterations\">The number of iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.DelaunayTriangulation3\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.DelaunayTriangulation3.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.Move(System.Int32,CGALDotNetGeometry.Numerics.Point3d,System.Boolean)\">\n            <summary>\n            Move a vertex.\n            </summary>\n            <param name=\"index\">The vertices index.</param>\n            <param name=\"point\">The point to move to.</param>\n            <param name=\"ifNoCollision\">Should the vertex only be moved if there is no coliision.</param>\n            <returns>If the vertex was moved.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.NearestVertex(CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the index of the nearest vertex to the point.\n            </summary>\n            <param name=\"point\">The point.</param>\n            <returns>The index of the nearest vertex to the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.NearestVertexInCell(System.Int32,CGALDotNetGeometry.Numerics.Point3d)\">\n            <summary>\n            Find the index of the nearest vertex to the point.\n            Presumes poimt is in a cell.\n            </summary>\n            <param name=\"index\">The cells index.</param>\n            <param name=\"point\">The point.</param>\n            <returns>The index of the nearest vertex to the point.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.RemoveVertex(System.Int32)\">\n            <summary>\n            Remobe a vertex.\n            </summary>\n            <param name=\"index\">The vertex index.</param>\n            <returns>True if vertex was removed.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.DelaunayTriangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation2`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.Triangulation2`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor(CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.InsertPolygon(CGALDotNet.Polygons.Polygon2{`0})\">\n            <summary>\n            Insert the points of the polygon into the triagulation.\n            May no have the same edges as polygon.\n            </summary>\n            <param name=\"polygon\">The polygon to insert/</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.InsertPolygon(CGALDotNet.Polygons.PolygonWithHoles2{`0})\">\n            <summary>\n            Insert the points of the polygon into the triagulation.\n            May no have the same edges as polygon.\n            </summary>\n            <param name=\"pwh\">The polygon to insert/</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation2\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point2d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.Triangulation2.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.MoveVertex(System.Int32,CGALDotNetGeometry.Numerics.Point2d,System.Boolean,CGALDotNet.Triangulations.TriVertex2@)\">\n            <summary>\n            Move the vertex.\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"point\"></param>\n            <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n            the triangulation is modified such that the new position of vertex same as point.</param>\n            <param name=\"vertex\">The moved vertex</param>\n            <returns>True if the vertex was found.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation2.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation3`1\">\n            <summary>\n            Generic triangulation class.\n            </summary>\n            <typeparam name=\"K\">The kerel.</typeparam>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.Triangulation3`1.Instance\">\n            <summary>\n            Static instance of a triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor\">\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor(CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            Construct a triangulation from the points.\n            </summary>\n            <param name=\"points\">The triangulation points.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.#ctor(System.IntPtr)\">\n            <summary>\n            Construct from a existing triangulation.\n            </summary>\n            <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.ToString\">\n            <summary>\n            The triangulation as a string.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.Copy\">\n            <summary>\n            Create a deep copy of the triangulation.\n            </summary>\n            <returns>The deep copy.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.Refine(System.Double,System.Int32)\">\n            <summary>\n            Refine the triangulation.\n            </summary>\n            <param name=\"targetEdgeLength\">The target edge lengths.</param>\n            <param name=\"iterations\">The number of iterations.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3`1.ComputeHull\">\n            <summary>\n            Compute the convex of the triagulation.\n            </summary>\n            <returns>The convex hull polygon.</returns>\n            <exception cref=\"T:System.InvalidOperationException\"></exception>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.Triangulation3\">\n            <summary>\n            Abstract base class for the triagulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel,CGALDotNetGeometry.Numerics.Point3d[])\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"points\"></param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.#ctor(CGALDotNet.CGALKernel,System.IntPtr)\">\n            <summary>\n            \n            </summary>\n            <param name=\"kernel\"></param>\n            <param name=\"ptr\"></param>\n        </member>\n        <member name=\"P:CGALDotNet.Triangulations.Triangulation3.TriangulationKernel\">\n            <summary>\n            The kernel with the functions unique to the triangulation.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.Triangulation3.Print(System.Text.StringBuilder)\">\n            <summary>\n            \n            </summary>\n            <param name=\"builder\"></param>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriCell3\">\n            <summary>\n            From Index to HalfEdgeIndex must match layout\n            of the unmanaged TriFace2 in the TriFace2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.IsInfinite\">\n            <summary>\n            Is this the infinite cell.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.Index\">\n            <summary>\n            The cells index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.VertexIndices\">\n            <summary>\n            The cells 4 vertices.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriCell3.NeighborIndices\">\n            <summary>\n            The cells 4 neighbor cells.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.op_Equality(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two cells equal.\n            </summary>\n            <param name=\"f1\">The first cell.</param>\n            <param name=\"f2\">The second cell.</param>\n            <returns>True if the cells are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.op_Inequality(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two cells not equal.\n            </summary>\n            <param name=\"f1\">The first cell.</param>\n            <param name=\"f2\">The second cell.</param>\n            <returns>True if the cells are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.Equals(CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are these cells equal.\n            </summary>\n            <param name=\"cell\">The other cell.</param>\n            <returns>True if the cells are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetHashCode\">\n            <summary>\n            The cells hash code.\n            </summary>\n            <returns>The cells hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetVertexIndex(System.Int32)\">\n            <summary>\n            Get a vertex index.\n            </summary>\n            <param name=\"i\">The vertices index 0-3.</param>\n            <returns>The vertices index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.GetNeighborIndex(System.Int32)\">\n            <summary>\n            Get a neighbor cell index.\n            </summary>\n            <param name=\"i\">The neighbor cell index 0-3.</param>\n            <returns>A neighbor cell index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateVertices(CGALDotNet.Triangulations.TriVertex3[])\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"vertices\">The vertices array.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateNeighbors(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate the vertices of the cell.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The cell vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.EnumerateNeighbors(CGALDotNet.Triangulations.TriCell3[])\">\n            <summary>\n            Enumerate the neighbors of the cell.\n            </summary>\n            <param name=\"cells\">The cell array.</param>\n            <returns>The cell neighbors.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.VerticesEqual(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two vertex arrays equal.\n            </summary>\n            <param name=\"c1\"></param>\n            <param name=\"c2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriCell3.NeighborEqual(CGALDotNet.Triangulations.TriCell3,CGALDotNet.Triangulations.TriCell3)\">\n            <summary>\n            Are the two neighbor arrays equal.\n            </summary>\n            <param name=\"c1\"></param>\n            <param name=\"c2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriEdge2\">\n            <summary>\n            From Index to TwinIndex must match layout\n            of the unmanaged TriEdge2 in the TriEdge2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.FaceIndex\">\n            <summary>\n            The edges face index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.NeighbourIndex\">\n            <summary>\n            The neighbours index in the face array betwen 0 and 2.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriEdge2.Segment\">\n            <summary>\n            The edges segment.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            \n            </summary>\n            <param name=\"faceIndex\">The face index in the triangulation</param>\n            <param name=\"neighbourIndex\">The neighbours index in the face array betwen 0 and 2.</param>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.op_Equality(CGALDotNet.Triangulations.TriEdge2,CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are the two edges equal.\n            </summary>\n            <param name=\"e1\">The first edge.</param>\n            <param name=\"e2\">The second edge.</param>\n            <returns>True if the edges are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.op_Inequality(CGALDotNet.Triangulations.TriEdge2,CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are the two edges not equal.\n            </summary>\n            <param name=\"e1\">The first edge.</param>\n            <param name=\"e2\">The second edge.</param>\n            <returns>True if the edges are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.Equals(CGALDotNet.Triangulations.TriEdge2)\">\n            <summary>\n            Are these edges equal.\n            </summary>\n            <param name=\"edge\">The other edge.</param>\n            <returns>True if the edges are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriEdge2.GetHashCode\">\n            <summary>\n            The edges hash code.\n            </summary>\n            <returns>The edges hash code.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriFace2\">\n            <summary>\n            From Index to HalfEdgeIndex must match layout\n            of the unmanaged TriFace2 in the TriFace2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.IsInfinite\">\n            <summary>\n            Is this the infinite face.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.Index\">\n            <summary>\n            The faces index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriFace2.VertexIndex\">\n            <summary>\n            The faces 3 vertices.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.ToString\">\n            <summary>\n            \n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.op_Equality(CGALDotNet.Triangulations.TriFace2,CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are the two faces equal.\n            </summary>\n            <param name=\"f1\">The first face.</param>\n            <param name=\"f2\">The second face.</param>\n            <returns>True if the faces are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.op_Inequality(CGALDotNet.Triangulations.TriFace2,CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are the two faces not equal.\n            </summary>\n            <param name=\"f1\">The first face.</param>\n            <param name=\"f2\">The second face.</param>\n            <returns>True if the faces are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.Equals(CGALDotNet.Triangulations.TriFace2)\">\n            <summary>\n            Are these faces equal.\n            </summary>\n            <param name=\"face\">The other face.</param>\n            <returns>True if the faces are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.GetHashCode\">\n            <summary>\n            The faces hash code.\n            </summary>\n            <returns>The faces hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.GetVertexIndex(System.Int32)\">\n            <summary>\n            Get a vertex index and wrap around array.\n            </summary>\n            <param name=\"i\">The vertices index wrapped to 0-2.</param>\n            <returns>The vertices index in the triangulation.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation2)\">\n            <summary>\n            Enumerate the vertices of the face.\n            </summary>\n            <param name=\"tri\">The triangle the vertices below too.</param>\n            <returns>The face vertices.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriFace2.EnumerateVertices(CGALDotNet.Triangulations.TriVertex2[])\">\n            <summary>\n            Enumerate the vertices of the face.\n            </summary>\n            <param name=\"vertices\">The vertices array.</param>\n            <returns>The face vertices.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriVertex2\">\n            <summary>\n            From Point to HalfEdgeIndex must match layout\n            of the unmanaged TriVertex2 in the TriVertex2 header file.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.IsInfinite\">\n            <summary>\n            Is this a infinite vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Degree\">\n            <summary>\n            The number of egdes connected to the vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.Index\">\n            <summary>\n            The vertices index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex2.FaceIndex\">\n            <summary>\n            The one of the vertexs the vertex is connected to.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.op_Equality(CGALDotNet.Triangulations.TriVertex2,CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are the two vertexs equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.op_Inequality(CGALDotNet.Triangulations.TriVertex2,CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are the two vertexs not equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.Equals(CGALDotNet.Triangulations.TriVertex2)\">\n            <summary>\n            Are these vertexs equal.\n            </summary>\n            <param name=\"vertex\">The other vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex2.GetHashCode\">\n            <summary>\n            The vertexs hash code.\n            </summary>\n            <returns>The vertexs hash code.</returns>\n        </member>\n        <member name=\"T:CGALDotNet.Triangulations.TriVertex3\">\n            <summary>\n            \n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Point\">\n            <summary>\n            The vertices point.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.IsInfinite\">\n            <summary>\n            Is this a infinte vertex.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Degree\">\n            <summary>\n            The vertices degree is the \n            number of edges connecting to it.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.Index\">\n            <summary>\n            The vertices index in the triangulation.\n            </summary>\n        </member>\n        <member name=\"F:CGALDotNet.Triangulations.TriVertex3.CellIndex\">\n            <summary>\n            The one of the cells the vertex is connected to.\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.op_Equality(CGALDotNet.Triangulations.TriVertex3,CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are the two vertices equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.op_Inequality(CGALDotNet.Triangulations.TriVertex3,CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are the two vertices not equal.\n            </summary>\n            <param name=\"v1\">The first vertex.</param>\n            <param name=\"v2\">The second vertex.</param>\n            <returns>True if the vertexs are not equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.Equals(System.Object)\">\n            <summary>\n            Are these objects equal.\n            </summary>\n            <param name=\"obj\">The other object.</param>\n            <returns>True if the objects are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.Equals(CGALDotNet.Triangulations.TriVertex3)\">\n            <summary>\n            Are these vertexs equal.\n            </summary>\n            <param name=\"vertex\">The other vertex.</param>\n            <returns>True if the vertexs are equal.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.GetHashCode\">\n            <summary>\n            The vertexs hash code.\n            </summary>\n            <returns>The vertexs hash code.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.EnumerateVertices(CGALDotNet.Triangulations.BaseTriangulation3)\">\n            <summary>\n            Enumerate around all the other vertices in this vertexs cell.\n            </summary>\n            <param name=\"tri\">The triangulation the vertex belongs to.</param>\n            <returns>All the other vertices in this vertexs cell</returns>\n        </member>\n        <member name=\"M:CGALDotNet.Triangulations.TriVertex3.EnumerateVertices(CGALDotNet.Triangulations.TriVertex3[],CGALDotNet.Triangulations.TriCell3[])\">\n            <summary>\n            Enumerate around all the other vertices in this vertexs cell.\n            </summary>\n            <param name=\"vertices\">A array of the other vertices in the triangulation.</param>\n            <param name=\"cells\">A array of the other cells in the triangulation.</param>\n            <returns>All the other vertices in this vertexs cell</returns>\n        </member>\n        <member name=\"T:CGALDotNet.ArrayCache\">\n            <summary>\n            Cache to reuse arrays.\n            Thread safe?\n            </summary>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Point2dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Point2d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Point2d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Segment2dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Segment2d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Segment2d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.Point3dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of Point3d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of Point3d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.HPoint3dArray(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of HPoint3d objects that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of HPoint3d objects that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.IntArray1(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of ints that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of ints that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.IntArray2(System.Int32,System.Boolean)\">\n            <summary>\n            Returns a array of ints that is at least the size of count.\n            </summary>\n            <param name=\"count\">The minimum size of the array.</param>\n            <param name=\"clear\">Should the array be cleared first.</param>\n            <returns>Returns a array of ints that is at least the size of count.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ArrayCache.MakeNewArray(System.Array,System.Int32)\">\n            <summary>\n            Should a new array be created.\n            </summary>\n            <param name=\"arr\">The current array.</param>\n            <param name=\"count\">The required new array size.</param>\n            <returns>Creates a new array if disabled, the current one is null or to small.</returns>\n        </member>\n        <member name=\"M:CGALDotNet.ErrorUtil.CheckArray(System.Array,System.Int32)\">\n            <summary>\n            Check a array that is passed to the c++ dll.\n            If the array is invalid it will cause a hard crash.\n            Array can be null if count is 0;\n            </summary>\n            <param name=\"array\"></param>\n            <param name=\"count\"></param>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "CGALDotNet/CGALGlobal.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\n[assembly: InternalsVisibleTo(\"CGALDotNetConsole\")]\n[assembly: InternalsVisibleTo(\"CGALDotNetTest\")]\n\nnamespace CGALDotNet\n{\n    /// <summary>\n    /// Global utility functions.\n    /// </summary>\n    public static class CGALGlobal\n    {\n        public const int NULL_INDEX = -1;\n\n        private const string DLL_NAME = \"CGALWrapper.dll\";\n\n        private const CallingConvention CDECL = CallingConvention.Cdecl;\n\n        /// <summary>\n        /// Get the version of CGAL in use.\n        /// </summary>\n        public static string Version\n        {\n            get\n            {\n                int v = CGALGlobal_VersionNumber();\n\n                int MAJOR = v / 10000000 % 100;\n                int MINOR = v / 100000 % 100;\n                int PATCH = v / 10000 % 10;\n                int BUILD = v % 10000;\n\n                return string.Format(\"{0}.{1}.{2}.{3}\", MAJOR, MINOR, PATCH, BUILD);\n            }\n        }\n\n        /// <summary>\n        /// Get the version of eigen being used.\n        /// </summary>\n        public static string EigenVersion\n        {\n            get\n            {\n                var v = CGALGlobal_EigenVersionNumber();\n\n                int WORLD = v.first;\n                int MAJOR = v.second;\n                int MINOR = v.third;\n\n                return string.Format(\"{0}.{1}.{2}\", WORLD, MAJOR, MINOR);\n            }\n        }\n\n        /// <summary>\n        /// Returns OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.</returns>\n        public static ANGLE Angle(Vector2d u, Vector2d v)\n        {\n            return CGALGlobal_EIK_Angle_Vector2(u, v);\n        }\n\n        /// <summary>\n        /// Returns OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.</returns>\n        public static ANGLE Angle(Vector2<EIK> u, Vector2<EIK> v)\n        {\n            return CGALGlobal_EIK_Angle_Vector2(u.Ptr, v.Ptr);\n        }\n\n        /// <summary>\n        /// Returns OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.</returns>\n        public static ANGLE Angle(Vector2<EEK> u, Vector2<EEK> v)\n        {\n            return CGALGlobal_EEK_Angle_Vector2(u.Ptr, v.Ptr);\n        }\n\n        /// <summary>\n        /// returns OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>OBTUSE, RIGHT or ACUTE depending on the \n        /// angle formed by the two vectors u and v.</returns>\n        public static ANGLE Angle(Vector3d u, Vector3d v)\n        {\n            return CGALGlobal_EIK_Angle_Vector3d(u, v);\n        }\n\n        /// <summary>\n        /// Returns an approximation of the angle between u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>The angle is given in degrees.</returns>\n        public static Degree ApproxAngle(Vector2d u, Vector2d v)\n        {\n            return new Degree(CGALGlobal_EIK_ApproxAngle_Vector3d(u.xy0, v.xy0));\n        }\n\n        /// <summary>\n        /// Returns an approximation of the angle between p-q and r-q.\n        /// </summary>\n        /// <param name=\"p\">The first tetrahedrons point.</param>\n        /// <param name=\"q\">The second tetrahedrons point.</param>\n        /// <param name=\"r\">The third tetrahedrons point.</param>\n        /// <returns>The angle is given in degrees.</returns>\n        public static Degree ApproxAngle(Point2d p, Point2d q, Point2d r)\n        {\n            var u = Point2d.Direction(q, p).xy0;\n            var v = Point2d.Direction(q, r).xy0;\n\n            return new Degree(CGALGlobal_EIK_ApproxAngle_Vector3d(u, v));\n        }\n\n        /// <summary>\n        /// Returns an approximation of the angle between u and v.\n        /// </summary>\n        /// <param name=\"u\">The first vector.</param>\n        /// <param name=\"v\">The second vector.</param>\n        /// <returns>The angle is given in degrees.</returns>\n        public static Degree ApproxAngle(Vector3d u, Vector3d v)\n        {\n            return new Degree(CGALGlobal_EIK_ApproxAngle_Vector3d(u, v));\n        }\n\n        /// <summary>\n        /// Returns an approximation of the angle between p-q and r-q.\n        /// </summary>\n        /// <param name=\"p\">The first tetrahedrons point.</param>\n        /// <param name=\"q\">The second tetrahedrons point.</param>\n        /// <param name=\"r\">The third tetrahedrons point.</param>\n        /// <returns>The angle is given in degrees.</returns>\n        public static Degree ApproxAngle(Point3d p, Point3d q, Point3d r)\n        {\n            var u = Point3d.Direction(q, p);\n            var v = Point3d.Direction(q, r);\n\n            return new Degree(CGALGlobal_EIK_ApproxAngle_Vector3d(u, v));\n        }\n\n        /// <summary>\n        /// Returns an approximation of the signed dihedral angle \n        /// in the tetrahedron pqrs of edge pq.\n        /// p,q,r and p,q,s are not collinear.\n        /// </summary>\n        /// <param name=\"p\">The first tetrahedrons point.</param>\n        /// <param name=\"q\">The second tetrahedrons point.</param>\n        /// <param name=\"r\">The third tetrahedrons point.</param>\n        /// <param name=\"s\">The fourth tetrahedrons point.</param>\n        /// <returns>The sign is negative if orientation(p,q,r,s) \n        /// is CGAL::NEGATIVE and positive otherwise.\n        /// The angle is given in degrees.</returns>\n        public static Degree ApproxDihedralAngle(Point3d p, Point3d q, Point3d r, Point3d s)\n        {\n            return new Degree(CGALGlobal_EIK_ApproxDihedralAngle_Point3(p, q, r, s));\n        }\n\n        /// <summary>\n        /// Returns true, if the three points are collinear \n        /// and q lies between p and r.\n        /// Note that true is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true, if the three points are \n        /// collinear and q lies between p and r.</returns>\n        public static bool AreOrderedAlongLine(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_AreOrderedAlongLine_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true, if the three points are collinear \n        /// and q lies between p and r.\n        /// Note that true is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true, if the three points are \n        /// collinear and q lies between p and r.</returns>\n        public static bool AreOrderedAlongLine(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_AreOrderedAlongLine_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true, if the three points are collinear \n        /// and q lies between p and r.\n        /// Note that true is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true, if the three points are \n        /// collinear and q lies between p and r.</returns>\n        public static bool AreOrderedAlongLine(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EEK_AreOrderedAlongLine_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true, if the three points are collinear \n        /// and q lies between p and r.\n        /// Note that true is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true, if the three points are \n        /// collinear and q lies between p and r.</returns>\n        public static bool AreOrderedAlongLine(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_AreOrderedAlongLine_Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// returns true, if the three points are collinear \n        /// and q lies strictly between p and r.\n        /// Note that false is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, iff the three points are \n        /// collinear and q lies strictly between p and r.</returns>\n        public static bool AreStrictlyOrderedAlongLine(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// returns true, if the three points are collinear \n        /// and q lies strictly between p and r.\n        /// Note that false is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, iff the three points are \n        /// collinear and q lies strictly between p and r.</returns>\n        public static bool AreStrictlyOrderedAlongLine(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if the three points are collinear \n        /// and q lies strictly between p and r.\n        /// Note that false is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, iff the three points are \n        /// collinear and q lies strictly between p and r.</returns>\n        public static bool AreStrictlyOrderedAlongLine(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EEK_AreStrictlyOrderedAlongLine_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if the three points are collinear \n        /// and q lies strictly between p and r.\n        /// Note that false is returned, if q==p or q==r.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, iff the three points are \n        /// collinear and q lies strictly between p and r.</returns>\n        public static bool AreStrictlyOrderedAlongLine(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true, if p, q, and r are collinear\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, if p, q, and r are collinear</returns>\n        public static bool Collinear(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_Collinear_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true, if p, q, and r are collinear\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, if p, q, and r are collinear</returns>\n        public static bool Collinear(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_Collinear_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true, if p, q, and r are collinear\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>returns true, if p, q, and r are collinear</returns>\n        public static bool Collinear(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EEK_Collinear_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true, if p, q, and r are collinear\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true, iff p, q, and r are collinear</returns>\n        public static bool Collinear(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_Collinear_Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// Compute the barycenter of the points p1, p2 and p3 \n        /// with corresponding weights w1, w2 and w3 as 1.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Compute the barycenter of the points.</returns>\n        public static Point2d Barycenter(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_Barycenter_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Compute the barycenter of the points p1, p2 and p3 \n        /// with corresponding weights w1, w2 and w3 as 1.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Compute the barycenter of the points.</returns>\n        public static Point2<EIK> Barycenter(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            var ptr = CGALGlobal_EIK_Barycenter_Point2(p.Ptr, q.Ptr, r.Ptr);\n            return new Point2<EIK>(ptr);\n        }\n\n        /// <summary>\n        /// Compute the barycenter of the points p1, p2 and p3 \n        /// with corresponding weights w1, w2 and w3 as 1.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Compute the barycenter of the points.</returns>\n        public static Point2<EEK> Barycenter(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            var ptr = CGALGlobal_EEK_Barycenter_Point2(p.Ptr, q.Ptr, r.Ptr);\n            return new Point2<EEK>(ptr);\n        }\n\n        /// <summary>\n        /// Compute the barycenter of the points p1, p2 and p3 \n        /// with corresponding weights w1, w2 and w3 as 1.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Compute the barycenter of the points.</returns>\n        public static Point3d Barycenter(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_Barycenter_Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// Constructs the bisector line of the two points p and q.\n        /// The bisector is oriented in such a way that p lies on its positive side.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <returns>Constructs the bisector line of the two points p and q.</returns>\n        public static Line2d Bisector(Point3d p, Point3d q)\n        {\n            return CGALGlobal_EIK_Bisector_Point3d(p, q);\n        }\n\n        /// <summary>\n        /// Constructs the bisector of the two lines l1 and l2.\n        /// \n        /// In the general case, the bisector has the direction of\n        /// the vector which is the sum of the normalized directions \n        /// of the two lines, and which passes through the intersection \n        /// of l1 and l2. If l1 and l2 are parallel, then the bisector \n        /// is defined as the line which has the same direction as l1, \n        /// and which is at the same distance from l1 and l2. \n        /// If Kernel::FT is not a model of FieldWithSqrt an \n        /// approximation of the square root will be used in this \n        /// function, impacting the exactness of the result even \n        /// with an (exact) multiprecision number type.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The second line.</param>\n        /// <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        public static Line2d Bisector(Line2d l1, Line2d l2)\n        {\n            return CGALGlobal_EIK_Bisector_Line2d(l1, l2);\n        }\n\n        /// <summary>\n        /// Constructs the bisector of the two lines l1 and l2.\n        /// \n        /// In the general case, the bisector has the direction of\n        /// the vector which is the sum of the normalized directions \n        /// of the two lines, and which passes through the intersection \n        /// of l1 and l2. If l1 and l2 are parallel, then the bisector \n        /// is defined as the line which has the same direction as l1, \n        /// and which is at the same distance from l1 and l2. \n        /// If Kernel::FT is not a model of FieldWithSqrt an \n        /// approximation of the square root will be used in this \n        /// function, impacting the exactness of the result even \n        /// with an (exact) multiprecision number type.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The second line.</param>\n        /// <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        public static Line2<EIK> Bisector(Line2<EIK> l1, Line2<EIK> l2)\n        {\n            var ptr = CGALGlobal_EIK_Bisector_Line2(l1.Ptr, l2.Ptr);\n            return new Line2<EIK>(ptr);\n        }\n\n        /// <summary>\n        /// Constructs the bisector of the two lines l1 and l2.\n        /// \n        /// In the general case, the bisector has the direction of\n        /// the vector which is the sum of the normalized directions \n        /// of the two lines, and which passes through the intersection \n        /// of l1 and l2. If l1 and l2 are parallel, then the bisector \n        /// is defined as the line which has the same direction as l1, \n        /// and which is at the same distance from l1 and l2. \n        /// If Kernel::FT is not a model of FieldWithSqrt an \n        /// approximation of the square root will be used in this \n        /// function, impacting the exactness of the result even \n        /// with an (exact) multiprecision number type.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The second line.</param>\n        /// <returns>Constructs the bisector of the two lines l1 and l2.</returns>\n        public static Line2<EEK> Bisector(Line2<EEK> l1, Line2<EEK> l2)\n        {\n            var ptr = CGALGlobal_EEK_Bisector_Line2(l1.Ptr, l2.Ptr);\n            return new Line2<EEK>(ptr);\n        }\n\n        /// <summary>\n        /// Returns true, if p, q, r, and s are coplanar.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <param name=\"s\">The fourth point</param>\n        /// <returns>Returns true, if p, q, r, and s are coplanar.</returns>\n        public static bool Coplanar(Point3d p, Point3d q, Point3d r, Point3d s)\n        {\n            return CGALGlobal_EIK_Coplanar_Point3d(p, q, r, s);\n        }\n\n        /// <summary>\n        /// If p,q,r are collinear, then CGAL_COLLINEAR is returned.\n        /// If not, then p,q,r define a plane p. The return value in this \n        /// case is either CGAL_POSITIVE or CGAL_NEGATIVE, but we don't \n        /// specify it explicitly. However, we guarantee that all calls to\n        /// this predicate over 3 points in p will return a coherent \n        /// orientation if considered a 2D orientation in p\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>If p,q,r are collinear, then CGAL_COLLINEAR is returned.</returns>\n        public static ORIENTATION CoplanarOrientation(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_CoplanarOrientation_3Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// Let P be the plane defined by the points p, q, and r.\n        /// Note that the order defines the orientation of P. The function computes \n        /// the orientation of points p, q, and s in P: If p, q, s are collinear, \n        /// CGAL_COLLINEAR is returned. If P and the plane defined by p, q,\n        /// and s have the same orientation, CGAL_POSITIVE is returned; \n        /// otherwise CGAL_NEGATIVE is returned.\n        /// p, q, r, and s are coplanar and p, q, and r are not collinear.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <param name=\"s\">The fourth point</param>\n        /// <returns></returns>\n        public static ORIENTATION CoplanarOrientation(Point3d p, Point3d q, Point3d r, Point3d s)\n        {\n            return CGALGlobal_EIK_CoplanarOrientation_4Point3d(p, q, r, s);\n        }\n\n        /// <summary>\n        /// Constructs the line which is at the same distance from the three points p, q and r.\n        /// p, q and r are not collinear.\n        /// </summary>\n        /// <param name=\"p\"></param>\n        /// <param name=\"q\"></param>\n        /// <param name=\"r\"></param>\n        /// <returns>Constructs the line which is at the same distance from the three points p, q and r.</returns>\n        public static Line3d EquidistantLine(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_EquidistantLine_Line3d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a left turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a left turn.</returns>\n        public static bool LeftTurn(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_LeftTurn_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a left turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a left turn.</returns>\n        public static bool LeftTurn(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_LeftTurn_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a left turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a left turn.</returns>\n        public static bool LeftTurn(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EEK_LeftTurn_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a right turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a right turn.</returns>\n        public static bool RightTurn(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_RightTurn_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a right turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a right turn.</returns>\n        public static bool RightTurn(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_RightTurn_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns true if p, q, and r form a right turn.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>Returns true if p, q, and r form a right turn.</returns>\n        public static bool RightTurn(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EIK_RightTurn_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns LEFT_TURN, if r lies to the left of the oriented \n        /// line l defined by p and q, returns RIGHT_TURN if r lies \n        /// to the right of l, and returns COLLINEAR if r lies on l.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Point2d p, Point2d q, Point2d r)\n        {\n            return CGALGlobal_EIK_Orientation_Point2d(p, q, r);\n        }\n\n        /// <summary>\n        /// Returns LEFT_TURN, if r lies to the left of the oriented \n        /// line l defined by p and q, returns RIGHT_TURN if r lies \n        /// to the right of l, and returns COLLINEAR if r lies on l.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Point2<EIK> p, Point2<EIK> q, Point2<EIK> r)\n        {\n            return CGALGlobal_EIK_Orientation_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// Returns LEFT_TURN, if r lies to the left of the oriented \n        /// line l defined by p and q, returns RIGHT_TURN if r lies \n        /// to the right of l, and returns COLLINEAR if r lies on l.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Point2<EEK> p, Point2<EEK> q, Point2<EEK> r)\n        {\n            return CGALGlobal_EEK_Orientation_Point2(p.Ptr, q.Ptr, r.Ptr);\n        }\n\n        /// <summary>\n        /// returns LEFT_TURN if u and v form a left turn, returns \n        /// RIGHT_TURN if u and v form a right turn, and returns \n        /// COLLINEAR if u and v are collinear.\n        /// </summary>\n        /// <param name=\"u\"></param>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Vector2d u, Vector2d v)\n        {\n            return CGALGlobal_EIK_Orientation_Vector2d(u, v);\n        }\n\n        /// <summary>\n        /// Returns LEFT_TURN, if r lies to the left of the oriented \n        /// line l defined by p and q, returns RIGHT_TURN if r lies \n        /// to the right of l, and returns COLLINEAR if r lies on l.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Vector2<EIK> p, Vector2<EIK> q)\n        {\n            return CGALGlobal_EIK_Orientation_Vector2(p.Ptr, q.Ptr);\n        }\n\n        /// <summary>\n        /// Returns LEFT_TURN, if r lies to the left of the oriented \n        /// line l defined by p and q, returns RIGHT_TURN if r lies \n        /// to the right of l, and returns COLLINEAR if r lies on l.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Vector2<EEK> p, Vector2<EEK> q)\n        {\n            return CGALGlobal_EEK_Orientation_Vector2(p.Ptr, q.Ptr);\n        }\n\n        /// <summary>\n        /// returns POSITIVE, if s lies on the positive side of the \n        /// oriented plane h defined by p, q, and r, returns NEGATIVE\n        /// if s lies on the negative side of h, and returns COPLANAR \n        /// if s lies on h.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <param name=\"s\">The fourth point</param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Point3d p, Point3d q, Point3d r, Point3d s)\n        {\n            return CGALGlobal_EIK_Orientation_Point3d(p, q, r, s);\n        }\n\n        /// <summary>\n        /// returns NEGATIVE if u, v and w are negatively oriented, \n        /// POSITIVE if u, v and w are positively oriented,\n        /// and COPLANAR if u, v and w are coplanar.\n        /// </summary>\n        /// <param name=\"u\"></param>\n        /// <param name=\"v\"></param>\n        /// <param name=\"w\"></param>\n        /// <returns></returns>\n        public static ORIENTATION Orientation(Vector3d u, Vector3d v, Vector3d w)\n        {\n            return CGALGlobal_EIK_Orientation_Vector3d(u, v, w);\n        }\n\n        /// <summary>\n        /// computes an orthogonal vector of the plane defined by p, q\n        /// and r, which is directed to the positive side of this plane.\n        /// </summary>\n        /// <param name=\"p\">The first point.</param>\n        /// <param name=\"q\">The second point.</param>\n        /// <param name=\"r\">The third point.</param>\n        /// <returns>computes an orthogonal vector of the plane</returns>\n        public static Vector3d OrthogonalVector(Point3d p, Point3d q, Point3d r)\n        {\n            return CGALGlobal_EIK_OrthogonalVector_Point3d(p, q, r);\n        }\n\n        /// <summary>\n        /// returns true, if l1 and l2 are parallel or if one of those \n        /// (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The seconed line.</param>\n        /// <returns>returns true, if l1 and l2 are parallel</returns>\n        public static bool Parallel(Line2d l1, Line2d l2)\n        {\n            return CGALGlobal_EIK_Parallel_Line2d(l1, l2);\n        }\n\n        /// <summary>\n        /// returns true, if l1 and l2 are parallel or if one of those \n        /// (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The seconed line.</param>\n        /// <returns>returns true, if l1 and l2 are parallel</returns>\n        public static bool Parallel(Line2<EIK> l1, Line2<EIK> l2)\n        {\n            return CGALGlobal_EIK_Parallel_Line2(l1.Ptr, l2.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if l1 and l2 are parallel or if one of those \n        /// (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"l1\">The first line.</param>\n        /// <param name=\"l2\">The seconed line.</param>\n        /// <returns>returns true, if l1 and l2 are parallel</returns>\n        public static bool Parallel(Line2<EEK> l1, Line2<EEK> l2)\n        {\n            return CGALGlobal_EEK_Parallel_Line2(l1.Ptr, l2.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if r1 and r2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"r1\">The first ray.</param>\n        /// <param name=\"r2\">The second ray.</param>\n        /// <returns>returns true, if r1 and r2 are parallel</returns>\n        public static bool Parallel(Ray2d r1, Ray2d r2)\n        {\n            return CGALGlobal_EIK_Parallel_Ray2d(r1, r2);\n        }\n\n        /// <summary>\n        /// returns true, if r1 and r2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"r1\">The first ray.</param>\n        /// <param name=\"r2\">The second ray.</param>\n        /// <returns>returns true, if r1 and r2 are parallel</returns>\n        public static bool Parallel(Ray2<EIK> r1, Ray2<EIK> r2)\n        {\n            return CGALGlobal_EIK_Parallel_Ray2(r1.Ptr, r2.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if r1 and r2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"r1\">The first ray.</param>\n        /// <param name=\"r2\">The second ray.</param>\n        /// <returns>returns true, if r1 and r2 are parallel</returns>\n        public static bool Parallel(Ray2<EEK> r1, Ray2<EEK> r2)\n        {\n            return CGALGlobal_EEK_Parallel_Ray2(r1.Ptr, r2.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if s1 and s2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"s1\">The first segment.</param>\n        /// <param name=\"s2\">The secong segment.</param>\n        /// <returns>returns true, if s1 and s2 are parallel</returns>\n        public static bool Parallel(Segment2d s1, Segment2d s2)\n        {\n            return CGALGlobal_EIK_Parallel_Segment2d(s1, s2);\n        }\n\n        /// <summary>\n        /// returns true, if s1 and s2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"s1\">The first segment.</param>\n        /// <param name=\"s2\">The secong segment.</param>\n        /// <returns>returns true, if s1 and s2 are parallel</returns>\n        public static bool Parallel(Segment2<EIK> s1, Segment2<EIK> s2)\n        {\n            return CGALGlobal_EIK_Parallel_Segment2(s1.Ptr, s2.Ptr);\n        }\n\n        /// <summary>\n        /// returns true, if s1 and s2 are parallel or if one of \n        /// those (or both) is degenerate.\n        /// </summary>\n        /// <param name=\"s1\">The first segment.</param>\n        /// <param name=\"s2\">The secong segment.</param>\n        /// <returns>returns true, if s1 and s2 are parallel</returns>\n        public static bool Parallel(Segment2<EEK> s1, Segment2<EEK> s2)\n        {\n            return CGALGlobal_EEK_Parallel_Segment2(s1.Ptr, s2.Ptr);\n        }\n\n        //---------------------------------------------------------------------------//\n        //                               Version                                     //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int CGALGlobal_VersionNumber();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index3 CGALGlobal_EigenVersionNumber();\n\n        //---------------------------------------------------------------------------//\n        //                               Angle                                       //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ANGLE CGALGlobal_EIK_Angle_Vector2(Vector2d u, Vector2d v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ANGLE CGALGlobal_EIK_Angle_Vector2(IntPtr u, IntPtr v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ANGLE CGALGlobal_EEK_Angle_Vector2(IntPtr u, IntPtr v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ANGLE CGALGlobal_EIK_Angle_Vector3d(Vector3d u, Vector3d v);\n\n        //---------------------------------------------------------------------------//\n        //                               ApproxAngle                                 //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double CGALGlobal_EIK_ApproxAngle_Vector3d(Vector3d u, Vector3d v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double CGALGlobal_EIK_ApproxAngle_Vector2(IntPtr u, IntPtr v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double CGALGlobal_EEK_ApproxAngle_Vector2(IntPtr u, IntPtr v);\n\n        //---------------------------------------------------------------------------//\n        //                               ApproxDihedralAngle                         //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double CGALGlobal_EIK_ApproxDihedralAngle_Point3(Point3d p, Point3d q, Point3d r, Point3d s);\n\n        //---------------------------------------------------------------------------//\n        //                               AreOrderedAlongLine                         //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreOrderedAlongLine_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_AreOrderedAlongLine_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r);\n\n        //---------------------------------------------------------------------------//\n        //                               AreStrictlyOrderedAlongLine                 //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_AreStrictlyOrderedAlongLine_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r);\n\n        //---------------------------------------------------------------------------//\n        //                                 Collinear                                 //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Collinear_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Collinear_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_Collinear_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Collinear_Point3d(Point3d p, Point3d q, Point3d r);\n\n        //---------------------------------------------------------------------------//\n        //                                  Barycenter                               //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d CGALGlobal_EIK_Barycenter_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EIK_Barycenter_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EEK_Barycenter_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d CGALGlobal_EIK_Barycenter_Point3d(Point3d p, Point3d q, Point3d r);\n\n        //---------------------------------------------------------------------------//\n        //                               Bisector                                    //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Line2d CGALGlobal_EIK_Bisector_Point3d(Point3d p, Point3d q);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Line2d CGALGlobal_EIK_Bisector_Line2d(Line2d p, Line2d q);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EIK_Bisector_Line2(IntPtr p, IntPtr q);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EEK_Bisector_Line2(IntPtr p, IntPtr q);\n\n        //---------------------------------------------------------------------------//\n        //                               Coplanar                                    //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Coplanar_Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n        //---------------------------------------------------------------------------//\n        //                            CoplanarOrientation                            //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_CoplanarOrientation_3Point3d(Point3d p, Point3d q, Point3d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_CoplanarOrientation_4Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n        //---------------------------------------------------------------------------//\n        //                             EquidistantLine                               //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Line3d CGALGlobal_EIK_EquidistantLine_Line3d(Point3d p, Point3d q, Point3d r);\n\n        //---------------------------------------------------------------------------//\n        //                              LeftTurn                                     //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_LeftTurn_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_LeftTurn_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_LeftTurn_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        //---------------------------------------------------------------------------//\n        //                               RightTurn                                   //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_RightTurn_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_RightTurn_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_RightTurn_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        //---------------------------------------------------------------------------//\n        //                               Orientation                                 //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Point2d(Point2d p, Point2d q, Point2d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EEK_Orientation_Point2(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Vector2d(Vector2d u, Vector2d v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Vector2(IntPtr p, IntPtr q);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EEK_Orientation_Vector2(IntPtr p, IntPtr q);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION CGALGlobal_EIK_Orientation_Vector3d(Vector3d u, Vector3d v, Vector3d w);\n\n        //---------------------------------------------------------------------------//\n        //                              OrthogonalVector                             //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector3d CGALGlobal_EIK_OrthogonalVector_Point3d(Point3d p, Point3d q, Point3d r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EIK_OrthogonalVector_Point3(IntPtr p, IntPtr q, IntPtr r);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr CGALGlobal_EEK_OrthogonalVector_Point3(IntPtr p, IntPtr q, IntPtr r);\n\n        //---------------------------------------------------------------------------//\n        //                               Parallel                                    //\n        //---------------------------------------------------------------------------//\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Line2d(Line2d l1, Line2d l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Line2(IntPtr l1, IntPtr l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_Parallel_Line2(IntPtr l1, IntPtr l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Ray2d(Ray2d r1, Ray2d r2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Ray2(IntPtr l1, IntPtr l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_Parallel_Ray2(IntPtr l1, IntPtr l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Segment2d(Segment2d s1, Segment2d s2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EIK_Parallel_Segment2(IntPtr l1, IntPtr l2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool CGALGlobal_EEK_Parallel_Segment2(IntPtr l1, IntPtr l2);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/CGALKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Geometry;\nusing CGALDotNet.Polylines;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Arrangements;\nusing CGALDotNet.Triangulations;\nusing CGALDotNet.Hulls;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Meshing;\nusing CGALDotNet.Processing;\n\nnamespace CGALDotNet\n{\n    public abstract class CGALKernel\n    {\n\n        internal abstract GeometryKernel2 GeometryKernel2 { get; }\n\n        internal abstract PolylineKernel2 PolylineKernel2 { get; }\n\n        internal abstract PolylineKernel3 PolylineKernel3 { get; }\n\n        internal abstract PolygonKernel2 PolygonKernel2 { get; }\n\n        internal abstract PolygonWithHolesKernel2 PolygonWithHolesKernel2 { get; }\n\n        internal abstract PolygonBooleanKernel2 PolygonBooleanKernel2 { get; }\n\n        internal abstract PolygonPartitionKernel2 PolygonPartitionKernel2 { get; }\n\n        internal abstract PolygonSimplificationKernel2 PolygonSimplificationKernel2 { get; }\n\n        internal abstract PolygonOffsetKernel2 PolygonOffsetKernel2 { get; }\n\n        internal abstract PolygonMinkowskiKernel PolygonMinkowskiKernel { get; }\n\n        internal abstract PolygonVisibilityKernel PolygonVisibilityKernel { get; }\n\n        internal abstract ArrangementKernel2 ArrangementKernel2 { get; }\n\n        internal abstract SweepLineKernel SweepLineKernel { get; }\n\n        internal abstract TriangulationKernel2 TriangulationKernel2 { get; }\n\n        internal abstract TriangulationKernel3 TriangulationKernel3 { get; }\n\n        internal abstract DelaunayTriangulationKernel2 DelaunayTriangulationKernel2 { get; }\n\n        internal abstract DelaunayTriangulationKernel3 DelaunayTriangulationKernel3 { get; }\n\n        internal abstract ConstrainedTriangulationKernel2 ConstrainedTriangulationKernel2 { get; }\n\n        internal abstract ConstrainedDelaunayTriangulationKernel2 ConstrainedDelaunayTriangulationKernel2 { get; }\n\n        internal abstract ConformingTriangulationKernel2 ConformingTriangulationKernel2 { get; }\n\n        internal abstract ConvexHullKernel2 ConvexHullKernel2 { get; }\n\n        internal abstract ConvexHullKernel3 ConvexHullKernel3 { get; }\n\n        internal abstract PolyhedronKernel3 PolyhedronKernel3 { get; }\n\n        internal abstract NefPolyhedronKernel3 NefPolyhedronKernel3 { get; }\n\n        internal abstract SurfaceMeshKernel3 SurfaceMeshKernel3 { get; }\n\n        internal abstract TetrahedralRemeshingKernel TetrahedralRemeshingKernel  { get; }\n\n        internal abstract SurfaceSubdivisionKernel SurfaceSubdivisionKernel { get; }\n\n        internal abstract SurfaceSimplificationKernel SurfaceSimplificationKernel { get; }\n\n        internal abstract SkinSurfaceMeshingKernel SkinSurfaceMeshingKernel { get; }\n\n        internal abstract MeshProcessingMeshingKernel MeshProcessingMeshingKernel { get; }\n\n        internal abstract MeshProcessingRepairKernel MeshProcessingRepairKernel { get; }\n\n        internal abstract MeshProcessingOrientationKernel MeshProcessingOrientationKernel { get; }\n\n        internal abstract MeshProcessingBooleanKernel MeshProcessingBooleanKernel { get; }\n\n        internal abstract MeshProcessingConnectionsKernel MeshProcessingConnectionsKernel { get; }\n\n        internal abstract MeshProcessingSlicerKernel MeshProcessingSlicerKernel { get; }\n\n        internal abstract MeshProcessingFeaturesKernel MeshProcessingFeaturesKernel { get; }\n\n        internal abstract MeshProcessingLocateKernel MeshProcessingLocateKernel { get; }\n\n        internal abstract HeatMethodKernel HeatMethodKernel { get; }\n    }\n\n    public class EIK : CGALKernel\n    {\n        public static readonly EIK Instance = new EIK();\n\n        internal override GeometryKernel2 GeometryKernel2 => GeometryKernel2_EIK.Instance;\n\n        internal override PolylineKernel2 PolylineKernel2 => PolylineKernel2_EIK.Instance;\n\n        internal override PolylineKernel3 PolylineKernel3 => PolylineKernel3_EIK.Instance;\n\n        internal override PolygonKernel2 PolygonKernel2 => PolygonKernel2_EIK.Instance;\n\n        internal override PolygonWithHolesKernel2 PolygonWithHolesKernel2 => PolygonWithHolesKernel2_EIK.Instance;\n\n        internal override PolygonBooleanKernel2 PolygonBooleanKernel2 => PolygonBooleanKernel2_EIK.Instance;\n\n        internal override PolygonPartitionKernel2 PolygonPartitionKernel2 => PolygonPartitionKernel2_EIK.Instance;\n\n        internal override PolygonSimplificationKernel2 PolygonSimplificationKernel2 => PolygonSimplificationKernel2_EIK.Instance;\n\n        internal override PolygonOffsetKernel2 PolygonOffsetKernel2 => PolygonOffsetKernel2_EIK.Instance;\n\n        internal override PolygonMinkowskiKernel PolygonMinkowskiKernel => PolygonMinkowskiKernel_EIK.Instance;\n\n        internal override PolygonVisibilityKernel PolygonVisibilityKernel => PolygonVisibilityKernel_EIK.Instance;\n\n        internal override ArrangementKernel2 ArrangementKernel2 => throw new NotImplementedException();\n\n        internal override SweepLineKernel SweepLineKernel => SweepLineKernel_EIK.Instance;\n\n        internal override TriangulationKernel2 TriangulationKernel2 => TriangulationKernel2_EIK.Instance;\n\n        internal override TriangulationKernel3 TriangulationKernel3 => throw new NotImplementedException();\n\n        internal override DelaunayTriangulationKernel2 DelaunayTriangulationKernel2 => DelaunayTriangulationKernel2_EIK.Instance;\n\n        internal override DelaunayTriangulationKernel3 DelaunayTriangulationKernel3 => throw new NotImplementedException();\n\n        internal override ConstrainedTriangulationKernel2 ConstrainedTriangulationKernel2 => ConstrainedTriangulationKernel2_EIK.Instance;\n\n        internal override ConstrainedDelaunayTriangulationKernel2 ConstrainedDelaunayTriangulationKernel2 => throw new NotImplementedException();\n\n        internal override ConformingTriangulationKernel2 ConformingTriangulationKernel2 => ConformingTriangulationKernel2_EIK.Instance;\n\n        internal override ConvexHullKernel2 ConvexHullKernel2 => ConvexHullKernel2_EIK.Instance;\n\n        internal override ConvexHullKernel3 ConvexHullKernel3 => ConvexHullKernel3_EIK.Instance;\n\n        internal override PolyhedronKernel3 PolyhedronKernel3 => PolyhedronKernel3_EIK.Instance;\n\n        internal override NefPolyhedronKernel3 NefPolyhedronKernel3 => NefPolyhedronKernel3_EIK.Instance;\n\n        internal override SurfaceMeshKernel3 SurfaceMeshKernel3 => SurfaceMeshKernel3_EIK.Instance;\n\n        internal override TetrahedralRemeshingKernel TetrahedralRemeshingKernel => throw new NotImplementedException();\n\n        internal override SurfaceSubdivisionKernel SurfaceSubdivisionKernel => SurfaceSubdivisionKernel_EIK.Instance;\n\n        internal override SurfaceSimplificationKernel SurfaceSimplificationKernel => SurfaceSimplificationKernel_EIK.Instance;\n\n        internal override SkinSurfaceMeshingKernel SkinSurfaceMeshingKernel => throw new NotImplementedException();\n\n        internal override MeshProcessingMeshingKernel MeshProcessingMeshingKernel => MeshProcessingMeshingKernel_EIK.Instance;\n\n        internal override MeshProcessingRepairKernel MeshProcessingRepairKernel => MeshProcessingRepairKernel_EIK.Instance;\n\n        internal override MeshProcessingOrientationKernel MeshProcessingOrientationKernel => MeshProcessingOrientationKernel_EIK.Instance;\n\n        internal override MeshProcessingBooleanKernel MeshProcessingBooleanKernel => MeshProcessingBooleanKernel_EIK.Instance;\n\n        internal override MeshProcessingConnectionsKernel MeshProcessingConnectionsKernel => MeshProcessingConnectionsKernel_EIK.Instance;\n\n        internal override MeshProcessingSlicerKernel MeshProcessingSlicerKernel => MeshProcessingSlicerKernel_EIK.Instance;\n\n        internal override MeshProcessingFeaturesKernel MeshProcessingFeaturesKernel => MeshProcessingFeaturesKernel_EIK.Instance;\n\n        internal override MeshProcessingLocateKernel MeshProcessingLocateKernel => MeshProcessingLocateKernel_EIK.Instance;\n\n        internal override HeatMethodKernel HeatMethodKernel => HeatMethodKernel_EIK.Instance;\n    }\n\n    public class EEK : CGALKernel\n    {\n        public static readonly EEK Instance = new EEK();\n\n        internal override GeometryKernel2 GeometryKernel2 => GeometryKernel2_EEK.Instance;\n\n        internal override PolylineKernel2 PolylineKernel2 => PolylineKernel2_EEK.Instance;\n\n        internal override PolylineKernel3 PolylineKernel3 => PolylineKernel3_EEK.Instance;\n\n        internal override PolygonKernel2 PolygonKernel2 => PolygonKernel2_EEK.Instance;\n\n        internal override PolygonWithHolesKernel2 PolygonWithHolesKernel2 => PolygonWithHolesKernel2_EEK.Instance;\n\n        internal override PolygonBooleanKernel2 PolygonBooleanKernel2 => PolygonBooleanKernel2_EEK.Instance;\n\n        internal override PolygonPartitionKernel2 PolygonPartitionKernel2 => PolygonPartitionKernel2_EEK.Instance;\n\n        internal override PolygonSimplificationKernel2 PolygonSimplificationKernel2 => PolygonSimplificationKernel2_EEK.Instance;\n\n        internal override PolygonOffsetKernel2 PolygonOffsetKernel2 => PolygonOffsetKernel2_EEK.Instance;\n\n        internal override PolygonMinkowskiKernel PolygonMinkowskiKernel => PolygonMinkowskiKernel_EEK.Instance;\n\n        internal override PolygonVisibilityKernel PolygonVisibilityKernel => PolygonVisibilityKernel_EEK.Instance;\n\n        internal override ArrangementKernel2 ArrangementKernel2 => ArrangementKernel2_EEK.Instance;\n\n        internal override SweepLineKernel SweepLineKernel => SweepLineKernel_EEK.Instance;\n\n        internal override TriangulationKernel2 TriangulationKernel2 => TriangulationKernel2_EEK.Instance;\n\n        internal override TriangulationKernel3 TriangulationKernel3 => TriangulationKernel3_EEK.Instance;\n\n        internal override DelaunayTriangulationKernel2 DelaunayTriangulationKernel2 => DelaunayTriangulationKernel2_EEK.Instance;\n\n        internal override DelaunayTriangulationKernel3 DelaunayTriangulationKernel3 => DelaunayTriangulationKernel3_EEK.Instance;\n\n        internal override ConstrainedTriangulationKernel2 ConstrainedTriangulationKernel2 => ConstrainedTriangulationKernel2_EEK.Instance;\n\n        internal override ConstrainedDelaunayTriangulationKernel2 ConstrainedDelaunayTriangulationKernel2 => ConstrainedDelaunayTriangulationKernel2_EEK.Instance;\n\n        internal override ConformingTriangulationKernel2 ConformingTriangulationKernel2 => ConformingTriangulationKernel2_EEK.Instance;\n\n        internal override ConvexHullKernel2 ConvexHullKernel2 => ConvexHullKernel2_EEK.Instance;\n\n        internal override ConvexHullKernel3 ConvexHullKernel3 => ConvexHullKernel3_EEK.Instance;\n\n        internal override PolyhedronKernel3 PolyhedronKernel3 => PolyhedronKernel3_EEK.Instance;\n\n        internal override NefPolyhedronKernel3 NefPolyhedronKernel3 => NefPolyhedronKernel3_EEK.Instance;\n\n        internal override SurfaceMeshKernel3 SurfaceMeshKernel3 => SurfaceMeshKernel3_EEK.Instance;\n\n        internal override TetrahedralRemeshingKernel TetrahedralRemeshingKernel => TetrahedralRemeshingKernel_EEK.Instance;\n\n        internal override SurfaceSubdivisionKernel SurfaceSubdivisionKernel => SurfaceSubdivisionKernel_EEK.Instance;\n\n        internal override SurfaceSimplificationKernel SurfaceSimplificationKernel => throw new NotSupportedException();\n\n        internal override SkinSurfaceMeshingKernel SkinSurfaceMeshingKernel => SkinSurfaceMeshingKernel_EEK.Instance;\n\n        internal override MeshProcessingMeshingKernel MeshProcessingMeshingKernel => MeshProcessingMeshingKernel_EEK.Instance;\n\n        internal override MeshProcessingRepairKernel MeshProcessingRepairKernel => MeshProcessingRepairKernel_EEK.Instance;\n\n        internal override MeshProcessingOrientationKernel MeshProcessingOrientationKernel => MeshProcessingOrientationKernel_EEK.Instance;\n\n        internal override MeshProcessingBooleanKernel MeshProcessingBooleanKernel => MeshProcessingBooleanKernel_EEK.Instance;\n\n        internal override MeshProcessingConnectionsKernel MeshProcessingConnectionsKernel => MeshProcessingConnectionsKernel_EEK.Instance;\n\n        internal override MeshProcessingSlicerKernel MeshProcessingSlicerKernel => MeshProcessingSlicerKernel_EEK.Instance;\n\n        internal override MeshProcessingFeaturesKernel MeshProcessingFeaturesKernel => MeshProcessingFeaturesKernel_EEK.Instance;\n\n        internal override MeshProcessingLocateKernel MeshProcessingLocateKernel => MeshProcessingLocateKernel_EEK.Instance;\n\n        internal override HeatMethodKernel HeatMethodKernel => HeatMethodKernel_EEK.Instance;\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNet/CGALObject.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet\n{\n    /// <summary>\n    /// Base class for objects that referrence a CGAL object.\n    /// </summary>\n    public abstract class CGALObject : IDisposable\n    {\n        protected const string DLL_NAME = \"CGALWrapper.dll\";\n\n        protected const CallingConvention CDECL = CallingConvention.Cdecl;\n\n        /// <summary>\n        /// The pointer to the unmanged CGAL object.\n        /// </summary>\n        private IntPtr m_ptr;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        internal CGALObject()\n        {\n            m_ptr = IntPtr.Zero;\n        }\n\n        /// <summary>\n        /// Constructor taking a referrence to a CGAL object.\n        /// </summary>\n        /// <param name=\"ptr\">A pointer to a CGAL object.</param>\n        internal CGALObject(IntPtr ptr)\n        {\n            m_ptr = ptr;\n        }\n\n        /// <summary>\n        /// The destuctor.\n        /// </summary>\n        ~CGALObject()\n        {\n            Release();\n        }\n\n        /// <summary>\n        /// Has the object been disposed.\n        /// </summary>\n        public bool IsDisposed { get; private set; }\n\n        /// <summary>\n        /// Get the ptr to the CGAL object.\n        /// </summary>\n        internal IntPtr Ptr \n        { \n            get\n            {\n                CheckPtr();\n                return m_ptr;\n            }\n            private protected set\n            {\n                m_ptr = value;\n            }\n        }\n\n        /// <summary>\n        /// Dispose the CGAL object.\n        /// </summary>\n        public void Dispose()\n        {\n            Release();\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Print some information about the object.\n        /// </summary>\n        /// <returns>Print some information about the object.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"[CGALObject: Ptr={0}, IsDiposed={1}]\", Ptr.ToInt64(), IsDisposed);\n        }\n\n        /// <summary>\n        /// Print the object into the console.\n        /// </summary>\n        public void Print()\n        {\n            var buider = new StringBuilder();\n            Print(buider);\n            Console.WriteLine(buider.ToString());\n        }\n\n        /// <summary>\n        /// Print the object into a string builder.\n        /// </summary>\n        /// <param name=\"builder\">The builder to print into.</param>\n        public virtual void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n        }\n\n        /// <summary>\n        /// Release the CGAL object.\n        /// </summary>\n        private void Release()\n        {\n            if (!IsDisposed)\n            {\n                if(m_ptr != IntPtr.Zero)\n                    ReleasePtr();\n\n                m_ptr = IntPtr.Zero;\n                IsDisposed = true;\n            }\n        }\n\n        /// <summary>\n        /// Swap the unmanaged pointer with another.\n        /// The old ptr will be released first.\n        /// </summary>\n        /// <param name=\"ptr\">The new ptr. The old ptr will be released first.</param>\n        internal void Swap(IntPtr ptr)\n        {\n            if(IsDisposed)\n                throw new CGALUnmanagedResourcesReleasedExeception(\"Can not swap when object has beed disposed.\");\n\n            if (m_ptr != IntPtr.Zero)\n                ReleasePtr(Ptr);\n\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// Allow derived class to release the unmanaged memory.\n        /// </summary>\n        protected abstract void ReleasePtr();\n\n        /// <summary>\n        /// Allow derived class to release the unmanaged memory.\n        /// </summary>\n        protected virtual void ReleasePtr(IntPtr ptr)\n        {\n            throw new CGALUnmanagedResourcesNotReleasedExeception(\"ReleasePtr not implemented.\");\n        }\n\n        /// <summary>\n        /// Check if the object is still valid.\n        /// </summary>\n        protected void CheckPtr()\n        {\n            if(IsDisposed)\n                throw new CGALUnmanagedResourcesReleasedExeception(\"Unmanaged resources have been released.\");\n\n            if (m_ptr == IntPtr.Zero)\n                throw new CGALUnmanagedResourcesReleasedExeception(\"Unmanaged resources have not been created.\");\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/CGALObjectKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet\n{\n    internal abstract class CGALObjectKernel\n    {\n        protected const string DLL_NAME = \"CGALWrapper.dll\";\n\n        protected const CallingConvention CDECL = CallingConvention.Cdecl;\n\n        internal abstract string Name { get; }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Collections/NativeList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\nusing System.Collections;\n\nnamespace CGALDotNet.Collections\n{\n\t/// <summary>\n\t/// \n\t/// </summary>\n\t/// <typeparam name=\"T\"></typeparam>\n\tpublic sealed class NativeList<T> : NativeList, IList<T>, IEnumerable<T> where T : CGALObject, new()\n    {\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tprivate List<T> m_list;\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n        public NativeList() : base()\n\t\t{\n\t\t\tm_list = new List<T>();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"count\"></param>\n\t\tpublic NativeList(int count) : base(count)\n\t\t{\n\t\t\tm_list = new List<T>(count);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"ptr\"></param>\n\t\tinternal NativeList(IntPtr ptr) : base(ptr)\n\t\t{\n\t\t\tfor(int i = 0; i < Count; i++)\n            {\n\t\t\t\tvar p = NativeList_Get(Ptr, i);\n\t\t\t\tvar item = new T();\n\t\t\t\titem.Swap(p);\n\t\t\t\tm_list.Add(item);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic bool IsSync => Count == m_list.Count;\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n        public override string ToString()\n        {\n            return String.Format(\"[NativeList: Count={0}, Capacity={1}, IsSync={2}]\", Count, Capacity, IsSync);\n        }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator<T> GetEnumerator()\n\t\t{\n\t\t\tfor (int i = 0; i < Count; i++)\n\t\t\t\tyield return m_list[i];\n\t\t}\n\n\t\tIEnumerator IEnumerable.GetEnumerator()\n\t\t{\n\t\t\treturn GetEnumerator();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"i\"></param>\n\t\t/// <returns></returns>\n\t\tpublic T this[int i]\n\t\t{\n\t\t\tget => Get(i);\n\t\t\tset => Set(i, value);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tm_list.Clear();\n\t\t\tNativeList_Clear(Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"item\"></param>\n\t\tpublic void Add(T item)\n\t\t{\n\t\t\tm_list.Add(item);\n\t\t\tNativeList_Add(Ptr, item.Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"items\"></param>\n\t\tpublic void AddRange(IEnumerable<T> items)\n\t\t{\n\t\t\tforeach(var item in items)\n\t\t\t\tAdd(item);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic NativeList<T> Copy()\n        {\n\t\t\tvar ptr = NativeList_Copy(Ptr);\n\t\t\treturn new NativeList<T>(ptr);\n        }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"array\"></param>\n\t\t/// <param name=\"startIndex\"></param>\n\t\tpublic void CopyTo(T[] array, int startIndex)\n\t\t{\n\t\t\tfor (int i = startIndex; i < Count; i++)\n\t\t\t\tarray[i] = Get(i);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"item\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool Contains(T item)\n\t\t{\n\t\t\treturn m_list.Contains(item);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"item\"></param>\n\t\t/// <returns></returns>\n\t\tpublic int IndexOf(T item)\n\t\t{\n\t\t\treturn m_list.IndexOf(item);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"index\"></param>\n\t\t/// <param name=\"item\"></param>\n\t\tpublic void Insert(int index, T item)\n\t\t{\n\t\t\tm_list.Insert(index, item);\n\t\t\tNativeList_Insert(Ptr, item.Ptr, index);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"item\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool Remove(T item)\n\t\t{\n\t\t\tvar b1 = m_list.Remove(item);\n\t\t\tvar b2 = NativeList_Remove(Ptr, item.Ptr);\n\n\t\t\treturn b1 && b2;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"index\"></param>\n\t\tpublic void RemoveAt(int index)\n\t\t{\n\t\t\tm_list.RemoveAt(index);\n\t\t\tNativeList_RemoveAt(Ptr, index);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic void Reverse()\n\t\t{\n\t\t\tm_list.Reverse();\n\t\t\tNativeList_Reverse(Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic void TrimExcess()\n\t\t{\n\t\t\tm_list.TrimExcess();\n\t\t\tNativeList_TrimExcess(Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"index\"></param>\n\t\t/// <returns></returns>\n\t\tprivate T Get(int index)\n\t\t{\n\t\t\treturn m_list[index];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"index\"></param>\n\t\t/// <param name=\"item\"></param>\n\t\tprivate void Set(int index, T item)\n\t\t{\n\t\t\tm_list[index] = item;\n\t\t\tNativeList_Set(Ptr, index, item.Ptr);\n\t\t}\n    }\n\n\t/// <summary>\n\t/// \n\t/// </summary>\n\tpublic abstract class NativeList : CGALObject\n\t{\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic NativeList()\n\t\t{\n\t\t\tPtr = NativeList_Create();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"count\"></param>\n\t\tpublic NativeList(int count)\n\t\t{\n\t\t\tPtr = NativeList_CreateWithCount(count);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"ptr\"></param>\n\t\tinternal NativeList(IntPtr ptr)\n\t\t{\n\t\t\tPtr = ptr;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic int Capacity => NativeList_Capacity(Ptr);\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic int Count => NativeList_Count(Ptr);\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic bool IsReadOnly => false;\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tprotected override void ReleasePtr()\n\t\t{\n\t\t\tNativeList_Release(Ptr);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern IntPtr NativeList_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern IntPtr NativeList_CreateWithCount(int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Release(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Add(IntPtr listPtr, IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_AddRange(IntPtr listPtr, IntPtr[] ptr_array, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern int NativeList_Capacity(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Clear(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern int NativeList_Count(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern bool NativeList_Contains(IntPtr listPtr, IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern IntPtr NativeList_Copy(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern IntPtr NativeList_Get(IntPtr listPtr, int index);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Set(IntPtr listPtr, int index, IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern int NativeList_IndexOf(IntPtr listPtr, IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Insert(IntPtr listPtr, IntPtr ptr, int index);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern bool NativeList_Remove(IntPtr listPtr, IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_RemoveAt(IntPtr listPtr, int index);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_Reverse(IntPtr listPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprotected static extern void NativeList_TrimExcess(IntPtr listPtr);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Eigen/EigenColumnVector.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Eigen\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public class EigenColumnVector : EigenVector\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"dimension\"></param>\n        public EigenColumnVector(int dimension)\n        {\n            Ptr = EigenColumnVector_CreateVector(dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        public EigenColumnVector(double x, double y)\n        {\n            Ptr = EigenColumnVector_CreateVector(2);\n            this[0] = x;\n            this[1] = y;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"z\"></param>\n        public EigenColumnVector(double x, double y, double z)\n        {\n            Ptr = EigenColumnVector_CreateVector(3);\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"z\"></param>\n        /// <param name=\"w\"></param>\n        public EigenColumnVector(double x, double y, double z, double w)\n        {\n            Ptr = EigenColumnVector_CreateVector(4);\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n            this[3] = w;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"list\"></param>\n        public EigenColumnVector(IList<double> list)\n        {\n            Ptr = EigenColumnVector_CreateVector(list.Count);\n            for (int i = 0; i < list.Count; i++)\n                this[i] = list[i];\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal EigenColumnVector(IntPtr ptr) : base(ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public override double this[int i]\n        {\n            get { return EigenColumnVector_Get(Ptr, i); }\n            set { EigenColumnVector_Set(Ptr, i, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override int Dimension => EigenColumnVector_Dimension(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override double Magnitude => EigenColumnVector_Norm(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return String.Format(\"[EigenColumnVector: Dimension={0}]\", Dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenColumnVector Normalized => new EigenColumnVector(EigenColumnVector_Normalized(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenRowVector Transpose => new EigenRowVector(EigenColumnVector_Transpose(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenColumnVector Adjoint => new EigenColumnVector(EigenColumnVector_Adjoint(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenColumnVector Conjugate => new EigenColumnVector(EigenColumnVector_Conjugate(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static double Dot(EigenColumnVector v1, EigenColumnVector v2)\n        {\n            AreSameSize(v1, v2);\n            return EigenColumnVector_Dot(v1.Ptr, v2.Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void Normalize()\n        {\n            EigenColumnVector_Normalize(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"dimension\"></param>\n        public override void Resize(int dimension)\n        {\n            EigenColumnVector_Resize(Ptr, dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"dimension\"></param>\n        /// <param name=\"min\"></param>\n        /// <param name=\"max\"></param>\n        /// <param name=\"seed\"></param>\n        /// <returns></returns>\n        public static EigenColumnVector Random(int dimension, double min, double max, int seed)\n        {\n            var ptr = EigenColumnVector_CreateVector(dimension);\n            var v = new EigenColumnVector(ptr);\n            var rnd = new Random(seed);\n            double range = max - min;\n\n            for (int i = 0; i < v.Dimension; i++)\n                v[i] = min + rnd.NextDouble() * range;\n\n            return v;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            EigenColumnVector_Release(Ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenColumnVector_CreateVector(int dimension);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenColumnVector_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int EigenColumnVector_Rows(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int EigenColumnVector_Dimension(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenColumnVector_Get(IntPtr ptr, int x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenColumnVector_Set(IntPtr ptr, int x, double value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenColumnVector_Dot(IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenColumnVector_Normalized(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenColumnVector_Normalize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenColumnVector_Norm(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenColumnVector_Transpose(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenColumnVector_Adjoint(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenColumnVector_Conjugate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenColumnVector_Resize(IntPtr ptr, int dimension);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Eigen/EigenMatrix.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Eigen\n{\n\t/// <summary>\n\t/// enum for egien solvers.\n\t/// </summary>\n\tpublic enum EIGEN_SOLVER\n    {\n\t\tCOL_PIV_HOUSEHOLDER_QR,\n\t\tPARTIAL_PIV_LU,\n\t\tFULL_PIV_LU,\n\t\tHOUSEHOLDER_QR,\n\t\tLLT,\n\t\tLDLT,\n\t\tBDCSVD,\n\t\tJACOBI_SVD,\n\t\tFULL_PIV_HOUSEHOLDER_QR,\n\t\tCOMPLETE_ORTH_DECOM\n\t}\n\n\tpublic enum EIGEN_SOLVER_OPTIONS\n\t{\n\t\tCOMPUTE_FULL_U = 4, //Used to indicate that the square matrix U is to be computed.\n\t\tCOMPUTE_THIN_U = 8, //Used to indicate that the thin matrix U is to be computed.\n\t\tCOMPUTE_FULL_V = 16, //Used to indicate that the square matrix V is to be computed.\n\t\tCOMPUTE_THIN_V = 32, //Used to indicate that the thin matrix V is to be computed.\n\t}\n\n\tpublic class EigenMatrix : CGALObject\n\t{\n\t\t/// <summary>\n\t\t/// Create a new matrix filled with zeros.\n\t\t/// </summary>\n\t\t/// <param name=\"rows\">The number of rows.</param>\n\t\t/// <param name=\"columns\">The number of columns.</param>\n\t\tpublic EigenMatrix(int rows, int columns)\n\t\t{\n\t\t\tif (rows <= 0)\n\t\t\t\tthrow new ArgumentException(\"Row vectors count can not be <= zero.\");\n\n\t\t\tif (columns <= 0)\n\t\t\t\tthrow new ArgumentException(\"Column vectors count can not be <= zero.\");\n\n\t\t\tPtr = EigenMatrix_Create(rows, columns);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a new matrix fill with the array contents.\n\t\t/// </summary>\n\t\t/// <param name=\"array\">The array.</param>\n\t\tpublic EigenMatrix(double[,] array)\n\t\t{\n\t\t\tint rowsCount = array.GetLength(0);\n\t\t\tint columnsCount = array.GetLength(1);\n\n\t\t\tif (rowsCount == 0)\n\t\t\t\tthrow new ArgumentException(\"Row vectors count can not be zero.\");\n\n\t\t\tif (columnsCount == 0)\n\t\t\t\tthrow new ArgumentException(\"Column vectors count can not be zero.\");\n\n\t\t\tPtr = EigenMatrix_Create(rowsCount, columnsCount);\n\n\t\t\tfor (int i = 0; i < rowsCount; i++)\n\t\t\t{\n\t\t\t\tfor (int j = 0; j < columnsCount; j++)\n\t\t\t\t{\n\t\t\t\t\tthis[i, j] = array[i, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a new matrix filled with the contents of the column vectors.\n\t\t/// All column vectors must have the same dimension.\n\t\t/// </summary>\n\t\t/// <param name=\"columns\"></param>\n\t\tpublic EigenMatrix(IList<EigenColumnVector> columns)\n\t\t{\n\t\t\tif (columns.Count == 0)\n\t\t\t\tthrow new ArgumentException(\"Column vectors count can not be zero.\");\n\n\t\t\tint rowsCount = columns.Count;\n\t\t\tint columnsCount = columns[0].Dimension;\n\t\t\tPtr = EigenMatrix_Create(rowsCount, columnsCount);\n\n\t\t\tfor (int i = 0; i < rowsCount; i++)\n\t\t\t{\n\t\t\t\tif (columns[i].Dimension != columnsCount)\n\t\t\t\t\tthrow new ArgumentException(\"Column vector is not the same size as fisrt column vector.\");\n\n\t\t\t\tfor (int j = 0; j < columnsCount; j++)\n\t\t\t\t{\n\t\t\t\t\tthis[i, j] = columns[i][j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a 2 x 2 matrix.\n\t\t/// </summary>\n\t\tpublic EigenMatrix(double m00, double m01,\n\t\t\t\t\t\tdouble m10, double m11)\n\t\t{\n\t\t\tPtr = EigenMatrix_Create(2, 2);\n\n\t\t\tthis[0, 0] = m00; this[0, 1] = m01;\n\t\t\tthis[1, 0] = m10; this[1, 1] = m11;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a 3 x 3 matrix.\n\t\t/// </summary>\n\t\tpublic EigenMatrix(double m00, double m01, double m02,\n\t\t\t\t\t\t\tdouble m10, double m11, double m12,\n\t\t\t\t\t\t\tdouble m20, double m21, double m22)\n\t\t{\n\t\t\tPtr = EigenMatrix_Create(3, 3);\n\n\t\t\tthis[0, 0] = m00; this[0, 1] = m01; this[0, 2] = m02;\n\t\t\tthis[1, 0] = m10; this[1, 1] = m11; this[1, 2] = m12;\n\t\t\tthis[2, 0] = m20; this[2, 1] = m21; this[2, 2] = m22;\n;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a 4 x 4 matrix.\n\t\t/// </summary>\n\t\tpublic EigenMatrix(\tdouble m00, double m01, double m02, double m03,\n\t\t\t\t\t\t\tdouble m10, double m11, double m12, double m13,\n\t\t\t\t\t\t\tdouble m20, double m21, double m22, double m23,\n\t\t\t\t\t\t\tdouble m30, double m31, double m32, double m33)\n\t\t{\n\t\t\tPtr = EigenMatrix_Create(4, 4);\n\n\t\t\tthis[0,0] = m00; this[0,1] = m01; this[0,2] = m02; this[0,3] = m03;\n\t\t\tthis[1,0] = m10; this[1,1] = m11; this[1,2] = m12; this[1,3] = m13;\n\t\t\tthis[2,0] = m20; this[2,1] = m21; this[2,2] = m22; this[2,3] = m23;\n\t\t\tthis[3,0] = m30; this[3,1] = m31; this[3,2] = m32; this[3,3] = m33;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a new matrix from a pointer.\n\t\t/// </summary>\n\t\t/// <param name=\"ptr\"></param>\n\t\tinternal EigenMatrix(IntPtr ptr) : base(ptr)\n\t\t{\n\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a identity matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"size\">The number of rows and columns of the matrix. Must be square.</param>\n\t\t/// <returns>The identity matrix.</returns>\n\t\tpublic static EigenMatrix Identity(int size)\n\t\t{\n\t\t\tif (size <= 0)\n\t\t\t\tthrow new ArgumentException(\"Size can not be <= zero.\");\n\n\t\t\tvar ptr = EigenMatrix_CreateIdentity(size, size);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a matrix filled with the numbers 1, 2. 3, etc to end.\n\t\t/// Used for debugging.\n\t\t/// </summary>\n\t\t/// <param name=\"rows\">The number of rows.</param>\n\t\t/// <param name=\"columns\">The number columns.</param>\n\t\t/// <returns>The Matrix.</returns>\n\t\t/// <exception cref=\"ArgumentException\"></exception>\n\t\tinternal static EigenMatrix Series(int rows, int columns)\n\t\t{\n\t\t\tif (rows <= 0)\n\t\t\t\tthrow new ArgumentException(\"Rows can not be <= zero.\");\n\n\t\t\tif (columns <= 0)\n\t\t\t\tthrow new ArgumentException(\"Colums can not be <= zero.\");\n\n\t\t\tvar m = new EigenMatrix(rows, columns);\n\n\t\t\tint i = 0;\n\t\t\tfor (int x = 0; x < m.Rows; x++)\n\t\t\t{\n\t\t\t\tfor (int y = 0; y < m.Columns; y++)\n\t\t\t\t{\n\t\t\t\t\tm[x, y] = i++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a new matrix fill with random numbers.\n\t\t/// </summary>\n\t\t/// <param name=\"rows\">The number of rows.</param>\n\t\t/// <param name=\"columns\">The number columns.</param>\n\t\t/// <param name=\"min\">The minimum random number generated.</param>\n\t\t/// <param name=\"max\">The maximum random number generated.</param>\n\t\t/// <param name=\"seed\">The random generators seed.</param>\n\t\t/// <returns>The matrix.</returns>\n\t\tpublic static EigenMatrix Random(int rows, int columns, double min, double max, int seed)\n\t\t{\n\t\t\tvar m = new EigenMatrix(rows, columns);\n\t\t\tvar rnd = new Random(seed);\n\t\t\tdouble range = max - min;\n\n\t\t\tfor (int i = 0; i < m.Length; i++)\n\t\t\t\tm[i] = min + rnd.NextDouble() * range;\n\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The number of rows in the matrix.\n\t\t/// </summary>\n\t\tpublic int Rows => EigenMatrix_Rows(Ptr);\n\n\t\t/// <summary>\n\t\t/// The number of columns in the matrix.\n\t\t/// </summary>\n\t\tpublic int Columns => EigenMatrix_Columns(Ptr);\n\n\t\t/// <summary>\n\t\t/// The total size of the matrix which is \n\t\t/// the rows times the number of columns.\n\t\t/// </summary>\n\t\tpublic int Length => Rows * Columns;\n\n\t\t/// <summary>\n\t\t/// The single dimension array accessor.\n\t\t/// </summary>\n\t\t/// <param name=\"i\">The array index.</param>\n\t\t/// <returns>The value at the index i.</returns>\n\t\tpublic double this[int i]\n\t\t{\n\t\t\tget { return EigenMatrix_GetX(Ptr, i); }\n\t\t\tset { EigenMatrix_SetX(Ptr, i, value); }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The double dimension array accessor.\n\t\t/// </summary>\n\t\t/// <param name=\"i\">The row index.</param>\n\t\t/// <param name=\"j\">The column index.</param>\n\t\t/// <returns>The value at the index i,j.</returns>\n\t\tpublic double this[int i, int j]\n\t\t{\n\t\t\tget { return EigenMatrix_GetXY(Ptr, i, j); }\n\t\t\tset { EigenMatrix_SetXY(Ptr, i, j, value); }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The matrix string info.\n\t\t/// </summary>\n\t\t/// <returns>The matrix string info.</returns>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn String.Format(\"[EigenMatrix: Rows={0}, Columns={1}]\", Rows, Columns);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The matrix transposed.\n\t\t/// Flips a matrix over its diagonal that is, \n\t\t/// it switches the row and column indices of the matrix.\n\t\t/// </summary>\n\t\tpublic EigenMatrix Transpose\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar ptr = EigenMatrix_Transpose(Ptr);\n\t\t\t\treturn new EigenMatrix(ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The matrices conjugate.\n\t\t/// The matrix obtained by replacing each element a(ij) with its complex conjugate, A^=(a^(ij)).\n\t\t/// </summary>\n\t\tpublic EigenMatrix Conjugate\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar ptr = EigenMatrix_Conjugate(Ptr);\n\t\t\t\treturn new EigenMatrix(ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The matrices adjoint.\n\t\t/// The transpose of its cofactor matrix.\n\t\t/// </summary>\n\t\tpublic EigenMatrix Adjoint\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar ptr = EigenMatrix_Adjoint(Ptr);\n\t\t\t\treturn new EigenMatrix(ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Is the matrix invertible.\n\t\t/// </summary>\n\t\tpublic bool IsInvertible\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(IsSquare) return false;\n\t\t\t\treturn EigenMatrix_IsInvertible(Ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The inverse of a square matrix A, \n\t\t/// sometimes called a reciprocal matrix, \n\t\t/// is a matrix A^(-1) such that AA^(-1)=I.\n\t\t/// DOes not check if the matrix is invertible.\n\t\t/// </summary>\n\t\tpublic EigenMatrix Inverse\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tCheckIfSqaure(this);\n\t\t\t\tvar ptr = EigenMatrix_Inverse(Ptr);\n\t\t\t\treturn new EigenMatrix(ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The determinant is a scalar value that is a \n\t\t/// function of the entries of a square matrix.\n\t\t/// </summary>\n\t\tpublic double Determinant\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tCheckIfSqaure(this);\n\t\t\t\treturn EigenMatrix_Determinant(Ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The trace of a square matrix is defined to be the \n\t\t/// sum of elements on the main diagonal from the upper left to the lower right.\n\t\t/// </summary>\n\t\tpublic double Trace\n        {\n\t\t\tget\n\t\t\t{\n\t\t\t\tCheckIfSqaure(this);\n\t\t\t\treturn EigenMatrix_Trace(Ptr);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// A square matrix has the same number of rows and columns.\n\t\t/// </summary>\n\t\tpublic bool IsSquare => Rows == Columns;\n\n\t\t/// <summary>\n\t\t/// A diagonal matrix is a matrix in which the entries \n\t\t/// outside the main diagonal are all zero.\n\t\t/// </summary>\n\t\tpublic bool IsDiagonal => EigenMatrix_IsDiagonal(Ptr);\n\n\t\t/// <summary>\n\t\t/// A square matrix is called upper triangular \n\t\t/// if all the entries below the main diagonal are zero.\n\t\t/// </summary>\n\t\tpublic bool IsUpperTriangular => EigenMatrix_IsUpperTriangular(Ptr);\n\n\t\t/// <summary>\n\t\t/// A square matrix is called lower triangular \n\t\t/// if all the entries above the main diagonal are zero.\n\t\t/// </summary>\n\t\tpublic bool IsLowerTriangular => EigenMatrix_IsLowerTriangular(Ptr);\n\n\t\t/// <summary>\n\t\t/// Multiple each component in matrix by the scalar.\n\t\t/// </summary>\n\t\t/// <param name=\"m\">The matrix.</param>\n\t\t/// <param name=\"s\">The scalar.</param>\n\t\t/// <returns>The matrix with each component multiplied by the scalar.</returns>\n\t\tpublic static EigenMatrix operator *(EigenMatrix m, double s)\n\t\t{\n\t\t\treturn new EigenMatrix(EigenMatrix_MulScalar(m.Ptr, s));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Divide each component in matrix by the scalar.\n\t\t/// </summary>\n\t\t/// <param name=\"m\">The matrix.</param>\n\t\t/// <param name=\"s\">The scalar.</param>\n\t\t/// <returns>The matrix with each component divided by the scalar.</returns>\n\t\tpublic static EigenMatrix operator /(EigenMatrix m, double s)\n\t\t{\n\t\t\treturn new EigenMatrix(EigenMatrix_DivideScalar(m.Ptr, s));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Multiple the two matrices.\n\t\t/// The first matrices number of columns must \n\t\t/// the same as the second matrices number of rows.\n\t\t/// </summary>\n\t\t/// <param name=\"m1\">The first matrix.</param>\n\t\t/// <param name=\"m2\">The second matrix.</param>\n\t\t/// <returns>The product matrix.</returns>\n\t\tpublic static EigenMatrix operator *(EigenMatrix m1, EigenMatrix m2)\n\t\t{\n\t\t\tIsValidProduct(m1, m2);\n\t\t\treturn new EigenMatrix(EigenMatrix_MulMatrix(m1.Ptr, m2.Ptr));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Add two matrices.\n\t\t/// The matrices must be the same size.\n\t\t/// </summary>\n\t\t/// <param name=\"m1\">The first matrix.</param>\n\t\t/// <param name=\"m2\">The second matrix.</param>\n\t\t/// <returns>A matrix where each compoent is the sum of the other two matrices.</returns>\n\t\tpublic static EigenMatrix operator +(EigenMatrix m1, EigenMatrix m2)\n\t\t{\n\t\t\tAreSameSize(m1, m2);\n\t\t\treturn new EigenMatrix(EigenMatrix_AddMatrix(m1.Ptr, m2.Ptr));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Subtract two matrices.\n\t\t/// The matrices must be the same size.\n\t\t/// </summary>\n\t\t/// <param name=\"m1\">The first matrix.</param>\n\t\t/// <param name=\"m2\">The second matrix.</param>\n\t\t/// <returns>A matrix where each compoent is the difference of the other two matrices.</returns>\n\t\tpublic static EigenMatrix operator -(EigenMatrix m1, EigenMatrix m2)\n\t\t{\n\t\t\tAreSameSize(m1, m2);\n\t\t\treturn new EigenMatrix(EigenMatrix_SubMatrix(m1.Ptr, m2.Ptr));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Multiple a matrix and a column vector.\n\t\t/// </summary>\n\t\t/// <param name=\"m\">The matrix.</param>\n\t\t/// <param name=\"v\">The column vector.</param>\n\t\t/// <returns>The product column vector.</returns>\n\t\tpublic static EigenColumnVector operator *(EigenMatrix m, EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(m, v);\n\t\t\treturn new EigenColumnVector(EigenMatrix_MulColumnVector(m.Ptr, v.Ptr));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Is this matrix the identity matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"eps\">The threshold the values in the \n\t\t/// matrix can be to the expected value.</param>\n\t\t/// <returns>Is this matrix the identity matrix.</returns>\n\t\tpublic bool IsIdentity(double eps = MathUtil.DEG_TO_RAD_64)\n\t\t{\n\t\t\tif (!IsSquare) return false;\n\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (x == y)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!MathUtil.IsOne(this[x, y], eps))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!MathUtil.IsZero(this[x, y], eps))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Is this matrix filled with zeros.\n\t\t/// </summary>\n\t\t/// <param name=\"eps\">The threshold the values in the \n\t\t/// matrix can be to the expected value.</param>\n\t\t/// <returns>Is this matrix filled with zeros.</returns>\n\t\tpublic bool IsZero(double eps = MathUtil.DEG_TO_RAD_64)\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (!MathUtil.IsZero(this[x, y], eps))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are all the values in this matrix positive.\n\t\t/// </summary>\n\t\t/// <returns>Are all the values in this matrix positive.</returns>\n\t\tpublic bool IsPositive()\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (this[x, y] < 0)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Does the matrix have a component that is nan.\n\t\t/// </summary>\n\t\t/// <returns>Does the matrix have a component that is nan.</returns>\n\t\tpublic bool HasNAN()\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (double.IsNaN(this[x, y]))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Replaces all nan values in the matrix with 0.\n\t\t/// </summary>\n\t\tpublic void NoNAN()\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (double.IsNaN(this[x, y]))\n\t\t\t\t\t\tthis[x, y] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are all the values in the matrix finite (non-infinite and non-nan).\n\t\t/// </summary>\n\t\t/// <returns>Are all the values in the matrix finite (non-infinite and non-nan).</returns>\n\t\tpublic bool IsFinite()\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (!MathUtil.IsFinite(this[x, y]))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Replaces all infinite and nan values in matrix with 0.\n\t\t/// </summary>\n\t\tpublic void MakeFinite()\n\t\t{\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (!MathUtil.IsFinite(this[x, y]))\n\t\t\t\t\t\tthis[x, y] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are all the values in the matrix the same.\n\t\t/// </summary>\n\t\t/// <param name=\"eps\">The threshold the values in the \n\t\t/// matrix can be to the expected value.</param>\n\t\t/// <returns>Are all the values in the matrix the same.</returns>\n\t\tpublic bool IsConst(double eps = MathUtil.EPS_64)\n\t\t{\n\t\t\tvar value = this[0];\n\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t{\n\t\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t\t{\n\t\t\t\t\tif (!MathUtil.AlmostEqual(this[x, y], value, eps))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a sub matrix from this matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"startRow\">The row to start at.</param>\n\t\t/// <param name=\"startCol\">THe column to start at.</param>\n\t\t/// <param name=\"rows\">The number of rows.</param>\n\t\t/// <param name=\"cols\">The number of columns.</param>\n\t\t/// <returns>A sub matrix from this matrix.</returns>\n\t\tpublic EigenMatrix SubMatrix(int startRow, int startCol, int rows, int cols)\n\t\t{\n\t\t\tvar ptr = EigenMatrix_Block(Ptr, startRow, startCol, rows, cols);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a sub matrix from this matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"rows\">The number of rows.</param>\n\t\t/// <param name=\"cols\">The number of columns.</param>\n\t\t/// <returns>A sub matrix from this matrix.</returns>\n\t\tpublic EigenMatrix SubMatrix(int rows, int cols)\n\t\t{\n\t\t\tvar ptr = EigenMatrix_Reshaped(Ptr, rows, cols);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Solve the linear system.\n\t\t/// </summary>\n\t\t/// <param name=\"v\">The vector to solve.</param>\n\t\t/// <param name=\"solver\">The solver type.</param>\n\t\t/// <returns>The solution vector.</returns>\n\t\tpublic EigenColumnVector Solve(EigenColumnVector v, EIGEN_SOLVER solver = EIGEN_SOLVER.COL_PIV_HOUSEHOLDER_QR)\n\t\t{\n            switch (solver)\n            {\n                case EIGEN_SOLVER.COL_PIV_HOUSEHOLDER_QR:\n\t\t\t\t\treturn ColPivHouseholderQr(v);\n                case EIGEN_SOLVER.PARTIAL_PIV_LU:\n\t\t\t\t\treturn PartialPivLu(v);\n                case EIGEN_SOLVER.FULL_PIV_LU:\n\t\t\t\t\treturn FullPivLu(v);\t\n                case EIGEN_SOLVER.HOUSEHOLDER_QR:\n\t\t\t\t\treturn HouseholderQr(v);\t\n                case EIGEN_SOLVER.LLT:\n\t\t\t\t\treturn LLT(v);\n                case EIGEN_SOLVER.LDLT:\n\t\t\t\t\treturn LDLT(v);\n                case EIGEN_SOLVER.BDCSVD:\n\t\t\t\t\treturn BdcSvd(v);\n                case EIGEN_SOLVER.JACOBI_SVD:\n                    return JacobiSvd(v);\n\t\t\t\tcase EIGEN_SOLVER.FULL_PIV_HOUSEHOLDER_QR:\n\t\t\t\t\treturn FullPivHouseholderQR(v);\n\t\t\t\tcase EIGEN_SOLVER.COMPLETE_ORTH_DECOM:\n\t\t\t\t\treturn CompleteOrthogonalDecomposition(v);\n\t\t\t\tdefault:\n\t\t\t\t\treturn ColPivHouseholderQr(v);\n            }\n        }\n\n\t\t/// <summary>\n\t\t/// Solve the linear system.\n\t\t/// </summary>\n\t\t/// <param name=\"v\">The vector to solve.</param>\n\t\t/// <param name=\"solver\">The solver type.</param>\n\t\t/// <returns>The solution vector.</returns>\n\t\tpublic EigenMatrix Solve(EigenMatrix v, EIGEN_SOLVER solver = EIGEN_SOLVER.COL_PIV_HOUSEHOLDER_QR)\n\t\t{\n\t\t\tswitch (solver)\n\t\t\t{\n\t\t\t\tcase EIGEN_SOLVER.COL_PIV_HOUSEHOLDER_QR:\n\t\t\t\t\treturn ColPivHouseholderQr(v);\n\t\t\t\tcase EIGEN_SOLVER.PARTIAL_PIV_LU:\n\t\t\t\t\treturn PartialPivLu(v);\n\t\t\t\tcase EIGEN_SOLVER.FULL_PIV_LU:\n\t\t\t\t\treturn FullPivLu(v);\n\t\t\t\tcase EIGEN_SOLVER.HOUSEHOLDER_QR:\n\t\t\t\t\treturn HouseholderQr(v);\n\t\t\t\tcase EIGEN_SOLVER.LLT:\n\t\t\t\t\treturn LLT(v);\n\t\t\t\tcase EIGEN_SOLVER.LDLT:\n\t\t\t\t\treturn LDLT(v);\n\t\t\t\tcase EIGEN_SOLVER.BDCSVD:\n\t\t\t\t\treturn BdcSvd(v);\n\t\t\t\tcase EIGEN_SOLVER.JACOBI_SVD:\n\t\t\t\t\treturn JacobiSvd(v);\n\t\t\t\tcase EIGEN_SOLVER.FULL_PIV_HOUSEHOLDER_QR:\n\t\t\t\t\treturn FullPivHouseholderQR(v);\n\t\t\t\tcase EIGEN_SOLVER.COMPLETE_ORTH_DECOM:\n\t\t\t\t\treturn CompleteOrthogonalDecomposition(v);\n\t\t\t\tdefault:\n\t\t\t\t\treturn ColPivHouseholderQr(v);\n\t\t\t}\n\t\t}\n\n\t\tpublic EigenColumnVector ColPivHouseholderQr(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_ColPivHouseholderQr_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix ColPivHouseholderQr(EigenMatrix m)\n\t\t{\n\t\t\tIsValidProduct(this, m);\n\t\t\tvar ptr = EigenMatrix_ColPivHouseholderQr_Mat(Ptr, m.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector PartialPivLu(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tif (!IsInvertible)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must be invertible for PartialPivLu solver.\");\n\n\t\t\tvar ptr = EigenMatrix_PartialPivLu_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix PartialPivLu(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tif (!IsInvertible)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must be invertible for PartialPivLu solver.\");\n\n\t\t\tvar ptr = EigenMatrix_PartialPivLu_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector FullPivLu(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_FullPivLu_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix FullPivLu(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_FullPivLu_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector HouseholderQr(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_HouseholderQr_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix HouseholderQr(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_HouseholderQr_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector LLT(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tif (!IsPositive())\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must be positive for LLT solver.\");\n\n\t\t\tvar ptr = EigenMatrix_LLT_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix LLT(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tif (!IsPositive())\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must be positive for LLT solver.\");\n\n\t\t\tvar ptr = EigenMatrix_LLT_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector LDLT(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_LDLT_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix LDLT(EigenMatrix m)\n\t\t{\n\t\t\tIsValidProduct(this, m);\n\t\t\tvar ptr = EigenMatrix_LDLT_Mat(Ptr, m.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector BdcSvd(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tint options = (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_U | \n\t\t\t\t\t\t  (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_V;\n\n\t\t\tvar ptr = EigenMatrix_BdcSvd_Vec(Ptr, v.Ptr, options);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix BdcSvd(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tint options = (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_U |\n\t\t\t  (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_V;\n\n\t\t\tvar ptr = EigenMatrix_BdcSvd_Mat(Ptr, v.Ptr, options);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector JacobiSvd(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tint options = (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_U |\n\t\t\t  (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_V;\n\n\t\t\tvar ptr = EigenMatrix_JacobiSvd_Vec(Ptr, v.Ptr, options);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix JacobiSvd(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\n\t\t\tint options = (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_U |\n\t\t\t  (int)EIGEN_SOLVER_OPTIONS.COMPUTE_THIN_V;\n\n\t\t\tvar ptr = EigenMatrix_JacobiSvd_Mat(Ptr, v.Ptr, options);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector FullPivHouseholderQR(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_FullPivHouseholderQr_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix FullPivHouseholderQR(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_FullPivHouseholderQr_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\tpublic EigenColumnVector CompleteOrthogonalDecomposition(EigenColumnVector v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_CompleteOrthogonalDecomposition_Vec(Ptr, v.Ptr);\n\t\t\treturn new EigenColumnVector(ptr);\n\t\t}\n\n\t\tpublic EigenMatrix CompleteOrthogonalDecomposition(EigenMatrix v)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\tvar ptr = EigenMatrix_CompleteOrthogonalDecomposition_Mat(Ptr, v.Ptr);\n\t\t\treturn new EigenMatrix(ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Find the relative error from the linear system.\n\t\t/// </summary>\n\t\t/// <param name=\"v\">The vector that was solved.</param>\n\t\t/// <param name=\"x\">The vector that was the solution.</param>\n\t\t/// <returns>The relative error.</returns>\n\t\tpublic double RelativeError(EigenColumnVector v, EigenColumnVector x)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\treturn EigenMatrix_RelativeError_Vec(Ptr, v.Ptr, x.Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Find the relative error from the linear system.\n\t\t/// </summary>\n\t\t/// <param name=\"v\">The vector that was solved.</param>\n\t\t/// <param name=\"x\">The vector that was the solution.</param>\n\t\t/// <returns>The relative error.</returns>\n\t\tpublic double RelativeError(EigenMatrix v, EigenMatrix x)\n\t\t{\n\t\t\tIsValidProduct(this, v);\n\t\t\treturn EigenMatrix_RelativeError_Mat(Ptr, v.Ptr, x.Ptr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Find the eigen values of the matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"values\">The eigen values if found, null otherwise.</param>\n\t\t/// <returns>True if the values could be determined.</returns>\n\t\tpublic bool EigenValues(out EigenColumnVector values)\n\t\t{\n\t\t\tvar ptr = EigenMatrix_Eigenvalues(Ptr);\n\t\t\tif (ptr != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tvalues = new EigenColumnVector(ptr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvalues = null;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Find the eigen vectors of the matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"vectors\">The eigen vectors if found, null otherwise.</param>\n\t\t/// <returns>True if the vectors could be determined.</returns>\n\t\tpublic bool EigenVectors(out EigenMatrix vectors)\n\t\t{\n\t\t\tvar ptr = EigenMatrix_Eigenvectors(Ptr);\n\t\t\tif (ptr != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tvectors = new EigenMatrix(ptr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvectors = null;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"values\"></param>\n\t\t/// <param name=\"vectors\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool EigenValuesAndVectors(out EigenColumnVector values, out EigenMatrix vectors)\n        {\n\t\t\tIntPtr valuesPtr;\n\t\t\tIntPtr vectorsPtr;\n\n\t\t\tif (EigenMatrix_EigenValuesVectors(Ptr, out valuesPtr, out vectorsPtr))\n            {\n\t\n\t\t\t\tvalues = new EigenColumnVector(valuesPtr);\n\t\t\t\tvectors = new EigenMatrix(vectorsPtr);\n\t\t\t\treturn true;\n\t\t\t}\n            else\n            {\n\t\t\t\tvalues = null;\n\t\t\t\tvectors = null;\n\t\t\t\treturn false;\n            }\n\n        }\n\n\t\t/// <summary>\n\t\t/// Try and find the inverse of the matrix.\n\t\t/// </summary>\n\t\t/// <param name=\"inverse\">The inverse if found, null otherwise.</param>\n\t\t/// <returns>True if the inverse was found.</returns>\n\t\tpublic bool TryInverse(out EigenMatrix inverse)\n        {\n\t\t\tinverse = null;\n\t\t\tif(!IsSquare) return false;\n\n\t\t\tvar ptr = EigenMatrix_TryInverse(Ptr);\n\t\t\tif(ptr != IntPtr.Zero)\n            {\n\t\t\t\tinverse = new EigenMatrix(ptr);\n\t\t\t\treturn true;\n            }\n\t\t\telse\n            {\n\t\t\t\treturn false;\n            }\n        }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"Row\"></param>\n\t\t/// <returns></returns>\n\t\tpublic EigenRowVector GetRow(int Row)\n\t\t{\n\t\t\tCheckRows(this, Row + 1);\n\t\t\tvar v = new EigenRowVector(Rows);\n\t\t\tfor (int i = 0; i < Rows; i++)\n\t\t\t\tv[i] = this[i, Row];\n\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"Row\"></param>\n\t\t/// <param name=\"v\"></param>\n\t\tpublic void SetRow(int Row, EigenRowVector v)\n\t\t{\n\t\t\tAreSameSize(this, v);\n\t\t\tfor (int i = 0; i < Rows; i++)\n\t\t\t\tthis[i, Row] = v[i];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"row\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\tpublic void SetRow(int row, double x, double y)\n\t\t{\n\t\t\tCheckSize(this, row + 1, 2);\n\t\t\tthis[row, 0] = x;\n\t\t\tthis[row, 1] = y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"row\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\t/// <param name=\"z\"></param>\n\t\tpublic void SetRow(int row, double x, double y, double z)\n\t\t{\n\t\t\tCheckSize(this, row + 1, 3);\n\t\t\tthis[row, 0] = x;\n\t\t\tthis[row, 1] = y;\n\t\t\tthis[row, 2] = z;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"row\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\t/// <param name=\"z\"></param>\n\t\t/// <param name=\"w\"></param>\n\t\tpublic void SetRow(int row, double x, double y, double z, double w)\n\t\t{\n\t\t\tCheckSize(this, row + 1, 4);\n\t\t\tthis[row, 0] = x;\n\t\t\tthis[row, 1] = y;\n\t\t\tthis[row, 2] = z;\n\t\t\tthis[row, 3] = w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"Column\"></param>\n\t\t/// <returns></returns>\n\t\tpublic EigenColumnVector GetColumn(int Column)\n\t\t{\n\t\t\tCheckColumns(this, Column + 1);\n\t\t\tvar v = new EigenColumnVector(Columns);\n\t\t\tfor (int i = 0; i < Columns; i++)\n\t\t\t\tv[i] = this[Column, i];\n\n\t\t\treturn v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"Column\"></param>\n\t\t/// <param name=\"v\"></param>\n\t\tpublic void SetColumn(int Column, EigenColumnVector v)\n\t\t{\n\t\t\tAreSameSize(this, v);\n\t\t\tfor (int i = 0; i < Columns; i++)\n\t\t\t\tthis[Column, i] = v[i];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"column\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\tpublic void SetColumn(int column, double x, double y)\n\t\t{\n\t\t\tCheckSize(this, 2, column + 1);\n\t\t\tthis[0, column] = x;\n\t\t\tthis[1, column] = y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"column\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\t/// <param name=\"z\"></param>\n\t\tpublic void SetColumn(int column, double x, double y, double z)\n\t\t{\n\t\t\tCheckSize(this, 3, column + 1);\n\t\t\tthis[0, column] = x;\n\t\t\tthis[1, column] = y;\n\t\t\tthis[2, column] = z;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"column\"></param>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <param name=\"y\"></param>\n\t\t/// <param name=\"z\"></param>\n\t\t/// <param name=\"w\"></param>\n\t\tpublic void SetColumn(int column, double x, double y, double z, double w)\n\t\t{\n\t\t\tCheckSize(this, 4, column + 1);\n\t\t\tthis[0, column] = x;\n\t\t\tthis[1, column] = y;\n\t\t\tthis[2, column] = z;\n\t\t\tthis[3, column] = w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"digits\"></param>\n\t\tpublic void Round(int digits)\n\t\t{\n\t\t\tfor (int i = 0; i < Length; i++)\n\t\t\t\tthis[i] = Math.Round(this[i], digits);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"point\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static EigenMatrix Translate(Point3d point)\n        {\n\t\t\tvar m = EigenMatrix.Identity(4);\n\t\t\tm.SetColumn(3, point.x, point.y, point.z, 1);\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"point\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static EigenMatrix Scale(Point3d point)\n\t\t{\n\t\t\tvar m = EigenMatrix.Identity(4);\n\n\t\t\tm[0, 0] = point.x;\n\t\t\tm[1, 1] = point.y;\n\t\t\tm[2, 2] = point.z;\n\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"s\"></param>\n\t\t/// <returns></returns>\n\t\tstatic public EigenMatrix Scale(double s)\n\t\t{\n\t\t\tvar m = EigenMatrix.Identity(4);\n\n\t\t\tm[0, 0] = s;\n\t\t\tm[1, 1] = s;\n\t\t\tm[2, 2] = s;\n\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"radian\"></param>\n\t\t/// <returns></returns>\n\t\tstatic public EigenMatrix RotateX(Radian radian)\n\t\t{\n\t\t\tvar m = new EigenMatrix(4, 4);\n\n\t\t\tdouble ca = MathUtil.Cos(radian);\n\t\t\tdouble sa = MathUtil.Sin(radian);\n\n\t\t\treturn new EigenMatrix(\t1, 0, 0, 0,\n\t\t\t\t\t\t\t\t\t0, ca, -sa, 0,\n\t\t\t\t\t\t\t\t\t0, sa, ca, 0,\n\t\t\t\t\t\t\t\t\t0, 0, 0, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"radian\"></param>\n\t\t/// <returns></returns>\n\t\tstatic public EigenMatrix RotateY(Radian radian)\n\t\t{\n\t\t\tvar m = new EigenMatrix(4, 4);\n\n\t\t\tdouble ca = MathUtil.Cos(radian);\n\t\t\tdouble sa = MathUtil.Sin(radian);\n\n\t\t\treturn new EigenMatrix(ca, 0, sa, 0,\n\t\t\t\t\t\t\t\t\t0, 1, 0, 0,\n\t\t\t\t\t\t\t\t\t-sa, 0, ca, 0,\n\t\t\t\t\t\t\t\t\t0, 0, 0, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"radian\"></param>\n\t\t/// <returns></returns>\n\t\tstatic public EigenMatrix RotateZ(Radian radian)\n\t\t{\n\t\t\tvar m = new EigenMatrix(4, 4);\n\n\t\t\tdouble ca = MathUtil.Cos(radian);\n\t\t\tdouble sa = MathUtil.Sin(radian);\n\n\t\t\treturn new EigenMatrix(ca, -sa, 0, 0,\n\t\t\t\t\t\t\t\t\tsa, ca, 0, 0,\n\t\t\t\t\t\t\t\t\t0, 0, 1, 0,\n\t\t\t\t\t\t\t\t\t0, 0, 0, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Create a rotation from a angle and the rotation axis.\n\t\t/// </summary>\n\t\t/// <param name=\"radian\">The rotation amount.</param>\n\t\t/// <param name=\"axis\">The axis to rotate on.</param>\n\t\t/// <returns>The rotation matrix.</returns>\n\t\tstatic public EigenMatrix Rotate(Radian radian, Vector3d axis)\n\t\t{\n\t\t\tvar m = EigenMatrix.Identity(4);\n\n\t\t\tdouble sinTheta = MathUtil.Sin(radian);\n\t\t\tdouble cosTheta = MathUtil.Cos(radian);\n\n\t\t\t// Compute rotation of first basis vector\n\t\t\tm[0, 0] = axis.x * axis.x + (1 - axis.x * axis.x) * cosTheta;\n\t\t\tm[0, 1] = axis.x * axis.y * (1 - cosTheta) - axis.z * sinTheta;\n\t\t\tm[0, 2] = axis.x * axis.z * (1 - cosTheta) + axis.y * sinTheta;\n\t\t\tm[0, 3] = 0;\n\n\t\t\t// Compute rotations of second and third basis vectors\n\t\t\tm[1, 0] = axis.x * axis.y * (1 - cosTheta) + axis.z * sinTheta;\n\t\t\tm[1, 1] = axis.y * axis.y + (1 - axis.y * axis.y) * cosTheta;\n\t\t\tm[1, 2] = axis.y * axis.z * (1 - cosTheta) - axis.x * sinTheta;\n\t\t\tm[1, 3] = 0;\n\n\t\t\tm[2, 0] = axis.x * axis.z * (1 - cosTheta) - axis.y * sinTheta;\n\t\t\tm[2, 1] = axis.y * axis.z * (1 - cosTheta) + axis.x * sinTheta;\n\t\t\tm[2, 2] = axis.z * axis.z + (1 - axis.z * axis.z) * cosTheta;\n\t\t\tm[2, 3] = 0;\n\n\t\t\treturn m;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"builder\"></param>\n\t\tpublic override void Print(StringBuilder builder)\n\t\t{\n\t\t\tbuilder.AppendLine(this.ToString());\n\n\t\t\tfor (int x = 0; x < Rows; x++)\n\t\t\t{\n\t\t\t\tfor (int y = 0; y < Columns; y++)\n\t\t\t\t{\n\t\t\t\t\tbuilder.Append(this[x, y].ToString());\n\n\t\t\t\t\tif (y != Columns - 1)\n\t\t\t\t\t\tbuilder.Append(\",\");\n\t\t\t\t}\n\n\t\t\t\tbuilder.AppendLine();\n\t\t\t}\n\t\t}\n\n\t\tinternal static void CheckIfSqaure(EigenMatrix m)\n\t\t{\n\t\t\tif (!m.IsSquare)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must be Square.\");\n\t\t}\n\n\t\tinternal static void IsValidProduct(EigenMatrix m, EigenColumnVector v)\n\t\t{\n\t\t\tif (v.Dimension != m.Columns)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must have same number of columns as vectors dimension.\");\n\t\t}\n\n\t\tinternal static void IsValidProduct(EigenMatrix m1, EigenMatrix m2)\n\t\t{\n\t\t\tif (m1.Columns != m2.Rows)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix1 must have same number of columns as matrix2 has rows.\");\n\t\t}\n\n\t\tinternal static void AreSameSize(EigenMatrix m1, EigenMatrix m2)\n\t\t{\n\t\t\tif (m1.Rows != m2.Rows)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix1 must be the same size as matrix2.\");\n\n\t\t\tif (m1.Columns != m2.Columns)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix1 must be the same size as matrix2.\");\n\t\t}\n\n\t\tinternal static void AreSameSize(EigenMatrix m, EigenRowVector v)\n\t\t{\n\t\t\tif (m.Rows != v.Dimension)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must have the same number of rows as vector dimension.\");\n\t\t}\n\n\t\tinternal static void AreSameSize(EigenMatrix m, EigenColumnVector v)\n\t\t{\n\t\t\tif (m.Columns != v.Dimension)\n\t\t\t\tthrow new InvalidOperationException(\"Matrix must have the same number of columns as vector dimension.\");\n\t\t}\n\n\t\tinternal static void CheckSize(EigenMatrix m, int rows, int columns)\n\t\t{\n\t\t\tif (rows > m.Rows)\n\t\t\t\tthrow new InvalidOperationException(String.Format(\"Matrix must have at least {0} rows.\", rows));\n\n\t\t\tif (columns > m.Columns)\n\t\t\t\tthrow new InvalidOperationException(String.Format(\"Matrix must have at least {0} columns.\", columns));\n\t\t}\n\n\t\tinternal static void CheckRows(EigenMatrix m, int rows)\n\t\t{\n\t\t\tif (rows > m.Rows)\n\t\t\t\tthrow new InvalidOperationException(String.Format(\"Matrix must have at least {0} rows.\", rows));\n\t\t}\n\n\t\tinternal static void CheckColumns(EigenMatrix m, int columns)\n\t\t{\n\t\t\tif (columns > m.Columns)\n\t\t\t\tthrow new InvalidOperationException(String.Format(\"Matrix must have at least {0} rows.\", columns));\n\t\t}\n\n\t\tprotected override void ReleasePtr()\n\t\t{\n\t\t\tEigenMatrix_Release(Ptr);\n\t\t}\n\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Create(int rows, int columns);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_CreateIdentity(int rows, int columns);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void EigenMatrix_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int EigenMatrix_Rows(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int EigenMatrix_Columns(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_GetXY(IntPtr ptr, int x, int y);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void EigenMatrix_SetXY(IntPtr ptr, int x, int y, double value);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_GetX(IntPtr ptr, int x);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void EigenMatrix_SetX(IntPtr ptr, int x, double value);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Transpose(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Conjugate(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Adjoint(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Inverse(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_Determinant(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_Trace(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_IsIdentity(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_IsDiagonal(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_IsUpperTriangular(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_IsLowerTriangular(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_MulScalar(IntPtr ptr1, double s);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_DivideScalar(IntPtr ptr1, double s);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_MulMatrix(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_AddMatrix(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_SubMatrix(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_MulColumnVector(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Block(IntPtr ptr, int startRox, int startCol, int blockRows, int blockCols);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Reshaped(IntPtr ptr, int rows, int cols);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_ColPivHouseholderQr_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_ColPivHouseholderQr_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_PartialPivLu_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_PartialPivLu_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_FullPivLu_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_FullPivLu_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_HouseholderQr_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_HouseholderQr_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_LLT_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_LLT_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_LDLT_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_LDLT_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_BdcSvd_Vec(IntPtr ptr1, IntPtr ptr2, int options);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_BdcSvd_Mat(IntPtr ptr1, IntPtr ptr2, int options);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_JacobiSvd_Vec(IntPtr ptr1, IntPtr ptr2, int options);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_JacobiSvd_Mat(IntPtr ptr1, IntPtr ptr2, int options);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_FullPivHouseholderQr_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_FullPivHouseholderQr_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_CompleteOrthogonalDecomposition_Vec(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_CompleteOrthogonalDecomposition_Mat(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_RelativeError_Vec(IntPtr ptr1, IntPtr ptr2, IntPtr ptr3);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double EigenMatrix_RelativeError_Mat(IntPtr ptr1, IntPtr ptr2, IntPtr ptr3);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Eigenvalues(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_Eigenvectors(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_EigenValuesVectors(IntPtr ptr, [Out] out IntPtr values, [Out] out IntPtr vectors);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool EigenMatrix_IsInvertible(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr EigenMatrix_TryInverse(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Eigen/EigenRowVector.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Eigen\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public class EigenRowVector : EigenVector\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"dimension\"></param>\n        public EigenRowVector(int dimension)\n        {\n            Ptr = EigenRowVector_CreateVector(dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        public EigenRowVector(double x, double y)\n        {\n            Ptr = EigenRowVector_CreateVector(2);\n            this[0] = x;\n            this[1] = y;\n        }\n\n        public EigenRowVector(double x, double y, double z)\n        {\n            Ptr = EigenRowVector_CreateVector(3);\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"z\"></param>\n        /// <param name=\"w\"></param>\n        public EigenRowVector(double x, double y, double z, double w)\n        {\n            Ptr = EigenRowVector_CreateVector(4);\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n            this[3] = w;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"list\"></param>\n        public EigenRowVector(IList<double> list)\n        {\n            Ptr = EigenRowVector_CreateVector(list.Count);\n            for(int i = 0; i < list.Count; i++)    \n                this[i] = list[i];\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal EigenRowVector(IntPtr ptr) : base(ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public override double this[int i]\n        {\n            get { return EigenRowVector_Get(Ptr, i); }\n            set { EigenRowVector_Set(Ptr, i, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override int Dimension => EigenRowVector_Dimension(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override double Magnitude => EigenRowVector_Norm(Ptr);\n\n        /// <summary>\n        /// /\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return String.Format(\"[EigenRowVector: Dimension={0}]\", Dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenRowVector Normalized => new EigenRowVector(EigenRowVector_Normalized(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenColumnVector Transpose => new EigenColumnVector(EigenRowVector_Transpose(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public EigenRowVector Adjoint => new EigenRowVector(EigenRowVector_Adjoint(Ptr));\n        \n        /// <summary>\n        /// \n        /// </summary>\n        public EigenRowVector Conjugate => new EigenRowVector(EigenRowVector_Conjugate(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static double Dot(EigenRowVector v1, EigenRowVector v2)\n        {\n            AreSameSize(v1, v2);\n            return EigenRowVector_Dot(v1.Ptr, v2.Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public override void Normalize()\n        {\n            EigenRowVector_Normalize(Ptr);\n        }\n\n        public override void Resize(int dimension)\n        {\n            EigenRowVector_Resize(Ptr, dimension);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"dimension\"></param>\n        /// <param name=\"min\"></param>\n        /// <param name=\"max\"></param>\n        /// <param name=\"seed\"></param>\n        /// <returns></returns>\n        public static EigenRowVector Random(int dimension, double min, double max, int seed)\n        {\n            var ptr = EigenRowVector_CreateVector(dimension);\n            var v = new EigenRowVector(ptr);\n            var rnd = new Random(seed);\n            double range = max - min;\n\n            for (int i = 0; i < v.Dimension; i++)\n                v[i] = min + rnd.NextDouble() * range;\n\n            return v;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            EigenRowVector_Release(Ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenRowVector_CreateVector(int dimension);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenRowVector_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int EigenRowVector_Rows(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int EigenRowVector_Dimension(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenRowVector_Get(IntPtr ptr, int x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenRowVector_Set(IntPtr ptr, int x, double value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenRowVector_Dot(IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenRowVector_Normalized(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenRowVector_Normalize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double EigenRowVector_Norm(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenRowVector_Transpose(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenRowVector_Adjoint(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr EigenRowVector_Conjugate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void EigenRowVector_Resize(IntPtr ptr, int dimension);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Eigen/EigenVector.cs",
    "content": "﻿using System;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Eigen\n{\n\t/// <summary>\n\t/// \n\t/// </summary>\n\tpublic abstract class EigenVector : CGALObject\n\t{\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tinternal EigenVector()\n\t\t{\n\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"ptr\"></param>\n\t\tinternal EigenVector(IntPtr ptr) : base(ptr)\n\t\t{\n\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The first value in the vector.\n\t\t/// </summary>\n\t\tpublic double x\n        {\n\t\t\tget { return this[0]; }\n\t\t\tset { this[0] = value; }\n        }\n\n\t\t/// <summary>\n\t\t/// The second value in the vector.\n\t\t/// </summary>\n\t\tpublic double y\n\t\t{\n\t\t\tget { return this[1]; }\n\t\t\tset { this[1] = value; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The third value in the vector.\n\t\t/// </summary>\n\t\tpublic double z\n\t\t{\n\t\t\tget { return this[2]; }\n\t\t\tset { this[2] = value; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The fourth value in the vector.\n\t\t/// </summary>\n\t\tpublic double w\n\t\t{\n\t\t\tget { return this[3]; }\n\t\t\tset { this[3] = value; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"i\"></param>\n\t\t/// <returns></returns>\n\t\tpublic abstract double this[int i] { get; set; }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic abstract int Dimension { get; }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic abstract double Magnitude { get; }\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic abstract void Normalize();\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"dimension\"></param>\n\t\tpublic abstract void Resize(int dimension);\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"eps\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool IsZero(double eps = MathUtil.DEG_TO_RAD_64)\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (!MathUtil.IsZero(this[x], eps))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic bool IsPositive()\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (this[x] < 0)\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic bool HasNAN()\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (double.IsNaN(this[x]))\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic void NoNAN()\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (double.IsNaN(this[x]))\n\t\t\t\t\tthis[x] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic bool IsFinite()\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (!MathUtil.IsFinite(this[x]))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic void MakeFinite()\n\t\t{\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (!MathUtil.IsFinite(this[x]))\n\t\t\t\t\tthis[x] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"eps\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool IsConst(double eps = MathUtil.EPS_64)\n\t\t{\n\t\t\tvar value = this[0];\n\t\t\tfor (int x = 0; x < Dimension; x++)\n\t\t\t{\n\t\t\t\tif (!MathUtil.AlmostEqual(this[x], value, eps))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"digits\"></param>\n\t\tpublic void Round(int digits)\n\t\t{\n\t\t\tfor (int i = 0; i < Dimension; i++)\n\t\t\t\tthis[i] = Math.Round(this[i], digits);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"builder\"></param>\n\t\tpublic override void Print(StringBuilder builder)\n\t\t{\n\t\t\tbuilder.AppendLine(this.ToString());\n\n\t\t\tif (this is EigenColumnVector)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < Dimension; i++)\n\t\t\t\t{\n\t\t\t\t\tbuilder.Append(this[i].ToString());\n\t\t\t\t\tif (i != Dimension - 1)\n\t\t\t\t\t\tbuilder.AppendLine(\",\");\n\t\t\t\t\telse\n\t\t\t\t\t\tbuilder.AppendLine();\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < Dimension; i++)\n\t\t\t\t{\n\t\t\t\t\tbuilder.Append(this[i].ToString());\n\t\t\t\t\tif (i != Dimension - 1)\n\t\t\t\t\t\tbuilder.Append(\",\");\n\t\t\t\t\telse\n\t\t\t\t\t\tbuilder.AppendLine();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"v1\"></param>\n\t\t/// <param name=\"v2\"></param>\n\t\t/// <exception cref=\"InvalidOperationException\"></exception>\n\t\tinternal static void AreSameSize(EigenVector v1, EigenVector v2)\n\t\t{\n\t\t\tif (v1.Dimension != v2.Dimension)\n\t\t\t\tthrow new InvalidOperationException(\"Vector1 must be the same size as Vector2.\");\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Extensions/ArrayExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNet.Triangulations;\n\nnamespace CGALDotNet.Extensions\n{\n    public static class ArrayExtensions\n    {\n        public static void Round(this TriVertex2[] array, int digits)\n        {\n            if (digits < 0) return;\n            for (int i = 0; i < array.Length; i++)\n            {\n                var p = array[i].Point;\n                array[i].Point = p.Rounded(digits);\n            }\n        }\n\n        public static void Round(this TriVertex3[] array, int digits)\n        {\n            if (digits < 0) return;\n            for (int i = 0; i < array.Length; i++)\n            {\n                var p = array[i].Point;\n                array[i].Point = p.Rounded(digits);\n            }     \n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Extensions/EnumExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Extensions\n{\n    public static class EnumExtensions\n    {\n        internal static bool ToBool(this BOOL_OR_UNDETERMINED e)\n        {\n            return e == BOOL_OR_UNDETERMINED.TRUE;\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Extensions/PrimativeExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Extensions\n{\n    public static class PrimativeExtensions\n    {\n        internal static BOOL_OR_UNDETERMINED ToBoolOrUndetermined(this bool b)\n        {\n            return b ? BOOL_OR_UNDETERMINED.TRUE : BOOL_OR_UNDETERMINED.FALSE;\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Box2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// The generic Box wrapper for a CGAL object.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Box2<K> : Box2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// Create box from min and max values.\n        /// </summary>\n        /// <param name=\"min\">The min x and y value.</param>\n        /// <param name=\"max\">The max x and y value.</param>\n        public Box2(double min, double max) : \n            base(new Point2d(min), new Point2d(max), new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create box from min and max points.\n        /// </summary>\n        /// <param name=\"min\">The min point.</param>\n        /// <param name=\"max\">The max point.</param>\n        public Box2(Point2d min, Point2d max) : \n            base(min, max, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The iso rectangle pointer.</param>\n        internal Box2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// The iso rectangle as a string.\n        /// </summary>\n        /// <returns>The iso rectangle as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Box2<{0}>: Min={1}, Max={2}]\", \n                KernelName, Min, Max);\n        }\n\n        /// <summary>\n        /// Translate the shape.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Box2_Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the shape.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Box2_Transform(Ptr, Point2d.Zero, rotation.radian, 1);\n        }\n\n        /// <summary>\n        /// Scale the shape.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Box2_Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// Transform the rectangle.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Box2_Transform(Ptr, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the rectangle.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Box2<K> Copy()\n        {\n            var ptr = Kernel.Box2_Copy(Ptr);\n            return new Box2<K>(ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract iso rectangle definition.\n    /// </summary>\n    public abstract class Box2 : CGALObject\n    {\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private Box2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"min\"></param>\n        /// <param name=\"max\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Box2(Point2d min, Point2d max, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Box2_Create(min, max);\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The geometry kernel.</param>\n        /// <param name=\"ptr\">The Box pointer.</param>\n        internal Box2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// The iso rectangle kernel.\n        /// Contains the functions to the unmanaged CGAL object.\n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Convert to shape struct.\n        /// </summary>\n        public Box2d Shape => new Box2d(Min, Max);\n\n        /// <summary>\n        /// The rectangles min point.\n        /// </summary>\n        public Point2d Min\n        {\n            get { return Kernel.Box2_GetMin(Ptr);  }\n            set {  Kernel.Box2_SetMin(Ptr, value); }\n        }\n\n        /// <summary>\n        /// The rectangles max point.\n        /// </summary>\n        public Point2d Max\n        {\n            get { return Kernel.Box2_GetMax(Ptr); }\n            set { Kernel.Box2_SetMax(Ptr, value); }\n        }\n\n        /// <summary>\n        /// The rectangles area.\n        /// </summary>\n        public double Area\n        {\n            get \n            {\n                if (IsDegenerate)\n                    return 0;\n                else\n                    return Kernel.Box2_Area(Ptr); \n            }\n        }\n\n        /// <summary>\n        /// Is the rectangle degenerate.\n        /// </summary>\n        public bool IsDegenerate => Kernel.Box2_IsDegenerate(Ptr);\n\n        /// <summary>\n        /// The side the rectangle the point is on.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>If the point is iside, outside or on boundary.</returns>\n        public BOUNDED_SIDE BoundedSide(Point2d point)\n        {\n            if (IsDegenerate)\n                return BOUNDED_SIDE.UNDETERMINED;\n            else\n                return Kernel.Box2_BoundedSide(Ptr, point);\n        }\n\n        /// <summary>\n        /// Does the rectangle contain the point.\n        /// </summary>\n        /// <param name=\"point\">The point</param>\n        /// <param name=\"includeBoundary\">Should a point on \n        /// the boundary count as being inside.</param>\n        /// <returns>Does the rectangle contain the point</returns>\n        public bool ContainsPoint(Point2d point, bool includeBoundary = true)\n        {\n            if (IsDegenerate)\n                return false;\n            else\n                return Kernel.Box2_ContainsPoint(Ptr, point, includeBoundary);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Box2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Round the shape.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            this.Min = Min.Rounded(digits);\n            this.Max = Max.Rounded(digits);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Box2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Box2_Convert(Ptr, e);\n            return new Box2<T>(ptr);\n        }\n\n    }\n }\n"
  },
  {
    "path": "CGALDotNet/Geometry/CGALIntersections_Geometry_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n\n    /// <summary>\n    /// The static intersection class.\n    /// </summary>\n    public static partial class CGALIntersections\n    {\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Point2<EEK> point, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EEK> point, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EEK> point, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_PointSegment(point.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EEK> point, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_PointTriangle(point.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EEK> point, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_PointBox(point.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Line2<EEK> line, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EEK> line, Line2<EEK> line2)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EEK> line, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EEK> line, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EEK> line, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EEK> line, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_LineBox(line.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Ray2<EEK> ray, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EEK> ray, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EEK> ray, Ray2<EEK> ray2)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EEK> ray, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EEK> ray, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EEK> ray, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_RayBox(ray.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Segment2<EEK> segment, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EEK> segment, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EEK> segment, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EEK> segment, Segment2<EEK> segment2)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EEK> segment, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EEK> segment, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_SegmentBox(segment.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Triangle2<EEK> triangle2)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EEK> triangle, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_TriangleBox(triangle.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Box2<EEK> box, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxPoint(box.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EEK> box, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxLine(box.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EEK> box, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxRay(box.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EEK> box, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxSegment(box.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EEK> box, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxTriangle(box.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EEK> box, Box2<EEK> box2)\n        {\n            return Intersections_Geometry_EEK_DoIntersect_BoxBox(box.Ptr, box2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Point2<EEK> point, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_Intersection_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EEK> point, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_Intersection_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EEK> point, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_Intersection_PointSegment(point.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EEK> point, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_Intersection_PointTriangle(point.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EEK> point, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_Intersection_PointBox(point.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_Intersection_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Line2<EEK> line2)\n        {\n            return Intersections_Geometry_EEK_Intersection_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_Intersection_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_Intersection_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_Intersection_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EEK> line, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_Intersection_LineBox(line.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_Intersection_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_Intersection_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Ray2<EEK> ray2)\n        {\n            return Intersections_Geometry_EEK_Intersection_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_Intersection_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_Intersection_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EEK> ray, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_Intersection_RayBox(ray.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Segment2<EEK> segment2)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EEK> segment, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_Intersection_SegmentBox(segment.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_Intersection_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_Intersection_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_Intersection_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_Intersection_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Triangle2<EEK> triangle2)\n        {\n            return Intersections_Geometry_EEK_Intersection_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EEK> triangle, Box2<EEK> box)\n        {\n            return Intersections_Geometry_EEK_Intersection_TriangleBox(triangle.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxPoint(box.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxLine(box.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxRay(box.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxSegment(box.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxTriangle(box.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EEK> box, Box2<EEK> box2)\n        {\n            return Intersections_Geometry_EEK_Intersection_BoxBox(box.Ptr, box2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///              The Point SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Point2<EEK> point, Point2<EEK> point2)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_PointPoint(point.Ptr, point2.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EEK> point, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EEK> point, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EEK> point, Segment2<EEK> seg)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_PointSegment(point.Ptr, seg.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EEK> point, Triangle2<EEK> tri)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_PointTriangle(point.Ptr, tri.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Line2<EEK> line, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EEK> line, Line2<EEK> line2)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EEK> line, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EEK> line, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EEK> line, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Ray2<EEK> ray, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EEK> ray, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EEK> ray, Ray2<EEK> ray2)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EEK> ray, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EEK> ray, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Segment2<EEK> segment, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EEK> segment, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EEK> segment, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EEK> segment, Segment2<EEK> segment2)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EEK> segment, Triangle2<EEK> triangle)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Triangle2<EEK> triangle, Point2<EEK> point)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EEK> triangle, Line2<EEK> line)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EEK> triangle, Ray2<EEK> ray)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EEK> triangle, Segment2<EEK> segment)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EEK> triangle, Triangle2<EEK> triangle2)\n        {\n            return Intersections_Geometry_EEK_SqrDistance_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_PointSegment(IntPtr point, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_PointTriangle(IntPtr point, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_PointBox(IntPtr point, IntPtr box);\n\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Linet DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LineTriangle(IntPtr line, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_LineBox(IntPtr line, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RayLine(IntPtr ray, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_RayBox(IntPtr ray, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentLine(IntPtr segment, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_SegmentBox(IntPtr segment, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TriangleLine(IntPtr triangle, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_TriangleBox(IntPtr triangle, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxPoint(IntPtr box, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxLine(IntPtr box, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxRay(IntPtr box, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxSegment(IntPtr box, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxTriangle(IntPtr box, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EEK_DoIntersect_BoxBox(IntPtr box, IntPtr box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointSegment(IntPtr point, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointTriangle(IntPtr point, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointBox(IntPtr point, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineTriangle(IntPtr line, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineBox(IntPtr line, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayLine(IntPtr ray, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayBox(IntPtr ray, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentLine(IntPtr segment, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentBox(IntPtr segment, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleLine(IntPtr triangle, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleBox(IntPtr triangle, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxPoint(IntPtr box, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxLine(IntPtr box, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxRay(IntPtr box, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxSegment(IntPtr box, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxTriangle(IntPtr box, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxBox(IntPtr box, IntPtr box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///               The Point SqrDistance extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_PointPoint(IntPtr point, IntPtr point2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_PointSegment(IntPtr point, IntPtr seg);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_PointTriangle(IntPtr point, IntPtr tri);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_LineTriangle(IntPtr line, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_RayLine(IntPtr ray, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_SegmentLine(IntPtr segment, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_TriangleLine(IntPtr triangle, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EEK_SqrDistance_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/CGALIntersections_Geometry_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n\n    /// <summary>\n    /// The static intersection class.\n    /// </summary>\n    public static partial class CGALIntersections\n    {\n  \n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Point2<EIK> point, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EIK> point, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EIK> point, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_PointSegment(point.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EIK> point, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_PointTriangle(point.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Point2<EIK> point, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_PointBox(point.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Line2<EIK> line, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EIK> line, Line2<EIK> line2)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EIK> line, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EIK> line, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EIK> line, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Line2<EIK> line, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_LineBox(line.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Ray2<EIK> ray, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EIK> ray, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EIK> ray, Ray2<EIK> ray2)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EIK> ray, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EIK> ray, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Ray2<EIK> ray, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_RayBox(ray.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Segment2<EIK> segment, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EIK> segment, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EIK> segment, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EIK> segment, Segment2<EIK> segment2)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EIK> segment, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Segment2<EIK> segment, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_SegmentBox(segment.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Triangle2<EIK> triangle2)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        public static bool DoIntersect(Triangle2<EIK> triangle, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_TriangleBox(triangle.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Box2<EIK> box, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxPoint(box.Ptr, point.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EIK> box, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxLine(box.Ptr, line.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EIK> box, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxRay(box.Ptr, ray.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EIK> box, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxSegment(box.Ptr, segment.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EIK> box, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxTriangle(box.Ptr, triangle.Ptr);\n        }\n\n        public static bool DoIntersect(Box2<EIK> box, Box2<EIK> box2)\n        {\n            return Intersections_Geometry_EIK_DoIntersect_BoxBox(box.Ptr, box2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Point2<EIK> point, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_Intersection_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EIK> point, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_Intersection_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EIK> point, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_Intersection_PointSegment(point.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EIK> point, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_Intersection_PointTriangle(point.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Point2<EIK> point, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_Intersection_PointBox(point.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_Intersection_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Line2<EIK> line2)\n        {\n            return Intersections_Geometry_EIK_Intersection_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_Intersection_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_Intersection_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_Intersection_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Line2<EIK> line, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_Intersection_LineBox(line.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_Intersection_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_Intersection_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Ray2<EIK> ray2)\n        {\n            return Intersections_Geometry_EIK_Intersection_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_Intersection_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_Intersection_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2<EIK> ray, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_Intersection_RayBox(ray.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Segment2<EIK> segment2)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2<EIK> segment, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_Intersection_SegmentBox(segment.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_Intersection_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_Intersection_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_Intersection_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_Intersection_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Triangle2<EIK> triangle2)\n        {\n            return Intersections_Geometry_EIK_Intersection_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2<EIK> triangle, Box2<EIK> box)\n        {\n            return Intersections_Geometry_EIK_Intersection_TriangleBox(triangle.Ptr, box.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxPoint(box.Ptr, point.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxLine(box.Ptr, line.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxRay(box.Ptr, ray.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxSegment(box.Ptr, segment.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxTriangle(box.Ptr, triangle.Ptr);\n        }\n\n        public static IntersectionResult2d Intersection(Box2<EIK> box, Box2<EIK> box2)\n        {\n            return Intersections_Geometry_EIK_Intersection_BoxBox(box.Ptr, box2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///              The Point SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Point2<EIK> point, Point2<EIK> point2)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_PointPoint(point.Ptr, point2.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EIK> point, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_PointLine(point.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EIK> point, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_PointRay(point.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EIK> point, Segment2<EIK> seg)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_PointSegment(point.Ptr, seg.Ptr);\n        }\n\n        public static double SqrDistance(Point2<EIK> point, Triangle2<EIK> tri)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_PointTriangle(point.Ptr, tri.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Line2<EIK> line, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_LinePoint(line.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EIK> line, Line2<EIK> line2)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_LineLine(line.Ptr, line2.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EIK> line, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_LineRay(line.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EIK> line, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_LineSegment(line.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Line2<EIK> line, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_LineTriangle(line.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Ray2<EIK> ray, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_RayPoint(ray.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EIK> ray, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_RayLine(ray.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EIK> ray, Ray2<EIK> ray2)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_RayRay(ray.Ptr, ray2.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EIK> ray, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_RaySegment(ray.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Ray2<EIK> ray, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_RayTriangle(ray.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Segment2<EIK> segment, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_SegmentPoint(segment.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EIK> segment, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_SegmentLine(segment.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EIK> segment, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_SegmentRay(segment.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EIK> segment, Segment2<EIK> segment2)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_SegmentSegment(segment.Ptr, segment2.Ptr);\n        }\n\n        public static double SqrDistance(Segment2<EIK> segment, Triangle2<EIK> triangle)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_SegmentTriangle(segment.Ptr, triangle.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Triangle2<EIK> triangle, Point2<EIK> point)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_TrianglePoint(triangle.Ptr, point.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EIK> triangle, Line2<EIK> line)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_TriangleLine(triangle.Ptr, line.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EIK> triangle, Ray2<EIK> ray)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_TriangleRay(triangle.Ptr, ray.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EIK> triangle, Segment2<EIK> segment)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_TriangleSegment(triangle.Ptr, segment.Ptr);\n        }\n\n        public static double SqrDistance(Triangle2<EIK> triangle, Triangle2<EIK> triangle2)\n        {\n            return Intersections_Geometry_EIK_SqrDistance_TriangleTriangle(triangle.Ptr, triangle2.Ptr);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_PointSegment(IntPtr point, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_PointTriangle(IntPtr point, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_PointBox(IntPtr point, IntPtr box);\n\n  \n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Linet DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LineTriangle(IntPtr line, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_LineBox(IntPtr line, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RayLine(IntPtr ray, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_RayBox(IntPtr ray, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentLine(IntPtr segment, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_SegmentBox(IntPtr segment, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TriangleLine(IntPtr triangle, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_TriangleBox(IntPtr triangle, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxPoint(IntPtr box, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxLine(IntPtr box, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxRay(IntPtr box, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxSegment(IntPtr box, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxTriangle(IntPtr box, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Geometry_EIK_DoIntersect_BoxBox(IntPtr box, IntPtr box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointSegment(IntPtr point, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointTriangle(IntPtr point, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointBox(IntPtr point, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineTriangle(IntPtr line, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineBox(IntPtr line, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayLine(IntPtr ray, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayBox(IntPtr ray, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentLine(IntPtr segment, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentBox(IntPtr segment, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleLine(IntPtr triangle, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleBox(IntPtr triangle, IntPtr box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxPoint(IntPtr box, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxLine(IntPtr box, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxRay(IntPtr box, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxSegment(IntPtr box, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxTriangle(IntPtr box, IntPtr triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxBox(IntPtr box, IntPtr box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///               The Point SqrDistance extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_PointPoint(IntPtr point, IntPtr point2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_PointLine(IntPtr point, IntPtr line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_PointRay(IntPtr point, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_PointSegment(IntPtr point, IntPtr seg);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_PointTriangle(IntPtr point, IntPtr tri);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_LinePoint(IntPtr line, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_LineLine(IntPtr line, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_LineRay(IntPtr line, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_LineSegment(IntPtr line, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_LineTriangle(IntPtr line, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_RayPoint(IntPtr ray, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_RayLine(IntPtr ray, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_RayRay(IntPtr ray, IntPtr ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_RaySegment(IntPtr ray, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_RayTriangle(IntPtr ray, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_SegmentPoint(IntPtr segment, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_SegmentLine(IntPtr segment, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_SegmentRay(IntPtr segment, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_SegmentSegment(IntPtr segment, IntPtr segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_SegmentTriangle(IntPtr segment, IntPtr triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_TrianglePoint(IntPtr triangle, IntPtr point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_TriangleLine(IntPtr triangle, IntPtr line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_TriangleRay(IntPtr triangle, IntPtr ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_TriangleSegment(IntPtr triangle, IntPtr segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Geometry_EIK_SqrDistance_TriangleTriangle(IntPtr triangle, IntPtr triangle2);\n       \n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/CGALIntersections_Shapes.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNet.Polygons;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n\n    /// <summary>\n    /// The static intersection class.\n    /// </summary>\n    public static partial class CGALIntersections\n    {\n        public const string DLL_NAME = \"CGALWrapper.dll\";\n\n        public const CallingConvention CDECL = CallingConvention.Cdecl;\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Point2d point, Line2d line)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_PointLine(point, line);\n        }\n\n        public static bool DoIntersect(Point2d point, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_PointRay(point, ray);\n        }\n\n        public static bool DoIntersect(Point2d point, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_PointSegment(point, segment);\n        }\n\n        public static bool DoIntersect(Point2d point, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_PointTriangle(point, triangle);\n        }\n\n        public static bool DoIntersect(Point2d point, Box2d box)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_PointBox(point, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Line2d line, Point2d point)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LinePoint(line, point);\n        }\n\n        public static bool DoIntersect(Line2d line, Line2d line2)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LineLine(line, line2);\n        }\n\n        public static bool DoIntersect(Line2d line, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LineRay(line, ray);\n        }\n\n        public static bool DoIntersect(Line2d line, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LineSegment(line, segment);\n        }\n\n        public static bool DoIntersect(Line2d line, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LineTriangle(line, triangle);\n        }\n\n        public static bool DoIntersect(Line2d line, Box2d box)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_LineBox(line, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Ray2d ray, Point2d point)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RayPoint(ray, point);\n        }\n\n        public static bool DoIntersect(Ray2d ray, Line2d line)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RayLine(ray, line);\n        }\n\n        public static bool DoIntersect(Ray2d ray, Ray2d ray2)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RayRay(ray, ray2);\n        }\n\n        public static bool DoIntersect(Ray2d ray, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RaySegment(ray, segment);\n        }\n\n        public static bool DoIntersect(Ray2d ray, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RayTriangle(ray, triangle);\n        }\n\n        public static bool DoIntersect(Ray2d ray, Box2d box)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_RayBox(ray, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Segment2d segment, Point2d point)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentPoint(segment, point);\n        }\n\n        public static bool DoIntersect(Segment2d segment, Line2d line)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentLine(segment, line);\n        }\n\n        public static bool DoIntersect(Segment2d segment, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentRay(segment, ray);\n        }\n\n        public static bool DoIntersect(Segment2d segment, Segment2d segment2)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentSegment(segment, segment2);\n        }\n\n        public static bool DoIntersect(Segment2d segment, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentTriangle(segment, triangle);\n        }\n\n        public static bool DoIntersect(Segment2d segment, Box2d box)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_SegmentBox(segment, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Triangle2d triangle, Point2d point)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TrianglePoint(triangle, point);\n        }\n\n        public static bool DoIntersect(Triangle2d triangle, Line2d line)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TriangleLine(triangle, line);\n        }\n\n        public static bool DoIntersect(Triangle2d triangle, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TriangleRay(triangle, ray);\n        }\n\n        public static bool DoIntersect(Triangle2d triangle, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TriangleSegment(triangle, segment);\n        }\n\n        public static bool DoIntersect(Triangle2d triangle, Triangle2d triangle2)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TriangleTriangle(triangle, triangle2);\n        }\n\n        public static bool DoIntersect(Triangle2d triangle, Box2d box)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_TriangleBox(triangle, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static bool DoIntersect(Box2d box, Point2d point)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxPoint(box, point);\n        }\n\n        public static bool DoIntersect(Box2d box, Line2d line)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxLine(box, line);\n        }\n\n        public static bool DoIntersect(Box2d box, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxRay(box, ray);\n        }\n\n        public static bool DoIntersect(Box2d box, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxSegment(box, segment);\n        }\n\n        public static bool DoIntersect(Box2d box, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxTriangle(box, triangle);\n        }\n\n        public static bool DoIntersect(Box2d box, Box2d boxd)\n        {\n            return Intersections_Shapes_EIK_DoIntersect_BoxBox(box, boxd);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Point2d point, Line2d line)\n        {\n            return Intersections_Shapes_EIK_Intersection_PointLine(point, line);\n        }\n\n        public static IntersectionResult2d Intersection(Point2d point, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_Intersection_PointRay(point, ray);\n        }\n\n        public static IntersectionResult2d Intersection(Point2d point, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_Intersection_PointSegment(point, segment);\n        }\n\n        public static IntersectionResult2d Intersection(Point2d point, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_Intersection_PointTriangle(point, triangle);\n        }\n\n        public static IntersectionResult2d Intersection(Point2d point, Box2d box)\n        {\n            return Intersections_Shapes_EIK_Intersection_PointBox(point, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Line2d line, Point2d point)\n        {\n            return Intersections_Shapes_EIK_Intersection_LinePoint(line, point);\n        }\n\n        public static IntersectionResult2d Intersection(Line2d line, Line2d line2)\n        {\n            return Intersections_Shapes_EIK_Intersection_LineLine(line, line2);\n        }\n\n        public static IntersectionResult2d Intersection(Line2d line, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_Intersection_LineRay(line, ray);\n        }\n\n        public static IntersectionResult2d Intersection(Line2d line, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_Intersection_LineSegment(line, segment);\n        }\n\n        public static IntersectionResult2d Intersection(Line2d line, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_Intersection_LineTriangle(line, triangle);\n        }\n\n        public static IntersectionResult2d Intersection(Line2d line, Box2d box)\n        {\n            return Intersections_Shapes_EIK_Intersection_LineBox(line, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Point2d point)\n        {\n            return Intersections_Shapes_EIK_Intersection_RayPoint(ray, point);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Line2d line)\n        {\n            return Intersections_Shapes_EIK_Intersection_RayLine(ray, line);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Ray2d ray2)\n        {\n            return Intersections_Shapes_EIK_Intersection_RayRay(ray, ray2);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_Intersection_RaySegment(ray, segment);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_Intersection_RayTriangle(ray, triangle);\n        }\n\n        public static IntersectionResult2d Intersection(Ray2d ray, Box2d box)\n        {\n            return Intersections_Shapes_EIK_Intersection_RayBox(ray, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Point2d point)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentPoint(segment, point);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Line2d line)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentLine(segment, line);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentRay(segment, ray);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Segment2d segment2)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentSegment(segment, segment2);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentTriangle(segment, triangle);\n        }\n\n        public static IntersectionResult2d Intersection(Segment2d segment, Box2d box)\n        {\n            return Intersections_Shapes_EIK_Intersection_SegmentBox(segment, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Point2d point)\n        {\n            return Intersections_Shapes_EIK_Intersection_TrianglePoint(triangle, point);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Line2d line)\n        {\n            return Intersections_Shapes_EIK_Intersection_TriangleLine(triangle, line);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_Intersection_TriangleRay(triangle, ray);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_Intersection_TriangleSegment(triangle, segment);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Triangle2d triangle2)\n        {\n            return Intersections_Shapes_EIK_Intersection_TriangleTriangle(triangle, triangle2);\n        }\n\n        public static IntersectionResult2d Intersection(Triangle2d triangle, Box2d box)\n        {\n            return Intersections_Shapes_EIK_Intersection_TriangleBox(triangle, box);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static IntersectionResult2d Intersection(Box2d box, Point2d point)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxPoint(box, point);\n        }\n\n        public static IntersectionResult2d Intersection(Box2d box, Line2d line)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxLine(box, line);\n        }\n\n        public static IntersectionResult2d Intersection(Box2d box, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxRay(box, ray);\n        }\n\n        public static IntersectionResult2d Intersection(Box2d box, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxSegment(box, segment);\n        }\n\n        public static IntersectionResult2d Intersection(Box2d box, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxTriangle(box, triangle);\n        }\n\n        public static IntersectionResult2d Intersection(Box2d box, Box2d boxd)\n        {\n            return Intersections_Shapes_EIK_Intersection_BoxBox(box, boxd);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///              The Point SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Point2d point, Point2d point2)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_PointPoint(point, point2);\n        }\n\n        public static double SqrDistance(Point2d point, Line2d line)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_PointLine(point, line);\n        }\n\n        public static double SqrDistance(Point2d point, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_PointRay(point, ray);\n        }\n\n        public static double SqrDistance(Point2d point, Segment2d seg)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_PointSegment(point, seg);\n        }\n\n        public static double SqrDistance(Point2d point, Triangle2d tri)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_PointTriangle(point, tri);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Line2d line, Point2d point)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_LinePoint(line, point);\n        }\n\n        public static double SqrDistance(Line2d line, Line2d line2)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_LineLine(line, line2);\n        }\n\n        public static double SqrDistance(Line2d line, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_LineRay(line, ray);\n        }\n\n        public static double SqrDistance(Line2d line, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_LineSegment(line, segment);\n        }\n\n        public static double SqrDistance(Line2d line, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_LineTriangle(line, triangle);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance functions\n        /// \n        /// </summary>--------------------------------------------------------\n\n        public static double SqrDistance(Ray2d ray, Line2d line)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_RayLine(ray, line);\n        }\n\n        public static double SqrDistance(Ray2d ray, Ray2d ray2)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_RayRay(ray, ray2);\n        }\n\n        public static double SqrDistance(Ray2d ray, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_RaySegment(ray, segment);\n        }\n\n        public static double SqrDistance(Ray2d ray, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_RayTriangle(ray, triangle);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Segment2d segment, Point2d point)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_SegmentPoint(segment, point);\n        }\n\n        public static double SqrDistance(Segment2d segment, Line2d line)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_SegmentLine(segment, line);\n        }\n\n        public static double SqrDistance(Segment2d segment, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_SegmentRay(segment, ray);\n        }\n\n        public static double SqrDistance(Segment2d segment, Segment2d segment2)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_SegmentSegment(segment, segment2);\n        }\n\n        public static double SqrDistance(Segment2d segment, Triangle2d triangle)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_SegmentTriangle(segment, triangle);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance functions\n        /// \n        /// </summary>-----------------------------------------------------\n\n        public static double SqrDistance(Triangle2d triangle, Point2d point)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_TrianglePoint(triangle, point);\n        }\n\n        public static double SqrDistance(Triangle2d triangle, Line2d line)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_TriangleLine(triangle, line);\n        }\n\n        public static double SqrDistance(Triangle2d triangle, Ray2d ray)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_TriangleRay(triangle, ray);\n        }\n\n        public static double SqrDistance(Triangle2d triangle, Segment2d segment)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_TriangleSegment(triangle, segment);\n        }\n\n        public static double SqrDistance(Triangle2d triangle, Triangle2d triangle2)\n        {\n            return Intersections_Shapes_EIK_SqrDistance_TriangleTriangle(triangle, triangle2);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_PointLine(Point2d point, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_PointRay(Point2d point, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_PointSegment(Point2d point, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_PointTriangle(Point2d point, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_PointBox(Point2d point, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Linet DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LinePoint(Line2d line, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LineLine(Line2d line, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LineRay(Line2d line, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LineSegment(Line2d line, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LineTriangle(Line2d line, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_LineBox(Line2d line, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RayPoint(Ray2d ray, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RayLine(Ray2d ray, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RayRay(Ray2d ray, Ray2d ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RaySegment(Ray2d ray, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_RayBox(Ray2d ray, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentPoint(Segment2d segment, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentLine(Segment2d segment, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentRay(Segment2d segment, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_SegmentBox(Segment2d segment, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TrianglePoint(Triangle2d triangle, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TriangleLine(Triangle2d triangle, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_TriangleBox(Triangle2d triangle, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box DoIntersect extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxPoint(Box2d box, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxLine(Box2d box, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxRay(Box2d box, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxSegment(Box2d box, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxTriangle(Box2d box, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Intersections_Shapes_EIK_DoIntersect_BoxBox(Box2d box, Box2d box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointLine(Point2d point, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointRay(Point2d point, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointSegment(Point2d point, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointTriangle(Point2d point, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointBox(Point2d point, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LinePoint(Line2d line, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineLine(Line2d line, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineRay(Line2d line, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineSegment(Line2d line, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineTriangle(Line2d line, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineBox(Line2d line, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayPoint(Ray2d ray, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayLine(Ray2d ray, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayRay(Ray2d ray, Ray2d ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RaySegment(Ray2d ray, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayBox(Ray2d ray, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentPoint(Segment2d segment, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentLine(Segment2d segment, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentRay(Segment2d segment, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentBox(Segment2d segment, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TrianglePoint(Triangle2d triangle, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleLine(Triangle2d triangle, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleBox(Triangle2d triangle, Box2d box);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box Intersection extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxPoint(Box2d box, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxLine(Box2d box, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxRay(Box2d box, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxSegment(Box2d box, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxTriangle(Box2d box, Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxBox(Box2d box, Box2d box2);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///               The Point SqrDistance extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_PointPoint(Point2d point, Point2d point2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_PointLine(Point2d point, Line2d line);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_PointRay(Point2d point, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_PointSegment(Point2d point, Segment2d seg);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_PointTriangle(Point2d point, Triangle2d tri);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_LinePoint(Line2d line, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_LineLine(Line2d line, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_LineRay(Line2d line, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_LineSegment(Line2d line, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_LineTriangle(Line2d line, Triangle2d triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_RayPoint(Ray2d ray, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_RayLine(Ray2d ray, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_RayRay(Ray2d ray, Ray2d ray2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_RaySegment(Ray2d ray, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_SegmentPoint(Segment2d segment, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_SegmentLine(Segment2d segment, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_SegmentRay(Segment2d segment, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle SqrDistance extern functions\n        /// \n        /// </summary>------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_TrianglePoint(Triangle2d triangle, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_TriangleLine(Triangle2d triangle, Line2d line2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Intersections_Shapes_EIK_SqrDistance_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/GeometryKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Geometry\n{\n    internal abstract class GeometryKernel2 : CGALObjectKernel\n    {\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n        \n        internal abstract IntPtr Point2_Create();\n\n        internal abstract IntPtr Point2_CreateFromPoint(Point2d point);\n\n\t    internal abstract void Point2_Release(IntPtr ptr);\n\n        internal abstract double Point2_GetX(IntPtr ptr);\n\n        internal abstract double Point2_GetY(IntPtr ptr);\n\n        internal abstract void Point2_SetX(IntPtr ptr, double x);\n\n        internal abstract void Point2_SetY(IntPtr ptr, double y);\n\n        internal abstract IntPtr Point2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Point2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Vector2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Vector2_Create();\n\n        internal abstract IntPtr Vector2_CreateFromVector(Vector2d vector);\n\n\t    internal abstract void Vector2_Release(IntPtr ptr);\n\n        internal abstract double Vector2_GetX(IntPtr ptr);\n\n        internal abstract double Vector2_GetY(IntPtr ptr);\n\n        internal abstract void Vector2_SetX(IntPtr ptr, double x);\n\n        internal abstract void Vector2_SetY(IntPtr ptr, double y);\n\n\t    internal abstract double Vector2_SqrLength(IntPtr ptr);\n\n        internal abstract IntPtr Vector2_Perpendicular(IntPtr ptr, ORIENTATION orientation);\n\n        internal abstract void Vector2_Normalize(IntPtr ptr);\n\n        internal abstract double Vector2_Magnitude(IntPtr ptr);\n\n        internal abstract IntPtr Vector2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Vector2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The HPoint2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr HPoint2_Create();\n\n        internal abstract IntPtr HPoint2_CreateFromPoint( HPoint2d point);\n\n\t    internal abstract void HPoint2_Release(IntPtr ptr);\n\n        internal abstract double HPoint2_GetX(IntPtr ptr);\n\n        internal abstract double HPoint2_GetY(IntPtr ptr);\n\n        internal abstract double HPoint2_GetW(IntPtr ptr);\n\n        internal abstract void HPoint2_SetX(IntPtr ptr, double x);\n\n        internal abstract void HPoint2_SetY(IntPtr ptr, double y);\n\n        internal abstract void HPoint2_SetW(IntPtr ptr, double y);\n\n        internal abstract IntPtr HPoint2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr HPoint2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Line2_Create(double a, double b, double c);\n\n        internal abstract IntPtr CreateFromPoints(Point2d p1, Point2d p2);\n\n\t    internal abstract IntPtr CreateFromPointVector(Point2d p, Vector2d v);\n\n        internal abstract void Line2_Release(IntPtr ptr);\n\n        internal abstract double Line2_GetA(IntPtr ptr);\n\n        internal abstract double Line2_GetB(IntPtr ptr);\n\n        internal abstract double Line2_GetC(IntPtr ptr);\n\n        internal abstract void Line2_SetA(IntPtr ptr, double a);\n\n        internal abstract void Line2_SetB(IntPtr ptr, double b);\n\n        internal abstract void Line2_SetC(IntPtr ptr, double c);\n\n        internal abstract bool Line2_IsDegenerate(IntPtr ptr);\n\n        internal abstract bool Line2_IsHorizontal(IntPtr ptr);\n\n        internal abstract bool Line2_IsVertical(IntPtr ptr);\n\n        internal abstract bool Line2_HasOn(IntPtr linePtr, Point2d point);\n\n        internal abstract bool Line2_HasOnNegativeSide(IntPtr linePtr, Point2d point);\n\n        internal abstract bool Line2_HasOnPositiveSide(IntPtr linePtr, Point2d point);\n\n        internal abstract IntPtr Line2_Opposite(IntPtr ptr);\n\n        internal abstract IntPtr Line2_Perpendicular(IntPtr ptr, Point2d point);\n\n        internal abstract double Line2_X_On_Y(IntPtr ptr, double y);\n\n        internal abstract double Line2_Y_On_X(IntPtr ptr, double x);\n\n        internal abstract Vector2d Line2_Vector(IntPtr ptr);\n\n        internal abstract void Line2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        internal abstract IntPtr Line2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Line2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Ray2_Create(Point2d position, Vector2d direction);\n\n        internal abstract void Ray2_Release(IntPtr ptr);\n\n        internal abstract bool Ray2_IsDegenerate(IntPtr ptr);\n\n        internal abstract bool Ray2_IsHorizontal(IntPtr ptr);\n\n        internal abstract bool Ray2_IsVertical(IntPtr ptr);\n\n        internal abstract bool Ray2_HasOn(IntPtr rayPtr,  Point2d point);\n\n\t    internal abstract Point2d Ray2_Source(IntPtr ptr);\n\n        internal abstract Vector2d Ray2_Vector(IntPtr ptr);\n\n        internal abstract IntPtr Ray2_Opposite(IntPtr ptr);\n\n        internal abstract IntPtr Ray2_Line(IntPtr ptr);\n\n        internal abstract void Ray2_Transform(IntPtr ptr,  Point2d translation, double rotation, double scale);\n\n        internal abstract IntPtr Ray2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Ray2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Segment2_Create(Point2d a, Point2d b);\n\n        internal abstract void Segment2_Release(IntPtr ptr);\n\n        internal abstract Point2d Segment2_GetVertex(IntPtr ptr, int i);\n\n        internal abstract void Segment2_SetVertex(IntPtr ptr, int i,  Point2d point);\n\n\t    internal abstract Point2d Segment2_Min(IntPtr ptr);\n\n        internal abstract Point2d Segment2_Max(IntPtr ptr);\n\n        internal abstract bool Segment2_IsDegenerate(IntPtr ptr);\n\n        internal abstract bool Segment2_IsHorizontal(IntPtr ptr);\n\n        internal abstract bool Segment2_IsVertical(IntPtr ptr);\n\n        internal abstract bool Segment2_HasOn(IntPtr segPtr,  Point2d point);\n\n\t    internal abstract Vector2d Segment2_Vector(IntPtr ptr);\n\n        internal abstract IntPtr Segment2_Line(IntPtr ptr);\n\n        internal abstract double Segment2_SqrLength(IntPtr ptr);\n\n        internal abstract void Segment2_Transform(IntPtr ptr,  Point2d translation, double rotation, double scale);\n\n        internal abstract IntPtr Segment2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Segment2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Triangle2_Create(Point2d a, Point2d b, Point2d c);\n\n        internal abstract void Triangle2_Release(IntPtr ptr);\n\n        internal abstract Point2d Triangle2_GetVertex(IntPtr ptr, int i);\n\n        internal abstract void Triangle2_SetVertex(IntPtr ptr, int i,  Point2d point);\n\n\t    internal abstract double Triangle2_Area(IntPtr ptr);\n\n        internal abstract BOUNDED_SIDE Triangle2_BoundedSide(IntPtr ptr,  Point2d point);\n\n\t    internal abstract ORIENTED_SIDE Triangle2_OrientedSide(IntPtr ptr,  Point2d point);\n\n\t    internal abstract ORIENTATION Triangle2_Orientation(IntPtr ptr);\n\n        internal abstract bool Triangle2_IsDegenerate(IntPtr ptr);\n\n        internal abstract void Triangle2_Transform(IntPtr ptr,  Point2d translation, double rotation, double scale);\n\n        internal abstract IntPtr Triangle2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Triangle2_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal abstract IntPtr Box2_Create(Point2d min, Point2d max);\n\n        internal abstract void Box2_Release(IntPtr ptr);\n\n        internal abstract Point2d Box2_GetMin(IntPtr ptr);\n\n        internal abstract void Box2_SetMin(IntPtr ptr, Point2d point);\n\n        internal abstract Point2d Box2_GetMax(IntPtr ptr);\n\n        internal abstract void Box2_SetMax(IntPtr ptr, Point2d point);\n\n        internal abstract double Box2_Area(IntPtr ptr);\n\n        internal abstract BOUNDED_SIDE Box2_BoundedSide(IntPtr ptr, Point2d point);\n\n        internal abstract bool Box2_ContainsPoint(IntPtr ptr, Point2d point, bool inculdeBoundary);\n\n        internal abstract bool Box2_IsDegenerate(IntPtr ptr);\n\n        internal abstract void Box2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        internal abstract IntPtr Box2_Copy(IntPtr ptr);\n\n        internal abstract IntPtr Box2_Convert(IntPtr ptr, CGAL_KERNEL k);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/GeometryKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    internal class GeometryKernel2_EEK : GeometryKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly GeometryKernel2 Instance = new GeometryKernel2_EEK();\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Point2_Create()\n        {\n            return Point2_Create();\n        }\n\n        internal override IntPtr Point2_CreateFromPoint(Point2d point)\n        {\n            return Point2_EEK_CreateFromPoint(point);\n        }\n\n        internal override void Point2_Release(IntPtr ptr)\n        {\n            Point2_EEK_Release(ptr);\n        }\n\n        internal override double Point2_GetX(IntPtr ptr)\n        {\n            return Point2_EEK_GetX(ptr);\n        }\n\n        internal override double Point2_GetY(IntPtr ptr)\n        {\n            return Point2_EEK_GetY(ptr);\n        }\n\n        internal override void Point2_SetX(IntPtr ptr, double x)\n        {\n            Point2_EEK_SetX(ptr, x);\n        }\n\n        internal override void Point2_SetY(IntPtr ptr, double y)\n        {\n            Point2_EEK_SetY(ptr, y);\n        }\n\n        internal override IntPtr Point2_Copy(IntPtr ptr)\n        {\n            return Point2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Point2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Point2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Vector2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Vector2_Create()\n        {\n            return Vector2_EEK_Create();\n        }\n\n        internal override IntPtr Vector2_CreateFromVector(Vector2d vector)\n        {\n            return Vector2_EEK_CreateFromVector(vector);\n        }\n\n        internal override void Vector2_Release(IntPtr ptr)\n        {\n            Vector2_EEK_Release(ptr);\n        }\n\n        internal override double Vector2_GetX(IntPtr ptr)\n        {\n            return Vector2_EEK_GetX(ptr);\n        }\n\n        internal override double Vector2_GetY(IntPtr ptr)\n        {\n            return Vector2_EEK_GetY(ptr);\n        }\n\n        internal override void Vector2_SetX(IntPtr ptr, double x)\n        {\n            Vector2_EEK_SetX(ptr, x);\n        }\n\n        internal override void Vector2_SetY(IntPtr ptr, double y)\n        {\n            Vector2_EEK_SetY(ptr, y);\n        }\n\n        internal override double Vector2_SqrLength(IntPtr ptr)\n        {\n            return Vector2_EEK_SqrLength(ptr);\n        }\n\n        internal override IntPtr Vector2_Perpendicular(IntPtr ptr, ORIENTATION orientation)\n        {\n            return Vector2_EEK_Perpendicular(ptr, orientation);\n        }\n\n        internal override void Vector2_Normalize(IntPtr ptr)\n        {\n            Vector2_EEK_Normalize(ptr);\n        }\n\n        internal override double Vector2_Magnitude(IntPtr ptr)\n        {\n            return Vector2_EEK_Magnitude(ptr);\n        }\n\n        internal override IntPtr Vector2_Copy(IntPtr ptr)\n        {\n            return Vector2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Vector2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Vector2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The HPoint2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr HPoint2_Create()\n        {\n            return HPoint2_Create();\n        }\n\n        internal override IntPtr HPoint2_CreateFromPoint(HPoint2d point)\n        {\n            return HPoint2_EEK_CreateFromPoint(point);\n        }\n\n        internal override void HPoint2_Release(IntPtr ptr)\n        {\n            HPoint2_EEK_Release(ptr);\n        }\n\n        internal override double HPoint2_GetX(IntPtr ptr)\n        {\n            return HPoint2_EEK_GetX(ptr);\n        }\n\n        internal override double HPoint2_GetY(IntPtr ptr)\n        {\n            return HPoint2_EEK_GetY(ptr);\n        }\n\n        internal override double HPoint2_GetW(IntPtr ptr)\n        {\n            return HPoint2_EEK_GetW(ptr);\n        }\n\n        internal override void HPoint2_SetX(IntPtr ptr, double x)\n        {\n            HPoint2_EEK_SetX(ptr, x);\n        }\n\n        internal override void HPoint2_SetY(IntPtr ptr, double y)\n        {\n            HPoint2_EEK_SetY(ptr, y);\n        }\n\n        internal override void HPoint2_SetW(IntPtr ptr, double w)\n        {\n            HPoint2_EEK_SetW(ptr, w);\n        }\n\n        internal override IntPtr HPoint2_Copy(IntPtr ptr)\n        {\n            return HPoint2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr HPoint2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return HPoint2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Line2_Create(double a, double b, double c)\n        {\n            return Line2_EEK_Create(a, b, c);\n        }\n\n        internal override IntPtr CreateFromPoints(Point2d p1, Point2d p2)\n        {\n            return Line2_EEK_CreateFromPoints(p1, p2);\n        }\n\n        internal override IntPtr CreateFromPointVector(Point2d p, Vector2d v)\n        {\n            return Line2_EEK_CreateFromPointVector(p, v);\n        }\n\n        internal override void Line2_Release(IntPtr ptr)\n        {\n            Line2_EEK_Release(ptr);\n        }\n\n        internal override double Line2_GetA(IntPtr ptr)\n        {\n            return Line2_EEK_GetA(ptr);\n        }\n\n        internal override double Line2_GetB(IntPtr ptr)\n        {\n            return Line2_EEK_GetB(ptr);\n        }\n\n        internal override double Line2_GetC(IntPtr ptr)\n        {\n            return Line2_EEK_GetC(ptr);\n        }\n\n        internal override void Line2_SetA(IntPtr ptr, double a)\n        {\n            Line2_EEK_SetA(ptr, a);\n        }\n\n        internal override void Line2_SetB(IntPtr ptr, double b)\n        {\n            Line2_EEK_SetB(ptr, b);\n        }\n\n        internal override void Line2_SetC(IntPtr ptr, double c)\n        {\n            Line2_EEK_SetC(ptr, c);\n        }\n\n        internal override bool Line2_IsDegenerate(IntPtr ptr)\n        {\n            return Line2_EEK_IsDegenerate(ptr);\n        }\n\n        internal override bool Line2_IsHorizontal(IntPtr ptr)\n        {\n            return Line2_EEK_IsHorizontal(ptr);\n        }\n\n        internal override bool Line2_IsVertical(IntPtr ptr)\n        {\n            return Line2_EEK_IsVertical(ptr);\n        }\n\n        internal override bool Line2_HasOn(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EEK_HasOn(linePtr, point);\n        }\n\n        internal override bool Line2_HasOnNegativeSide(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EEK_HasOnNegativeSide(linePtr, point);\n        }\n\n        internal override bool Line2_HasOnPositiveSide(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EEK_HasOnPositiveSide(linePtr, point);\n        }\n\n        internal override IntPtr Line2_Opposite(IntPtr ptr)\n        {\n            return Line2_EEK_Opposite(ptr);\n        }\n\n        internal override IntPtr Line2_Perpendicular(IntPtr ptr, Point2d point)\n        {\n            return Line2_EEK_Perpendicular(ptr, point);\n        }\n\n        internal override double Line2_X_On_Y(IntPtr ptr, double y)\n        {\n            return Line2_EEK_X_On_Y(ptr, y);\n        }\n\n        internal override double Line2_Y_On_X(IntPtr ptr, double x)\n        {\n            return Line2_EEK_Y_On_X(ptr, x);\n        }\n\n        internal override Vector2d Line2_Vector(IntPtr ptr)\n        {\n            return Line2_EEK_Vector(ptr);\n        }\n\n        internal override void Line2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Line2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Line2_Copy(IntPtr ptr)\n        {\n            return Line2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Line2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Line2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Ray2_Create(Point2d position, Vector2d direction)\n        {\n            return Ray2_EEK_Create(position, direction);\n        }\n\n        internal override void Ray2_Release(IntPtr ptr)\n        {\n            Ray2_EEK_Release(ptr);\n        }\n\n        internal override bool Ray2_IsDegenerate(IntPtr ptr)\n        {\n            return Box2_EEK_IsDegenerate(ptr);\n        }\n\n        internal override bool Ray2_IsHorizontal(IntPtr ptr)\n        {\n            return Ray2_EEK_IsHorizontal(ptr);\n        }\n\n        internal override bool Ray2_IsVertical(IntPtr ptr)\n        {\n            return Ray2_EEK_IsVertical(ptr);\n        }\n\n        internal override bool Ray2_HasOn(IntPtr rayPtr, Point2d point)\n        {\n            return Ray2_EEK_HasOn(rayPtr, point);\n        }\n\n        internal override Point2d Ray2_Source(IntPtr ptr)\n        {\n            return Ray2_EEK_Source(ptr);\n        }\n\n        internal override Vector2d Ray2_Vector(IntPtr ptr)\n        {\n            return Ray2_EEK_Vector(ptr);\n        }\n\n        internal override IntPtr Ray2_Opposite(IntPtr ptr)\n        {\n            return Ray2_EEK_Opposite(ptr);\n        }\n\n        internal override IntPtr Ray2_Line(IntPtr ptr)\n        {\n            return Ray2_EEK_Line(ptr);\n        }\n\n        internal override void Ray2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Ray2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Ray2_Copy(IntPtr ptr)\n        {\n            return Ray2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Ray2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Ray2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Segment2_Create(Point2d a, Point2d b)\n        {\n            return Segment2_EEK_Create(a, b);\n        }\n\n        internal override void Segment2_Release(IntPtr ptr)\n        {\n            Segment2_EEK_Release(ptr);\n        }\n\n        internal override Point2d Segment2_GetVertex(IntPtr ptr, int i)\n        {\n            return Segment2_EEK_GetVertex(ptr, i);\n        }\n\n        internal override void Segment2_SetVertex(IntPtr ptr, int i, Point2d point)\n        {\n            Segment2_EEK_SetVertex(ptr, i, point);\n        }\n\n        internal override Point2d Segment2_Min(IntPtr ptr)\n        {\n            return Segment2_EEK_Min(ptr);\n        }\n\n        internal override Point2d Segment2_Max(IntPtr ptr)\n        {\n            return Segment2_EEK_Max(ptr);\n        }\n\n        internal override bool Segment2_IsDegenerate(IntPtr ptr)\n        {\n            return Segment2_EEK_IsDegenerate(ptr);\n        }\n\n        internal override bool Segment2_IsHorizontal(IntPtr ptr)\n        {\n            return Segment2_EEK_IsHorizontal(ptr);\n        }\n\n        internal override bool Segment2_IsVertical(IntPtr ptr)\n        {\n            return Segment2_EEK_IsVertical(ptr);\n        }\n\n        internal override bool Segment2_HasOn(IntPtr segPtr, Point2d point)\n        {\n            return Segment2_EEK_HasOn(segPtr, point);\n        }\n\n        internal override Vector2d Segment2_Vector(IntPtr ptr)\n        {\n            return Segment2_EEK_Vector(ptr);\n        }\n\n        internal override IntPtr Segment2_Line(IntPtr ptr)\n        {\n            return Segment2_EEK_Line(ptr);\n        }\n\n        internal override double Segment2_SqrLength(IntPtr ptr)\n        {\n            return Segment2_EEK_SqrLength(ptr);\n        }\n\n        internal override void Segment2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Segment2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Segment2_Copy(IntPtr ptr)\n        {\n            return Segment2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Segment2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Segment2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Triangle2_Create(Point2d a, Point2d b, Point2d c)\n        {\n            return Triangle2_EEK_Create(a, b, c);\n        }\n\n        internal override void Triangle2_Release(IntPtr ptr)\n        {\n            Triangle2_EEK_Release(ptr);\n        }\n\n        internal override Point2d Triangle2_GetVertex(IntPtr ptr, int i)\n        {\n            return Triangle2_EEK_GetVertex(ptr, i);\n        }\n\n        internal override void Triangle2_SetVertex(IntPtr ptr, int i, Point2d point)\n        {\n            Segment2_EEK_SetVertex(ptr, i, point);\n        }\n\n        internal override double Triangle2_Area(IntPtr ptr)\n        {\n            return Triangle2_EEK_Area(ptr);\n        }\n\n        internal override BOUNDED_SIDE Triangle2_BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Triangle2_EEK_BoundedSide(ptr, point);\n        }\n\n        internal override ORIENTED_SIDE Triangle2_OrientedSide(IntPtr ptr, Point2d point)\n        {\n            return Triangle2_EEK_OrientedSide(ptr, point);\n        }\n\n        internal override ORIENTATION Triangle2_Orientation(IntPtr ptr)\n        {\n            return Triangle2_EEK_Orientation(ptr);\n        }\n\n        internal override bool Triangle2_IsDegenerate(IntPtr ptr)\n        {\n            return Triangle2_EEK_IsDegenerate(ptr);\n        }\n\n        internal override void Triangle2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Triangle2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Triangle2_Copy(IntPtr ptr)\n        {\n            return Triangle2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Triangle2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Triangle2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The IsoRectancle2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Box2_Create(Point2d min, Point2d max)\n        {\n            return Box2_EEK_Create(min, max);\n        }\n\n        internal override void Box2_Release(IntPtr ptr)\n        {\n            Box2_EEK_Release(ptr);\n        }\n\n        internal override Point2d Box2_GetMin(IntPtr ptr)\n        {\n            return Box2_EEK_GetMin(ptr);\n        }\n\n        internal override void Box2_SetMin(IntPtr ptr, Point2d point)\n        {\n            Box2_EEK_SetMin(ptr, point);\n        }\n\n        internal override Point2d Box2_GetMax(IntPtr ptr)\n        {\n            return Box2_EEK_GetMax(ptr);\n        }\n\n        internal override void Box2_SetMax(IntPtr ptr, Point2d point)\n        {\n            Box2_EEK_SetMax(ptr, point);\n        }\n\n        internal override double Box2_Area(IntPtr ptr)\n        {\n            return Box2_EEK_Area(ptr);\n        }\n\n        internal override BOUNDED_SIDE Box2_BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Box2_EEK_BoundedSide(ptr, point);\n        }\n        internal override bool Box2_ContainsPoint(IntPtr ptr, Point2d point, bool inculdeBoundary)\n        {\n            return Box2_EEK_ContainsPoint(ptr, point, inculdeBoundary);\n        }\n\n        internal override bool Box2_IsDegenerate(IntPtr ptr)\n        {\n            return Box2_EEK_IsDegenerate(ptr);\n        }\n\n        internal override void Box2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Box2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Box2_Copy(IntPtr ptr)\n        {\n            return Box2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Box2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Box2_EEK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EEK_CreateFromPoint(Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Point2_EEK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Point2_EEK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EEK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EEK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Vector2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EEK_CreateFromVector(Vector2d vector);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EEK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EEK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EEK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EEK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EEK_SqrLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EEK_Perpendicular(IntPtr ptr, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EEK_Normalize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EEK_Magnitude(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The HPoint2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EEK_CreateFromPoint(HPoint2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EEK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EEK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EEK_GetW(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EEK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EEK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EEK_SetW(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_Create(double a, double b, double c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_CreateFromPoints(Point2d p1, Point2d p2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_CreateFromPointVector(Point2d p, Vector2d v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EEK_GetA(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EEK_GetB(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EEK_GetC(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EEK_SetA(IntPtr ptr, double a);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EEK_SetB(IntPtr ptr, double b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EEK_SetC(IntPtr ptr, double c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_HasOn(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_HasOnNegativeSide(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EEK_HasOnPositiveSide(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_Opposite(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_Perpendicular(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EEK_X_On_Y(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EEK_Y_On_X(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Line2_EEK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EEK_Create(Point2d position, Vector2d direction);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Ray2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EEK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EEK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EEK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EEK_HasOn(IntPtr rayPtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Ray2_EEK_Source(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Ray2_EEK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EEK_Opposite(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EEK_Line(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Ray2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EEK_Create(Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EEK_GetVertex(IntPtr ptr, int i);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EEK_SetVertex(IntPtr ptr, int i, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EEK_Min(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EEK_Max(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EEK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EEK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EEK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EEK_HasOn(IntPtr segPtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Segment2_EEK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EEK_Line(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Segment2_EEK_SqrLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EEK_Create(Point2d a, Point2d b, Point2d c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Triangle2_EEK_GetVertex(IntPtr ptr, int i);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EEK_SetVertex(IntPtr ptr, int i, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Triangle2_EEK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Triangle2_EEK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE Triangle2_EEK_OrientedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION Triangle2_EEK_Orientation(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangle2_EEK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EEK_Create(Point2d min, Point2d max);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Box2_EEK_GetMin(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EEK_SetMin(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Box2_EEK_GetMax(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EEK_SetMax(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Box2_EEK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Box2_EEK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Box2_EEK_ContainsPoint(IntPtr ptr, Point2d point, bool inculdeBoundary);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Box2_EEK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/GeometryKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    internal class GeometryKernel2_EIK : GeometryKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly GeometryKernel2 Instance = new GeometryKernel2_EIK();\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Point2_Create()\n        {\n            return Point2_Create();\n        }\n\n        internal override IntPtr Point2_CreateFromPoint(Point2d point)\n        {\n            return Point2_EIK_CreateFromPoint(point);\n        }\n\n        internal override void Point2_Release(IntPtr ptr)\n        {\n            Point2_EIK_Release(ptr);\n        }\n\n        internal override double Point2_GetX(IntPtr ptr)\n        {\n            return Point2_EIK_GetX(ptr);\n        }\n\n        internal override double Point2_GetY(IntPtr ptr)\n        {\n            return Point2_EIK_GetY(ptr);\n        }\n\n        internal override void Point2_SetX(IntPtr ptr, double x)\n        {\n            Point2_EIK_SetX(ptr, x);\n        }\n\n        internal override void Point2_SetY(IntPtr ptr, double y)\n        {\n            Point2_EIK_SetY(ptr, y);\n        }\n\n        internal override IntPtr Point2_Copy(IntPtr ptr)\n        {\n            return Point2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Point2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Point2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Vector2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Vector2_Create()\n        {\n            return Vector2_EIK_Create();\n        }\n\n        internal override IntPtr Vector2_CreateFromVector(Vector2d vector)\n        {\n            return Vector2_EIK_CreateFromVector(vector);\n        }\n\n        internal override void Vector2_Release(IntPtr ptr)\n        {\n            Vector2_EIK_Release(ptr);\n        }\n\n        internal override double Vector2_GetX(IntPtr ptr)\n        {\n            return Vector2_EIK_GetX(ptr);\n        }\n\n        internal override double Vector2_GetY(IntPtr ptr)\n        {\n            return Vector2_EIK_GetY(ptr);\n        }\n\n        internal override void Vector2_SetX(IntPtr ptr, double x)\n        {\n            Vector2_EIK_SetX(ptr, x);\n        }\n\n        internal override void Vector2_SetY(IntPtr ptr, double y)\n        {\n            Vector2_EIK_SetY(ptr, y);\n        }\n\n        internal override double Vector2_SqrLength(IntPtr ptr)\n        {\n            return Vector2_EIK_SqrLength(ptr);\n        }\n\n        internal override IntPtr Vector2_Perpendicular(IntPtr ptr, ORIENTATION orientation)\n        {\n            return Vector2_EIK_Perpendicular(ptr, orientation);\n        }\n\n        internal override void Vector2_Normalize(IntPtr ptr)\n        {\n            Vector2_EIK_Normalize(ptr);\n        }\n\n        internal override double Vector2_Magnitude(IntPtr ptr)\n        {\n            return Vector2_EIK_Magnitude(ptr);\n        }\n\n        internal override IntPtr Vector2_Copy(IntPtr ptr)\n        {\n            return Vector2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Vector2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Vector2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The HPoint2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr HPoint2_Create()\n        {\n            return HPoint2_Create();\n        }\n\n        internal override IntPtr HPoint2_CreateFromPoint(HPoint2d point)\n        {\n            return HPoint2_EIK_CreateFromPoint(point);\n        }\n\n        internal override void HPoint2_Release(IntPtr ptr)\n        {\n            HPoint2_EIK_Release(ptr);\n        }\n\n        internal override double HPoint2_GetX(IntPtr ptr)\n        {\n            return HPoint2_EIK_GetX(ptr);\n        }\n\n        internal override double HPoint2_GetY(IntPtr ptr)\n        {\n            return HPoint2_EIK_GetY(ptr);\n        }\n\n        internal override double HPoint2_GetW(IntPtr ptr)\n        {\n            return HPoint2_EIK_GetW(ptr);\n        }\n\n        internal override void HPoint2_SetX(IntPtr ptr, double x)\n        {\n            HPoint2_EIK_SetX(ptr, x);\n        }\n\n        internal override void HPoint2_SetY(IntPtr ptr, double y)\n        {\n            HPoint2_EIK_SetY(ptr, y);\n        }\n\n        internal override void HPoint2_SetW(IntPtr ptr, double w)\n        {\n            HPoint2_EIK_SetW(ptr, w);\n        }\n\n        internal override IntPtr HPoint2_Copy(IntPtr ptr)\n        {\n            return HPoint2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr HPoint2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return HPoint2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Line2_Create(double a, double b, double c)\n        {\n            return Line2_EIK_Create(a, b, c);\n        }\n\n        internal override IntPtr CreateFromPoints(Point2d p1, Point2d p2)\n        {\n            return Line2_EIK_CreateFromPoints(p1, p2);\n        }\n\n        internal override IntPtr CreateFromPointVector(Point2d p, Vector2d v)\n        {\n            return Line2_EIK_CreateFromPointVector(p, v);\n        }\n\n        internal override void Line2_Release(IntPtr ptr)\n        {\n            Line2_EIK_Release(ptr);\n        }\n\n        internal override double Line2_GetA(IntPtr ptr)\n        {\n            return Line2_EIK_GetA(ptr);\n        }\n\n        internal override double Line2_GetB(IntPtr ptr)\n        {\n            return Line2_EIK_GetB(ptr);\n        }\n\n        internal override double Line2_GetC(IntPtr ptr)\n        {\n            return Line2_EIK_GetC(ptr);\n        }\n\n        internal override void Line2_SetA(IntPtr ptr, double a)\n        {\n            Line2_EIK_SetA(ptr, a);\n        }\n\n        internal override void Line2_SetB(IntPtr ptr, double b)\n        {\n            Line2_EIK_SetB(ptr, b);\n        }\n\n        internal override void Line2_SetC(IntPtr ptr, double c)\n        {\n            Line2_EIK_SetC(ptr, c);\n        }\n\n        internal override bool Line2_IsDegenerate(IntPtr ptr)\n        {\n            return Line2_EIK_IsDegenerate(ptr);\n        }\n\n        internal override bool Line2_IsHorizontal(IntPtr ptr)\n        {\n            return Line2_EIK_IsHorizontal(ptr);\n        }\n\n        internal override bool Line2_IsVertical(IntPtr ptr)\n        {\n            return Line2_EIK_IsVertical(ptr);\n        }\n\n        internal override bool Line2_HasOn(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EIK_HasOn(linePtr, point);\n        }\n\n        internal override bool Line2_HasOnNegativeSide(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EIK_HasOnNegativeSide(linePtr, point);\n        }\n\n        internal override bool Line2_HasOnPositiveSide(IntPtr linePtr, Point2d point)\n        {\n            return Line2_EIK_HasOnPositiveSide(linePtr, point);\n        }\n\n        internal override IntPtr Line2_Opposite(IntPtr ptr)\n        {\n            return Line2_EIK_Opposite(ptr);\n        }\n\n        internal override IntPtr Line2_Perpendicular(IntPtr ptr, Point2d point)\n        {\n            return Line2_EIK_Perpendicular(ptr, point);\n        }\n\n        internal override double Line2_X_On_Y(IntPtr ptr, double y)\n        {\n            return Line2_EIK_X_On_Y(ptr, y);\n        }\n\n        internal override double Line2_Y_On_X(IntPtr ptr, double x)\n        {\n            return Line2_EIK_Y_On_X(ptr, x);\n        }\n\n        internal override Vector2d Line2_Vector(IntPtr ptr)\n        {\n            return Line2_EIK_Vector(ptr);\n        }\n\n        internal override void Line2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Line2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Line2_Copy(IntPtr ptr)\n        {\n            return Line2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Line2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Line2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Ray2_Create(Point2d position, Vector2d direction)\n        {\n            return Ray2_EIK_Create(position, direction);\n        }\n\n        internal override void Ray2_Release(IntPtr ptr)\n        {\n            Ray2_EIK_Release(ptr);\n        }\n\n        internal override bool Ray2_IsDegenerate(IntPtr ptr)\n        {\n            return Box2_EIK_IsDegenerate(ptr);\n        }\n\n        internal override bool Ray2_IsHorizontal(IntPtr ptr)\n        {\n            return Ray2_EIK_IsHorizontal(ptr);\n        }\n\n        internal override bool Ray2_IsVertical(IntPtr ptr)\n        {\n            return Ray2_EIK_IsVertical(ptr);\n        }\n\n        internal override bool Ray2_HasOn(IntPtr rayPtr, Point2d point)\n        {\n            return Ray2_EIK_HasOn(rayPtr, point);\n        }\n\n        internal override Point2d Ray2_Source(IntPtr ptr)\n        {\n            return Ray2_EIK_Source(ptr);\n        }\n\n        internal override Vector2d Ray2_Vector(IntPtr ptr)\n        {\n            return Ray2_EIK_Vector(ptr);\n        }\n\n        internal override IntPtr Ray2_Opposite(IntPtr ptr)\n        {\n            return Ray2_EIK_Opposite(ptr);\n        }\n\n        internal override IntPtr Ray2_Line(IntPtr ptr)\n        {\n            return Ray2_EIK_Line(ptr);\n        }\n\n        internal override void Ray2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Ray2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Ray2_Copy(IntPtr ptr)\n        {\n            return Ray2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Ray2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Ray2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Segment2_Create(Point2d a, Point2d b)\n        {\n            return Segment2_EIK_Create(a, b);\n        }\n\n        internal override void Segment2_Release(IntPtr ptr)\n        {\n            Segment2_EIK_Release(ptr);\n        }\n\n        internal override Point2d Segment2_GetVertex(IntPtr ptr, int i)\n        {\n            return Segment2_EIK_GetVertex(ptr, i);\n        }\n\n        internal override void Segment2_SetVertex(IntPtr ptr, int i, Point2d point)\n        {\n            Segment2_EIK_SetVertex(ptr, i, point);\n        }\n\n        internal override Point2d Segment2_Min(IntPtr ptr)\n        {\n            return Segment2_EIK_Min(ptr);\n        }\n\n        internal override Point2d Segment2_Max(IntPtr ptr)\n        {\n            return Segment2_EIK_Max(ptr);\n        }\n\n        internal override bool Segment2_IsDegenerate(IntPtr ptr)\n        {\n            return Segment2_EIK_IsDegenerate(ptr);\n        }\n\n        internal override bool Segment2_IsHorizontal(IntPtr ptr)\n        {\n            return Segment2_EIK_IsHorizontal(ptr);\n        }\n\n        internal override bool Segment2_IsVertical(IntPtr ptr)\n        {\n            return Segment2_EIK_IsVertical(ptr);\n        }\n\n        internal override bool Segment2_HasOn(IntPtr segPtr, Point2d point)\n        {\n            return Segment2_EIK_HasOn(segPtr, point);\n        }\n\n        internal override Vector2d Segment2_Vector(IntPtr ptr)\n        {\n            return Segment2_EIK_Vector(ptr);\n        }\n\n        internal override IntPtr Segment2_Line(IntPtr ptr)\n        {\n            return Segment2_EIK_Line(ptr);\n        }\n\n        internal override double Segment2_SqrLength(IntPtr ptr)\n        {\n            return Segment2_EIK_SqrLength(ptr);\n        }\n\n        internal override void Segment2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Segment2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Segment2_Copy(IntPtr ptr)\n        {\n            return Segment2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Segment2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Segment2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Triangle2_Create(Point2d a, Point2d b, Point2d c)\n        {\n            return Triangle2_EIK_Create(a, b, c);\n        }\n\n        internal override void Triangle2_Release(IntPtr ptr)\n        {\n            Triangle2_EIK_Release(ptr);\n        }\n\n        internal override Point2d Triangle2_GetVertex(IntPtr ptr, int i)\n        {\n            return Triangle2_EIK_GetVertex(ptr, i);\n        }\n\n        internal override void Triangle2_SetVertex(IntPtr ptr, int i, Point2d point)\n        {\n            Segment2_EIK_SetVertex(ptr, i, point);\n        }\n\n        internal override double Triangle2_Area(IntPtr ptr)\n        {\n            return Triangle2_EIK_Area(ptr);\n        }\n\n        internal override BOUNDED_SIDE Triangle2_BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Triangle2_EIK_BoundedSide(ptr, point);\n        }\n\n        internal override ORIENTED_SIDE Triangle2_OrientedSide(IntPtr ptr, Point2d point)\n        {\n            return Triangle2_EIK_OrientedSide(ptr, point);\n        }\n\n        internal override ORIENTATION Triangle2_Orientation(IntPtr ptr)\n        {\n            return Triangle2_EIK_Orientation(ptr);\n        }\n\n        internal override bool Triangle2_IsDegenerate(IntPtr ptr)\n        {\n            return Triangle2_EIK_IsDegenerate(ptr);\n        }\n\n        internal override void Triangle2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Triangle2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Triangle2_Copy(IntPtr ptr)\n        {\n            return Triangle2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Triangle2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Triangle2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The IsoRectancle2 Class Functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        internal override IntPtr Box2_Create(Point2d min, Point2d max)\n        {\n            return Box2_EIK_Create(min, max);\n        }\n\n        internal override void Box2_Release(IntPtr ptr)\n        {\n            Box2_EIK_Release(ptr);\n        }\n\n        internal override Point2d Box2_GetMin(IntPtr ptr)\n        {\n            return Box2_EIK_GetMin(ptr);\n        }\n\n        internal override void Box2_SetMin(IntPtr ptr, Point2d point)\n        {\n            Box2_EIK_SetMin(ptr, point);\n        }\n\n        internal override Point2d Box2_GetMax(IntPtr ptr)\n        {\n            return Box2_EIK_GetMax(ptr);\n        }\n\n        internal override void Box2_SetMax(IntPtr ptr, Point2d point)\n        {\n            Box2_EIK_SetMax(ptr, point);\n        }\n\n        internal override double Box2_Area(IntPtr ptr)\n        {\n            return Box2_EIK_Area(ptr);\n        }\n\n        internal override BOUNDED_SIDE Box2_BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Box2_EIK_BoundedSide(ptr, point);\n        }\n        internal override bool Box2_ContainsPoint(IntPtr ptr, Point2d point, bool inculdeBoundary)\n        {\n            return Box2_EIK_ContainsPoint(ptr, point, inculdeBoundary);\n        }\n\n        internal override bool Box2_IsDegenerate(IntPtr ptr)\n        {\n            return Box2_EIK_IsDegenerate(ptr);\n        }\n\n        internal override void Box2_Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Box2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override IntPtr Box2_Copy(IntPtr ptr)\n        {\n            return Box2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Box2_Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Box2_EIK_Convert(ptr, k);\n        }\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Point2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EIK_CreateFromPoint(Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Point2_EIK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Point2_EIK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EIK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Point2_EIK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Point2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Vector2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EIK_CreateFromVector(Vector2d vector);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EIK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EIK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EIK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EIK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EIK_SqrLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EIK_Perpendicular(IntPtr ptr, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Vector2_EIK_Normalize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Vector2_EIK_Magnitude(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Vector2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The HPoint2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EIK_CreateFromPoint(HPoint2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EIK_GetX(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EIK_GetY(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HPoint2_EIK_GetW(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EIK_SetX(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EIK_SetY(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HPoint2_EIK_SetW(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HPoint2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Line2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_Create(double a, double b, double c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_CreateFromPoints(Point2d p1, Point2d p2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_CreateFromPointVector(Point2d p, Vector2d v);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EIK_GetA(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EIK_GetB(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EIK_GetC(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EIK_SetA(IntPtr ptr, double a);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EIK_SetB(IntPtr ptr, double b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EIK_SetC(IntPtr ptr, double c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_HasOn(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_HasOnNegativeSide(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Line2_EIK_HasOnPositiveSide(IntPtr linePtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_Opposite(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_Perpendicular(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EIK_X_On_Y(IntPtr ptr, double y);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Line2_EIK_Y_On_X(IntPtr ptr, double x);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Line2_EIK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Line2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Line2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Ray2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EIK_Create(Point2d position, Vector2d direction);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Ray2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EIK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EIK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EIK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Ray2_EIK_HasOn(IntPtr rayPtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Ray2_EIK_Source(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Ray2_EIK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EIK_Opposite(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EIK_Line(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Ray2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Ray2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Segment2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EIK_Create(Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EIK_GetVertex(IntPtr ptr, int i);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EIK_SetVertex(IntPtr ptr, int i, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EIK_Min(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Segment2_EIK_Max(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EIK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EIK_IsHorizontal(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EIK_IsVertical(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Segment2_EIK_HasOn(IntPtr segPtr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Vector2d Segment2_EIK_Vector(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EIK_Line(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Segment2_EIK_SqrLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Segment2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Segment2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Triangle2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EIK_Create(Point2d a, Point2d b, Point2d c);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Triangle2_EIK_GetVertex(IntPtr ptr, int i);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EIK_SetVertex(IntPtr ptr, int i, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Triangle2_EIK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Triangle2_EIK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE Triangle2_EIK_OrientedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION Triangle2_EIK_Orientation(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangle2_EIK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangle2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangle2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        /// <summary>--------------------------------------------------------\n        /// \n        ///                 The Box2 extern functions\n        /// \n        /// </summary>-------------------------------------------------------\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EIK_Create(Point2d min, Point2d max);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Box2_EIK_GetMin(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EIK_SetMin(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Box2_EIK_GetMax(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EIK_SetMax(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Box2_EIK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Box2_EIK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Box2_EIK_ContainsPoint(IntPtr ptr, Point2d point, bool inculdeBoundary);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Box2_EIK_IsDegenerate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Box2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Box2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/HPoint2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// Weighted point class\n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class HPoint2<K> : HPoint2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Create a new weighted point.\n        /// </summary>\n        public HPoint2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a value and weight as 1.\n        /// </summary>\n        /// <param name=\"v\">The points value.</param>\n        public HPoint2(double v) : base(v, v, 1, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a x, y value and weight as 1.\n        /// </summary>\n        /// <param name=\"x\">The points x value.</param>\n        /// <param name=\"y\">The points y value.</param>\n        public HPoint2(double x, double y) : base(x, y, 1, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a x, y value and weight as the w value.\n        /// </summary>\n        /// <param name=\"x\">The points x value.</param>\n        /// <param name=\"y\">The points y value.</param>\n        /// <param name=\"w\">The points weight value.</param>\n        public HPoint2(double x, double y, double w) : base(x, y, w, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The pointer.</param>\n        internal HPoint2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[HPoint2<{0}>: x={1}, y={2}]\",\n                KernelName, x, y);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the point.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public HPoint2<K> Copy()\n        {\n            return new HPoint2<K>(Kernel.HPoint2_Copy(Ptr));\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class HPoint2 : CGALObject\n    {\n\n        /// <summary>\n        /// Create a new weighted point.\n        /// </summary>\n        /// <param name=\"kernel\">The points kernel.</param>\n        internal HPoint2(CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.HPoint2_Create();\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a x, y value and weight as the w value.\n        /// </summary>\n        /// <param name=\"x\">The points x value.</param>\n        /// <param name=\"y\">The points y value.</param>\n        /// <param name=\"w\">The points weight value.</param>\n        /// <param name=\"kernel\">The points kernel.</param>\n        internal HPoint2(double x, double y, double w, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.HPoint2_CreateFromPoint(new HPoint2d(x, y, w));\n        }\n\n        /// <summary>\n        /// Create a new weighted point from a existing ponter and kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The points kernel.</param>\n        /// <param name=\"ptr\">The points pointer</param>\n        internal HPoint2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// The points kernel.\n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Release the pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.HPoint2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release the pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The pointer to release.</param>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.HPoint2_Release(ptr);\n        }\n\n        /// <summary>\n        /// Accessor or the points x value.\n        /// </summary>\n        public double x\n        {\n            get { return Kernel.HPoint2_GetX(Ptr); }\n            set { Kernel.HPoint2_SetX(Ptr, value); }\n        }\n\n        /// <summary>\n        /// ccessor or the points y value.\n        /// </summary>\n        public double y\n        {\n            get { return Kernel.HPoint2_GetY(Ptr); }\n            set { Kernel.HPoint2_SetY(Ptr, value); }\n        }\n\n\n        //public double w\n        //{\n        //    get { return Kernel.HPoint2_GetW(Ptr); }\n        //    set { Kernel.HPoint2_SetW(Ptr, value); }\n        //}\n\n        /// <summary>\n        /// Round the point.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            this.x = Math.Round(x, digits);\n            this.y = Math.Round(y, digits);\n            //this.w = Math.Round(w, digits);\n        }\n\n        /// <summary>\n        /// Clamp the point.\n        /// </summary>\n        /// <param name=\"min\">The points min value.</param>\n        /// <param name=\"max\">The points max value.</param>\n        public void Clamp(double min, double max)\n        {\n            this.x = MathUtil.Clamp(x, min, max);\n            this.y = MathUtil.Clamp(y, min, max);\n            //this.w = MathUtil.Clamp(w, min, max);\n        }\n\n        /// <summary>\n        /// Clamp the point.\n        /// </summary>\n        public void Clamp01()\n        {\n            this.x = MathUtil.Clamp01(x);\n            this.y = MathUtil.Clamp01(y);\n            //this.w = MathUtil.Clamp01(w);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public HPoint2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.HPoint2_Convert(Ptr, e);\n            return new HPoint2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/IntersectionResult2d.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNet.Polygons;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// Enum for the type of intersection geomerty.\n    /// </summary>\n    public enum INTERSECTION_RESULT_2D\n    {\n        NONE,\n        POINT2,\n        LINE2,\n        RAY2,\n        SEGMENT2,\n        BOX2,\n        TRIANGLE2,\n        POLYGON2\n    }\n\n    /// <summary>\n    /// The intersection result struct.\n    /// May contain up tp 6 points of data.\n    /// </summary>\n    public unsafe struct IntersectionResult2d\n    {\n        /// <summary>\n        /// The point data for the intersection.\n        /// Represents up to 6 points in xy order.\n        /// </summary>\n        private fixed double Data[12];\n\n        /// <summary>\n        /// The number of points of data used.\n        /// </summary>\n        private int Count;\n\n        /// <summary>\n        /// Was there a intersection.\n        /// </summary>\n        public bool Hit => Type != INTERSECTION_RESULT_2D.NONE;\n\n        /// <summary>\n        /// Is the intersection a polygon.\n        /// </summary>\n        public bool IsPolygon => Type == INTERSECTION_RESULT_2D.POLYGON2;\n\n        /// <summary>\n        /// The intersection geometry type.\n        /// </summary>\n        public INTERSECTION_RESULT_2D Type;\n\n        /// <summary>\n        /// Array accessor for the point data.\n        /// </summary>\n        /// <param name=\"i\">The array index from 0 to 6.</param>\n        /// <returns>The point at index i.</returns>\n        public Point2d this[int i]\n        {\n            get\n            {\n                if ((uint)i >= 6)\n                    throw new IndexOutOfRangeException(\"IntersectionResult2d index out of range.\");\n\n                fixed (IntersectionResult2d* array = &this) { return ((Point2d*)array)[i]; }\n            }\n        }\n\n        /// <summary>\n        /// Results information as string.\n        /// </summary>\n        /// <returns>esults information as string</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[IntersectionResult2d: Type={0}, Count={1}]\", Type, Count);\n        }\n\n        /// <summary>\n        /// If result type was point get the point geometry.\n        /// </summary>\n        public Point2d Point => this[0];\n\n        /// <summary>\n        /// If result type was line get the line geometry.\n        /// </summary>\n        public Line2d Line => new Line2d(Data[0], Data[1], Data[2]);\n\n        /// <summary>\n        /// If result type was ray get the ray geometry.\n        /// </summary>\n        public Ray2d Ray => new Ray2d(this[0], this[1]);\n\n        /// <summary>\n        /// If result type was segment get the segment geometry.\n        /// </summary>\n        public Segment2d Segment => new Segment2d(this[0], this[1]);\n\n        /// <summary>\n        /// If result type was box get the box geometry.\n        /// </summary>\n        public Box2d Box => new Box2d(this[0], this[1]);\n\n        /// <summary>\n        /// If result type was triangle get the triangle geometry.\n        /// </summary>\n        public Triangle2d Triangle => new Triangle2d(this[0], this[1], this[2]);\n\n        /// <summary>\n        /// If result type was polygon get the points that\n        /// make up the polygon geometry.\n        /// Should only ever have at most 6 points.\n        /// </summary>\n        public Point2d[] PolygonPoints\n        {\n            get\n            {\n                if (Count > 6)\n                    throw new Exception(\"Unexpected number of polygon points.\");\n\n                if (!IsPolygon)\n                    throw new Exception(\"Intersection not a polygon.\");\n\n                var points = new Point2d[Count];\n                for (int i = 0; i < Count; i++)\n                    points[i] = this[i];\n\n                return points;\n            }\n        }\n\n        /// <summary>\n        /// The intersection result as a polygon.\n        /// </summary>\n        /// <typeparam name=\"K\">The polygons kernel.</typeparam>\n        /// <returns>The polygon.</returns>\n        public Polygon2<K> Polygon<K>() where K : CGALKernel, new()\n        {\n            return new Polygon2<K>(PolygonPoints);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Line2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// A CGALObject that represents a line on 2D space.\n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class Line2<K> : Line2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// A horizontal line on the x axis.\n        /// </summary>\n        public readonly static Line2<K> Horizontal = new Line2<K>(Point2d.Zero, Point2d.UnitX);\n\n        /// <summary>\n        /// A vertical line on the y axis.\n        /// </summary>\n\t    public readonly static Line2<K> Vertical = new Line2<K>(Point2d.Zero, Point2d.UnitY);\n\n        /// <summary>\n        /// Create a new line where ax + by + c = 0 holds.\n        /// </summary>\n        /// <param name=\"a\">The constant in ax.</param>\n        /// <param name=\"b\">The constant in by.</param>\n        /// <param name=\"c\">The constant.</param>\n        public Line2(double a, double b, double c) : base(a, b, c, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new line that passes through the two points.\n        /// </summary>\n        /// <param name=\"p1\">The first point.</param>\n        /// <param name=\"p2\">The second point.</param>\n        public Line2(Point2d p1, Point2d p2) : base(p1, p2, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a line that passes through the point in the direction of the vector.\n        /// </summary>\n        /// <param name=\"p\">The point.</param>\n        /// <param name=\"v\">The vector.</param>\n        public Line2(Point2d p, Vector2d v) : base(p, v, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a line from a existing pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The pointer.</param>\n        internal Line2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new line that faces in the opposite direction.\n        /// </summary>\n        public Line2<K> Opposite => new Line2<K>(Kernel.Line2_Opposite(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Line2<{0}>: A={1}, B={2}, C={3}]\",\n                Kernel.Name, A, B, C);\n        }\n\n        /// <summary>\n        /// Create a new line that is perpendicular to current line.\n        /// </summary>\n        /// <param name=\"point\">A point the line should turn ccw when turning.</param>\n        /// <returns>The perpendicular line.</returns>\n        public Line2<K> Perpendicular(Point2d point)\n        {\n            var ptr = Kernel.Line2_Perpendicular(Ptr, point);\n            return new Line2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Translate the object.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Line2_Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the object.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Line2_Transform(Ptr, Point2d.Zero, rotation.radian, 1);\n        }\n\n        /// <summary>\n        /// Scale the object.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Line2_Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// Translate, rotate and scale the object.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate in degrees.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Line2_Transform(Ptr, translation, rotation.radian, scale);    \n        }\n\n        /// <summary>\n        /// Create a deep copy of the line.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Line2<K> Copy()\n        {\n            return new Line2<K>(Kernel.Line2_Copy(Ptr));\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract class for the line object.\n    /// </summary>\n    public abstract class Line2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private Line2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"c\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Line2(double a, double b, double c, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Line2_Create(a, b, c);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"p1\"></param>\n        /// <param name=\"p2\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Line2(Point2d p1, Point2d p2, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.CreateFromPoints(p1, p2);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"p\"></param>\n        /// <param name=\"v\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Line2(Point2d p, Vector2d v, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.CreateFromPointVector(p, v);\n        }\n\n        internal Line2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// The lines kernel.\n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Convert to shape struct.\n        /// </summary>\n        public Line2d Shape => new Line2d(A, B, C);\n\n        /// <summary>\n        /// The lines constant in ax.\n        /// </summary>\n        public double A\n        {\n            get { return Kernel.Line2_GetA(Ptr); }\n            set { Kernel.Line2_SetA(Ptr, value); }\n        }\n\n        /// <summary>\n        /// The lines constant in by.\n        /// </summary>\n        public double B\n        {\n            get { return Kernel.Line2_GetB(Ptr); }\n            set { Kernel.Line2_SetB(Ptr, value); }\n        }\n\n        /// <summary>\n        /// The lines constant.\n        /// </summary>\n        public double C\n        {\n            get { return Kernel.Line2_GetC(Ptr); }\n            set { Kernel.Line2_SetC(Ptr, value); }\n        }\n\n        /// <summary>\n        /// Is the line degenerate.\n        /// </summary>\n        public bool IsDegenerate => Kernel.Line2_IsDegenerate(Ptr);\n\n        /// <summary>\n        /// Is the line horizontal on the x axis.\n        /// </summary>\n        public bool IsHorizontal => Kernel.Line2_IsHorizontal(Ptr);\n\n        /// <summary>\n        /// Is the line vertical on the y axis.\n        /// </summary>\n        public bool IsVertical => Kernel.Line2_IsVertical(Ptr); \n\n        /// <summary>\n        /// Convert the line to a vector.\n        /// </summary>\n        public Vector2d Vector => Kernel.Line2_Vector(Ptr);\n\n        /// <summary>\n        /// Does the point lie on the line.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>True if the point lies on the line.</returns>\n        public bool HasOn(Point2d point)\n        {\n            return Kernel.Line2_HasOn(Ptr, point);\n        }\n\n        /// <summary>\n        /// Does the point lies on the negative/cw side of the line.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>True if the point lies on the negative/cw side of the line.</returns>\n        public bool HasOnNegativeSide(Point2d point)\n        {\n            return Kernel.Line2_HasOnNegativeSide(Ptr, point);  \n        }\n\n       /// <summary>\n        /// Does the point lies on the positive/ccw side of the line.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>True if the point lies on the positive/ccw side of the line.</returns>\n        public bool HasOnPositiveSide(Point2d point)\n        {\n            return Kernel.Line2_HasOnPositiveSide(Ptr, point);  \n        }\n\n        /// <summary>\n        /// The lines x value given a y value.\n        /// </summary>\n        /// <param name=\"y\">The y value.</param>\n        /// <returns>The lines x value given a y value.</returns>\n        public double X_On_Y(double y)\n        {\n            return Kernel.Line2_X_On_Y(Ptr, y);\n        }\n\n        /// <summary>\n        /// The lines y value given a x value.\n        /// </summary>\n        /// <param name=\"x\">The x value.</param>\n        /// <returns>The lines y value given a x value.</returns>\n\n        public double Y_On_X(double x)\n        {\n            return Kernel.Line2_Y_On_X(Ptr, x);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Line2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Round the shape.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            this.A = Math.Round(A, digits);\n            this.B = Math.Round(B, digits);\n            this.C = Math.Round(C, digits);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Line2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Line2_Convert(Ptr, e);\n            return new Line2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Point2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class Point2<K> : Point2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// The unit x point.\n        /// </summary>\n        public readonly static Point2<K> UnitX = new Point2<K>(1, 0);\n\n        /// <summary>\n        /// The unit y point.\n        /// </summary>\n\t    public readonly static Point2<K> UnitY = new Point2<K>(0, 1);\n\n        /// <summary>\n        /// A point of zeros.\n        /// </summary>\n\t    public readonly static Point2<K> Zero = new Point2<K>(0);\n\n        /// <summary>\n        /// A point of ones.\n        /// </summary>\n        public readonly static Point2<K> One = new Point2<K>(1);\n\n        /// <summary>\n        /// A point of halfs.\n        /// </summary>\n        public readonly static Point2<K> Half = new Point2<K>(0.5);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"v\"></param>\n        public Point2(double v) : base(v, v, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        public Point2(double x, double y) : base(x, y, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal Point2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Point2<{0}>: x={1}, y={2}]\",\n                KernelName, x, y);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public Point2<K> Copy()\n        {\n            return new Point2<K>(Kernel.Point2_Copy(Ptr));\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class Point2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal Point2(CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Point2_Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Point2(double x, double y, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Point2_CreateFromPoint(new Point2d(x,y));\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Point2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Point2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Point2_Release(ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public double x\n        {\n            get { return Kernel.Point2_GetX(Ptr); }\n            set { Kernel.Point2_SetX(Ptr, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public double y\n        {\n            get { return Kernel.Point2_GetY(Ptr); }\n            set { Kernel.Point2_SetY(Ptr, value); }\n        }\n\n        /// <summary>\n        /// Round the point.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            this.x = Math.Round(x, digits);\n            this.y = Math.Round(y, digits);\n        }\n\n        /// <summary>\n        /// Clamp the point.\n        /// </summary>\n        /// <param name=\"min\">The points min value.</param>\n        /// <param name=\"max\">The points max value.</param>\n        public void Clamp(double min, double max)\n        {\n            this.x = MathUtil.Clamp(x, min, max);\n            this.y = MathUtil.Clamp(y, min, max);\n        }\n\n        /// <summary>\n        /// Clamp the point.\n        /// </summary>\n        public void Clamp01()\n        {\n            this.x = MathUtil.Clamp01(x);\n            this.y = MathUtil.Clamp01(y);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Point2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Point2_Convert(Ptr, e);\n            return new Point2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Ray2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class Ray2<K> : Ray2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// The unit x ray.\n        /// </summary>\n        public readonly static Ray2<K> UnitX = new Ray2<K>(Point2d.Zero, Vector2d.UnitX);\n\n        /// <summary>\n        /// The unit y ray.\n        /// </summary>\n\t    public readonly static Ray2<K> UnitY = new Ray2<K>(Point2d.Zero, Vector2d.UnitY);\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"position\"></param>\n        /// <param name=\"direction\"></param>\n        public Ray2(Point2d position, Vector2d direction) \n            : base(position, direction, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal Ray2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Ray2<{0}>: Position={1}, Direction={2}]\",\n                Kernel.Name, Position, Direction);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Ray2<K> Opposite => new Ray2<K>(Kernel.Ray2_Opposite(Ptr));\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Line2<K> Line => new Line2<K>(Kernel.Ray2_Line(Ptr));\n\n        /// <summary>\n        /// Translate the shape.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Ray2_Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the shape.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Ray2_Transform(Ptr, Point2d.Zero, rotation.radian, 1);\n        }\n\n        /// <summary>\n        /// Scale the shape.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Ray2_Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"translation\"></param>\n        /// <param name=\"rotation\"></param>\n        /// <param name=\"scale\"></param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Ray2_Transform(Ptr, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public Ray2<K> Copy()\n        {\n            return new Ray2<K>(Kernel.Ray2_Copy(Ptr));\n        }\n\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class Ray2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private Ray2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"position\"></param>\n        /// <param name=\"direction\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Ray2(Point2d position, Vector2d direction, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Ray2_Create(position, direction);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Ray2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Convert to shape struct.\n        /// </summary>\n        public Ray2d Shape => new Ray2d(Position, Direction);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsDegenerate => Kernel.Ray2_IsDegenerate(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsHorizontal => Kernel.Ray2_IsHorizontal(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsVertical => Kernel.Ray2_IsVertical(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d Position => Kernel.Ray2_Source(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Vector2d Direction => Kernel.Ray2_Vector(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <returns></returns>\n        public bool HasOn(Point2d point)\n        {\n            return Kernel.Ray2_HasOn(Ptr, point);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Ray2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Round the shape.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            Position.Round(digits);\n            Direction.Round(digits);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Ray2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Ray2_Convert(Ptr, e);\n            return new Ray2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Segment2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class Segment2<K> : Segment2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// A horizontal line on the x axis.\n        /// </summary>\n        public readonly static Segment2<K> Horizontal \n            = new Segment2<K>(new Point2d(-1, 0), new Point2d(1, 0));\n\n        /// <summary>\n        /// A vertical line on the y axis.\n        /// </summary>\n\t    public readonly static Segment2<K> Vertical \n            = new Segment2<K>(new Point2d(0, -1), new Point2d(0, 1));\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        public Segment2(Point2d a, Point2d b) : base(a, b, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal Segment2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Segment2<{0}>: A={1}, B={2}]\",\n                Kernel.Name, A, B);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Line2<K> Line => new Line2<K>(Kernel.Segment2_Line(Ptr));\n\n        /// <summary>\n        /// Translate the shape.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Segment2_Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the shape.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Segment2_Transform(Ptr, Point2d.Zero, rotation.radian, 1);\n        }\n\n        /// <summary>\n        /// Scale the shape.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Segment2_Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"translation\"></param>\n        /// <param name=\"rotation\"></param>\n        /// <param name=\"scale\"></param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Segment2_Transform(Ptr, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public Segment2<K> Copy()\n        {\n            return new Segment2<K>(Kernel.Segment2_Copy(Ptr));\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class Segment2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private Segment2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Segment2(Point2d a, Point2d b, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Segment2_Create(a, b);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Segment2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Convert to shape struct.\n        /// </summary>\n        public Segment2d Shape => new Segment2d(A, B);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d A\n        {\n            get { return Kernel.Segment2_GetVertex(Ptr, 0); }\n            set { Kernel.Segment2_SetVertex(Ptr, 0, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d B\n        {\n            get { return Kernel.Segment2_GetVertex(Ptr, 1); }\n            set { Kernel.Segment2_SetVertex(Ptr, 1, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d Min => Kernel.Segment2_Min(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d Max => Kernel.Segment2_Max(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsDegenerate => Kernel.Segment2_IsDegenerate(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsHorizontal => Kernel.Segment2_IsHorizontal(Ptr);  \n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsVertical => Kernel.Segment2_IsVertical(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Vector2d Vector => Kernel.Segment2_Vector(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public double SqrLength => Kernel.Segment2_SqrLength(Ptr);  \n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <returns></returns>\n        public bool HasOn(Point2d point)\n        {\n            return Kernel.Line2_HasOn(Ptr, point);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Segment2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Round the shape.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            A.Round(digits);\n            B.Round(digits);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Segment2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Segment2_Convert(Ptr, e);\n            return new Segment2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Triangle2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class Triangle2<K> : Triangle2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"c\"></param>\n        public Triangle2(Point2d a, Point2d b, Point2d c) : base(a, b, c, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal Triangle2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Triangle2<{0}>: A={1}, B={2}, C={2}]\",\n                Kernel.Name, A, B, C);\n        }\n\n        /// <summary>\n        /// Translate the shape.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Triangle2_Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the shape.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Triangle2_Transform(Ptr, Point2d.Zero, rotation.radian, 1);\n        }\n\n        /// <summary>\n        /// Scale the shape.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Triangle2_Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"translation\"></param>\n        /// <param name=\"rotation\"></param>\n        /// <param name=\"scale\"></param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Triangle2_Transform(Ptr, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public Triangle2<K> Copy()\n        {\n            return new Triangle2<K>(Kernel.Triangle2_Copy(Ptr));\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class Triangle2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private Triangle2()\n        {\n       \n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <param name=\"c\"></param>\n        /// <param name=\"kernel\"></param>\n        internal Triangle2(Point2d a, Point2d b, Point2d c, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Triangle2_Create(a, b, c);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Triangle2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Convert to shape struct.\n        /// </summary>\n        public Triangle2d Shape => new Triangle2d(A, B, C);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d A\n        {\n            get { return Kernel.Triangle2_GetVertex(Ptr, 0); }\n            set { Kernel.Triangle2_SetVertex(Ptr, 0, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d B\n        {\n            get { return Kernel.Triangle2_GetVertex(Ptr, 1); }\n            set { Kernel.Triangle2_SetVertex(Ptr, 1, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public Point2d C\n        {\n            get { return Kernel.Triangle2_GetVertex(Ptr, 2); }\n            set { Kernel.Triangle2_SetVertex(Ptr, 2, value); }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public bool IsDegenerate => Kernel.Triangle2_IsDegenerate(Ptr);\n\n        /// <summary>\n        /// \n        /// </summary>\n        public double Area\n        {\n            get\n            {\n                if (IsDegenerate)\n                    return 0;\n                else\n                    return Kernel.Triangle2_Area(Ptr);\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public ORIENTATION Orientation\n        {\n            get\n            {\n                if (IsDegenerate)\n                    return ORIENTATION.ZERO;\n                else\n                    return Kernel.Triangle2_Orientation(Ptr);\n            }\n        }\n        \n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <returns></returns>\n        public BOUNDED_SIDE BoundedSide(Point2d point)\n        {\n            if (IsDegenerate)\n                return BOUNDED_SIDE.UNDETERMINED;\n            else\n                return Kernel.Triangle2_BoundedSide(Ptr, point);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <returns></returns>\n        public ORIENTED_SIDE OrientedSide(Point2d point)\n        {\n            if (IsDegenerate)\n                return ORIENTED_SIDE.UNDETERMINED;\n            else\n                return Kernel.Triangle2_OrientedSide(Ptr, point);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Triangle2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Round the shape.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            A.Round(digits);\n            B.Round(digits);\n            C.Round(digits);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Triangle2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Triangle2_Convert(Ptr, e);\n            return new Triangle2<T>(ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Geometry/Vector2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Geometry\n{\n    /// <summary>\n    /// A Vector2 object with kernel type K.\n    /// </summary>\n    /// <typeparam name=\"K\">The type of kernel.</typeparam>\n    public sealed class Vector2<K> : Vector2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// The unit x vector.\n        /// </summary>\n        public readonly static Vector2<K> UnitX = new Vector2<K>(1, 0);\n\n        /// <summary>\n        /// The unit y vector.\n        /// </summary>\n\t    public readonly static Vector2<K> UnitY = new Vector2<K>(0, 1);\n\n        /// <summary>\n        /// A vector of zeros.\n        /// </summary>\n\t    public readonly static Vector2<K> Zero = new Vector2<K>(0);\n\n        /// <summary>\n        /// A vector of ones.\n        /// </summary>\n        public readonly static Vector2<K> One = new Vector2<K>(1);\n\n        /// <summary>\n        /// Create a new Vector.\n        /// </summary>\n        public Vector2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new vector filled with the value.\n        /// </summary>\n        /// <param name=\"v\">The value to fill.</param>\n        public Vector2(double v) : base(v, v, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new vector with the values x and y.\n        /// </summary>\n        /// <param name=\"x\">The vectors x value.</param>\n        /// <param name=\"y\">The vectors y value.</param>\n        public Vector2(double x, double y) : base(x, y, new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new vector from a existing pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The pointer object.</param>\n        internal Vector2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// Vector information.\n        /// </summary>\n        /// <returns>The vectors string information.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Vector2<{0}>: x={1}, y={2}]\",\n                KernelName, x, y);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the vector.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Vector2<K> Copy()\n        {\n            return new Vector2<K>(Kernel.Vector2_Copy(Ptr));\n        }\n\n    }\n\n    /// <summary>\n    /// The vectors abstract bass class.\n    /// </summary>\n    public abstract class Vector2 : CGALObject\n    {\n        /// <summary>\n        /// Create a new vector with the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The vectors kernel.</param>\n        internal Vector2(CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Vector2_Create();\n        }\n\n        /// <summary>\n        /// Create a new vector from the x and y values.\n        /// </summary>\n        /// <param name=\"x\">The vectors x value.</param>\n        /// <param name=\"y\">The vectors y value.</param>\n        /// <param name=\"kernel\">The vectors kernel.</param>\n        internal Vector2(double x, double y, CGALKernel kernel)\n        {\n            Kernel = kernel.GeometryKernel2;\n            Ptr = Kernel.Vector2_CreateFromVector(new Vector2d(x, y));\n        }\n\n        /// <summary>\n        /// Create a new vector from a existing pointer.\n        /// </summary>\n        /// <param name=\"kernel\">The vectors kernel.</param>\n        /// <param name=\"ptr\">The existing pointer.</param>\n        internal Vector2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.GeometryKernel2;\n        }\n\n        /// <summary>\n        /// The vectors kernel.\n        /// </summary>\n        protected private GeometryKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// The vectors sqr magnitude.\n        /// </summary>\n        public double Magnitude => Kernel.Vector2_Magnitude(Ptr);\n\n        /// <summary>\n        /// The vectors sqr magnitude.\n        /// </summary>\n        public double SqrMagnitude => Kernel.Vector2_SqrLength(Ptr);\n\n        /// <summary>\n        /// Access the x component.\n        /// </summary>\n        public double x\n        {\n            get { return Kernel.Vector2_GetX(Ptr); }\n            set { Kernel.Vector2_SetX(Ptr, value); }\n        }\n\n        /// <summary>\n        /// Access the y component.\n        /// </summary>\n        public double y\n        {\n            get { return Kernel.Vector2_GetY(Ptr); }\n            set { Kernel.Vector2_SetY(Ptr, value); }\n        }\n\n        /// <summary>\n        /// Release the vectors pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Vector2_Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release a pointer to a vector.\n        /// </summary>\n        /// <param name=\"ptr\">The pointer to release.</param>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Vector2_Release(ptr);\n        }\n\n        /// <summary>\n        /// Round the vector.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            this.x = Math.Round(x, digits);\n            this.y = Math.Round(y, digits);\n        }\n\n        /// <summary>\n        /// Clamp the vector.\n        /// </summary>\n        /// <param name=\"min\">The vectors min value.</param>\n        /// <param name=\"max\">The vectors max value.</param>\n        public void Clamp(double min, double max)\n        {\n            this.x = MathUtil.Clamp(x, min, max);\n            this.y = MathUtil.Clamp(y, min, max);\n        }\n\n        /// <summary>\n        /// Clamp the vector.\n        /// </summary>\n        public void Clamp01()\n        {\n            this.x = MathUtil.Clamp01(x);\n            this.y = MathUtil.Clamp01(y);\n        }\n\n        /// <summary>\n        /// Normalize the vector.\n        /// </summary>\n        public void Normalize()\n        {\n            Kernel.Vector2_Normalize(Ptr);\n        }\n\n        /// <summary>\n        /// Convert to another kernel.\n        /// Must provide a different kernel to convert to or\n        /// just a deep copy will be returned.\n        /// </summary>\n        /// <returns>The shape with another kernel type.</returns>\n        public Vector2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Vector2_Convert(Ptr, e);\n            return new Vector2<T>(ptr);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHull2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Hulls\n{\n    /// <summary>\n    /// The convex hull method to use.\n    /// </summary>\n    public enum HULL_METHOD\n    {\n        DEFAULT,\n        AKL_TOUSSAINT,\n        BYKAT,\n        EDDY,\n        GRAHAM_ANDREW,\n        JARVIS\n    };\n\n    /// <summary>\n    /// The generic convex hull class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type</typeparam>\n    public sealed class ConvexHull2<K> : ConvexHull2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// The static instance.\n        /// </summary>\n        public static readonly ConvexHull2<K> Instance = new ConvexHull2<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public ConvexHull2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[ConvexHull2<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Find the convex of the points.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <param name=\"method\">The hull ethod to use.</param>\n        /// <returns>A polygon that represents the convex hull.</returns>\n        public Polygon2<K> CreateHull(Point2d[] points, int count, HULL_METHOD method = HULL_METHOD.DEFAULT)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.CreateHull(points, count, method);\n            return new Polygon2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Find the upper hull of points.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>A polygon that represents the upper hull.</returns>\n        public Polygon2<K> UpperHull(Point2d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.UpperHull(points, count);\n            return new Polygon2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Find the lower hull of points.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>A polygon that represents the lower hull.</returns>\n        public Polygon2<K> LowerHull(Point2d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.LowerHull(points, count);\n            return new Polygon2<K>(ptr);\n        }\n    }\n\n    /// <summary>\n    /// The convex hull abstract base class.\n    /// </summary>\n    public abstract class ConvexHull2 : CGALObject\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private ConvexHull2()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct hull with the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The kernel</param>\n        internal ConvexHull2(CGALKernel kernel)\n        {\n            Kernel = kernel.ConvexHullKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The hulls kernel type.\n        /// </summary>\n        protected private ConvexHullKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Is this set of points ccw orderer.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>Is this set of points ccw orderer.</returns>\n        public bool IsStronglyConvexCCW(Point2d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            return Kernel.IsStronglyConvexCCW(points, count);\n        }\n\n        /// <summary>\n        /// Is this set of points cw orderer.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <returns>Is this set of points cw orderer.</returns>\n        public bool IsStronglyConvexCW(Point2d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            return Kernel.IsStronglyConvexCW(points, count);\n        }\n\n        /// <summary>\n        /// Checks if the minimum number of points have been provided.\n        /// </summary>\n        /// <param name=\"count\">The point array length.</param>\n        /// <exception cref=\"ArgumentException\"></exception>\n        protected void CheckCount(int count)\n        {\n            if (count < 3)\n                throw new ArgumentException(\"3 or more points must be provided to find the convex hull.\");\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHull3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Hulls\n{\n\n    /// <summary>\n    /// The generic convex hull class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type</typeparam>\n    public sealed class ConvexHull3<K> : ConvexHull3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// The static instance.\n        /// </summary>\n        public static readonly ConvexHull3<K> Instance = new ConvexHull3<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public ConvexHull3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[ConvexHull3<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Create the convex hull from a set of points.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The point arrays length</param>\n        /// <returns>The hull as a polyhedron.</returns>\n        public Polyhedron3<K> CreateHullAsPolyhedron(Point3d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.CreateHullAsPolyhedronFromPoints(points, count);\n            return new Polyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Create the convex hull from a set of points.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The point arrays length</param>\n        /// <returns>The hull as a surface mesh.</returns>\n        public SurfaceMesh3<K> CreateHullAsSurfaceMesh(Point3d[] points, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.CreateHullAsSurfaceMeshFromPoints(points, count);\n            return new SurfaceMesh3<K>(ptr);\n        }\n\n        /*\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"planes\"></param>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        public Polyhedron3<K> CreateHullAsPolyhedron(Plane3d[] planes, int count)\n        {\n            CheckCount(count);\n            ErrorUtil.CheckArray(planes, count);\n            var ptr = Kernel.CreateHullAsPolyhedronFromPlanes(planes, count);\n             return new Polyhedron3<K>(ptr);\n        }\n        */\n\n        /*\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"planes\"></param>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        public SurfaceMesh3<K> CreateHullAsSurfaceMesh(Plane3d[] planes, int count)\n        {\n           CheckCount(count);\n           ErrorUtil.CheckArray(planes, count);\n            var ptr = Kernel.CreateHullAsSurfaceMeshFromPlanes(planes, count);\n            return new SurfaceMesh3<K>(ptr);\n        }\n        */\n    }\n\n    /// <summary>\n    /// The convex hull abstract base class.\n    /// </summary>\n    public abstract class ConvexHull3 : CGALObject\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private ConvexHull3()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct hull with the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The kernel</param>\n        internal ConvexHull3(CGALKernel kernel)\n        {\n            Kernel = kernel.ConvexHullKernel3;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The hulls kernel type.\n        /// </summary>\n        protected private ConvexHullKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// Check if the points in the polyhedron are convex.\n        /// </summary>\n        /// <param name=\"poly\">The polyhedron.</param>\n        /// <returns>True if the polyhedron is convex.</returns>\n        public bool IsStronglyConvex(Polyhedron3 poly)\n        {\n            return Kernel.IsPolyhedronStronglyConvex(poly.Ptr);\n        }\n\n        /// <summary>\n        /// Check if the points in the mesh are convex.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <returns>True if the mesh is convex.</returns>\n        public bool IsStronglyConvex(SurfaceMesh3 mesh)\n        {\n            return Kernel.IsSurfaceMeshStronglyConvex(mesh.Ptr); ;\n        }\n\n        /// <summary>\n        /// Checks if the minimum number of points have been provided.\n        /// </summary>\n        /// <param name=\"count\">The point array length.</param>\n        /// <exception cref=\"ArgumentException\"></exception>\n        protected void CheckCount(int count)\n        {\n            if (count < 4)\n                throw new ArgumentException(\"4 or more points must be provided to find the convex hull.\");\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Hulls\n{\n    internal abstract class ConvexHullKernel2 : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract IntPtr CreateHull(Point2d[] points, int count, HULL_METHOD method);\n\n        internal abstract IntPtr UpperHull(Point2d[] points, int count);\n\n        internal abstract IntPtr LowerHull(Point2d[] points, int count);\n\n        internal abstract bool IsStronglyConvexCCW(Point2d[] points, int count);\n\n        internal abstract bool IsStronglyConvexCW(Point2d[] points, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Hulls\n{\n    internal class ConvexHullKernel2_EEK : ConvexHullKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly ConvexHullKernel2 Instance = new ConvexHullKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return ConvexHull2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConvexHull2_EEK_Release(ptr);\n        }\n\n        internal override IntPtr CreateHull(Point2d[] points, int count, HULL_METHOD method)\n        {\n            return ConvexHull2_EEK_CreateHull(points, count, method);\n        }\n\n        internal override IntPtr UpperHull(Point2d[] points, int count)\n        {\n            return ConvexHull2_EEK_UpperHull(points, count);\n        }\n\n        internal override IntPtr LowerHull(Point2d[] points, int count)\n        {\n            return ConvexHull2_EEK_LowerHull(points, count);\n        }\n\n        internal override bool IsStronglyConvexCCW(Point2d[] points, int count)\n        {\n            return ConvexHull2_EEK_IsStronglyConvexCCW(points, count);\n        }\n\n        internal override bool IsStronglyConvexCW(Point2d[] points, int count)\n        {\n            return IsStronglyConvexCW(points, count);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConvexHull2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EEK_CreateHull([In] Point2d[] points, int count, HULL_METHOD method);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EEK_UpperHull([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EEK_LowerHull([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull2_EEK_IsStronglyConvexCCW([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull2_EEK_IsStronglyConvexCW([In] Point2d[] points, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Hulls\n{\n    internal class ConvexHullKernel2_EIK : ConvexHullKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly ConvexHullKernel2 Instance = new ConvexHullKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return ConvexHull2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConvexHull2_EIK_Release(ptr);\n        }\n\n        internal override IntPtr CreateHull(Point2d[] points, int count, HULL_METHOD method)\n        {\n            return ConvexHull2_EIK_CreateHull(points, count, method);\n        }\n\n        internal override IntPtr UpperHull(Point2d[] points, int count)\n        {\n            return ConvexHull2_EIK_UpperHull(points, count);\n        }\n\n        internal override IntPtr LowerHull(Point2d[] points, int count)\n        {\n            return ConvexHull2_EIK_LowerHull(points, count);\n        }\n\n        internal override bool IsStronglyConvexCCW(Point2d[] points, int count)\n        {\n            return ConvexHull2_EIK_IsStronglyConvexCCW(points, count);\n        }\n\n        internal override bool IsStronglyConvexCW(Point2d[] points, int count)\n        {\n            return IsStronglyConvexCW(points, count);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConvexHull2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EIK_CreateHull([In] Point2d[] points, int count, HULL_METHOD method);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EIK_UpperHull([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull2_EIK_LowerHull([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull2_EIK_IsStronglyConvexCCW([In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull2_EIK_IsStronglyConvexCW([In] Point2d[] points, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Hulls\n{\n    internal abstract class ConvexHullKernel3 : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract IntPtr CreateHullAsPolyhedronFromPoints(Point3d[] points, int count);\n\n        internal abstract IntPtr CreateHullAsSurfaceMeshFromPoints(Point3d[] points, int count);\n\n        internal abstract IntPtr CreateHullAsPolyhedronFromPlanes(Plane3d[] planes, int count);\n\n        internal abstract IntPtr CreateHullAsSurfaceMeshFromPlanes(Plane3d[] planes, int count);\n\n        internal abstract bool IsPolyhedronStronglyConvex(IntPtr ptr);\n\n        internal abstract bool IsSurfaceMeshStronglyConvex(IntPtr ptr);\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Hulls\n{\n    internal class ConvexHullKernel3_EEK : ConvexHullKernel3\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly ConvexHullKernel3 Instance = new ConvexHullKernel3_EEK();\n\n        internal override IntPtr Create()\n        {\n            return ConvexHull3_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConvexHull3_EEK_Release(ptr);\n        }\n\n        internal override IntPtr CreateHullAsPolyhedronFromPoints(Point3d[] points, int count)\n        {\n            return ConvexHull3_EEK_CreateHullAsPolyhedronFromPoints(points, count);\n        }\n\n        internal override IntPtr CreateHullAsSurfaceMeshFromPoints(Point3d[] points, int count)\n        {\n            return ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPoints((Point3d[])points, count);\n        }\n\n        internal override IntPtr CreateHullAsPolyhedronFromPlanes(Plane3d[] planes, int count)\n        {\n            return ConvexHull3_EEK_CreateHullAsPolyhedronFromPlanes(planes, count);  \n        }\n\n        internal override IntPtr CreateHullAsSurfaceMeshFromPlanes(Plane3d[] planes, int count)\n        {\n            return ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPlanes(planes, count);\n        }\n\n        internal override bool IsPolyhedronStronglyConvex(IntPtr ptr)\n        {\n            return ConvexHull3_EEK_IsPolyhedronStronglyConvex(ptr);\n        }\n\n        internal override bool IsSurfaceMeshStronglyConvex(IntPtr ptr)\n        {\n            return ConvexHull3_EEK_IsSurfaceMeshStronglyConvex(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConvexHull3_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EEK_CreateHullAsPolyhedronFromPoints(Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPoints(Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EEK_CreateHullAsPolyhedronFromPlanes(Plane3d[] planes, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPlanes(Plane3d[] planes, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull3_EEK_IsPolyhedronStronglyConvex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull3_EEK_IsSurfaceMeshStronglyConvex(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Hulls/ConvexHullKernel3_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Hulls\n{\n    internal class ConvexHullKernel3_EIK : ConvexHullKernel3\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly ConvexHullKernel3 Instance = new ConvexHullKernel3_EIK();\n\n        internal override IntPtr Create()\n        {\n            return ConvexHull3_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConvexHull3_EIK_Release(ptr);\n        }\n\n        internal override IntPtr CreateHullAsPolyhedronFromPoints(Point3d[] points, int count)\n        {\n            return ConvexHull3_EIK_CreateHullAsPolyhedronFromPoints(points, count);\n        }\n\n        internal override IntPtr CreateHullAsSurfaceMeshFromPoints(Point3d[] points, int count)\n        {\n            return ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPoints((Point3d[])points, count);\n        }\n\n        internal override IntPtr CreateHullAsPolyhedronFromPlanes(Plane3d[] planes, int count)\n        {\n            return ConvexHull3_EIK_CreateHullAsPolyhedronFromPlanes(planes, count);\n        }\n\n        internal override IntPtr CreateHullAsSurfaceMeshFromPlanes(Plane3d[] planes, int count)\n        {\n            return ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPlanes(planes, count);\n        }\n\n        internal override bool IsPolyhedronStronglyConvex(IntPtr ptr)\n        {\n            return ConvexHull3_EIK_IsPolyhedronStronglyConvex(ptr);\n        }\n\n        internal override bool IsSurfaceMeshStronglyConvex(IntPtr ptr)\n        {\n            return ConvexHull3_EIK_IsSurfaceMeshStronglyConvex(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConvexHull3_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EIK_CreateHullAsPolyhedronFromPoints(Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPoints(Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EIK_CreateHullAsPolyhedronFromPlanes(Plane3d[] planes, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPlanes(Plane3d[] planes, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull3_EIK_IsPolyhedronStronglyConvex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConvexHull3_EIK_IsSurfaceMeshStronglyConvex(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/ConformingTriangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polygons;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class ConformingTriangulation2<K> : ConformingTriangulation2 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// A static instance of the triangulation.\n        /// </summary>\n        public static readonly ConformingTriangulation2<K> Instance = new ConformingTriangulation2<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public ConformingTriangulation2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        public ConformingTriangulation2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal ConformingTriangulation2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[ConformingTriangulation2<{0}>: VertexCount={1}, TriangleCount={2}]\",\n                Kernel.Name, VertexCount, TriangleCount);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        public void Insert(Polygon2<K> polygon)\n        {\n            Kernel.InsertPolygon(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\"></param>\n        public void Insert(PolygonWithHoles2<K> pwh)\n        {\n            Kernel.InsertPolygonWithHoles(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to insert.</param>\n        public void InsertConstraint(Polygon2<K> polygon)\n        {\n            Kernel.InsertPolygonConstraint(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\">The polygon to insert.</param>\n        public void InsertConstraint(PolygonWithHoles2<K> pwh)\n        {\n            Kernel.InsertPolygonWithHolesConstraint(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// A deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public ConformingTriangulation2<K> Copy()\n        {\n            return new ConformingTriangulation2<K>(Kernel.Copy(Ptr));\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class ConformingTriangulation2 : CGALObject\n    {\n\n        /// <summary>\n        /// The max value the angle bounds can be.\n        /// </summary>\n        public const double MAX_ANGLE_BOUNDS = 0.125;\n\n        /// <summary>\n        /// \n        /// </summary>\n        private ConformingTriangulation2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal ConformingTriangulation2(CGALKernel kernel)\n        {\n            Kernel = kernel.ConformingTriangulationKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal ConformingTriangulation2(CGALKernel kernel, Point2d[] points)\n        {\n            Kernel = kernel.ConformingTriangulationKernel2;\n            Ptr = Kernel.Create();\n            Insert(points, points.Length);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal ConformingTriangulation2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.ConformingTriangulationKernel2;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// The number of verices in the triangulation.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// The number of triangles in the triangulation.\n        /// </summary>\n        public int TriangleCount => Kernel.FaceCount(Ptr);\n\n        /// <summary>\n        /// The number of indices need to represent the\n        /// triangulation (number of triangles * 3).\n        /// </summary>\n        public int IndiceCount => TriangleCount * 3;\n\n        /// <summary>\n        /// The conforming triangulation kernel.\n        /// </summary>\n        internal ConformingTriangulationKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Clear the triangulation.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"point\"></param>\n        public void Insert(Point2d point)\n        {\n            Kernel.InsertPoint(Ptr, point);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        public void Insert(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.InsertPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        public void GetPoints( Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"indices\"></param>\n        /// <param name=\"count\"></param>\n        public void GetIndices(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            Kernel.GetIndices(Ptr, indices, count);\n        }\n\n        /// <summary>\n        /// Translate the triangulation.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the triangulation.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        public void Rotate(Radian rotation)\n        {\n            Kernel.Transform(Ptr, Point2d.Zero, rotation.angle, 1);\n        }\n\n        /// <summary>\n        /// Scale the triangulation.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// Transform the triangulation with a TRS matrix.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Radian rotation, double scale)\n        {\n            Kernel.Transform(Ptr, translation, rotation.angle, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        public void InsertConstraint(Point2d a, Point2d b)\n        {\n            Kernel.InsertSegmentConstraint(Ptr, a, b);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"segment\"></param>\n        public void InsertConstraint(Segment2d segment)\n        {\n            Kernel.InsertSegmentConstraint(Ptr, segment.A, segment.B);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"segments\"></param>\n        /// <param name=\"count\"></param>\n        public void InsertConstraints(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.InsertSegmentConstraints(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Make the mesh delaunay.\n        /// </summary>\n        public void MakeDelaunay()\n        {\n            Kernel.MakeDelaunay(Ptr);\n        }\n\n        /// <summary>\n        /// Make the mesh \n        /// </summary>\n        public void MakeGabriel()\n        {\n            Kernel.MakeGabriel(Ptr);\n        }\n\n        /// <summary>\n        /// Refine the mesh into smaller triangles.\n        /// </summary>\n        /// <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n        /// <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        public void Refine(double angleBounds, double lengthBounds)\n        {\n            if (angleBounds > MAX_ANGLE_BOUNDS)\n                angleBounds = MAX_ANGLE_BOUNDS;\n\n            if (lengthBounds <= 0)\n                return;\n\n            Kernel.RefineAndOptimize(Ptr, 1, angleBounds, lengthBounds);\n        }\n\n        /// <summary>\n        /// Refine the mesh into smaller triangles.\n        /// </summary>\n        /// <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n        /// <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        /// <param name=\"seeds\">Seeds point in polygons that are not to be refined.</param>\n        public void Refine(double angleBounds, double lengthBounds, Point2d[] seeds)\n        {\n            if (angleBounds > MAX_ANGLE_BOUNDS)\n                angleBounds = MAX_ANGLE_BOUNDS;\n\n            if (lengthBounds <= 0)\n                return;\n\n            Kernel.RefineAndOptimizeWithSeeds(Ptr, 1, angleBounds, lengthBounds, seeds, seeds.Length);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"IndiceCount = \" + IndiceCount);\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/ConformingTriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n    internal abstract class ConformingTriangulationKernel2 : CGALObjectKernel\n\t{\n\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract void Clear(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Copy(IntPtr ptr);\n\n\t\tinternal abstract int VertexCount(IntPtr ptr);\n\n\t\tinternal abstract int FaceCount(IntPtr ptr);\n\n\t\tinternal abstract void InsertPoint(IntPtr ptr, Point2d point);\n\n\t\tinternal abstract void InsertPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\tinternal abstract void InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n\t\tinternal abstract void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\tinternal abstract void GetIndices(IntPtr ptr, int[] indices, int count);\n\n\t\tinternal abstract void Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n\t\tinternal abstract void InsertSegmentConstraint(IntPtr ptr, Point2d a, Point2d b);\n\n\t\tinternal abstract void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\tinternal abstract void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n\t\tinternal abstract void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\tinternal abstract void MakeDelaunay(IntPtr ptr);\n\n\t\tinternal abstract void MakeGabriel(IntPtr ptr);\n\n\t\tinternal abstract void RefineAndOptimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds);\n\n\t\tinternal abstract void RefineAndOptimizeWithSeeds(IntPtr ptr, int iterations, double angleBounds, double lengthBounds, Point2d[] points, int count);\n\t}\n}\n\n\n"
  },
  {
    "path": "CGALDotNet/Meshing/ConformingTriangulationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n\tinternal class ConformingTriangulationKernel2_EEK : ConformingTriangulationKernel2\n\t{\n\t\tinternal override string Name => \"EEK\";\n\n\t\tinternal static readonly ConformingTriangulationKernel2 Instance = new ConformingTriangulationKernel2_EEK();\n\n\t\tinternal override IntPtr Create()\n\t\t{\n\t\t\treturn ConformingTriangulation2_EEK_Create();\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_Release(ptr);\n\t\t}\n\n\t\tinternal override void Clear(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_Clear(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Copy(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EEK_Copy(ptr);\n\t\t}\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EEK_VertexCount(ptr);\n\t\t}\n\n\t\tinternal override int FaceCount(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EEK_FaceCount(ptr);\n\t\t}\n\n\t\tinternal override void InsertPoint(IntPtr ptr, Point2d point)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPoint(ptr, point);\n\t\t}\n\n\t\tinternal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPolygon(triPtr, polyPtr);\n\t\t}\n\n\t\tinternal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPolygonWithHoles(triPtr, pwhPtr);\n\t\t}\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_GetPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void GetIndices(IntPtr ptr, int[] indices, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_GetIndices(ptr, indices, count);\n\t\t}\n\n\t\tinternal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n\t\t\tConformingTriangulation2_EEK_Transform(ptr, translation, rotation, scale);\n\t\t}\n\n\t\tinternal override void InsertSegmentConstraint(IntPtr ptr, Point2d a, Point2d b)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertSegmentConstraint(ptr, a, b);\n\t\t}\n\n\t\tinternal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertSegmentConstraints(ptr, segments, count);\n\t\t}\n\n\t\tinternal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPolygonConstraint(triPtr, polyPtr);\n\t\t}\n\n\t\tinternal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n\t\t}\n\n\t\tinternal override void MakeDelaunay(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_MakeDelaunay(ptr);\n\t\t}\n\n\t\tinternal override void MakeGabriel(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_MakeGabriel(ptr);\n\t\t}\n\n\t\tinternal override void RefineAndOptimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds)\n\t\t{\n\t\t\tConformingriangulation2_EEK_RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds);\n\t\t}\n\n\t\tinternal override void RefineAndOptimizeWithSeeds(IntPtr ptr, int iterations, double angleBounds, double lengthBounds, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EEK_RefineAndOptimizeWithSeeds(ptr, iterations, angleBounds, lengthBounds, points, count);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr ConformingTriangulation2_EEK_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_Clear(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr ConformingTriangulation2_EEK_Copy(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int ConformingTriangulation2_EEK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int ConformingTriangulation2_EEK_FaceCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertSegmentConstraint(IntPtr ptr, Point2d a, Point2d b);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_MakeDelaunay(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_MakeGabriel(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Conformingriangulation2_EEK_RefineAndOptimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EEK_RefineAndOptimizeWithSeeds(IntPtr ptr, int iterations, double angleBounds, double lengthBounds, Point2d[] points, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/ConformingTriangulationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n\tinternal class ConformingTriangulationKernel2_EIK : ConformingTriangulationKernel2\n\t{\n\t\tinternal override string Name => \"EIK\";\n\n\t\tinternal static readonly ConformingTriangulationKernel2 Instance = new ConformingTriangulationKernel2_EIK();\n\n\t\tinternal override IntPtr Create()\n\t\t{\n\t\t\treturn ConformingTriangulation2_EIK_Create();\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_Release(ptr);\n\t\t}\n\n\t\tinternal override void Clear(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_Clear(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Copy(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EIK_Copy(ptr);\n\t\t}\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EIK_VertexCount(ptr);\n\t\t}\n\n\t\tinternal override int FaceCount(IntPtr ptr)\n\t\t{\n\t\t\treturn ConformingTriangulation2_EIK_FaceCount(ptr);\n\t\t}\n\n\t\tinternal override void InsertPoint(IntPtr ptr, Point2d point)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPoint(ptr, point);\n\t\t}\n\n\t\tinternal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPolygon(triPtr, polyPtr);\n\t\t}\n\n\t\tinternal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPolygonWithHoles(triPtr, pwhPtr);\n\t\t}\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_GetPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void GetIndices(IntPtr ptr, int[] indices, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_GetIndices(ptr, indices, count);\n\t\t}\n\n\t\tinternal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_Transform(ptr, translation, rotation, scale);\n\t\t}\n\n\t\tinternal override void InsertSegmentConstraint(IntPtr ptr, Point2d a, Point2d b)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertSegmentConstraint(ptr, a, b);\n\t\t}\n\n\t\tinternal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertSegmentConstraints(ptr, segments, count);\n\t\t}\n\n\t\tinternal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPolygonConstraint(triPtr, polyPtr);\n\t\t}\n\n\t\tinternal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n\t\t}\n\n\t\tinternal override void MakeDelaunay(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_MakeDelaunay(ptr);\n\t\t}\n\n\t\tinternal override void MakeGabriel(IntPtr ptr)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_MakeGabriel(ptr);\n\t\t}\n\n\t\tinternal override void RefineAndOptimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds)\n\t\t{\n\t\t\tConformingriangulation2_EIK_RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds);\n\t\t}\n\n\t\tinternal override void RefineAndOptimizeWithSeeds(IntPtr ptr, int iterations, double angleBounds, double lengthBounds, Point2d[] points, int count)\n\t\t{\n\t\t\tConformingTriangulation2_EIK_RefineAndOptimizeWithSeeds(ptr, iterations, angleBounds, lengthBounds, points, count);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr ConformingTriangulation2_EIK_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_Clear(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr ConformingTriangulation2_EIK_Copy(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int ConformingTriangulation2_EIK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int ConformingTriangulation2_EIK_FaceCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPoint(IntPtr ptr, Point2d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertSegmentConstraint(IntPtr ptr, Point2d a, Point2d b);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_MakeDelaunay(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_MakeGabriel(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Conformingriangulation2_EIK_RefineAndOptimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void ConformingTriangulation2_EIK_RefineAndOptimizeWithSeeds(IntPtr ptr, int iterations, double angleBounds, double lengthBounds, Point2d[] points, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/SkinSurfaceMeshing.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polyhedra;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class SkinSurfaceMeshing<K> : SkinSurfaceMeshing where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly SkinSurfaceMeshing<K> Instance = new SkinSurfaceMeshing<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public SkinSurfaceMeshing() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal SkinSurfaceMeshing(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[SkinMeshing<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"shrinkFactor\"></param>\n        /// <param name=\"subdivde\"></param>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        public Polyhedron3<K> CreateSkinPolyhedra(double shrinkFactor, bool subdivde, Point3d[] points, int count)\n        {\n            if (shrinkFactor < 0)\n                shrinkFactor = 0;\n\n            if (shrinkFactor == 0)\n                return new Polyhedron3<K>();\n\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.MakeSkinSurface(shrinkFactor, subdivde, points, count);\n            return new Polyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"shrinkFactor\"></param>\n        /// <param name=\"subdivde\"></param>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        public Polyhedron3<K> CreateSkinPolyhedra(double shrinkFactor, bool subdivde, HPoint3d[] points, int count)\n        {\n            if(shrinkFactor < 0)\n                shrinkFactor = 0;\n\n            if (shrinkFactor == 0)\n                return new Polyhedron3<K>();\n\n            ErrorUtil.CheckArray(points, count);\n            var ptr = Kernel.MakeSkinSurface(shrinkFactor, subdivde, points, count);\n            return new Polyhedron3<K>(ptr);\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class SkinSurfaceMeshing : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private SkinSurfaceMeshing()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal SkinSurfaceMeshing(CGALKernel kernel)\n        {\n            Kernel = kernel.SkinSurfaceMeshingKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal SkinSurfaceMeshing(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.SkinSurfaceMeshingKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal SkinSurfaceMeshingKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/SkinSurfaceMeshingKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Meshing\n{\n    internal abstract class SkinSurfaceMeshingKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract IntPtr MakeSkinSurface(double shrinkfactor, bool subdivide, Point3d[] points, int count);\n\n        internal abstract IntPtr MakeSkinSurface(double shrinkfactor, bool subdivide, HPoint3d[] points, int count);\n    }\n}"
  },
  {
    "path": "CGALDotNet/Meshing/SkinSurfaceMeshingKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Meshing\n{\n    internal class SkinSurfaceMeshingKernel_EEK : SkinSurfaceMeshingKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly SkinSurfaceMeshingKernel Instance = new SkinSurfaceMeshingKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return SkinSurfaceMeshing_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SkinSurfaceMeshing_EEK_Release(ptr);\n        }\n\n        internal override IntPtr MakeSkinSurface(double shrinkfactor, bool subdivide, Point3d[] points, int count)\n        {\n            return SkinSurfaceMeshing_EEK_MakeSkinSurface_Point3d(shrinkfactor, subdivide, points, count);\n        }\n\n        internal override IntPtr MakeSkinSurface(double shrinkfactor, bool subdivide, HPoint3d[] points, int count)\n        {\n            return SkinSurfaceMeshing_EEK_MakeSkinSurface_HPoint3d(shrinkfactor, subdivide, points, count);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SkinSurfaceMeshing_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SkinSurfaceMeshing_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SkinSurfaceMeshing_EEK_MakeSkinSurface_Point3d(double shrinkfactor, bool subdivide, Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SkinSurfaceMeshing_EEK_MakeSkinSurface_HPoint3d(double shrinkfactor, bool subdivide, HPoint3d[] points, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/TetrahedralRemeshing.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polygons;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Meshing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class TetrahedralRemeshing<K> : TetrahedralRemeshing where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance of the tetrahedral remeshing.\n        /// </summary>\n        public static readonly TetrahedralRemeshing<K> Instance = new TetrahedralRemeshing<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public TetrahedralRemeshing() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal TetrahedralRemeshing(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[TetrahedralRemeshing<{0}>: ]\", Kernel.Name);\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class TetrahedralRemeshing : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private TetrahedralRemeshing()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal TetrahedralRemeshing(CGALKernel kernel)\n        {\n            Kernel = kernel.TetrahedralRemeshingKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal TetrahedralRemeshing(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.TetrahedralRemeshingKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// The tetrahedral remeshing kernel.\n        /// </summary>\n        internal TetrahedralRemeshingKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"targetLength\"></param>\n        /// <param name=\"iterations\"></param>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        public int Remesh(double targetLength, int iterations, Point3d[] points, int count)\n        {\n            return Kernel.Remesh(Ptr, targetLength, iterations, points, count);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        /// <param name=\"count\"></param>\n        public void GetPoints(Point3d[] points, int count)\n        {\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/TetrahedralRemeshingKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Meshing\n{\n    internal abstract class TetrahedralRemeshingKernel : CGALObjectKernel\n    {\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract int Remesh(IntPtr ptr, double targetLength, int iterations, Point3d[] points, int count);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Meshing/TetrahedralRemeshingKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Meshing\n{\n    internal class TetrahedralRemeshingKernel_EEK : TetrahedralRemeshingKernel\n\t{\n\t\tinternal override string Name => \"EEK\";\n\n\t\tinternal static readonly TetrahedralRemeshingKernel Instance = new TetrahedralRemeshingKernel_EEK();\n\n\t\tinternal override IntPtr Create()\n\t\t{\n\t\t\treturn TetrahedralRemeshing_EEK_Create();\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tTetrahedralRemeshing_EEK_Release(ptr);\n\t\t}\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n\t\t\tTetrahedralRemeshing_EEK_GetPoints(ptr, points, count);\n        }\n\n\t\tinternal override int Remesh(IntPtr ptr, double targetLength, int iterations, Point3d[] points, int count)\n        {\n\t\t\treturn TetrahedralRemeshing_EEK_Remesh(ptr, targetLength, iterations, points, count);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr TetrahedralRemeshing_EEK_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void TetrahedralRemeshing_EEK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void TetrahedralRemeshing_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int TetrahedralRemeshing_EEK_Remesh(IntPtr ptr, double targetLength, int iterations, Point3d[] points, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/Polygon2.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Triangulations;\nusing CGALDotNet.Meshing;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Polygons\n{\n\n    /// <summary>\n    /// Generic polygon definition.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Polygon2<K> : Polygon2 where K : CGALKernel, new() \n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Polygon2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a set of points.\n        /// </summary>\n        /// <param name=\"points\">The polygons points.</param>\n        public Polygon2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The polygons pointer.</param>\n        internal Polygon2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The polygon as a string.\n        /// </summary>\n        /// <returns>The polygon as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Polygon2<{0}>: Count={1}, IsSimple={2}, Orientation={3}]\",\n                Kernel.Name, Count, IsSimple, Orientation);\n        }\n\n        /// <summary>\n        /// Copy the polygon.\n        /// </summary>\n        /// <returns>The copied polygon.</returns>\n        public Polygon2<K> Copy()\n        {\n            var copy = new Polygon2<K>(Kernel.Copy(Ptr));\n            copy.Update(IsSimple, Orientation);\n            return copy;\n        }\n\n        /// <summary>\n        /// Triangulate the polygon.\n        /// </summary>\n        /// <param name=\"indices\">The triangle indices.</param>\n        public override void Triangulate(List<int> indices)\n        {\n            try\n            {\n                var ct = ConstrainedTriangulation2<K>.Instance;\n                ct.InsertConstraint(this);\n                ct.GetConstrainedDomainIndices(indices);\n                ct.Clear();\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersects(Polygon2<K> polygon)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.DoIntersect(this, polygon);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersects(PolygonWithHoles2<K> polygon)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.DoIntersect(this, polygon);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <param name=\"results\">The intersection results.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersection(Polygon2<K> polygon, List<PolygonWithHoles2<K>> results)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.Intersect(this, polygon, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <param name=\"results\">The intersection results.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersection(PolygonWithHoles2<K> polygon, List<PolygonWithHoles2<K>> results)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.Intersect(this, polygon, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Refine the polygon to a triangulation.\n        /// Does not modify this polygon.\n        /// </summary>\n        /// <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        /// <returns>The base triangulation.</returns>\n        public DelaunayTriangulation2<K> Refine(double lengthBounds)\n        {\n            return Refine(ConformingTriangulation2.MAX_ANGLE_BOUNDS, lengthBounds);\n        }\n\n        /// <summary>\n        /// Refine the polygon to a triangulation.\n        /// Does not modify this polygon.\n        /// </summary>\n        /// <param name=\"angleBounds\">Default shape bound. 0.125 corresponds to abound 20.6 degree. Max 0.125 value.</param>\n        /// <param name=\"lengthBounds\">Upper bound on the length of the longest edge.</param>\n        /// <returns>The base triangulation.</returns>\n        public DelaunayTriangulation2<K> Refine(double angleBounds, double lengthBounds)\n        {\n            try\n            {\n                var ct = ConformingTriangulation2<K>.Instance;\n                ct.InsertConstraint(this);\n                ct.Refine(angleBounds, lengthBounds);\n\n                int count = ct.VertexCount;\n                var points = ArrayCache.Point2dArray(count);\n                ct.GetPoints(points, count);\n                ct.Clear();\n\n                return new DelaunayTriangulation2<K>(points);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return new DelaunayTriangulation2<K>();\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex pieces.\n        /// Does not modify this polygon.\n        /// </summary>\n        /// <param name=\"results\">The convex partition.</param>\n        /// <param name=\"type\">The type of partition method.</param>\n        public void Partition(List<Polygon2<K>> results, POLYGON_PARTITION type = POLYGON_PARTITION.GREENE_APROX_CONVEX)\n        {\n            try\n            {\n                var part = PolygonPartition2<K>.Instance;\n                part.Partition(type, this, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"threshold\">The simplification threshold.</param>\n        public void Simplify(double threshold)\n        {\n            var param = PolygonSimplificationParams.Default;\n            param.threshold = threshold;\n            Simplify(param);\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"param\">The simplification parameters.</param>\n        public void Simplify(PolygonSimplificationParams param)\n        {\n            try\n            {\n                var sim = PolygonSimplification2<K>.Instance;\n                var ptr = sim.SimplifyPtr(this, param);\n                Swap(ptr);\n                IsUpdated = false;\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// offset the polygon. Does not modify this polygon.\n        /// </summary>\n        /// <param name=\"offset\">The type of offset.</param>\n        /// <param name=\"amount\">The amount to offset.</param>\n        /// <param name=\"results\">The offset results.</param>\n        public void Offset(OFFSET offset, double amount, List<Polygon2<K>> results)\n        {\n            try\n            {\n                var off = PolygonOffset2<K>.Instance;\n                off.CreateOffset(offset, this, amount, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// Create a polyhedron3 mesh with one polygon face.\n        /// </summary>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        /// <returns>The new polyhedron mesh</returns>\n        /// <exception cref=\"InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        public Polyhedron3<K> ToPolyhedron3(bool xz)\n        {\n            if (!IsSimple)\n                throw new InvalidOperationException(\"Polygon must be simple to convert to polyhedron mesh.\");\n\n            var poly = new Polyhedron3<K>();\n            poly.CreatePolygonMesh(this, xz);\n            return poly;\n        }\n\n        /// <summary>\n        /// Get the dual polygon where every point s now a edge.\n        /// </summary>\n        /// <returns>The dual polygon.</returns>\n        public Polygon2<K> Dual()\n        {\n            int count = Count;\n            if (count < 3)\n                throw new InvalidOperationException(\"Count < 3\");\n\n            var points = new Point2d[count];\n\n            for (int i = 0; i < count; i++)\n            {\n                var a = GetPoint(i);\n                var b = GetPointWrapped(i + 1);\n\n                points[i] = (a + b) * 0.5;\n            }\n\n            return new Polygon2<K>(points);\n        }\n    }\n\n    /// <summary>\n    /// The abstract polygon definition.\n    /// </summary>\n    public abstract class Polygon2 : CGALObject, IEnumerable<Point2d>\n    {\n\n        /// <summary>\n        /// Is the polygon simple.\n        /// Must be updated to find if simple.\n        /// </summary>\n        private bool m_isSimple;\n\n        /// <summary>\n        /// The polygons orientation.\n        /// Must be updated to find orientation.\n        /// </summary>\n        private ORIENTATION m_orientation;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private Polygon2()\n        {\n            \n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polygon kernel.</param>\n        internal Polygon2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polygon kernel.</param>\n        /// <param name=\"points\">The points to construct from.</param>\n        internal Polygon2(CGALKernel kernel, Point2d[] points)\n        {\n            Kernel = kernel.PolygonKernel2;\n            Ptr = Kernel.Create();\n            SetPoints(points, points.Length);\n            Update();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polygon kernel.</param>\n        /// <param name=\"ptr\">The polygons pointer.</param>\n        internal Polygon2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.PolygonKernel2;\n            Count = Kernel.Count(Ptr);\n            Update();\n        }\n\n        /// <summary>\n        /// The number of points in the polygon.\n        /// </summary>\n        public int Count { get; private set; }\n\n        /// <summary>\n        /// The capacity of the point array.\n        /// </summary>\n        public int Capacity => Kernel.Capacity(Ptr);\n\n        /// <summary>\n        /// Is this a simple polygon.\n        /// Certains actions can only be carried out on simple polygons.\n        /// </summary>\n        public bool IsSimple\n        {\n            get\n            {\n                Update();\n                return m_isSimple;\n            }\n            protected set\n            {\n                m_isSimple = value;\n            }\n        }\n\n        /// <summary>\n        /// The polygons orientation.\n        /// Certain actions depend on the polygons orientation.\n        /// </summary>\n        public ORIENTATION Orientation\n        {\n            get\n            {\n                Update();\n                return m_orientation;\n            }\n            protected set\n            {\n                m_orientation = value;\n            }\n        }\n\n        /// <summary>\n        /// The orientation expressed as the clock direction.\n        /// </summary>\n        public CLOCK_DIR ClockDir => (CLOCK_DIR)Orientation;\n\n        /// <summary>\n        /// Is the polygon degenerate.\n        /// Polygons with less than 3 points are degenerate.\n        /// </summary>\n        public bool IsDegenerate => Count < 3 || Orientation == ORIENTATION.ZERO;\n\n        /// <summary>\n        /// Is the polygon cw orientated.\n        /// </summary>\n        public bool IsClockWise => ClockDir == CLOCK_DIR.CLOCKWISE;\n\n        /// <summary>\n        /// Is the polygon ccw orientated.\n        /// </summary>\n        public bool IsCounterClockWise => ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE;\n\n        /// <summary>\n        /// Is the polygon updated.\n        /// </summary>\n        protected bool IsUpdated { get; set; }\n\n        /// <summary>\n        /// The polygons kernel.\n        /// Contains the functions to the unmanaged CGAL polygon.\n        /// </summary>\n        protected private PolygonKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// Array accessor for the polygon.\n        /// Getting a point wraps around the polygon.\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public Point2d this[int i]\n        {\n            get => GetPointWrapped(i);\n            set => SetPoint(i, value);\n        }\n\n        /// <summary>\n        /// Mark th mesh as needing to be updated.\n        /// </summary>\n        public void SetIsUpdatedToFalse()\n        {\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Valid polygons should be simple and ccw \n        /// for most algorithms to work on them.\n        /// </summary>\n        public bool IsValid()\n        {\n            return IsSimple && IsCounterClockWise;\n        }\n\n        /// <summary>\n        /// Valid hole polygons should be simple\n        /// and cw to add to a polygon with holes.\n        /// </summary>\n        public bool IsValidHole()\n        {\n            return IsSimple && IsClockWise;\n        }\n\n        /// <summary>\n        /// Clear the polygon of all points.\n        /// </summary>\n        public void Clear()\n        {\n            Count = 0;\n            Kernel.Clear(Ptr);\n            Update(false, ORIENTATION.ZERO);\n        }\n\n        /// <summary>\n        /// Shrink the capacity to match the point count.\n        /// </summary>\n        public void ShrinkCapacityToFitCount()\n        {\n            Kernel.ShrinkToFit(Ptr);\n        }\n\n        /// <summary>\n        /// Resize the point array.\n        /// New elements will default to zero.\n        /// </summary>\n        /// <param name=\"count\"></param>\n        public void Resize(int count)\n        {\n            Count = count;\n            IsUpdated = false;\n            Kernel.Resize(Ptr, count);\n        }\n\n        /// <summary>\n        /// Remove the point at the index from the array.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        public void Remove(int index)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count--;\n            IsUpdated = false;\n            Kernel.Erase(Ptr, index);\n        }\n\n        /// <summary>\n        /// Remove a range of points from the array.\n        /// </summary>\n        /// <param name=\"start\">The starting index</param>\n        /// <param name=\"count\">The number of points to remove.</param>\n        public void Remove(int start, int count)\n        {\n            if (start < 0 || start >= Count || start + count >= Count || count > Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count -= count;\n            IsUpdated = false;\n            Kernel.EraseRange(Ptr, start, count);\n        }\n\n        /// <summary>\n        /// Insert the point at the index into the array.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The point to insert.</param>\n        public void Insert(int index, Point2d point)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count++;\n            IsUpdated = false;\n            Kernel.Insert(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Insert a range of points into the array.\n        /// </summary>\n        /// <param name=\"start\">The starting index</param>\n        /// <param name=\"points\">The points to insert.</param>\n        /// <param name=\"count\">The number of points to insert.</param>\n        public void Insert(int start, Point2d[] points, int count)\n        {\n            if (start < 0 || start >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            ErrorUtil.CheckArray(points, count);\n            Count += count;\n            IsUpdated = false;\n            Kernel.InsertRange(Ptr, start, count, points);\n        }\n\n        /// <summary>\n        /// Add the point to the end of the poylgon.\n        /// </summary>\n        /// <param name=\"point\">The point to add.</param>\n        public void Add(Point2d point)\n        {\n            Insert(Count-1, point);\n        }\n\n        /// <summary>\n        /// Get the point a the index.\n        /// </summary>\n        /// <param name=\"index\">The points index to get.</param>\n        /// <returns>The point at index.</returns>\n        public Point2d GetPoint(int index)\n        {\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and wrap around the polygon.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point2d GetPointWrapped(int index)\n        {\n            index = MathUtil.Wrap(index, Count);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and clamp to the polygons last point.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point2d GetPointClamped(int index)\n        {\n            index = MathUtil.Clamp(index, 0, Count - 1);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get all the points in the polygon.\n        /// </summary>\n        /// <param name=\"points\">The point array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get all the polygon points.\n        /// </summary>\n        /// <param name=\"points\">The list to copy the data into.</param>\n        public void GetPoints(List<Point2d> points)\n        {\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(i));\n        }\n\n        /// <summary>\n        /// Triangulate the polygon.\n        /// </summary>\n        /// <param name=\"indices\">The triangle indices.</param>\n        public abstract void Triangulate(List<int> indices);\n\n        /*\n    /// <summary>\n    /// Triangulate the polygon.\n    /// </summary>\n    /// <param name=\"triangules\">The triangless.</param>\n    public void Triangulate(List<Triangle2d> triangules)\n    {\n        int numPoints = Count;\n\n        var points = ArrayCache.Point2dArray(numPoints);\n        GetPoints(points, points.Length);\n\n        // A polygon can be composed of multiple contours which are all tessellated at the same time.\n        var contour = new ContourVertex[numPoints];\n        for (int i = 0; i < numPoints; i++)\n            contour[i].Position = new Vec3(points[i].x, points[i].y, 0);\n\n        // Create an instance of the tessellator. Can be reused.\n        var tess = new Tess();\n        // Add the contour with a specific orientation, use \"Original\" if you want to keep the input orientation.\n        tess.AddContour(contour, ContourOrientation.Clockwise);\n\n        // Tessellate!\n        // The winding rule determines how the different contours are combined together.\n        // See http://www.glprogramming.com/red/chapter11.html (section \"Winding Numbers and Winding Rules\") for more information.\n        // If you want triangles as output, you need to use \"Polygons\" type as output and 3 vertices per polygon.\n        tess.Tessellate(WindingRule.EvenOdd, ElementType.Polygons, 3);\n\n        int numTriangles = tess.ElementCount;\n        for (int i = 0; i < numTriangles; i++)\n        {\n            var a = points[tess.Elements[i * 3 + 0]];\n            var b = points[tess.Elements[i * 3 + 1]];\n            var c = points[tess.Elements[i * 3 + 2]];\n\n            var t = new Triangle2d(a, b, c);\n\n            triangules.Add(t);\n        }\n    }\n\n    /// <summary>\n    /// Triangulate the polygon.\n    /// </summary>\n    /// <param name=\"triangules\">The triangle indices.</param>\n    public void Triangulate(List<int> triangules)\n    {\n        int numPoints = Count;\n\n        var points = new Point2d[numPoints];\n        GetPoints(points, points.Length);\n\n        // A polygon can be composed of multiple contours which are all tessellated at the same time.\n        var contour = new ContourVertex[numPoints];\n        for (int i = 0; i < numPoints; i++)\n            contour[i].Position = new Vec3(points[i].x, points[i].y, 0);\n\n        // Create an instance of the tessellator. Can be reused.\n        var tess = new Tess();\n        // Add the contour with a specific orientation, use \"Original\" if you want to keep the input orientation.\n        tess.AddContour(contour, ContourOrientation.Clockwise);\n\n        // The winding rule determines how the different contours are combined together.\n        // See http://www.glprogramming.com/red/chapter11.html (section \"Winding Numbers and Winding Rules\") for more information.\n        // If you want triangles as output, you need to use \"Polygons\" type as output and 3 vertices per polygon.\n        tess.Tessellate(WindingRule.EvenOdd, ElementType.Polygons, 3);\n\n        int numTriangles = tess.ElementCount;\n        for (int i = 0; i < numTriangles; i++)\n        {\n            var a = tess.Elements[i * 3 + 0];\n            var b = tess.Elements[i * 3 + 1];\n            var c = tess.Elements[i * 3 + 2];\n\n            Console.WriteLine(a);\n            Console.WriteLine(b);\n            Console.WriteLine(c);\n\n            triangules.Add(a);\n            triangules.Add(b);\n            triangules.Add(c);\n        }\n    }\n    */\n\n        /// <summary>\n        /// Get all the polygon segments.\n        /// </summary>\n        /// <param name=\"segments\">The segment array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetSegments(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Set the points at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The points value.</param>\n        public void SetPoint(int index, Point2d point)\n        {\n            Kernel.SetPoint(Ptr, index, point);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Set the points from the array.\n        /// If the array is larger than the polygon then \n        /// the new points will be appended to end of polygon.\n        /// </summary>\n        /// <param name=\"points\">The points array.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void SetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.SetPoints(Ptr, points, count);\n            Count = count;\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Reverse the polygon.\n        /// Swithches the orientation.\n        /// </summary>\n        public void Reverse()\n        {\n            Kernel.Reverse(Ptr);\n            m_orientation = CGALEnum.Opposite(m_orientation);\n        }\n\n        /// <summary>\n        /// Find the bounding box for the polygon.\n        /// </summary>\n        /// <returns>The bounding box.</returns>\n        public Box2d FindBoundingBox()\n        {\n            return Kernel.GetBoundingBox(Ptr);\n        }\n\n        /// <summary>\n        /// Find if the polygon is simple.\n        /// </summary>\n        /// <returns>True if simple.</returns>\n        public bool FindIfSimple()\n        {\n            if (Count < 3)\n                return false;\n            else\n                return Kernel.IsSimple(Ptr);\n        }\n\n        /// <summary>\n        /// Find if the polygon is convex.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <returns>True if the polygon is convex.</returns>\n        public bool FindIfConvex()\n        {\n            if (IsSimple)\n                return Kernel.IsConvex(Ptr);\n            else\n                return false;\n        }\n\n        /// <summary>\n        /// Find the polygons orientation.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <returns>The polygons orientations.</returns>\n        public ORIENTATION FindOrientation()\n        {\n            if (IsSimple)\n                return Kernel.Orientation(Ptr);\n            else\n                return ORIENTATION.ZERO;\n        }\n\n        /// <summary>\n        /// Find the orientated side the point lies on.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The orientated side of the polygon the point is on.</returns>\n        public ORIENTED_SIDE OrientedSide(Point2d point)\n        {\n            if (IsSimple)\n                return Kernel.OrientedSide(Ptr, point);\n            else\n                return ORIENTED_SIDE.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find the bounded side the point lies on.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The bounded side of the polygon the point is on.</returns>\n        public BOUNDED_SIDE BoundedSide(Point2d point)\n        {\n            if (IsSimple)\n                return Kernel.BoundedSide(Ptr, point);\n            else\n                return BOUNDED_SIDE.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find the polygons signed area. \n        /// Must be simple to determine.\n        /// </summary>\n        /// <returns>The signed area is positive if polygon is ccw \n        /// and negation if cw.</returns>\n        public double FindSignedArea()\n        {\n            if (IsSimple)\n                return Kernel.SignedArea(Ptr);\n            else\n                return 0;\n        }\n\n        /// <summary>\n        /// The area of the polygon.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <returns>The abs of the signed area.</returns>\n        public double FindArea()\n        {\n            return Math.Abs(FindSignedArea());\n        }\n\n        /// <summary>\n        /// Find the perimeter.\n        /// This is the length of the polygon boundary.\n        /// </summary>\n        /// <returns></returns>\n        public double FindPerimeter()\n        {\n            return Kernel.SqPerimeter(Ptr);\n        }\n\n        /// <summary>\n        /// Find the square perimeter.\n        /// This is the square length of the polygon boundary.\n        /// </summary>\n        /// <returns></returns>\n        public double FindSquarePerimeter()\n        {\n            return Kernel.SqPerimeter(Ptr);\n        }\n\n        /// <summary>\n        /// Does the polygon contain the points.\n        /// Must be simple to determine.\n        /// </summary>\n        /// <param name=\"point\">The point to find.</param>\n        /// <param name=\"inculdeBoundary\">Does the point on the boundary count</param>\n        /// <returns>True if the point is inside the polygon.</returns>\n        public bool ContainsPoint(Point2d point, bool inculdeBoundary = true)\n        {\n            if (IsSimple)\n                 return Kernel.ContainsPoint(Ptr, point, Orientation, inculdeBoundary);\n            else\n                return false;\n        }\n\n        /// <summary>\n        /// Round each point it polygon to a number of digits.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            for(int i = 0; i < Count; i++)\n                this[i] = GetPoint(i).Rounded(digits);\n\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Translate the polygon.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Translate(Ptr, translation);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Rotate the polygon.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Rotate(Ptr, rotation.radian);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Scale the polygon.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Scale(Ptr, scale);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Transform the polygon with a TRS matrix.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Transform(Ptr, translation, rotation.radian, scale);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polygon.\n        /// </summary>\n        /// <returns>Each point in polygon.</returns>\n        public IEnumerator<Point2d> GetEnumerator()\n        {\n            for (int i = 0; i < Count; i++)\n                yield return GetPoint(i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polygon.\n        /// </summary>\n        /// <returns>Each point in polygon.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Return all the points in the polygon in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point2d[] ToArray()\n        {\n            var points = new Point2d[Count];\n            GetPoints(points, points.Length);\n            return points;\n        }\n\n        /// <summary>\n        /// Get all the points in the polygon into a list.\n        /// </summary>\n        public void ToList(List<Point2d> list)\n        {\n            for (int i = 0; i < Count; i++)\n                list.Add(GetPoint(i));\n        }\n\n        /// <summary>\n        /// Convert the polygon to a new polygon with a different kernel.\n        /// May result in different values due to precision issues.\n        /// </summary>\n        /// <typeparam name=\"T\">The new kernel type.</typeparam>\n        /// <returns>The new polygon.</returns>\n        public Polygon2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Convert(Ptr, e);\n            return new Polygon2<T>(ptr);\n        }\n\n        /// <summary>\n        /// Truncate a point in the polygon by splitting\n        /// the point and shifting toward its neghbours.\n        /// </summary>\n        /// <param name=\"index\">The points index in mesh.</param>\n        /// <param name=\"amount\">The amount to truncale.</param>\n        public void Truncate(int index, double amount)\n        {\n            if (amount <= 0) return;\n\n            var a = GetPointWrapped(index - 1);\n            var b = GetPoint(index);\n            var c = GetPointWrapped(index + 1);\n\n            var dir_ba = Point2d.Direction(b, a);\n            var dir_bc = Point2d.Direction(b, c);\n\n            var dist_ba = Point2d.Distance(b, a);\n            var dist_bc = Point2d.Distance(b, c);\n\n            if (amount >= dist_ba && amount >= dist_bc)\n            {\n                Remove(index);\n            }\n            else if (amount < dist_ba && amount < dist_bc)\n            {\n                var d = b + dir_ba * amount;\n                var e = b + dir_bc * amount;\n\n                Remove(index);\n                Insert(index, d);\n                Insert(index + 1, e);\n            }\n        }\n\n        /// <summary>\n        /// Print the polygon into a styring builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            Update();\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Capacity = \" + Capacity);\n            builder.AppendLine(\"CCW = \" + IsCounterClockWise);\n            builder.AppendLine(\"Is convex = \" + FindIfConvex());\n            builder.AppendLine(\"Signed Area = \" + FindSignedArea());\n            builder.AppendLine(\"Area = \" + FindArea());\n            builder.AppendLine(\"Perimeter = \" + FindPerimeter());\n\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Release(ptr);\n        }\n\n        /// <summary>\n        /// Update the polygon if needed.\n        /// </summary>\n        protected void Update()\n        {\n            if (IsUpdated) return;\n            IsUpdated = true;\n\n            if (FindIfSimple())\n            {\n                IsSimple = true;\n                Orientation = FindOrientation();\n            }\n            else\n            {\n                IsSimple = false;\n                Orientation = ORIENTATION.ZERO;\n            }\n        }\n\n        /// <summary>\n        /// Update the polygon directly without calling the update\n        /// function.\n        /// </summary>\n        /// <param name=\"isSimple\">Is the polygon simepl.</param>\n        /// <param name=\"orientation\">The polygons orientation.</param>\n        protected void Update(bool isSimple, ORIENTATION orientation)\n        {\n            IsSimple = isSimple;\n            Orientation = orientation;\n            IsUpdated = true;\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonAlgorithm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    public abstract class PolygonAlgorithm : CGALObject\n    {\n        /// <summary>\n        /// Should the input polygon be checked.\n        /// Can disable for better performance if \n        /// it is know all input if valid.\n        /// </summary>\n        public bool CheckInput = true;\n\n        /// <summary>\n        /// Check if the polygon is valid to offset.\n        /// Should be simple and ccw.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to check.</param>\n        protected void CheckPolygon(Polygon2 polygon)\n        {\n            if (polygon == null)\n                throw new NullReferenceException(\"The polygon is null.\");\n\n            if (!CheckInput) return;\n\n            if (!polygon.IsValid())\n                throw new InvalidOperationException(\"Polygon2 must be simple and ccw.\");\n        }\n\n        /// <summary>\n        /// Check if the polygon is valid to offset.\n        /// Should be simple and ccw.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to check.</param>\n        protected void CheckPolygon(PolygonWithHoles2 polygon)\n        {\n            if (polygon == null)\n                throw new NullReferenceException(\"The polygon is null.\");\n\n            if (!CheckInput) return;\n\n            if (!polygon.IsValid())\n                throw new InvalidOperationException(\"PolygonWithHoles2 must be simple and ccw and all holes must be simple and cw.\");\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonBoolean2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace CGALDotNet.Polygons\n{\n    /// <summary>\n    /// The type of boolean ops.\n    /// </summary>\n    public enum POLYGON_BOOLEAN \n    { \n        JOIN, \n        INTERSECT, \n        DIFFERENCE, \n        SYMMETRIC_DIFFERENCE\n    };\n\n    /// <summary>\n    /// Generic polygon boolean class.\n    /// </summary>\n    /// <typeparam name=\"K\">The type of kernel</typeparam>\n    public sealed class PolygonBoolean2<K> : PolygonBoolean2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance to the boolean class.\n        /// </summary>\n        public static readonly PolygonBoolean2<K> Instance = new PolygonBoolean2<K>();\n\n        /// <summary>\n        /// Create a new object.\n        /// </summary>\n        public PolygonBoolean2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonBoolean2<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Perform the boolean op on the two polygons.\n        /// </summary>\n        /// <param name=\"op\">The type of op.</param>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The result of the op.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Op(POLYGON_BOOLEAN op, Polygon2<K> polygon1, Polygon2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            switch (op)\n            {\n                case POLYGON_BOOLEAN.JOIN:\n                    return Join(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.INTERSECT:\n                    return Intersect(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.DIFFERENCE:\n                    return Difference(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.SYMMETRIC_DIFFERENCE:\n                    return SymmetricDifference(polygon1, polygon2, result);\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Perform the boolean op on the two polygons.\n        /// </summary>\n        /// <param name=\"op\">The type of op.</param>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The result of the op.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Op(POLYGON_BOOLEAN op, Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            switch (op)\n            {\n                case POLYGON_BOOLEAN.JOIN:\n                    return Join(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.INTERSECT:\n                    return Intersect(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.DIFFERENCE:\n                    return Difference(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.SYMMETRIC_DIFFERENCE:\n                    return SymmetricDifference(polygon1, polygon2, result);\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Perform the boolean op on the two polygons.\n        /// </summary>\n        /// <param name=\"op\">The type of op.</param>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The result of the op.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Op(POLYGON_BOOLEAN op, PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            switch (op)\n            {\n                case POLYGON_BOOLEAN.JOIN:\n                    return Join(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.INTERSECT:\n                    return Intersect(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.DIFFERENCE:\n                    return Difference(polygon1, polygon2, result);\n\n                case POLYGON_BOOLEAN.SYMMETRIC_DIFFERENCE:\n                    return SymmetricDifference(polygon1, polygon2, result);\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Check if the polygons intesect.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <returns>If the polygons intesect.</returns>\n        public bool DoIntersect(Polygon2<K> polygon1, Polygon2<K> polygon2) \n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n            return Kernel.DoIntersect(Ptr, polygon1, polygon2);\n        }\n\n        /// <summary>\n        /// Check if the polygons intesect.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <returns>If the polygons intesect.</returns>\n        public bool DoIntersect(Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n            return Kernel.DoIntersect(Ptr, polygon1, polygon2);\n        }\n\n        /// <summary>\n        /// Check if the polygons intesect.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <returns>If the polygons intesect.</returns>\n        public bool DoIntersect(PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n            return Kernel.DoIntersect(Ptr, polygon1, polygon2);\n        }\n\n        /// <summary>\n        /// The union of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The union of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Join(Polygon2<K> polygon1, Polygon2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            if (Kernel.Join(Ptr, polygon1, polygon2, out IntPtr resultPtr))\n            {\n                result.Add(new PolygonWithHoles2<K>(resultPtr));\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// The union of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The union of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Join(Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            if (Kernel.Join(Ptr, polygon1, polygon2, out IntPtr resultPtr))\n            {\n                result.Add(new PolygonWithHoles2<K>(resultPtr));\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// The union of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The union of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Join(PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            if (Kernel.Join(Ptr, polygon1, polygon2, out IntPtr resultPtr))\n            {\n                result.Add(new PolygonWithHoles2<K>(resultPtr));\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// The intersection of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The intersection of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Intersect(Polygon2<K> polygon1, Polygon2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Intersect(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The intersection of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The intersection of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Intersect(Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Intersect(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The intersection of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The intersection of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Intersect(PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Intersect(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Difference(Polygon2<K> polygon1, Polygon2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Difference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Difference(Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Difference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool Difference(PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.Difference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The symmetric difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The symmetric difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool SymmetricDifference(Polygon2<K> polygon1, Polygon2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.SymmetricDifference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The symmetric difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The symmetric difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool SymmetricDifference(Polygon2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.SymmetricDifference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The symmetric difference of the two polygons.\n        /// </summary>\n        /// <param name=\"polygon1\">A simple ccw polygon.</param>\n        /// <param name=\"polygon2\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The symmetric difference of the polygons.</param>\n        /// <returns>If the op was performed and the result list changed.</returns>\n        public bool SymmetricDifference(PolygonWithHoles2<K> polygon1, PolygonWithHoles2<K> polygon2, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon1);\n            CheckPolygon(polygon2);\n\n            int count = Kernel.SymmetricDifference(Ptr, polygon1, polygon2);\n            CopyBuffer(count, result);\n            return count != 0;\n        }\n\n        /// <summary>\n        /// The complement of the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">A simple ccw polygon.</param>\n        /// <param name=\"result\">The complement of the polygon.</param>\n        public void Complement(PolygonWithHoles2<K> polygon, List<PolygonWithHoles2<K>> result)\n        {\n            CheckPolygon(polygon);\n\n            int count = Kernel.Complement(Ptr, polygon);\n            CopyBuffer(count, result);\n        }\n\n        /// <summary>\n        /// Copy the unmanaged polygon objects created \n        /// into the result list.\n        /// </summary>\n        /// <param name=\"count\">The number of objects in the buffer.</param>\n        /// <param name=\"result\">The result lis.</param>\n        private void CopyBuffer(int count, List<PolygonWithHoles2<K>> result)\n        {\n            for (int i = 0; i < count; i++)\n                result.Add(CopyBufferItem(i));\n\n            ClearBuffer();\n        }\n\n        /// <summary>\n        /// Copy the unmanaged polygon object.\n        /// </summary>\n        /// <param name=\"index\">The index of the polygon in the buffer.</param>\n        /// <returns>The polygon copy.</returns>\n        private PolygonWithHoles2<K> CopyBufferItem(int index)\n        {\n            var ptr = Kernel.CopyBufferItem(Ptr, index);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract base class for polygon boolean.\n    /// </summary>\n    public abstract class PolygonBoolean2 : PolygonAlgorithm\n    {\n        private PolygonBoolean2()\n        {\n\n        }\n\n        internal PolygonBoolean2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonBooleanKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The polygon boolean kernel.\n        /// </summary>\n        protected private PolygonBooleanKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Clear the unmanaged buffer.\n        /// </summary>\n        protected void ClearBuffer()\n        {\n            Kernel.ClearBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged resourses.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonBooleanKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonBooleanKernel2 : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void ClearBuffer(IntPtr ptr);\n\n        internal abstract IntPtr CopyBufferItem(IntPtr ptr, int index);\n\n        internal abstract bool DoIntersect(IntPtr ptr, Polygon2 poly1, Polygon2 poly2);\n\n        internal abstract bool DoIntersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract bool DoIntersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract bool Join(IntPtr ptr, Polygon2 poly1, Polygon2 poly2, out IntPtr result);\n\n        internal abstract bool Join(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2, out IntPtr result);\n\n        internal abstract bool Join(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2, out IntPtr result);\n\n        internal abstract int Intersect(IntPtr ptr, Polygon2 poly, Polygon2 poly2);\n\n        internal abstract int Intersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int Intersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int Difference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2);\n\n        internal abstract int Difference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int Difference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int SymmetricDifference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2);\n\n        internal abstract int SymmetricDifference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int SymmetricDifference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2);\n\n        internal abstract int Complement(IntPtr ptr, PolygonWithHoles2 poly);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonBooleanKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonBooleanKernel2_EEK : PolygonBooleanKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonBooleanKernel2 Instance = new PolygonBooleanKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonBoolean2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonBoolean2_EEK_Release(ptr);\n        }\n\n        internal override void ClearBuffer(IntPtr ptr)\n        {\n            PolygonBoolean2_EEK_ClearBuffer(ptr);\n        }\n\n        internal override IntPtr CopyBufferItem(IntPtr ptr, int index)\n        {\n            return PolygonBoolean2_EEK_CopyBufferItem(ptr, index);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EEK_DoIntersect_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_DoIntersect_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_DoIntersect_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EEK_Intersect_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_Intersect_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_Intersect_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool Join(IntPtr ptr, Polygon2 poly1, Polygon2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EEK_Join_P_P(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override bool Join(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EEK_Join_P_PWH(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override bool Join(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EEK_Join_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override int Difference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EEK_Difference_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Difference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_Difference_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Difference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_Difference_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_SymmetricDifference_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EEK_SymmetricDifference_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EEK_SymmetricDifference_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Complement(IntPtr ptr, PolygonWithHoles2 poly)\n        {\n            return PolygonBoolean2_EEK_Complement_PWH(ptr, poly.Ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonBoolean2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonBoolean2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonBoolean2_EEK_ClearBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonBoolean2_EEK_CopyBufferItem(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_DoIntersect_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_DoIntersect_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_DoIntersect_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_Join_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_Join_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EEK_Join_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Intersect_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Intersect_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Intersect_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Difference_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Difference_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Difference_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_SymmetricDifference_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_SymmetricDifference_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_SymmetricDifference_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EEK_Complement_PWH(IntPtr ptr0, IntPtr ptr1);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonBooleanKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonBooleanKernel2_EIK : PolygonBooleanKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonBooleanKernel2 Instance = new PolygonBooleanKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonBoolean2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonBoolean2_EIK_Release(ptr);\n        }\n\n        internal override void ClearBuffer(IntPtr ptr)\n        {\n            PolygonBoolean2_EIK_ClearBuffer(ptr);\n        }\n\n        internal override IntPtr CopyBufferItem(IntPtr ptr, int index)\n        {\n            return PolygonBoolean2_EIK_CopyBufferItem(ptr, index);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EIK_DoIntersect_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_DoIntersect_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool DoIntersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_DoIntersect_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EIK_Intersect_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_Intersect_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Intersect(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_Intersect_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override bool Join(IntPtr ptr, Polygon2 poly1, Polygon2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EIK_Join_P_P(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override bool Join(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EIK_Join_P_PWH(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override bool Join(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2, out IntPtr result)\n        {\n            return PolygonBoolean2_EIK_Join_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr, out result);\n        }\n\n        internal override int Difference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EIK_Difference_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Difference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_Difference_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Difference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_Difference_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, PolygonWithHoles2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_SymmetricDifference_PWH_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, Polygon2 poly1, Polygon2 poly2)\n        {\n            return PolygonBoolean2_EIK_SymmetricDifference_P_P(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int SymmetricDifference(IntPtr ptr, Polygon2 poly1, PolygonWithHoles2 poly2)\n        {\n            return PolygonBoolean2_EIK_SymmetricDifference_P_PWH(ptr, poly1.Ptr, poly2.Ptr);\n        }\n\n        internal override int Complement(IntPtr ptr, PolygonWithHoles2 poly)\n        {\n            return PolygonBoolean2_EIK_Complement_PWH(ptr, poly.Ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonBoolean2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonBoolean2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonBoolean2_EIK_ClearBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonBoolean2_EIK_CopyBufferItem(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_DoIntersect_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_DoIntersect_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_DoIntersect_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_Join_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_Join_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonBoolean2_EIK_Join_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2, out IntPtr result);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Intersect_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Intersect_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Intersect_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Difference_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Difference_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Difference_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_SymmetricDifference_P_P(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_SymmetricDifference_P_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_SymmetricDifference_PWH_PWH(IntPtr ptr0, IntPtr ptr1, IntPtr ptr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonBoolean2_EIK_Complement_PWH(IntPtr ptr0, IntPtr ptr1);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    /// <summary>\n    /// Factory for creating polygons.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public static class PolygonFactory<K> where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// Create a empty polygon.\n        /// </summary>\n        /// <returns></returns>\n        public static Polygon2<K> Create()\n        {\n            var poly = new Polygon2<K>();\n            return poly;\n        }\n\n        /// <summary>\n        /// Create a polygon from a triangle.\n        /// </summary>\n        /// <param name=\"a\">The triangle first point.</param>\n        /// <param name=\"b\">The triangle second point.</param>\n        /// <param name=\"c\">The triangle third point.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The created polygon.</returns>\n        public static Polygon2<K> CreateTriangle(Point2d a, Point2d b, Point2d c, bool ccw = true)\n        {\n            var tri = new Triangle2d(a, b, c);\n            return CreateTriangle(tri, ccw);\n        }\n\n        /// <summary>\n        /// Create a polygon from a triangle.\n        /// </summary>\n        /// <param name=\"tri\">The triangle.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The created polygon.</returns>\n        public static Polygon2<K> CreateTriangle(Triangle2d tri, bool ccw = true)\n        {\n            var points = new Point2d[] { tri.A, tri.B, tri.C };\n            var poly = new Polygon2<K>(points);\n\n            if (!ccw) poly.Reverse();\n\n            return poly;\n        }\n\n        /// <summary>\n        /// Create a polygon from a box.\n        /// </summary>\n        /// <param name=\"min\">The boxs min point.</param>\n        /// <param name=\"max\">The boxs max point.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The created polygon.</returns>\n        public static Polygon2<K> CreateBox(Point2d min, Point2d max, bool ccw = true)\n        {\n            var box = new Box2d(min, max);\n            return CreateBox(box, ccw);\n        }\n\n        /// <summary>\n        /// Create a polygon from a box.\n        /// </summary>\n        /// <param name=\"min\">The boxs min point.</param>\n        /// <param name=\"max\">The boxs max point.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The created polygon.</returns>\n        public static Polygon2<K> CreateBox(double min, double max, bool ccw = true)\n        {\n            var box = new Box2d(min, max);\n            return CreateBox(box, ccw);\n        }\n\n        /// <summary>\n        /// Create a polygon from a box.\n        /// </summary>\n        /// <param name=\"box\">The box.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The created polygon.</returns>\n        public static Polygon2<K> CreateBox(Box2d box, bool ccw = true)\n        {\n            var points = new Point2d[4];\n            box.GetCorners(points);\n            var poly = new Polygon2<K>(points);\n\n            if (!ccw) poly.Reverse();\n\n            return poly;\n        }\n\n        /// <summary>\n        /// Create a polygon from a dounut.\n        /// Outer radius must be greater than inner.\n        /// </summary>\n        /// <param name=\"outer\">The outer radius.</param>\n        /// <param name=\"inner\">The inner radius</param>\n        /// <param name=\"segments\">The number of segments.</param>\n        /// <returns>The created polygon with holes</returns>\n        public static PolygonWithHoles2<K> CreateDounut(double outer, double inner, int segments)\n        {\n            return CreateDounut(Point2d.Zero, outer, inner, segments);\n        }\n\n\n        /// <summary>\n        /// Create a polygon from a dounut.\n        /// Outer radius must be greater than inner.\n        /// </summary>\n        /// <param name=\"center\">The center position of the polygon.</param>\n        /// <param name=\"outer\">The outer radius.</param>\n        /// <param name=\"inner\">The inner radius</param>\n        /// <param name=\"segments\">The number of segments.</param>\n        /// <returns>The created polygon with holes</returns>\n        public static PolygonWithHoles2<K> CreateDounut(Point2d center, double outer, double inner, int segments)\n        {\n            var boundary = CreateCircle(new Circle2d(center, outer), segments);\n            var pwh = new PolygonWithHoles2<K>(boundary);\n\n            if (inner < outer)\n            {\n                var hole = CreateCircle(new Circle2d(center, inner), segments);\n\n                hole.Reverse();\n                pwh.AddHole(hole);\n            }\n\n            return pwh;\n        }\n\n        /// <summary>\n        /// Create a polygon from a circle.\n        /// </summary>\n        /// <param name=\"radius\">The radius of the circle.</param>\n        /// <param name=\"segments\">The number of segments.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns>The polygon.</returns>\n        public static Polygon2<K> CreateCircle(double radius, int segments, bool ccw = true)\n        {\n            return CreateCircle(new Circle2d(Point2d.Zero, radius), segments, ccw);\n        }\n\n        /// <summary>\n        /// Create a polygon from a circle.\n        /// </summary>\n        /// <param name=\"center\">The center of the circle.</param>\n        /// <param name=\"radius\">The radius of the circle.</param>\n        /// <param name=\"segments\">The number of segments.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns></returns>\n        public static Polygon2<K> CreateCircle(Point2d center, double radius, int segments, bool ccw = true)\n        {\n            return CreateCircle(new Circle2d(center, radius), segments, ccw);\n        }\n\n        /// <summary>\n        /// Create a polygon from a circle.\n        /// </summary>\n        /// <param name=\"circle\">The cirlce.</param>\n        /// <param name=\"segments\">The number of segments.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns></returns>\n        public static Polygon2<K> CreateCircle(Circle2d circle, int segments, bool ccw = true)\n        {\n            segments = Math.Max(3, segments);\n\n            double pi = Math.PI;\n            var points = new Point2d[segments];\n\n            double rotate = Rotation(segments);\n\n            for (int i = 0; i < segments; i++)\n            {\n                double theta = 2.0 * pi * i / segments + rotate;\n\n                double x = -circle.Radius * Math.Cos(theta);\n                double y = -circle.Radius * Math.Sin(theta);\n\n                points[i] = circle.Center + new Point2d(x, y);\n            }\n\n            var poly = new Polygon2<K>(points);\n\n            if (!ccw) poly.Reverse();\n\n            return poly;\n        }\n\n        private static double Rotation(int segments)\n        {\n            return (((segments - 2) * 180) / segments) * MathUtil.DEG_TO_RAD_64 * 0.5;\n        }\n\n        /// <summary>\n        /// https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n        /// </summary>\n        /// <param name=\"size\">The size of the polygon.</param>\n        /// <param name=\"iterations\">The number of times to sub divide.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns></returns>\n        public static Polygon2<K> KochStar(double size, int iterations, bool ccw = true)\n        {\n            return KochStar(Point2d.Zero, size, iterations, ccw);\n        }\n\n        /// <summary>\n        /// https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n        /// </summary>\n        /// <param name=\"center\">The stars center.</param>\n        /// <param name=\"size\">The size of the polygon.</param>\n        /// <param name=\"iterations\">The number of times to sub divide.</param>\n        /// <param name=\"ccw\">True for a counter clock wise polygon, false for a clock wise polygon</param>\n        /// <returns></returns>\n        public static Polygon2<K> KochStar(Point2d center, double size, int iterations, bool ccw = true)\n        {\n            double sqrt3_2 = Math.Sqrt(3) / 2.0;\n            double length = size * sqrt3_2 * 0.95;\n\n            double x = (size - length) / 2.0;\n            double y = size / 2.0 - length * sqrt3_2 / 3.0;\n\n            var points = new List<Point2d>(4);\n\n            points.Add(new Point2d(x, y));\n            points.Add(new Point2d(x + length / 2, y + length * sqrt3_2));\n            points.Add(new Point2d(x + length, y));\n            points.Add(new Point2d(x, y));\n\n            for (int i = 0; i < iterations; ++i)\n                points = KochNext(points);\n\n            int last = points.Count - 1;\n            points.RemoveAt(last);\n            points.Reverse();\n\n            var offset = center + new Point2d(size / 2);\n            for (int i = 0; i < points.Count; ++i)\n                points[i] -= offset;\n            \n            var poly = new Polygon2<K>(points.ToArray());\n\n            if (!ccw) poly.Reverse();\n\n            return poly;\n        }\n\n        /// <summary>\n        /// https://rosettacode.org/wiki/Koch_curve#C.2B.2B\n        /// </summary>\n        /// <param name=\"points\"></param>\n        /// <returns></returns>\n        private static List<Point2d> KochNext(List<Point2d> points)\n        {\n            double sqrt3_2 = Math.Sqrt(3) / 2.0;\n            int size = points.Count;\n            var output = new List<Point2d>(4 * (size - 1) + 1);\n\n            double x0 = 0, y0 = 0, x1 = 0, y1 = 0;\n\n            for (int i = 0; i + 1 < size; ++i)\n            {\n                x0 = points[i].x;\n                y0 = points[i].y;\n                x1 = points[i + 1].x;\n                y1 = points[i + 1].y;\n                double dy = y1 - y0;\n                double dx = x1 - x0;\n\n                output.Add(new Point2d(x0, y0));\n                output.Add(new Point2d(x0 + dx / 3.0, y0 + dy / 3.0));\n                output.Add(new Point2d(x0 + dx / 2.0 - dy * sqrt3_2 / 3, y0 + dy / 2.0 + dx * sqrt3_2 / 3.0));\n                output.Add(new Point2d(x0 + 2.0 * dx / 3.0, y0 + 2.0 * dy / 3.0));\n            }\n\n            output.Add(new Point2d(x1, y1));\n\n            return output;\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract int Count(IntPtr ptr);\n\n        internal abstract IntPtr Copy(IntPtr ptr);\n\n        internal abstract IntPtr Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        internal abstract Box2d GetBoundingBox(IntPtr ptr);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract int Capacity(IntPtr ptr);\n\n        internal abstract void Resize(IntPtr ptr, int count);\n\n        internal abstract void ShrinkToFit(IntPtr ptr);\n\n        internal abstract void Erase(IntPtr ptr, int index);\n\n        internal abstract void EraseRange(IntPtr ptr, int start, int count);\n\n        internal abstract void Insert(IntPtr ptr, int index, Point2d point);\n\n        internal abstract void InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n        internal abstract double SqPerimeter(IntPtr ptr);\n\n        internal abstract Point2d GetPoint(IntPtr ptr, int index);\n\n        internal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n\n        internal abstract void GetSegments(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void SetPoint(IntPtr ptr, int index, Point2d point);\n\n        internal abstract void SetPoints(IntPtr ptr, Point2d[] points, int count);\n\n        internal abstract void Reverse(IntPtr ptr);\n\n        internal abstract bool IsSimple(IntPtr ptr);\n\n        internal abstract bool IsConvex(IntPtr ptr);\n\n        internal abstract ORIENTATION Orientation(IntPtr ptr);\n\n        internal abstract ORIENTED_SIDE OrientedSide(IntPtr ptr, Point2d point);\n\n        internal abstract BOUNDED_SIDE BoundedSide(IntPtr ptr, Point2d point);\n\n        internal abstract double SignedArea(IntPtr ptr);\n\n        internal abstract void Translate(IntPtr ptr, Point2d translation);\n\n        internal abstract void Rotate(IntPtr ptr, double rotation);\n\n        internal abstract void Scale(IntPtr ptr, double scale);\n\n        internal abstract void Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        internal abstract bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n\n    internal class PolygonKernel2_EEK : PolygonKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonKernel2 Instance = new PolygonKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return Polygon2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Polygon2_EEK_Release(ptr);\n        }\n\n        internal override int Count(IntPtr ptr)\n        {\n            return Polygon2_EEK_Count(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polygon2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polygon2_EEK_Convert(ptr, k);\n        }\n\n        internal override Box2d GetBoundingBox(IntPtr ptr)\n        {\n            return Polygon2_EEK_GetBoundingBox(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polygon2_EEK_Copy(ptr);\n        }\n\n        internal override int Capacity(IntPtr ptr)\n        {\n            return Polygon2_EEK_Capacity(ptr);\n        }\n\n        internal override void Resize(IntPtr ptr, int count)\n        {\n            Polygon2_EEK_Resize(ptr, count);\n        }\n\n        internal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polygon2_EEK_ShrinkToFit(ptr);\n        }\n\n        internal override void Erase(IntPtr ptr, int index)\n        {\n            Polygon2_EEK_Erase(ptr, index);\n        }\n\n        internal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polygon2_EEK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point2d point)\n        {\n            Polygon2_EEK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point2d[] points)\n        {\n            Polygon2_EEK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override double SqPerimeter(IntPtr ptr)\n        {\n            return Polygon2_EEK_SqPerimeter(ptr);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int index)\n        {\n            return Polygon2_EEK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polygon2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            Polygon2_EEK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point2d point)\n        {\n            Polygon2_EEK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polygon2_EEK_SetPoints(ptr, points, count);\n        }\n\n        internal override void Reverse(IntPtr ptr)\n        {\n            Polygon2_EEK_Reverse(ptr);\n        }\n\n        internal override bool IsSimple(IntPtr ptr)\n        {\n            return Polygon2_EEK_IsSimple(ptr);\n        }\n\n        internal override bool IsConvex(IntPtr ptr)\n        {\n            return Polygon2_EEK_IsConvex(ptr);\n        }\n\n        internal override ORIENTATION Orientation(IntPtr ptr)\n        {\n            return Polygon2_EEK_Orientation(ptr);\n        }\n\n        internal override ORIENTED_SIDE OrientedSide(IntPtr ptr, Point2d point)\n        {\n            return Polygon2_EEK_OrientedSide(ptr, point);\n        }\n\n        internal override BOUNDED_SIDE BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Polygon2_EEK_BoundedSide(ptr, point);\n        }\n\n        internal override double SignedArea(IntPtr ptr)\n        {\n            return Polygon2_EEK_SignedArea(ptr);\n        }\n\n        internal override void Translate(IntPtr ptr, Point2d translation)\n        {\n            Polygon2_EEK_Translate(ptr, translation);\n        }\n\n        internal override void Rotate(IntPtr ptr, double rotation)\n        {\n            Polygon2_EEK_Rotate(ptr, rotation);\n        }\n\n        internal override void Scale(IntPtr ptr, double scale)\n        {\n            Polygon2_EEK_Scale(ptr, scale);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Polygon2_EEK_Transform(ptr,  translation, rotation, scale);\n        }\n\n        internal override bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary)\n        {\n            return Polygon2_EEK_ContainsPoint(ptr, point, orientation, inculdeBoundary);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polygon2_EEK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box2d Polygon2_EEK_GetBoundingBox(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polygon2_EEK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Insert(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polygon2_EEK_SqPerimeter(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EEK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_SetPoint(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_SetPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EEK_TopVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EEK_BottomVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EEK_RightVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EEK_LeftVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EEK_IsSimple(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EEK_IsConvex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION Polygon2_EEK_Orientation(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE Polygon2_EEK_OrientedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Polygon2_EEK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polygon2_EEK_SignedArea(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Translate(IntPtr ptr, Point2d translation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Rotate(IntPtr ptr, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Scale(IntPtr ptr, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EEK_ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n\n    internal class PolygonKernel2_EIK : PolygonKernel2\n    {\n\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonKernel2 Instance = new PolygonKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return Polygon2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Polygon2_EIK_Release(ptr);\n        }\n\n        internal override int Count(IntPtr ptr)\n        {\n            return Polygon2_EIK_Count(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polygon2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polygon2_EIK_Convert(ptr, k);\n        }\n\n        internal override Box2d GetBoundingBox(IntPtr ptr)\n        {\n            return Polygon2_EIK_GetBoundingBox(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polygon2_EIK_Copy(ptr);\n        }\n\n        internal override int Capacity(IntPtr ptr)\n        {\n            return Polygon2_EIK_Capacity(ptr);\n        }\n\n        internal override void Resize(IntPtr ptr, int count)\n        {\n            Polygon2_EIK_Resize(ptr, count);\n        }\n\n        internal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polygon2_EIK_ShrinkToFit(ptr);\n        }\n\n        internal override void Erase(IntPtr ptr, int index)\n        {\n            Polygon2_EIK_Erase(ptr, index);\n        }\n\n        internal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polygon2_EIK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point2d point)\n        {\n            Polygon2_EIK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point2d[] points)\n        {\n            Polygon2_EIK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override double SqPerimeter(IntPtr ptr)\n        {\n            return Polygon2_EIK_SqPerimeter(ptr);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int index)\n        {\n            return Polygon2_EIK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polygon2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            Polygon2_EIK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point2d point)\n        {\n            Polygon2_EIK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polygon2_EIK_SetPoints(ptr, points, count);\n        }\n\n        internal override void Reverse(IntPtr ptr)\n        {\n            Polygon2_EIK_Reverse(ptr);\n        }\n\n        internal override bool IsSimple(IntPtr ptr)\n        {\n            return Polygon2_EIK_IsSimple(ptr);\n        }\n\n        internal override bool IsConvex(IntPtr ptr)\n        {\n            return Polygon2_EIK_IsConvex(ptr);\n        }\n\n        internal override ORIENTATION Orientation(IntPtr ptr)\n        {\n            return Polygon2_EIK_Orientation(ptr);\n        }\n\n        internal override ORIENTED_SIDE OrientedSide(IntPtr ptr, Point2d point)\n        {\n            return Polygon2_EIK_OrientedSide(ptr, point);\n        }\n\n        internal override BOUNDED_SIDE BoundedSide(IntPtr ptr, Point2d point)\n        {\n            return Polygon2_EIK_BoundedSide(ptr, point);\n        }\n\n        internal override double SignedArea(IntPtr ptr)\n        {\n            return Polygon2_EIK_SignedArea(ptr);\n        }\n\n        internal override void Translate(IntPtr ptr, Point2d translation)\n        {\n            Polygon2_EIK_Translate(ptr, translation);\n        }\n\n        internal override void Rotate(IntPtr ptr, double rotation)\n        {\n            Polygon2_EIK_Rotate(ptr, rotation);\n        }\n\n        internal override void Scale(IntPtr ptr, double scale)\n        {\n            Polygon2_EIK_Scale(ptr, scale);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Polygon2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        internal override bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary)\n        {\n            return Polygon2_EIK_ContainsPoint(ptr, point, orientation, inculdeBoundary);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polygon2_EIK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polygon2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box2d Polygon2_EIK_GetBoundingBox(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polygon2_EIK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Insert(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polygon2_EIK_SqPerimeter(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EIK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_SetPoint(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_SetPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EIK_TopVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EIK_BottomVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EIK_RightVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polygon2_EIK_LeftVertex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EIK_IsSimple(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EIK_IsConvex(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION Polygon2_EIK_Orientation(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE Polygon2_EIK_OrientedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE Polygon2_EIK_BoundedSide(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polygon2_EIK_SignedArea(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Translate(IntPtr ptr, Point2d translation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Rotate(IntPtr ptr, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Scale(IntPtr ptr, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polygon2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polygon2_EIK_ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonMinkowski.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace CGALDotNet.Polygons\n{\n\n    /// <summary>\n    /// Decomposition stratergy for polygons.\n    /// </summary>\n    public enum MINKOWSKI_DECOMPOSITION\n    {\n        SMALL_SIDE_ANGLE_BISECTOR,\n        OPTIMAL_CONVEX,\n        HERTEL_MEHLHORN_CONVEX,\n        GREENE_CONVEX,\n        VERTICAL,\n        TRIANGULATION\n    }\n\n    /// <summary>\n    /// Decomposition stratergy for polygons with holes.\n    /// </summary>\n    public enum MINKOWSKI_DECOMPOSITION_PWH\n    {\n        VERTICAL,\n        TRIANGULATION\n    }\n\n    /// <summary>\n    /// Generic Minkowski class.\n    /// </summary>\n    /// <typeparam name=\"K\">The type of kernel</typeparam>\n    public class PolygonMinkowski<K> : PolygonMinkowski where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance to the Minkowski class.\n        /// </summary>\n        public static readonly PolygonMinkowski<K> Instance = new PolygonMinkowski<K>();\n\n        /// <summary>\n        /// Create a new object.\n        /// </summary>\n        public PolygonMinkowski() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonMinkowski<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Compute the Minkowski sum of two polygons.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> Sum(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Compute the Minkowski sum of two polygons.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> Sum(PolygonWithHoles2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSumPWH(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Compute the Minkowski sum of two polygons.\n        /// </summary>\n        /// <param name=\"decomp\">The decomposition method.</param>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> Sum(MINKOWSKI_DECOMPOSITION decomp, Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            switch (decomp)\n            {\n                case MINKOWSKI_DECOMPOSITION.SMALL_SIDE_ANGLE_BISECTOR:\n                    return SumSSAB(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION.OPTIMAL_CONVEX:\n                    return SumOptimalConvex(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION.HERTEL_MEHLHORN_CONVEX:\n                    return SumHertelMehlhorn(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION.GREENE_CONVEX:\n                    return SumGreeneConvex(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION.VERTICAL:\n                    return SumVertical(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION.TRIANGULATION:\n                    return SumTriangle(polygon, shape);\n\n                default:\n                    return Sum(polygon, shape);\n            }\n        }\n\n        /// <summary>\n        /// Compute the Minkowski sum of two polygons.\n        /// </summary>\n        /// <param name=\"decomp\">The decomposition method.</param>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> Sum(MINKOWSKI_DECOMPOSITION_PWH decomp, PolygonWithHoles2<K> polygon, Polygon2<K> shape)\n        {\n            switch (decomp)\n            {\n                case MINKOWSKI_DECOMPOSITION_PWH.VERTICAL:\n                    return SumVertical(polygon, shape);\n\n                case MINKOWSKI_DECOMPOSITION_PWH.TRIANGULATION:\n                    return SumTriangle(polygon, shape);\n\n                default:\n                    return Sum(polygon, shape);\n            }\n        }\n\n        /// <summary>\n        /// It is based on the angle-bisector decomposition method suggested by Chazelle and Dobkin [4],\n        /// which runs in O(n2) time. In addition, it applies a heuristic by Flato that reduces the number\n        /// of output polygons in many common cases. The convex decompositions that it produces usually \n        /// yield efficient running times for Minkowski sum computations. It starts by examining each pair \n        /// of reflex vertices in the input polygon, such that the entire interior of the diagonal \n        /// connecting these vertices is contained in the polygon. Out of all available pairs, the vertices\n        /// pi and pj are selected, such that the number of reflex vertices encountered when traversing \n        /// the boundary of the polygon from pi to pj in clockwise order is minimal. The polygon is split \n        /// by the diagonal pipj. This process is repeated recursively on both resulting sub-polygons. \n        /// In case it is not possible to eliminate two reflex vertices at once any more, each reflex \n        /// vertex is eliminated by a diagonal that is closest to the angle bisector emanating from this \n        /// vertex and having rational-coordinate endpoints on both sides.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumSSAB(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_SSAB(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Uses the dynamic-programming algorithm of Greene [6] for computing an optimal decomposition of \n        /// a polygon into a minimal number of convex sub-polygons. While this algorithm results in a small\n        /// number of convex polygons, it consumes rather many resources, as it runs in O(n4) time and O(n3) \n        /// space in the worst case, where n is the number of vertices in the input polygon.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumOptimalConvex(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_OptimalConvex(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        ///  Implements the approximation algorithm suggested by Hertel and Mehlhorn [8], which triangulates \n        ///  the input polygon and then discards unnecessary triangulation edges. After triangulation (carried \n        ///  out by the constrained-triangulation procedure of CGAL) the algorithm runs in O(n) time and space,\n        ///  and guarantees that the number of sub-polygons it generates is not more than four times the optimum.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumHertelMehlhorn(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_HertelMehlhorn(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Implementation of Greene's approximation algorithm [6], which computes a convex decomposition of the \n        /// polygon based on its partitioning into y-monotone polygons. This algorithm runs in O(nlogn) time and \n        /// O(n) space, and has the same guarantee on the quality of approximation as Hertel and Mehlhorn's algorithm.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumGreeneConvex(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_GreeneConvex(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Uses vertical decomposition to decompose the underlying arrangement.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumVertical(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_Vertical(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Uses vertical decomposition to decompose the underlying arrangement.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumVertical(PolygonWithHoles2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSumPWH_Vertical(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumTriangle(Polygon2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSum_Triangle(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Uses constrained triangulation to decompose the input polygons, which may have holes, into triangles.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        /// <param name=\"shape\"></param>\n        /// <returns></returns>\n        public PolygonWithHoles2<K> SumTriangle(PolygonWithHoles2<K> polygon, Polygon2<K> shape)\n        {\n            CheckPolygon(polygon);\n            CheckPolygon(shape);\n            var ptr = Kernel.MinkowskiSumPWH_Triangle(polygon.Ptr, shape.Ptr);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract base class for polygon minkowski.\n    /// </summary>\n    public abstract class PolygonMinkowski : PolygonAlgorithm\n    {\n        private PolygonMinkowski()\n        {\n\n        }\n\n        internal PolygonMinkowski(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonMinkowskiKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The polygon Minkowski kernel.\n        /// </summary>\n        protected private PolygonMinkowskiKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release the unmanaged resourses.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonMinkowskiKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonMinkowskiKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract IntPtr MinkowskiSum(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSumPWH(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_SSAB(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_OptimalConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_HertelMehlhorn(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_GreeneConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_Vertical(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSumPWH_Vertical(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSum_Triangle(IntPtr polyPtr1, IntPtr polyPtr2);\n\n\t\tinternal abstract IntPtr MinkowskiSumPWH_Triangle(IntPtr pwhPtr1, IntPtr polyPtr2);\n\t}\n\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonMinkowskiKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonMinkowskiKernel_EEK : PolygonMinkowskiKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonMinkowskiKernel Instance = new PolygonMinkowskiKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonMinkowski_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonMinkowski_EEK_Release(ptr);\n        }\n\n        internal override IntPtr MinkowskiSum(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSumPWH(pwhPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_SSAB(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_SSAB(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_OptimalConvex(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_OptimalConvex(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_HertelMehlhorn(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_HertelMehlhorn(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_GreeneConvex(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_GreeneConvex(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_Vertical(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_Vertical(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH_Vertical(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSumPWH_Vertical(pwhPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_Triangle(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSum_Triangle(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH_Triangle(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EEK_MinkowskiSumPWH_Triangle(pwhPtr1, polyPtr2);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonMinkowski_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSumPWH(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_SSAB(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_OptimalConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_HertelMehlhorn(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_GreeneConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_Vertical(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSumPWH_Vertical(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSum_Triangle(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EEK_MinkowskiSumPWH_Triangle(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonMinkowskiKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonMinkowskiKernel_EIK : PolygonMinkowskiKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonMinkowskiKernel Instance = new PolygonMinkowskiKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonMinkowski_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonMinkowski_EIK_Release(ptr);\n        }\n\n        internal override IntPtr MinkowskiSum(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSumPWH(pwhPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_SSAB(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_SSAB(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_OptimalConvex(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_OptimalConvex(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_HertelMehlhorn(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_HertelMehlhorn(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_GreeneConvex(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_GreeneConvex(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_Vertical(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_Vertical(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH_Vertical(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSumPWH_Vertical(pwhPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSum_Triangle(IntPtr polyPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSum_Triangle(polyPtr1, polyPtr2);\n        }\n\n        internal override IntPtr MinkowskiSumPWH_Triangle(IntPtr pwhPtr1, IntPtr polyPtr2)\n        {\n            return PolygonMinkowski_EIK_MinkowskiSumPWH_Triangle(pwhPtr1, polyPtr2);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonMinkowski_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSumPWH(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_SSAB(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_OptimalConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_HertelMehlhorn(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_GreeneConvex(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_Vertical(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSumPWH_Vertical(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSum_Triangle(IntPtr polyPtr1, IntPtr polyPtr2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonMinkowski_EIK_MinkowskiSumPWH_Triangle(IntPtr pwhPtr1, IntPtr polyPtr2);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonOffset2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n\n    public enum OFFSET\n    {\n        INTERIOR,\n        EXTERIOR\n    }\n\n    /// <summary>\n    /// The generic polgon offset class\n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class PolygonOffset2<K> : PolygonOffset2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of polygon offset.\n        /// </summary>\n        public static readonly PolygonOffset2<K> Instance = new PolygonOffset2<K>();\n\n        /// <summary>\n        /// Create new polygon offset.\n        /// </summary>\n        public PolygonOffset2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonOffset2<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Create a interior or exterior offset.\n        /// </summary>\n        /// <param name=\"offset\">The offset type</param>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"amount\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateOffset(OFFSET offset, Polygon2<K> polygon, double amount, List<Polygon2<K>> results)\n        {\n            if (offset == OFFSET.INTERIOR)\n                CreateInteriorOffset(polygon, amount, results);\n            else\n                CreateExteriorOffset(polygon, amount, results);\n        }\n\n        /// <summary>\n        /// Create a interior or exterior offset.\n        /// </summary>\n        /// <param name=\"offset\">The offset type</param>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"amount\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateOffset(OFFSET offset, PolygonWithHoles2<K> polygon, double amount, List<Polygon2<K>> results)\n        {\n            if (offset == OFFSET.INTERIOR)\n                CreateInteriorOffset(polygon, amount, results);\n            else\n                CreateExteriorOffset(polygon, amount, results);\n        }\n\n        /// <summary>\n        /// Create a interior offset.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"offset\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateInteriorOffset(Polygon2<K> polygon, double offset, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateInteriorOffset(Ptr, polygon.Ptr, offset);\n\n            int count = PolygonBufferSize();\n\n            for (int i = 0; i < count; i++)\n            {\n                var ptr = GetBufferedPolygon(i);\n                results.Add(new Polygon2<K>(ptr));\n            }\n\n            ClearPolygonBuffer();\n        }\n\n        /// <summary>\n        /// Create a interior offset.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"offset\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateInteriorOffset(PolygonWithHoles2<K> polygon, double offset, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateInteriorOffsetPWH(Ptr, polygon.Ptr, offset, false);\n\n            int count = PolygonBufferSize();\n\n            for (int i = 0; i < count; i++)\n            {\n                var ptr = GetBufferedPolygon(i);\n                results.Add(new Polygon2<K>(ptr));\n            }\n\n            ClearPolygonBuffer();\n        }\n\n        /// <summary>\n        /// Create a exterior offset.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"offset\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateExteriorOffset(Polygon2<K> polygon, double offset, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateExteriorOffset(Ptr, polygon.Ptr, offset);\n\n            int count = PolygonBufferSize();\n\n            for (int i = 0; i < count; i++)\n            {\n                var ptr = GetBufferedPolygon(i);\n                results.Add(new Polygon2<K>(ptr));\n            }\n\n            ClearPolygonBuffer();\n        }\n\n        /// <summary>\n        /// Create a exterior offset.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"offset\">The offset amount</param>\n        /// <param name=\"results\">The offset polygon</param>\n        public void CreateExteriorOffset(PolygonWithHoles2<K> polygon, double offset, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateExteriorOffsetPWH(Ptr, polygon.Ptr, offset, false);\n\n            int count = PolygonBufferSize();\n\n            for (int i = 0; i < count; i++)\n            {\n                var ptr = GetBufferedPolygon(i);\n                results.Add(new Polygon2<K>(ptr));\n            }\n\n            ClearPolygonBuffer();\n        }\n\n        /// <summary>\n        /// Create the interior skeleton of the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n        /// <param name=\"results\">The skeletons segments.</param>\n        public void CreateInteriorSkeleton(Polygon2<K> polygon, bool includeBorder, List<Segment2d> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateInteriorSkeleton(Ptr, polygon.Ptr, includeBorder);\n\n            int count = SegmentBufferSize();\n\n            for (int i = 0; i < count; i++)\n                results.Add(GetBufferedSegment(i));\n\n            ClearSegmentBuffer();\n        }\n\n        /// <summary>\n        /// Create the interior skeleton of the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n        /// <param name=\"results\">The skeletons segments.</param>\n        public void CreateInteriorSkeleton(PolygonWithHoles2<K> polygon, bool includeBorder, List<Segment2d> results)\n        {\n            CheckPolygon(polygon);\n            Kernel.CreateInteriorSkeletonPWH(Ptr, polygon.Ptr, includeBorder);\n\n            int count = SegmentBufferSize();\n\n            for (int i = 0; i < count; i++)\n                results.Add(GetBufferedSegment(i));\n\n            ClearSegmentBuffer();\n        }\n\n        /// <summary>\n        /// Create the exterior skeleton of the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n        /// <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n        /// <param name=\"results\">The skeletons segments.</param>\n        public void CreateExteriorSkeleton(Polygon2<K> polygon, double maxOffset, bool includeBorder, List<Segment2d> results)\n        {\n            CheckPolygon(polygon);\n            if (maxOffset <= 0) return;\n\n            Kernel.CreateExteriorSkeleton(Ptr, polygon.Ptr, maxOffset, includeBorder);\n\n            int count = SegmentBufferSize();\n\n            for (int i = 0; i < count; i++)\n                results.Add(GetBufferedSegment(i));\n\n            ClearSegmentBuffer();\n        }\n\n\n        /// <summary>\n        /// Create the exterior skeleton of the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to offset.</param>\n        /// <param name=\"maxOffset\">The bounding boxes offset from the polygons edges. Must be > 0.</param>\n        /// <param name=\"includeBorder\">Should the polygon be included as the border.</param>\n        /// <param name=\"results\">The skeletons segments.</param>\n        public void CreateExteriorSkeleton(PolygonWithHoles2<K> polygon, double maxOffset, bool includeBorder, List<Segment2d> results)\n        {\n            CheckPolygon(polygon);\n            if (maxOffset <= 0) return;\n\n            Kernel.CreateExteriorSkeletonPWH(Ptr, polygon.Ptr, maxOffset, includeBorder);\n\n            int count = SegmentBufferSize();\n\n            for (int i = 0; i < count; i++)\n                results.Add(GetBufferedSegment(i));\n\n            ClearSegmentBuffer();\n        }\n    }\n\n    /// <summary>\n    /// The abstract polygon offset class.\n    /// </summary>\n    public abstract class PolygonOffset2 : PolygonAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private PolygonOffset2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal PolygonOffset2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonOffsetKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The offset kernel.\n        /// </summary>\n        protected private PolygonOffsetKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Get the number off polygons in the buffer.\n        /// </summary>\n        /// <returns></returns>\n        protected int PolygonBufferSize()\n        {\n            return Kernel.PolygonBufferSize(Ptr);\n        }\n\n        /// <summary>\n        /// The size of the segment buffer.\n        /// </summary>\n        /// <returns>The number of segments in the buffer.</returns>\n        protected int SegmentBufferSize()\n        {\n            return Kernel.SegmentBufferSize(Ptr);\n        }\n\n        /// <summary>\n        /// Get the unmanaged point to the polygon at the buffer index\n        /// </summary>\n        /// <param name=\"index\">The index in the buffer.</param>\n        /// <returns>The pointer</returns>\n        protected IntPtr GetBufferedPolygon(int index)\n        {\n            return Kernel.GetBufferedPolygon(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the segment from buffer.\n        /// </summary>\n        /// <param name=\"index\">The segments index.</param>\n        /// <returns>The segment.</returns>\n        protected Segment2d GetBufferedSegment(int index)\n        {\n            return Kernel.GetSegment(Ptr, index);\n        }\n\n        /// <summary>\n        /// Clear the polygon buffer.\n        /// </summary>\n        protected void ClearPolygonBuffer()\n        {\n            Kernel.ClearPolygonBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// Clear the segment buffer.\n        /// </summary>\n        protected void ClearSegmentBuffer()\n        {\n            Kernel.ClearSegmentBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonOffsetKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonOffsetKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract int PolygonBufferSize(IntPtr ptr);\n\n        internal abstract int SegmentBufferSize(IntPtr ptr);\n\n        internal abstract void ClearPolygonBuffer(IntPtr ptr);\n\n        internal abstract void ClearSegmentBuffer(IntPtr ptr);\n\n        internal abstract IntPtr GetBufferedPolygon(IntPtr ptr, int index);\n\n        internal abstract Segment2d GetSegment(IntPtr ptr, int index);\n\n        internal abstract void GetSegments(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void CreateInteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        internal abstract void CreateInteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        internal abstract void CreateExteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        internal abstract void CreateExteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        internal abstract void CreateInteriorSkeleton(IntPtr ptr, IntPtr polyPtr, bool includeBorder);\n\n        internal abstract void CreateInteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, bool includeBorder);\n\n        internal abstract void CreateExteriorSkeleton(IntPtr ptr, IntPtr polyPtr, double maxOffset, bool includeBorder);\n\n        internal abstract void CreateExteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, double maxOffset, bool includeBorder);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonOffsetKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonOffsetKernel2_EEK : PolygonOffsetKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonOffsetKernel2 Instance = new PolygonOffsetKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonOffset2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonOffset2_EEK_Release(ptr);\n        }\n\n        internal override int PolygonBufferSize(IntPtr ptr)\n        {\n            return PolygonOffset2_EEK_PolygonBufferSize(ptr);\n        }\n\n        internal override int SegmentBufferSize(IntPtr ptr)\n        {\n            return PolygonOffset2_EEK_SegmentBufferSize(ptr);\n        }\n\n        internal override void ClearPolygonBuffer(IntPtr ptr)\n        {\n            PolygonOffset2_EEK_ClearPolygonBuffer(ptr);\n        }\n\n        internal override void ClearSegmentBuffer(IntPtr ptr)\n        {\n            PolygonOffset2_EEK_ClearSegmentBuffer(ptr);\n        }\n\n        internal override IntPtr GetBufferedPolygon(IntPtr ptr, int index)\n        {\n            return PolygonOffset2_EEK_GetBufferedPolygon(ptr, index);\n        }\n\n        internal override Segment2d GetSegment(IntPtr ptr, int index)\n        {\n            return PolygonOffset2_EEK_GetSegment(ptr, index);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            PolygonOffset2_EEK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void CreateInteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset)\n        {\n            PolygonOffset2_EEK_CreateInteriorOffset(ptr, polyPtr, offset);\n        }\n\n        internal override void CreateInteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly)\n        {\n            PolygonOffset2_EEK_CreateInteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n        }\n\n        internal override void CreateExteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset)\n        {\n            PolygonOffset2_EEK_CreateExteriorOffset(ptr, polyPtr, offset);\n        }\n\n        internal override void CreateExteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly)\n        {\n            PolygonOffset2_EEK_CreateExteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n        }\n\n        internal override void CreateInteriorSkeleton(IntPtr ptr, IntPtr polyPtr, bool includeBorder)\n        {\n            PolygonOffset2_EEK_CreateInteriorSkeleton(ptr, polyPtr, includeBorder);\n        }\n\n        internal override void CreateInteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, bool includeBorder)\n        {\n            PolygonOffset2_EEK_CreateInteriorSkeletonPWH(ptr, pwhPtr, includeBorder);\n        }\n\n        internal override void CreateExteriorSkeleton(IntPtr ptr, IntPtr polyPtr, double maxOffset, bool includeBorder)\n        {\n            PolygonOffset2_EEK_CreateExteriorSkeleton(ptr, polyPtr, maxOffset, includeBorder);\n        }\n\n        internal override void CreateExteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, double maxOffset, bool includeBorder)\n        {\n            PolygonOffset2_EEK_CreateExteriorSkeletonPWH(ptr, pwhPtr, maxOffset, includeBorder);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonOffset2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonOffset2_EEK_PolygonBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonOffset2_EEK_SegmentBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_ClearPolygonBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_ClearSegmentBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonOffset2_EEK_GetBufferedPolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Segment2d PolygonOffset2_EEK_GetSegment(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateInteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateInteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateExteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateExteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateInteriorSkeleton(IntPtr ptr, IntPtr polyPtr, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateInteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateExteriorSkeleton(IntPtr ptr, IntPtr polyPtr, double maxOffset, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EEK_CreateExteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, double maxOffset, bool includeBorder);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonOffsetKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonOffsetKernel2_EIK : PolygonOffsetKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonOffsetKernel2 Instance = new PolygonOffsetKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonOffset2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonOffset2_EIK_Release(ptr);\n        }\n\n        internal override int PolygonBufferSize(IntPtr ptr)\n        {\n            return PolygonOffset2_EIK_PolygonBufferSize(ptr);\n        }\n\n        internal override int SegmentBufferSize(IntPtr ptr)\n        {\n            return PolygonOffset2_EIK_SegmentBufferSize(ptr);\n        }\n\n        internal override void ClearPolygonBuffer(IntPtr ptr)\n        {\n            PolygonOffset2_EIK_ClearPolygonBuffer(ptr);\n        }\n\n        internal override void ClearSegmentBuffer(IntPtr ptr)\n        {\n            PolygonOffset2_EIK_ClearSegmentBuffer(ptr);\n        }\n\n        internal override IntPtr GetBufferedPolygon(IntPtr ptr, int index)\n        {\n            return PolygonOffset2_EIK_GetBufferedPolygon(ptr, index);\n        }\n\n        internal override Segment2d GetSegment(IntPtr ptr, int index)\n        {\n            return PolygonOffset2_EIK_GetSegment(ptr, index);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            PolygonOffset2_EIK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void CreateInteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset)\n        {\n            PolygonOffset2_EIK_CreateInteriorOffset(ptr, polyPtr, offset);\n        }\n\n        internal override void CreateInteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly)\n        {\n            PolygonOffset2_EIK_CreateInteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n        }\n\n        internal override void CreateExteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset)\n        {\n            PolygonOffset2_EIK_CreateExteriorOffset(ptr, polyPtr, offset);\n        }\n\n        internal override void CreateExteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly)\n        {\n            PolygonOffset2_EIK_CreateExteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n        }\n\n        internal override void CreateInteriorSkeleton(IntPtr ptr, IntPtr polyPtr, bool includeBorder)\n        {\n            PolygonOffset2_EIK_CreateInteriorSkeleton(ptr, polyPtr, includeBorder);\n        }\n\n        internal override void CreateInteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, bool includeBorder)\n        {\n            PolygonOffset2_EIK_CreateInteriorSkeletonPWH(ptr, pwhPtr, includeBorder);\n        }\n\n        internal override void CreateExteriorSkeleton(IntPtr ptr, IntPtr polyPtr, double maxOffset, bool includeBorder)\n        {\n            PolygonOffset2_EIK_CreateExteriorSkeleton(ptr, polyPtr, maxOffset, includeBorder);\n        }\n\n        internal override void CreateExteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, double maxOffset, bool includeBorder)\n        {\n            PolygonOffset2_EIK_CreateExteriorSkeletonPWH(ptr, pwhPtr, maxOffset, includeBorder);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonOffset2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonOffset2_EIK_PolygonBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonOffset2_EIK_SegmentBufferSize(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_ClearPolygonBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_ClearSegmentBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonOffset2_EIK_GetBufferedPolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Segment2d PolygonOffset2_EIK_GetSegment(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateInteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateInteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateExteriorOffset(IntPtr ptr, IntPtr polyPtr, double offset);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateExteriorOffsetPWH(IntPtr ptr, IntPtr pwhPtr, double offset, bool boundaryOnly);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateInteriorSkeleton(IntPtr ptr, IntPtr polyPtr, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateInteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateExteriorSkeleton(IntPtr ptr, IntPtr polyPtr, double maxOffset, bool includeBorder);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonOffset2_EIK_CreateExteriorSkeletonPWH(IntPtr ptr, IntPtr pwhPtr, double maxOffset, bool includeBorder);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonPartition2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace CGALDotNet.Polygons\n{\n    /// <summary>\n    /// Type of polygon partitions.\n    /// </summary>\n    public enum POLYGON_PARTITION\n    {\n        OPTIMAL_CONVEX,\n        APPROX_CONVEX,\n        GREENE_APROX_CONVEX,\n        Y_MONOTONE\n    }\n\n    /// <summary>\n    /// Generic polygon partition class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class PolygonPartition2<K> : PolygonPartition2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of polygon partition.\n        /// </summary>\n        public static readonly PolygonPartition2<K> Instance = new PolygonPartition2<K>();\n\n        /// <summary>\n        /// Create new polygon partition.\n        /// </summary>\n        public PolygonPartition2() : base(new K())\n        {\n\n        }\n\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonPartition2<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Is this polygon Y monotonic.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon.</param>\n        /// <returns>True if y monotonic.</returns>\n        public bool Is_Y_Monotone(Polygon2<K> polygon)\n        {\n            CheckPolygon(polygon);\n            return Kernel.Is_Y_Monotone(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Is this polygon Y monotonic.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon.</param>\n        /// <returns>True if y monotonic.</returns>\n        public bool Is_Y_Monotone(PolygonWithHoles2<K> polygon)\n        {\n            CheckPolygon(polygon);\n            return Kernel.Is_Y_MonotonePWH(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Partition a polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Partition(Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            GreeneApproxConvex(polygon, results);\n        }\n\n        /// <summary>\n        /// Partition a polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Partition(PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            GreeneApproxConvex(polygon, results);\n        }\n\n        /// <summary>\n        /// Partition a polygon.\n        /// </summary>\n        /// <param name=\"type\">The type of partition to perfrom.</param>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Partition(POLYGON_PARTITION type, Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            switch (type)\n            {\n                case POLYGON_PARTITION.OPTIMAL_CONVEX:\n                    OptimalConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.APPROX_CONVEX:\n                    ApproxConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.GREENE_APROX_CONVEX:\n                    GreeneApproxConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.Y_MONOTONE:\n                    Y_Monotone(polygon, results);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Partition a polygon.\n        /// </summary>\n        /// <param name=\"type\">The type of partition to perfrom.</param>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Partition(POLYGON_PARTITION type, PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            switch (type)\n            {\n                case POLYGON_PARTITION.OPTIMAL_CONVEX:\n                    OptimalConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.APPROX_CONVEX:\n                    ApproxConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.GREENE_APROX_CONVEX:\n                    GreeneApproxConvex(polygon, results);\n                    break;\n\n                case POLYGON_PARTITION.Y_MONOTONE:\n                    Y_Monotone(polygon, results);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Partition in to Y monotonic polygons.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Y_Monotone(Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.Y_MonotonePartition(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition in to Y monotonic polygons.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void Y_Monotone(PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.Y_MonotonePartitionPWH(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of\n        /// convex polygons produced is no more than four times the minimal number.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void ApproxConvex(Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.ApproxConvexPartition(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of\n        /// convex polygons produced is no more than four times the minimal number.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void ApproxConvex(PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.ApproxConvexPartitionPWH(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of\n        /// convex polygons produced is no more than four times the minimal number.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void GreeneApproxConvex(Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.GreeneApproxConvexPartition(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of\n        /// convex polygons produced is no more than four times the minimal number.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void GreeneApproxConvex(PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.GreeneApproxConvexPartitionPWH(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of \n        /// convex polygons produced is minimal.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void OptimalConvex(Polygon2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.OptimalConvexPartition(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex polygons where the number of \n        /// convex polygons produced is minimal.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to partition.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        public void OptimalConvex(PolygonWithHoles2<K> polygon, List<Polygon2<K>> results)\n        {\n            CheckPolygon(polygon);\n            int count = Kernel.OptimalConvexPartitionPWH(Ptr, polygon.Ptr);\n            CopyBufferAndClear(count, results);\n        }\n\n        /// <summary>\n        /// Copy the new polygons into the result array\n        /// and the clear the buffer.\n        /// </summary>\n        /// <param name=\"count\">The number of polygons in buffer.</param>\n        /// <param name=\"results\">The resulting polygons.</param>\n        private void CopyBufferAndClear(int count, List<Polygon2<K>> results)\n        {\n            for (int i = 0; i < count; i++)\n            {\n                var ptr = Kernel.CopyBufferItem(Ptr, i);\n                results.Add(new Polygon2<K>(ptr));\n            }\n\n            Kernel.ClearBuffer(Ptr);\n        }\n\n        private bool PartitionIsValid(Polygon2<K> polygon)\n        {\n            return Kernel.PartitionIsValid(Ptr, polygon.Ptr);\n        }\n\n        private bool ConvexPartitionIsValid(Polygon2<K> polygon)\n        {\n            return Kernel.ConvexPartitionIsValid(Ptr, polygon.Ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract base class.\n    /// </summary>\n    public abstract class PolygonPartition2 : PolygonAlgorithm\n    {\n        private PolygonPartition2()\n        {\n\n        }\n\n        internal PolygonPartition2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonPartitionKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The partition kernel.\n        /// </summary>\n        protected private PolygonPartitionKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Clear the unmanaged buffer.\n        /// </summary>\n        protected void ClearBuffer()\n        {\n            Kernel.ClearBuffer(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonPartitionKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonPartitionKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void ClearBuffer(IntPtr ptr);\n\n        internal abstract int BufferCount(IntPtr ptr);\n\n        internal abstract IntPtr CopyBufferItem(IntPtr ptr, int index);\n\n        internal abstract bool Is_Y_Monotone(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract bool Is_Y_MonotonePWH(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract bool PartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract bool ConvexPartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int Y_MonotonePartition(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int Y_MonotonePartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int ApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int ApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int GreeneApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int GreeneApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int OptimalConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        internal abstract int OptimalConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonPartitionKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonPartitionKernel2_EEK : PolygonPartitionKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonPartitionKernel2 Instance = new PolygonPartitionKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonPartition2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonPartition2_EEK_Release(ptr);\n        }\n\n        internal override void ClearBuffer(IntPtr ptr)\n        {\n            PolygonPartition2_EEK_ClearBuffer(ptr);\n        }\n\n        internal override int BufferCount(IntPtr ptr)\n        {\n            return PolygonPartition2_EEK_BufferCount(ptr);\n        }\n\n        internal override IntPtr CopyBufferItem(IntPtr ptr, int index)\n        {\n            return PolygonPartition2_EEK_CopyBufferItem(ptr, index);\n        }\n\n        internal override bool Is_Y_Monotone(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_Is_Y_Monotone(ptr, polyPtr);\n        }\n\n        internal override bool Is_Y_MonotonePWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_Is_Y_MonotonePWH(ptr, polyPtr);\n        }\n\n        internal override bool PartitionIsValid(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_PartitionIsValid(ptr, polyPtr);\n        }\n\n        internal override bool ConvexPartitionIsValid(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_ConvexPartitionIsValid(ptr, polyPtr);\n        }\n\n        internal override int Y_MonotonePartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_Y_MonotonePartition(ptr, polyPtr);\n        }\n\n        internal override int Y_MonotonePartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_Y_MonotonePartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int ApproxConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_ApproxConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int ApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_ApproxConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int GreeneApproxConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_GreeneApproxConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int GreeneApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_GreeneApproxConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int OptimalConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_OptimalConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int OptimalConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EEK_OptimalConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonPartition2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonPartition2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonPartition2_EEK_ClearBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_BufferCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonPartition2_EEK_CopyBufferItem(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EEK_Is_Y_Monotone(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EEK_Is_Y_MonotonePWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EEK_PartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EEK_ConvexPartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_Y_MonotonePartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_Y_MonotonePartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_ApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_ApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_GreeneApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_GreeneApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_OptimalConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EEK_OptimalConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonPartitionKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonPartitionKernel2_EIK : PolygonPartitionKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonPartitionKernel2 Instance = new PolygonPartitionKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonPartition2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonPartition2_EIK_Release(ptr);\n        }\n\n        internal override void ClearBuffer(IntPtr ptr)\n        {\n            PolygonPartition2_EIK_ClearBuffer(ptr);\n        }\n\n        internal override int BufferCount(IntPtr ptr)\n        {\n            return PolygonPartition2_EIK_BufferCount(ptr);\n        }\n\n        internal override IntPtr CopyBufferItem(IntPtr ptr, int index)\n        {\n            return PolygonPartition2_EIK_CopyBufferItem(ptr, index);\n        }\n\n        internal override bool Is_Y_Monotone(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_Is_Y_Monotone(ptr, polyPtr);\n        }\n\n        internal override bool Is_Y_MonotonePWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_Is_Y_MonotonePWH(ptr, polyPtr);\n        }\n\n        internal override bool PartitionIsValid(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_PartitionIsValid(ptr, polyPtr);\n        }\n\n        internal override bool ConvexPartitionIsValid(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_ConvexPartitionIsValid(ptr, polyPtr);\n        }\n\n        internal override int Y_MonotonePartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_Y_MonotonePartition(ptr, polyPtr);\n        }\n\n        internal override int Y_MonotonePartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_Y_MonotonePartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int ApproxConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_ApproxConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int ApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_ApproxConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int GreeneApproxConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_GreeneApproxConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int GreeneApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_GreeneApproxConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        internal override int OptimalConvexPartition(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_OptimalConvexPartition(ptr, polyPtr);\n        }\n\n        internal override int OptimalConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr)\n        {\n            return PolygonPartition2_EIK_OptimalConvexPartitionPWH(ptr, polyPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonPartition2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonPartition2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonPartition2_EIK_ClearBuffer(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_BufferCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonPartition2_EIK_CopyBufferItem(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EIK_Is_Y_Monotone(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EIK_Is_Y_MonotonePWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EIK_PartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonPartition2_EIK_ConvexPartitionIsValid(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_Y_MonotonePartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_Y_MonotonePartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_ApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_ApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_GreeneApproxConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_GreeneApproxConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_OptimalConvexPartition(IntPtr ptr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonPartition2_EIK_OptimalConvexPartitionPWH(IntPtr ptr, IntPtr polyPtr);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonSimplification2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace CGALDotNet.Polygons\n{\n    /// <summary>\n    /// Cost options for simplification.\n    /// </summary>\n    public enum POLYGON_SIMP_COST_FUNC\n    {\n        SQUARE_DIST,\n        SCALED_SQ_DIST\n    };\n\n    /// <summary>\n    /// Stop distance options for simplification.\n    /// </summary>\n    public enum POLYGON_SIMP_STOP_FUNC\n    {\n        BELOW_RATIO,\n        BELOW_THRESHOLD,\n        ABOVE_THRESHOLD\n    };\n\n    /// <summary>\n    /// Paramaters for poylgon simplification.\n    /// </summary>\n    public struct PolygonSimplificationParams\n    {\n        public POLYGON_SIMP_COST_FUNC cost;\n        public POLYGON_SIMP_STOP_FUNC stop;\n        public double threshold;\n\n        /// <summary>\n        /// The default param settings.\n        /// </summary>\n        public static PolygonSimplificationParams Default\n        {\n            get\n            {\n                var param = new PolygonSimplificationParams();\n                param.stop = POLYGON_SIMP_STOP_FUNC.BELOW_THRESHOLD;\n                param.cost = POLYGON_SIMP_COST_FUNC.SQUARE_DIST;\n                param.threshold = 0.5;\n\n                return param;\n            }\n        }\n\n        /// <summary>\n        /// The param as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return String.Format(\"[PolygonSimplificationParams: Cost={0}, Stop={1}, Threshold={2}]\",\n                cost, stop, threshold);\n        }\n    }\n\n    /// <summary>\n    /// Generic polygon simplification class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class PolygonSimplification2<K> : PolygonSimplification2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of polygon simplification.\n        /// </summary>\n        public static readonly PolygonSimplification2<K> Instance = new PolygonSimplification2<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public PolygonSimplification2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonSimplification2<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygon.</returns>\n        public Polygon2<K> Simplify(Polygon2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            var ptr = Kernel.SimplifyPolygon(polygon.Ptr, param);\n            return new Polygon2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygon ptr.</returns>\n        internal IntPtr SimplifyPtr(Polygon2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            return Kernel.SimplifyPolygon(polygon.Ptr, param);\n        }\n\n        /// <summary>\n        /// Simplify the polygons boundary and all the holes.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygon.</returns>\n        public PolygonWithHoles2<K> Simplify(PolygonWithHoles2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            var ptr = Kernel.SimplifyPolygonWithHoles_All(polygon.Ptr, param);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Simplify the polygons boundary and all the holes.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygons ptr.</returns>\n        internal IntPtr SimplifyPtr(PolygonWithHoles2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            return Kernel.SimplifyPolygonWithHoles_All(polygon.Ptr, param);\n        }\n\n        /// <summary>\n        /// Simplify the polygons boundary.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygon.</returns>\n        public PolygonWithHoles2<K> SimplifyBoundary(PolygonWithHoles2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            var ptr = Kernel.SimplifyPolygonWithHoles_Boundary(polygon.Ptr, param);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Simplify the polygons holes.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <returns>The simplified polygon.</returns>\n        public PolygonWithHoles2<K> SimplifyHoles(PolygonWithHoles2<K> polygon, PolygonSimplificationParams param)\n        {\n            CheckPolygon(polygon);\n            var ptr = Kernel.SimplifyPolygonWithHoles_Holes(polygon.Ptr, param);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Simplify one of the polygons holes.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to simplify. Must be simple.</param>\n        /// <param name=\"param\">The simplification parameters.</param>\n        /// <param name=\"index\">The hole index to simplify.</param>\n        /// <returns>The simplified polygon.</returns>\n        public PolygonWithHoles2<K> SimplifyHole(PolygonWithHoles2<K> polygon, PolygonSimplificationParams param, int index)\n        {\n            CheckPolygon(polygon);\n            var ptr = Kernel.SimplifyPolygonWithHoles_Hole(polygon.Ptr, param, index);\n            return new PolygonWithHoles2<K>(ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract polygon simplification class.\n    /// </summary>\n    public abstract class PolygonSimplification2 : PolygonAlgorithm\n    {\n        private PolygonSimplification2()\n        {\n\n        }\n\n        internal PolygonSimplification2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonSimplificationKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The simplification kernel.\n        /// </summary>\n        protected private PolygonSimplificationKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Release unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonSimplificationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonSimplificationKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract IntPtr SimplifyPolygon(IntPtr polyPtr, PolygonSimplificationParams param);\n\n        internal abstract IntPtr SimplifyPolygonWithHoles_All(IntPtr polyPtr, PolygonSimplificationParams param);\n\n        internal abstract IntPtr SimplifyPolygonWithHoles_Boundary(IntPtr polyPtr, PolygonSimplificationParams param);\n\n        internal abstract IntPtr SimplifyPolygonWithHoles_Holes(IntPtr polyPtr, PolygonSimplificationParams param);\n\n        internal abstract IntPtr SimplifyPolygonWithHoles_Hole(IntPtr polyPtr, PolygonSimplificationParams param, int index);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonSimplificationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonSimplificationKernel2_EEK : PolygonSimplificationKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonSimplificationKernel2 Instance = new PolygonSimplificationKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonSimplification2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonSimplification2_EEK_Release(ptr);\n        }\n\n        internal override IntPtr SimplifyPolygon(IntPtr polyPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EEK_Simplify(polyPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_All(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EEK_SimplifyPolygonWithHoles_All(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Boundary(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Boundary(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Holes(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Holes(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Hole(IntPtr pwhPtr, PolygonSimplificationParams param, int index)\n        {\n            return PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Hole(pwhPtr, param.cost, param.stop, param.threshold, index);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonSimplification2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_Simplify(IntPtr polyPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_SimplifyPolygonWithHoles_All(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Boundary(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Holes(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Hole(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold, int index);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonSimplificationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonSimplificationKernel2_EIK : PolygonSimplificationKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonSimplificationKernel2 Instance = new PolygonSimplificationKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonSimplification2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonSimplification2_EIK_Release(ptr);\n        }\n\n        internal override IntPtr SimplifyPolygon(IntPtr polyPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EIK_Simplify(polyPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_All(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EIK_SimplifyPolygonWithHoles_All(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Boundary(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Boundary(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Holes(IntPtr pwhPtr, PolygonSimplificationParams param)\n        {\n            return PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Holes(pwhPtr, param.cost, param.stop, param.threshold);\n        }\n\n        internal override IntPtr SimplifyPolygonWithHoles_Hole(IntPtr pwhPtr, PolygonSimplificationParams param, int index)\n        {\n            return PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Hole(pwhPtr, param.cost, param.stop, param.threshold, index);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonSimplification2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_Simplify(IntPtr polyPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_SimplifyPolygonWithHoles_All(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Boundary(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Holes(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Hole(IntPtr pwhPtr, POLYGON_SIMP_COST_FUNC cost, POLYGON_SIMP_STOP_FUNC stop, double theshold, int index);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonVisibility.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    public enum POLYGON_VISIBILITY\n    {\n        ROTATION_SWEEP,\n        TRIANGULAR_EXPANSION\n    }\n\n    /// <summary>\n    /// The generic polgon visibility class\n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class PolygonVisibility<K> : PolygonVisibility where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of polygon visibility.\n        /// </summary>\n        public static readonly PolygonVisibility<K> Instance = new PolygonVisibility<K>();\n\n        /// <summary>\n        /// Create new polygon visibility.\n        /// </summary>\n        public PolygonVisibility() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonVisibility<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Compute the visibility from a simple polygon with no holes.\n        /// This class implements the algorithm of B.Joe and R.B.Simpson [4]. The algorithm is a modification\n        /// and extension of the linear time algorithm of Lee [5]. It computes the visibility region from a \n        /// viewpoint that is in the interior or on the boundary of the polygon.\n        /// While scanning the boundary the algorithm uses a stack to manipulate the vertices, and ultimately\n        /// yields the visibility region.For each scanned edge, at most 2 points are pushed onto the stack.\n        /// Overall, at most 2 n points are pushed or popped. Thus, the time and space complexities of the\n        /// algorithm are O(n) even in case of degeneracies such as needles, where n is the number of the vertices of the polygon.\n        /// </summary>\n        /// <param name=\"point\">The visibility point.</param>\n        /// <param name=\"polygon\">A simple polygon that contains the point.</param>\n        /// <param name=\"result\">The visibility result.</param>\n        /// <returns>True if result was computed</returns>\n        public bool ComputeVisibility(Point2d point, Polygon2<K> polygon,  out Polygon2<K> result)\n        {\n            if(polygon.ContainsPoint(point))\n            {\n                CheckPolygon(polygon);\n                var ptr = Kernel.ComputeVisibilitySimple(point, polygon.Ptr);\n                result = new Polygon2<K>(ptr);\n\n                if (result.IsClockWise)\n                    polygon.Reverse();\n\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Compute the visibility from a polygon with holes.\n        /// </summary>\n        /// <param name=\"point\">The visibility point.</param>\n        /// <param name=\"polygon\">A polygon with holes that contains the point.</param>\n        /// <param name=\"result\">The visibility result.</param>\n        /// <returns>True if result was computed</returns>\n        public bool ComputeVisibility(Point2d point, PolygonWithHoles2<K> polygon, out PolygonWithHoles2<K> result)\n        {\n            return ComputeVisibilityRSV(point, polygon, out result);\n        }\n\n        /// <summary>\n        /// Compute the visibility from a polygon with holes.\n        /// </summary>\n        /// <param name=\"method\">What method to use.</param>\n        /// <param name=\"point\">The visibility point.</param>\n        /// <param name=\"polygon\">A polygon with holes that contains the point.</param>\n        /// <param name=\"result\">The visibility result.</param>\n        /// <returns>True if result was computed</returns>\n        public bool ComputeVisibility(POLYGON_VISIBILITY method, Point2d point, PolygonWithHoles2<K> polygon, out PolygonWithHoles2<K> result)\n        {\n            switch (method)\n            {\n                case POLYGON_VISIBILITY.ROTATION_SWEEP:\n                    return ComputeVisibilityRSV(point, polygon, out result);\n\n                case POLYGON_VISIBILITY.TRIANGULAR_EXPANSION:\n                    return ComputeVisibilityTEV(point, polygon, out result);\n\n                default:\n                    return ComputeVisibilityTEV(point, polygon, out result);\n            }\n        }\n\n        /// <summary>\n        /// Compute the visibility from a polygon with holes using the triangular expansion method.\n        /// The algorithm does not require preprocessing. It relies on the algorithm of T. \n        /// Asano [1] based on angular plane sweep, with a time complexity of O(nlogn) in the number of vertices.\n        /// </summary>\n        /// <param name=\"point\">The visibility point.</param>\n        /// <param name=\"polygon\">A polygon with holes that contains the point.</param>\n        /// <param name=\"result\">The visibility result.</param>\n        /// <returns>True if result was computed</returns>\n        public bool ComputeVisibilityTEV(Point2d point, PolygonWithHoles2<K> polygon, out PolygonWithHoles2<K> result)\n        {\n            if (polygon.ContainsPoint(point))\n            {\n                //CheckPolygon(polygon);\n                var ptr = Kernel.ComputeVisibilityTEV(point, polygon.Ptr);\n                result = new PolygonWithHoles2<K>(ptr);\n\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Compute the visibility from a polygon with holes using the rotational sweep method.\n        /// The algorithm obtains a constrained triangulation from the input arrangement, then computes visibility by \n        /// expanding the triangle that contains the query point. Preprocessing takes O(n) time and O(n) space, where \n        /// n is the number of vertices of input polygon. The query time is O(nh), where h is the number of holes+1 of \n        /// input polygon. Thus, for simple polygons (or a polygon with a constant number of holes) the algorithm \n        /// complexity is linear, but it is O(n2) in the worst case, as the number of holes can be linear in n.\n        /// </summary>\n        /// <param name=\"point\">The visibility point.</param>\n        /// <param name=\"polygon\">A polygon with holes that contains the point.</param>\n        /// <param name=\"result\">The visibility result.</param>\n        /// <returns>True if result was computed</returns>\n        public bool ComputeVisibilityRSV(Point2d point, PolygonWithHoles2<K> polygon, out PolygonWithHoles2<K> result)\n        {\n            if (polygon.ContainsPoint(point))\n            {\n                //CheckPolygon(polygon);\n                var ptr = Kernel.ComputeVisibilityRSV(point, polygon.Ptr);\n                result = new PolygonWithHoles2<K>(ptr);\n\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract polygon visibility class.\n    /// </summary>\n    public abstract class PolygonVisibility : PolygonAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private PolygonVisibility()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal PolygonVisibility(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonVisibilityKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// The offset kernel.\n        /// </summary>\n        protected private PolygonVisibilityKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release the unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonVisibilityKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonVisibilityKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract IntPtr ComputeVisibilitySimple(Point2d point, IntPtr polyPtr);\n\n        internal abstract IntPtr ComputeVisibilityTEV(Point2d point, IntPtr pwhPtr);\n\n        internal abstract IntPtr ComputeVisibilityRSV(Point2d point, IntPtr pwhPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonVisibilityKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonVisibilityKernel_EEK : PolygonVisibilityKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonVisibilityKernel Instance = new PolygonVisibilityKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonVisibility_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonVisibility_EEK_Release(ptr);\n        }\n\n        internal override IntPtr ComputeVisibilitySimple(Point2d point, IntPtr polyPtr)\n        {\n            return PolygonVisibility_EEK_ComputeVisibilitySimple(point, polyPtr);\n        }\n\n        internal override IntPtr ComputeVisibilityTEV(Point2d point, IntPtr pwhPtr)\n        {\n            return PolygonVisibility_EEK_ComputeVisibilityTEV(point, pwhPtr);\n        }\n\n        internal override IntPtr ComputeVisibilityRSV(Point2d point, IntPtr pwhPtr)\n        {\n            return PolygonVisibility_EEK_ComputeVisibilityRSV(point, pwhPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonVisibility_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EEK_ComputeVisibilitySimple(Point2d point, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EEK_ComputeVisibilityTEV(Point2d point, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EEK_ComputeVisibilityRSV(Point2d point, IntPtr pwhPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonVisibilityKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polygons\n{\n    internal class PolygonVisibilityKernel_EIK : PolygonVisibilityKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonVisibilityKernel Instance = new PolygonVisibilityKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonVisibility_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonVisibility_EIK_Release(ptr);\n        }\n\n        internal override IntPtr ComputeVisibilitySimple(Point2d point, IntPtr polyPtr)\n        {\n            return PolygonVisibility_EIK_ComputeVisibilitySimple(point, polyPtr);\n        }\n\n        internal override IntPtr ComputeVisibilityTEV(Point2d point, IntPtr pwhPtr)\n        {\n            return PolygonVisibility_EIK_ComputeVisibilityTEV(point, pwhPtr);\n        }\n\n        internal override IntPtr ComputeVisibilityRSV(Point2d point, IntPtr pwhPtr)\n        {\n            return PolygonVisibility_EIK_ComputeVisibilityRSV(point, pwhPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonVisibility_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EIK_ComputeVisibilitySimple(Point2d point, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EIK_ComputeVisibilityTEV(Point2d point, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonVisibility_EIK_ComputeVisibilityRSV(Point2d point, IntPtr pwhPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonWithHoles2.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Triangulations;\n\nnamespace CGALDotNet.Polygons\n{\n    /// <summary>\n    /// Polygon with holes consists of a boundary and holes.\n    /// </summary>\n    public enum POLYGON_ELEMENT \n    { \n        BOUNDARY, \n        HOLE\n    }\n\n    /// <summary>\n    /// Generic polygon definition.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class PolygonWithHoles2<K> : PolygonWithHoles2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Default constuctor.\n        /// </summary>\n        public PolygonWithHoles2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct polygon with the boundary.\n        /// </summary>\n        /// <param name=\"boundary\">A CCW polygon.</param>\n        public PolygonWithHoles2(Polygon2<K> boundary) : base(new K(), boundary)\n        {\n\n        }\n\n        /// <summary>\n        /// Construct polygon with the boundary points\n        /// </summary>\n        /// <param name=\"boundary\">A CCW set of points.</param>\n        public PolygonWithHoles2(Point2d[] boundary) : base(new K(), boundary)\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The polygons pointer.</param>\n        internal PolygonWithHoles2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The polygon as a string.\n        /// </summary>\n        /// <returns>The polygon as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonWithHoles2<{0}>: IsBounded={1}, PointCount={2}, HoleCount={3}]\", \n                Kernel.Name, IsBounded, Count, HoleCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the polygon.\n        /// </summary>\n        /// <returns>The copy.</returns>\n        public PolygonWithHoles2<K> Copy()\n        {\n            return new PolygonWithHoles2<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Create a deep copy of the polygon element.\n        /// </summary>\n        /// <param name=\"element\">The element type to copy.</param>\n        /// <param name=\"index\">If element os a hole thiss is the holes index.</param>\n        /// <returns>The copy.</returns>\n        public Polygon2<K> Copy(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n            {\n                if (IsUnbounded)\n                    return new Polygon2<K>();\n\n                var ptr = Kernel.CopyPolygon(Ptr, BOUNDARY_INDEX);\n                if (ptr != IntPtr.Zero)\n                    return new Polygon2<K>(ptr);\n                else\n                    throw new InvalidOperationException(\"Failed to find boundary.\");\n            }\n            else\n            {\n                if(index < 0 || index >= HoleCount)\n                    throw new ArgumentOutOfRangeException(\"Hole index must be > 0 and < HoleCount.\");\n\n                return new Polygon2<K>(Kernel.CopyPolygon(Ptr, index));\n            }\n        }\n\n        /// <summary>\n        /// Get the boundary as a copy.\n        /// If unbounded will return a empty polygon.\n        /// </summary>\n        /// <returns>A copy of the hole polygon.</returns>\n        public Polygon2<K> GetBoundary()\n        {\n            return Copy(POLYGON_ELEMENT.BOUNDARY);\n        }\n\n        /// <summary>\n        /// Get the hole as a copy.\n        /// </summary>\n        /// <param name=\"index\">The holes index</param>\n        /// <returns>A copy of the hole polygon.</returns>\n        public Polygon2<K> GetHole(int index)\n        {\n            return Copy(POLYGON_ELEMENT.HOLE, index);\n        }\n\n        /// <summary>\n        /// Add a polygon as a holes.\n        /// Holes must simple and CW.\n        /// </summary>\n        /// <param name=\"polygon\">The hole polygon.</param>\n        public void AddHole(Polygon2<K> polygon)\n        {\n            Kernel.AddHoleFromPolygon(Ptr, polygon.Ptr);\n            HoleCount++;\n        }\n\n        /// <summary>\n        /// Create a copy of boundary and hole polygons.\n        /// </summary>\n        /// <returns>The list of polygons.</returns>\n        public List<Polygon2<K>> ToList()\n        {\n            int count = HoleCount;\n            if (IsBounded)\n                count++;\n\n            var polygons = new List<Polygon2<K>>(count);\n\n            if (IsBounded)\n                polygons.Add(GetBoundary());\n\n            for (int i = 0; i < HoleCount; i++)\n                polygons.Add(GetHole(i));\n\n            return polygons;\n        }\n\n        /// <summary>\n        /// Triangulate the polygon.\n        /// </summary>\n        /// <param name=\"indices\">The triangle indices.</param>\n        public override void Triangulate(List<int> indices)\n        {\n            try\n            {\n                var ct = ConstrainedTriangulation2<K>.Instance;\n                ct.InsertConstraint(this);\n                ct.GetConstrainedDomainIndices(indices);\n                ct.Clear();\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersects(Polygon2<K> polygon)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.DoIntersect(polygon, this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Do the polygons intersect.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <returns>Do the polygons intersect.</returns>\n        public bool Intersects(PolygonWithHoles2<K> polygon)\n        {\n            try\n            {\n                return PolygonBoolean2<K>.Instance.DoIntersect(polygon, this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Connect all the holes of the polygon \n        /// and return as a polygon. \n        /// Will result in a non simple polygon.\n        /// </summary>\n        /// <returns>The connected non-simple polygon.</returns>\n        public Polygon2<K> ConnectHoles()\n        {\n            var ptr = Kernel.ConnectHoles(Ptr);\n            return new Polygon2<K>(ptr);\n        }\n\n        /// <summary>\n        /// Partition the polygon into convex pieces.\n        /// </summary>\n        /// <param name=\"results\">The convex partition.</param>\n        /// <param name=\"type\">The type of partition method.</param>\n        public void Partition(List<Polygon2<K>> results, POLYGON_PARTITION type = POLYGON_PARTITION.GREENE_APROX_CONVEX)\n        {\n            try\n            {\n                var part = PolygonPartition2<K>.Instance;\n                part.Partition(type, this, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"threshold\">The simplification threshold.</param>\n        public void Simplify(double threshold)\n        {\n            var param = PolygonSimplificationParams.Default;\n            param.threshold = threshold;\n            Simplify(param);\n        }\n\n        /// <summary>\n        /// Simplify the polygon.\n        /// </summary>\n        /// <param name=\"param\">The simplification parameters.</param>\n        public void Simplify(PolygonSimplificationParams param)\n        {\n            try\n            {\n                var sim = PolygonSimplification2<K>.Instance;\n                var ptr = sim.SimplifyPtr(this, param);\n                Swap(ptr);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n        /// <summary>\n        /// offset the polygon. Does not modify this polygon.\n        /// </summary>\n        /// <param name=\"offset\">The type of offset.</param>\n        /// <param name=\"amount\">The amount to offset.</param>\n        /// <param name=\"results\">The offset results.</param>\n        public void Offset(OFFSET offset, double amount, List<Polygon2<K>> results)\n        {\n            try\n            {\n                var off = PolygonOffset2<K>.Instance;\n                off.CreateOffset(offset, this, amount, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { }\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract polygon definition.\n    /// </summary>\n    public abstract class PolygonWithHoles2 : CGALObject, IEnumerable<Point2d>\n    {\n        protected const int BOUNDARY_INDEX = -1;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private PolygonWithHoles2()\n        {\n            IsUnbounded = true;\n        }\n\n        /// <summary>\n        /// Construct polygon with the kernel.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal PolygonWithHoles2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolygonWithHolesKernel2;\n            Ptr = Kernel.Create();\n            IsUnbounded = true;\n        }\n\n        /// <summary>\n        /// Construct the polygon with the kernel and boundary.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"boundary\">A CCW polygon.</param>\n        internal PolygonWithHoles2(CGALKernel kernel, Polygon2 boundary)\n        {\n            Kernel = kernel.PolygonWithHolesKernel2;\n            Ptr = Kernel.CreateFromPolygon(boundary.Ptr);\n            IsUnbounded = false;\n        }\n\n        /// <summary>\n        /// Construct the polygon with the kernel and boundary.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"boundary\">A CCW set of points.</param>\n        internal PolygonWithHoles2(CGALKernel kernel, Point2d[] boundary)\n        {\n            Kernel = kernel.PolygonWithHolesKernel2;\n            Ptr = Kernel.CreateFromPoints(boundary, boundary.Length);\n            IsUnbounded = false;\n        }\n\n        /// <summary>\n        /// Construct the polygon with the kernel and pointer.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal PolygonWithHoles2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.PolygonWithHolesKernel2;\n            HoleCount = Kernel.HoleCount(Ptr);\n            IsUnbounded = FindIfUnbounded();\n        }\n\n        /// <summary>\n        /// Is the polygon unbounded. \n        /// ie no boundary polygon has been set.\n        /// </summary>\n        public bool IsUnbounded { get; protected set; }\n\n        /// <summary>\n        /// Is the polygon bounded. \n        /// ie a boundary polygon has been set.\n        /// </summary>\n        public bool IsBounded => !IsUnbounded;\n\n        /// <summary>\n        /// Number of points in the boindary polygon.\n        /// </summary>\n        public int Count => PointCount(POLYGON_ELEMENT.BOUNDARY);\n\n        /// <summary>\n        /// The number of holes in polygon.\n        /// </summary>\n        public int HoleCount { get; protected set; }\n\n        /// <summary>\n        /// Is this a simple polygon.\n        /// Certains actions can only be carried out on simple polygons.\n        /// </summary>\n        public bool IsSimple => FindIfSimple(POLYGON_ELEMENT.BOUNDARY);\n\n        /// <summary>\n        /// The polygons orientation.\n        /// Certain actions depend on the polygons orientation.\n        /// </summary>\n        public ORIENTATION Orientation => FindOrientation(POLYGON_ELEMENT.BOUNDARY);\n\n        /// <summary>\n        /// The orientation expressed as the clock direction.\n        /// </summary>\n        public CLOCK_DIR ClockDir => (CLOCK_DIR)Orientation;\n\n        /// <summary>\n        /// Is the polygon degenerate.\n        /// Polygons with less than 3 points are degenerate.\n        /// </summary>\n        public bool IsDegenerate => Count < 3 || Orientation == ORIENTATION.ZERO;\n\n        /// <summary>\n        /// Is the polygon cw orientated.\n        /// </summary>\n        public bool IsClockWise => ClockDir == CLOCK_DIR.CLOCKWISE;\n\n        /// <summary>\n        /// Is the polygon ccw orientated.\n        /// </summary>\n        public bool IsCounterClockWise => ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE;\n\n        /// <summary>\n        /// The polygon kernel.\n        /// </summary>\n        protected private PolygonWithHolesKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// The type of kernel object uses.\n        /// </summary>\n        public string KernelName => Kernel.Name;\n\n        /// <summary>\n        /// Valid polygon with holes must have a simple and ccw boundary\n        /// and all holes must be simple and cw.\n        /// </summary>\n        /// <returns></returns>\n        public bool IsValid()\n        {\n            if(IsBounded)\n            {\n                if (!FindIfSimple(POLYGON_ELEMENT.BOUNDARY))\n                    return false;\n\n                if (FindOrientation(POLYGON_ELEMENT.BOUNDARY) != ORIENTATION.POSITIVE)\n                    return false;\n            }\n\n            for(int i = 0; i < HoleCount; i++)\n            {\n                if (!FindIfSimple(POLYGON_ELEMENT.HOLE, i))\n                    return false;\n\n                if (FindOrientation(POLYGON_ELEMENT.HOLE, i) != ORIENTATION.NEGATIVE)\n                    return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Valid holes must be simple, cw and must be contained\n        /// within the boundary polygon.\n        /// </summary>\n        /// <param name=\"pwh\"></param>\n        /// <param name=\"hole\"></param>\n        /// <returns>True if the polygon is a valid hole.</returns>\n        public static bool IsValidHole(PolygonWithHoles2 pwh, Polygon2 hole)\n        {\n            if (!hole.IsValidHole())\n                return false;\n\n            if (!pwh.ContainsPolygon(hole))\n                return false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Clear the polygon.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n            IsUnbounded = true;\n            HoleCount = 0;\n        }\n\n        /// <summary>\n        /// Clear the polygons boundary.\n        /// </summary>\n        public void ClearBoundary()\n        {\n            Kernel.ClearBoundary(Ptr);\n            IsUnbounded = true;\n        }\n\n        /// <summary>\n        /// Clear the polygons holes.\n        /// </summary>\n        public void ClearHoles()\n        {\n            Kernel.ClearHoles(Ptr);\n            HoleCount = 0;\n        }\n\n        /// <summary>\n        /// Get the number of points of a polygon element.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns></returns>\n        public int PointCount(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.PointCount(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.PointCount(Ptr, index);\n        }\n\n        /// <summary>\n        /// Remove a polygon.\n        /// Can remove the boundary or a hole.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Remove(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n            {\n                Kernel.ClearBoundary(Ptr);\n                IsUnbounded = true;\n            }\n            else\n            {\n                Kernel.RemoveHole(Ptr, index);\n                HoleCount--;\n            }\n        }\n\n        /// <summary>\n        /// Remove a hole from the polygon.\n        /// </summary>\n        /// <param name=\"index\">The holes index.</param>\n        public void RemoveHole(int index)\n        {\n            if (index >= 0 && index <= HoleCount)\n            {\n                Kernel.RemoveHole(Ptr, index);\n                HoleCount--;\n            }\n        }\n\n        /// <summary>\n        /// Reverse the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Reverse(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.ReversePolygon(Ptr, BOUNDARY_INDEX);\n            else\n                Kernel.ReversePolygon(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get a polygons point.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"pointIndex\">The index of the point in the polygon.</param>\n        /// <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        /// <returns></returns>\n        public Point2d GetPoint(POLYGON_ELEMENT element, int pointIndex, int holeIndex = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.GetPoint(Ptr, BOUNDARY_INDEX, pointIndex);\n            else\n                return Kernel.GetPoint(Ptr, holeIndex, pointIndex);\n        }\n\n        /// <summary>\n        /// Get the points in the polygon element.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"points\">The point array to copy points into.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        public void GetPoints(POLYGON_ELEMENT element, Point2d[] points, int count, int holeIndex = 0)\n        {\n            ErrorUtil.CheckArray(points, count);\n\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.GetPoints(Ptr, points, BOUNDARY_INDEX, points.Length);\n            else\n                Kernel.GetPoints(Ptr, points, holeIndex, points.Length);\n            \n        }\n\n        /// <summary>\n        /// Set a polygons point.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"pointIndex\">The index of the point in the polygon.</param>\n        /// <param name=\"point\">The point to set.</param>\n        /// <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        public void SetPoint(POLYGON_ELEMENT element, int pointIndex, Point2d point, int holeIndex = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)  \n                Kernel.SetPoint(Ptr, BOUNDARY_INDEX, pointIndex, point);\n            else\n                Kernel.SetPoint(Ptr, holeIndex, pointIndex, point);\n        }\n\n        /// <summary>\n        /// Set all the points in the polygon. If the point array is longer\n        /// than the polygon is current the extra points are appended to the end.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"points\">The points to set.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        /// <param name=\"holeIndex\">If element type is a hole this is the holes index.</param>\n        public void SetPoints(POLYGON_ELEMENT element, Point2d[] points, int count, int holeIndex = 0)\n        {\n            ErrorUtil.CheckArray(points, count);\n\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.SetPoints(Ptr, points, BOUNDARY_INDEX, points.Length);\n            else\n                Kernel.SetPoints(Ptr, points, holeIndex, points.Length);\n        }\n\n        /// <summary>\n        /// Triangulate the polygon.\n        /// </summary>\n        /// <param name=\"indices\">The triangle indices.</param>\n        public abstract void Triangulate(List<int> indices);\n\n        /// <summary>\n        /// Add a hole from a set of points.\n        /// </summary>\n        /// <param name=\"points\">A CW set of points.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void AddHole(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.AddHoleFromPoints(Ptr, points, count);\n            HoleCount++;\n        }\n\n        /// <summary>\n        /// Find if the polygon has a boundary.\n        /// </summary>\n        /// <returns>True if the polygon has a boundary.</returns>\n        public bool FindIfUnbounded()\n        {\n            return Kernel.IsUnbounded(Ptr);\n        }\n\n        /// <summary>\n        /// Find the polygons bounding box.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>The polygons bounding box.</returns>\n        public Box2d FindBoundingBox(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.GetBoundingBox(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.GetBoundingBox(Ptr, index);\n        }\n\n        /// <summary>\n        /// Find if the polygon is simple.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>True if the polygon is simple.</returns>\n        public bool FindIfSimple(POLYGON_ELEMENT element, int index = 0)\n        {\n            if(element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.IsSimple(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.IsSimple(Ptr, index);\n        }\n\n        /// <summary>\n        /// Find if the polygon is convex.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>True if polygon is convex.</returns>\n        public bool FindIfConvex(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.IsConvex(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.IsConvex(Ptr, index);\n        }\n\n        /// <summary>\n        /// Find the orientation of polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>The orientation of the polygon.</returns>\n        public ORIENTATION FindOrientation(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.Orientation(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.Orientation(Ptr, index);\n        }\n\n        /// <summary>\n        /// Find the orientated side the point is on.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>The orientated side of point compared to the polygon.</returns>\n        public ORIENTED_SIDE OrientedSide(POLYGON_ELEMENT element, Point2d point, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.OrientedSide(Ptr, BOUNDARY_INDEX, point);\n            else\n                return Kernel.OrientedSide(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// The signed area of the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>The signed area is positive if polygon is ccw \n        /// and negation if cw.</returns>\n        public double FindSignedArea(POLYGON_ELEMENT element, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                return Kernel.SignedArea(Ptr, BOUNDARY_INDEX);\n            else\n                return Kernel.SignedArea(Ptr, index);\n        }\n\n        /// <summary>\n        /// The area of the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        /// <returns>The polygons area.</returns>\n        public double FindArea(POLYGON_ELEMENT element, int index = 0)\n        {\n            return Math.Abs(FindSignedArea(element, index));\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polygon.\n        /// </summary>\n        /// <returns>Each point in polygon.</returns>\n        public IEnumerator<Point2d> GetEnumerator()\n        {\n            for (int i = 0; i < Count; i++)\n                yield return GetPoint( POLYGON_ELEMENT.BOUNDARY, i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polygon.\n        /// </summary>\n        /// <returns>Each point in polygon.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Return all the points in the polygon in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point2d[] ToArray()\n        {\n            var points = new Point2d[Count];\n            for (int i = 0; i < Count; i++)\n                points[i] = GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n\n            return points;\n        }\n\n        /// <summary>\n        /// Get all the points in the polygons boundary into a list.\n        /// </summary>\n        public void ToList(List<Point2d> points)\n        {\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(POLYGON_ELEMENT.BOUNDARY, i));\n        }\n\n        /// <summary>\n        /// Get all the points in the polygon boundary and holes.\n        /// </summary>\n        /// <param name=\"points\">The point array to copy into.</param>\n        public void GetAllPoints(List<Point2d> points)\n        {\n            int count = PointCount(POLYGON_ELEMENT.BOUNDARY);\n            var arr = new Point2d[count];\n            GetPoints(POLYGON_ELEMENT.BOUNDARY, arr, arr.Length);\n            points.AddRange(arr);\n\n            for (int i = 0; i < HoleCount; i++)\n            {\n                count = PointCount(POLYGON_ELEMENT.HOLE, i);\n                arr = new Point2d[count];\n                GetPoints(POLYGON_ELEMENT.HOLE, arr, arr.Length, i);\n                points.AddRange(arr);\n            }\n        }\n\n        /// <summary>\n        /// Round each point it polygon to a number of digits.\n        /// </summary>\n        /// <param name=\"digits\">The number of digits to round to.</param>\n        public void Round(int digits)\n        {\n            int count = PointCount(POLYGON_ELEMENT.BOUNDARY);\n            var arr = new Point2d[count];\n            GetPoints(POLYGON_ELEMENT.BOUNDARY, arr, arr.Length);\n\n            for(int i = 0; i < count; i++)\n                arr[i] = arr[i].Rounded(digits);\n\n            SetPoints(POLYGON_ELEMENT.BOUNDARY, arr, arr.Length);\n\n            for (int i = 0; i < HoleCount; i++)\n            {\n                count = PointCount(POLYGON_ELEMENT.HOLE, i);\n                arr = new Point2d[count];\n                GetPoints(POLYGON_ELEMENT.HOLE, arr, arr.Length, i);\n\n                for (int j = 0; j < count; j++)\n                    arr[j] = arr[j].Rounded(digits);\n\n                SetPoints(POLYGON_ELEMENT.HOLE, arr, arr.Length, i);\n            }\n\n        }\n\n        /// <summary>\n        /// Convert the polygon to a new polygon with a different kernel.\n        /// May result in different values due to precision issues.\n        /// </summary>\n        /// <typeparam name=\"T\">The new kernel type.</typeparam>\n        /// <returns>The new polygon.</returns>\n        public PolygonWithHoles2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Convert(Ptr, e);\n            return new PolygonWithHoles2<T>(ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged resoures.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Release(ptr);\n        }\n\n        /// <summary>\n        /// Does the polygon fully contain the other polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The other polygon.</param>\n        /// <param name=\"inculdeBoundary\">Should the boundary be included.</param>\n        /// <returns>True if the polygon is contained within this polygon.</returns>\n        private bool ContainsPolygon(Polygon2 polygon, bool inculdeBoundary = true)\n        {\n            if (IsUnbounded) return true;\n\n            for (int i = 0; i < polygon.Count; i++)\n            {\n                if (!ContainsPoint(polygon.GetPoint(i), inculdeBoundary))\n                    return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Does this polygon contain the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"inculdeBoundary\">Should points on the boundary be \n        /// counted as being inside the polygon.</param>\n        /// <returns>True if the polygon contain the point.</returns>\n        public bool ContainsPoint(Point2d point, bool inculdeBoundary = true)\n        {\n            var orientation = FindOrientation(POLYGON_ELEMENT.BOUNDARY);\n            return Kernel.ContainsPoint(Ptr, point, orientation, inculdeBoundary);\n        }\n\n        /// <summary>\n        /// Translate the polygon.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Translate(Ptr, BOUNDARY_INDEX, translation);\n\n            int count = HoleCount;\n            for (int i = 0; i < count; i++)\n                Kernel.Translate(Ptr, i, translation);\n        }\n\n        /// <summary>\n        /// Translate the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Translate(POLYGON_ELEMENT element, Point2d translation, int index = 0)\n        {\n            if(element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.Translate(Ptr, BOUNDARY_INDEX, translation);\n            else\n                Kernel.Translate(Ptr, index, translation);\n        }\n\n        /// <summary>\n        /// Rotate the polygon.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        public void Rotate(Degree rotation)\n        {\n            Kernel.Rotate(Ptr, BOUNDARY_INDEX, rotation.radian);\n\n            int count = HoleCount;\n            for (int i = 0; i < count; i++)\n                Kernel.Rotate(Ptr, i, rotation.radian);\n        }\n\n        /// <summary>\n        /// Rotate the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Rotate(POLYGON_ELEMENT element, Degree rotation, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.Rotate(Ptr, BOUNDARY_INDEX, rotation.radian);\n            else\n                Kernel.Rotate(Ptr, index, rotation.radian);\n        }\n\n        /// <summary>\n        /// Rotate the polygon.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Scale(Ptr, BOUNDARY_INDEX, scale);\n\n            int count = HoleCount;\n            for (int i = 0; i < count; i++)\n                Kernel.Scale(Ptr, i, scale);\n        }\n\n        /// <summary>\n        /// Scale the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Scale(POLYGON_ELEMENT element, double scale, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.Scale(Ptr, BOUNDARY_INDEX, scale);\n            else\n                Kernel.Scale(Ptr, index, scale);\n        }\n\n        /// <summary>\n        /// Transform the polygon.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Degree rotation, double scale)\n        {\n            Kernel.Transform(Ptr, BOUNDARY_INDEX, translation, rotation.radian, scale);\n\n            int count = HoleCount;\n            for (int i = 0; i < count; i++)\n                Kernel.Transform(Ptr, i, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// Transform the polygon.\n        /// </summary>\n        /// <param name=\"element\">The element type.</param>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        /// <param name=\"index\">If element type is a hole this is the holes index.</param>\n        public void Transform(POLYGON_ELEMENT element, Point2d translation, Degree rotation, double scale, int index = 0)\n        {\n            if (element == POLYGON_ELEMENT.BOUNDARY)\n                Kernel.Transform(Ptr, BOUNDARY_INDEX, translation, rotation.radian, scale);\n            else\n                Kernel.Transform(Ptr, index, translation, rotation.radian, scale);\n        }\n\n        /// <summary>\n        /// Print debug infomation.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Is Bounded = \" + IsBounded);\n\n            if (!IsUnbounded)\n            {\n                var element = POLYGON_ELEMENT.BOUNDARY;\n                builder.AppendLine(\"Boundary point count = \" + PointCount(element));\n                builder.AppendLine(\"Boundary is simple = \" + FindIfSimple(element));\n                builder.AppendLine(\"Boundary is convex = \" + FindIfConvex(element));\n                builder.AppendLine(\"Boundary orientation = \" + FindOrientation(element));\n                builder.AppendLine(\"Boundary signed Area = \" + FindSignedArea(element));\n            }\n\n            for (int i = 0; i < HoleCount; i++)\n            {\n                builder.AppendLine(\"\");\n                var element = POLYGON_ELEMENT.HOLE;\n                builder.AppendLine(\"Hole \" + i + \" point count = \" + PointCount(element, i));\n                builder.AppendLine(\"Hole \" + i + \" is simple = \" + FindIfSimple(element, i));\n                builder.AppendLine(\"Hole \" + i + \" is convex = \" + FindIfConvex(element, i));\n                builder.AppendLine(\"Hole \" + i + \" is orientation = \" + FindOrientation(element, i));\n                builder.AppendLine(\"Hole \" + i + \" is signed area = \" + FindSignedArea(element, i));\n                builder.AppendLine();\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonWithHolesKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal abstract class PolygonWithHolesKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract int HoleCount(IntPtr ptr);\n\n        internal abstract int PointCount(IntPtr ptr, int index);\n\n        internal abstract IntPtr Copy(IntPtr ptr);\n\n        internal abstract IntPtr Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract void ClearBoundary(IntPtr ptr);\n\n        internal abstract void ClearHoles(IntPtr ptr);\n\n        internal abstract IntPtr CreateFromPolygon(IntPtr ptr);\n\n        internal abstract IntPtr CreateFromPoints(Point2d[] points, int count);\n\n        internal abstract Point2d GetPoint(IntPtr ptr, int polyIndex, int pointIndex);\n\n        internal abstract void GetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count);\n\n        internal abstract void SetPoint(IntPtr ptr, int polyIndex, int pointIndex, Point2d point);\n\n        internal abstract void SetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count);\n\n        internal abstract void AddHoleFromPolygon(IntPtr pwhPtr, IntPtr polygonPtr);\n\n        internal abstract void AddHoleFromPoints(IntPtr ptr, Point2d[] points, int count);\n\n        internal abstract void RemoveHole(IntPtr ptr, int index);\n\n        internal abstract IntPtr CopyPolygon(IntPtr ptr, int index);\n\n        internal abstract void ReversePolygon(IntPtr ptr, int index);\n\n        internal abstract bool IsUnbounded(IntPtr ptr);\n\n        internal abstract Box2d GetBoundingBox(IntPtr ptr, int index);\n\n        internal abstract bool IsSimple(IntPtr ptr, int index);\n\n        internal abstract bool IsConvex(IntPtr ptr, int index);\n\n        internal abstract ORIENTATION Orientation(IntPtr ptr, int index);\n\n        internal abstract ORIENTED_SIDE OrientedSide(IntPtr ptr, int index, Point2d point);\n\n        internal abstract double SignedArea(IntPtr ptr, int index);\n\n        internal abstract void Translate(IntPtr ptr, int index, Point2d translation);\n\n        internal abstract void Rotate(IntPtr ptr, int index, double rotation);\n\n        internal abstract void Scale(IntPtr ptr, int index, double scale);\n\n        internal abstract void Transform(IntPtr ptr, int index, Point2d translation, double rotation, double scale);\n\n        internal abstract bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary);\n\n        internal abstract IntPtr ConnectHoles(IntPtr ptr);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonWithHolesKernel2_EEK.cs",
    "content": "﻿using CGALDotNetGeometry.Numerics;\nusing System;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal sealed class PolygonWithHolesKernel2_EEK : PolygonWithHolesKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolygonWithHolesKernel2_EEK Instance = new PolygonWithHolesKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonWithHoles2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonWithHoles2_EEK_Release(ptr);\n        }\n\n        internal override int HoleCount(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EEK_HoleCount(ptr);\n        }\n\n        internal override int PointCount(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_PointCount(ptr, index);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return PolygonWithHoles2_EEK_Convert(ptr, k);   \n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            PolygonWithHoles2_EEK_Clear(ptr);\n        }\n\n        internal override void ClearBoundary(IntPtr ptr)\n        {\n            PolygonWithHoles2_EEK_ClearBoundary(ptr);\n        }\n\n        internal override void ClearHoles(IntPtr ptr)\n        {\n            PolygonWithHoles2_EEK_ClearHoles(ptr);\n        }\n\n        internal override IntPtr CreateFromPolygon(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EEK_CreateFromPolygon(ptr);\n        }\n\n        internal override IntPtr CreateFromPoints(Point2d[] points, int count)\n        {\n            return PolygonWithHoles2_EEK_CreateFromPoints(points, count);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int polyIndex, int pointIndex)\n        {\n            return PolygonWithHoles2_EEK_GetPoint(ptr, polyIndex, pointIndex);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count)\n        {\n            PolygonWithHoles2_EEK_GetPoints(ptr, points, polyIndex, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int polyIndex, int pointIndex, Point2d point)\n        {\n            PolygonWithHoles2_EEK_SetPoint(ptr, polyIndex, pointIndex, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count)\n        {\n            PolygonWithHoles2_EEK_SetPoints(ptr, points, polyIndex, count);\n        }\n\n        internal override void AddHoleFromPolygon(IntPtr pwhPtr, IntPtr polygonPtr)\n        {\n            PolygonWithHoles2_EEK_AddHoleFromPolygon(pwhPtr, polygonPtr);\n        }\n\n        internal override void AddHoleFromPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            PolygonWithHoles2_EEK_AddHoleFromPoints(ptr, points, count);\n        }\n\n        internal override void RemoveHole(IntPtr ptr, int index)\n        {\n            PolygonWithHoles2_EEK_RemoveHole(ptr, index);\n        }\n\n        internal override IntPtr CopyPolygon(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_CopyPolygon(ptr, index);\n        }\n\n        internal override void ReversePolygon(IntPtr ptr, int index)\n        {\n            PolygonWithHoles2_EEK_ReversePolygon(ptr, index);\n        }\n\n        internal override bool IsUnbounded(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EEK_IsUnbounded(ptr);\n        }\n\n        internal override Box2d GetBoundingBox(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_GetBoundingBox(ptr, index);\n        }\n\n        internal override bool IsSimple(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_IsSimple(ptr, index);\n        }\n\n        internal override bool IsConvex(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_IsConvex(ptr, index);\n        }\n\n        internal override ORIENTATION Orientation(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_Orientation(ptr, index);\n        }\n\n        internal override ORIENTED_SIDE OrientedSide(IntPtr ptr, int index, Point2d point)\n        {\n            return PolygonWithHoles2_EEK_OrientedSide(ptr, index, point);\n        }\n\n        internal override double SignedArea(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EEK_SignedArea(ptr, index);\n        }\n\n        internal override void Translate(IntPtr ptr, int index, Point2d translation)\n        {\n            PolygonWithHoles2_EEK_Translate(ptr, index, translation);\n        }\n\n        internal override void Rotate(IntPtr ptr, int index, double rotation)\n        {\n            PolygonWithHoles2_EEK_Rotate(ptr, index, rotation);\n        }\n\n        internal override void Scale(IntPtr ptr, int index, double scale)\n        {\n            PolygonWithHoles2_EEK_Scale(ptr, index, scale);\n        }\n\n        internal override void Transform(IntPtr ptr, int index, Point2d translation, double rotation, double scale)\n        {\n            PolygonWithHoles2_EEK_Transform(ptr, index, translation, rotation, scale);\n        }\n\n        internal override bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary)\n        {\n            return PolygonWithHoles2_EEK_ContainsPoint(ptr, point, orientation, inculdeBoundary);\n        }\n\n        internal override IntPtr ConnectHoles(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EEK_ConnectHoles(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EEK_HoleCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EEK_PointCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_ClearBoundary(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_ClearHoles(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_CreateFromPolygon(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_CreateFromPoints(Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d PolygonWithHoles2_EEK_GetPoint(IntPtr ptr, int polyIndex, int pointIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int polyIndex, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_SetPoint(IntPtr ptr, int polyIndex, int pointIndex, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_SetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_AddHoleFromPolygon(IntPtr pwhPtr, IntPtr polygonPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_AddHoleFromPoints(IntPtr ptr, Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_RemoveHole(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_CopyPolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_ReversePolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EEK_IsUnbounded(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box2d PolygonWithHoles2_EEK_GetBoundingBox(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EEK_IsSimple(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EEK_IsConvex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION PolygonWithHoles2_EEK_Orientation(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE PolygonWithHoles2_EEK_OrientedSide(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double PolygonWithHoles2_EEK_SignedArea(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_Translate(IntPtr ptr, int index, Point2d translation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_Rotate(IntPtr ptr, int index, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_Scale(IntPtr ptr, int index, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EEK_Transform(IntPtr ptr, int index, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EEK_ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation,bool inculdeBoundary);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EEK_ConnectHoles(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polygons/PolygonWithHolesKernel2_EIK.cs",
    "content": "﻿using CGALDotNetGeometry.Numerics;\nusing System;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polygons\n{\n    internal sealed class PolygonWithHolesKernel2_EIK : PolygonWithHolesKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolygonWithHolesKernel2_EIK Instance = new PolygonWithHolesKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return PolygonWithHoles2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            PolygonWithHoles2_EIK_Release(ptr);\n        }\n\n        internal override int HoleCount(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EIK_HoleCount(ptr);\n        }\n\n        internal override int PointCount(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_PointCount(ptr, index);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return PolygonWithHoles2_EIK_Convert(ptr, k);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            PolygonWithHoles2_EIK_Clear(ptr);\n        }\n\n        internal override void ClearBoundary(IntPtr ptr)\n        {\n            PolygonWithHoles2_EIK_ClearBoundary(ptr);\n        }\n\n        internal override void ClearHoles(IntPtr ptr)\n        {\n            PolygonWithHoles2_EIK_ClearHoles(ptr);\n        }\n\n        internal override IntPtr CreateFromPolygon(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EIK_CreateFromPolygon(ptr);\n        }\n\n        internal override IntPtr CreateFromPoints(Point2d[] points, int count)\n        {\n            return PolygonWithHoles2_EIK_CreateFromPoints(points, count);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int polyIndex, int pointIndex)\n        {\n            return PolygonWithHoles2_EIK_GetPoint(ptr, polyIndex, pointIndex);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count)\n        {\n            PolygonWithHoles2_EIK_GetPoints(ptr, points, polyIndex, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int polyIndex, int pointIndex, Point2d point)\n        {\n            PolygonWithHoles2_EIK_SetPoint(ptr, polyIndex, pointIndex, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count)\n        {\n            PolygonWithHoles2_EIK_SetPoints(ptr, points, polyIndex, count);\n        }\n\n        internal override void AddHoleFromPolygon(IntPtr pwhPtr, IntPtr polygonPtr)\n        {\n            PolygonWithHoles2_EIK_AddHoleFromPolygon(pwhPtr, polygonPtr);\n        }\n\n        internal override void AddHoleFromPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            PolygonWithHoles2_EIK_AddHoleFromPoints(ptr, points, count);\n        }\n\n        internal override void RemoveHole(IntPtr ptr, int index)\n        {\n            PolygonWithHoles2_EIK_RemoveHole(ptr, index);\n        }\n\n        internal override IntPtr CopyPolygon(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_CopyPolygon(ptr, index);\n        }\n\n        internal override void ReversePolygon(IntPtr ptr, int index)\n        {\n            PolygonWithHoles2_EIK_ReversePolygon(ptr, index);\n        }\n\n        internal override bool IsUnbounded(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EIK_IsUnbounded(ptr);\n        }\n\n        internal override Box2d GetBoundingBox(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_GetBoundingBox(ptr, index);\n        }\n\n        internal override bool IsSimple(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_IsSimple(ptr, index);\n        }\n\n        internal override bool IsConvex(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_IsConvex(ptr, index);\n        }\n\n        internal override ORIENTATION Orientation(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_Orientation(ptr, index);\n        }\n\n        internal override ORIENTED_SIDE OrientedSide(IntPtr ptr, int index, Point2d point)\n        {\n            return PolygonWithHoles2_EIK_OrientedSide(ptr, index, point);\n        }\n\n        internal override double SignedArea(IntPtr ptr, int index)\n        {\n            return PolygonWithHoles2_EIK_SignedArea(ptr, index);\n        }\n\n        internal override void Translate(IntPtr ptr, int index, Point2d translation)\n        {\n            PolygonWithHoles2_EIK_Translate(ptr, index, translation);\n        }\n\n        internal override void Rotate(IntPtr ptr, int index, double rotation)\n        {\n            PolygonWithHoles2_EIK_Rotate(ptr, index, rotation);\n        }\n\n        internal override void Scale(IntPtr ptr, int index, double scale)\n        {\n            PolygonWithHoles2_EIK_Scale(ptr, index, scale);\n        }\n\n        internal override void Transform(IntPtr ptr, int index, Point2d translation, double rotation, double scale)\n        {\n            PolygonWithHoles2_EIK_Transform(ptr, index, translation, rotation, scale);\n        }\n\n        internal override bool ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary)\n        {\n            return PolygonWithHoles2_EIK_ContainsPoint(ptr, point, orientation, inculdeBoundary);\n        }\n\n        internal override IntPtr ConnectHoles(IntPtr ptr)\n        {\n            return PolygonWithHoles2_EIK_ConnectHoles(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EIK_HoleCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int PolygonWithHoles2_EIK_PointCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_ClearBoundary(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_ClearHoles(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_CreateFromPolygon(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_CreateFromPoints(Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d PolygonWithHoles2_EIK_GetPoint(IntPtr ptr, int polyIndex, int pointIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int polyIndex, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_SetPoint(IntPtr ptr, int polyIndex, int pointIndex, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_SetPoints(IntPtr ptr, Point2d[] points, int polyIndex, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_AddHoleFromPolygon(IntPtr pwhPtr, IntPtr polygonPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_AddHoleFromPoints(IntPtr ptr, Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_RemoveHole(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_CopyPolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_ReversePolygon(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EIK_IsUnbounded(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box2d PolygonWithHoles2_EIK_GetBoundingBox(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EIK_IsSimple(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EIK_IsConvex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTATION PolygonWithHoles2_EIK_Orientation(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern ORIENTED_SIDE PolygonWithHoles2_EIK_OrientedSide(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double PolygonWithHoles2_EIK_SignedArea(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_Translate(IntPtr ptr, int index, Point2d translation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_Rotate(IntPtr ptr, int index, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_Scale(IntPtr ptr, int index, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void PolygonWithHoles2_EIK_Transform(IntPtr ptr, int index, Point2d translation, double rotation, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool PolygonWithHoles2_EIK_ContainsPoint(IntPtr ptr, Point2d point, ORIENTATION orientation, bool inculdeBoundary);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr PolygonWithHoles2_EIK_ConnectHoles(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/IMesh.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public interface IMesh : IEnumerable<Point3d>\n    {\n\n        /// <summary>\n        /// Number of vertices.\n        /// </summary>\n        int VertexCount { get; }\n\n        /// <summary>\n        /// Number of faces.\n        /// </summary>\n        int FaceCount { get; }\n\n        /// <summary>\n        /// Number of halfedges.\n        /// </summary>\n        int HalfedgeCount { get; }\n\n        /// <summary>\n        /// Number of border edges.\n        /// Since each border edge of a polyhedral surface has exactly one \n        /// border halfedge, this number is equal to size of border halfedges.\n        /// </summary>\n        int BorderEdgeCount { get; }\n\n        /// <summary>\n        /// Returns true if the polyhedral surface is combinatorially consistent.\n        /// Must be a valid mesh to check many other properties.\n        /// </summary>\n        bool IsValid { get; }\n\n        /// <summary>\n        /// Returns true if there are no border edges.\n        /// </summary>\n        bool IsClosed { get; }\n\n        /// <summary>\n        /// Returns true if all faces are triangles.\n        /// </summary>\n        bool IsTriangle { get; }\n\n        /// <summary>\n        /// Returns true if all faces are quads.\n        /// </summary>\n        bool IsQuad { get; }\n\n        /// <summary>\n        /// Is this a valid triangle mesh.\n        /// </summary>\n        bool IsValidTriangleMesh { get; }\n\n        /// <summary>\n        /// Is this a valid closed mesh.\n        /// </summary>\n        bool IsValidClosedMesh { get; }\n\n        /// <summary>\n        /// Is this a valid closed triangle mesh.\n        /// </summary>\n        bool IsValidClosedTriangleMesh { get; }\n\n        /// <summary>\n        /// The current build stamp.\n        /// </summary>\n        int BuildStamp { get; }\n\n        /// <summary>\n        /// Clear the mesh.\n        /// </summary>\n        void Clear();\n\n        /// <summary>\n        /// Clear the normal maps.\n        /// </summary>\n        /// <param name=\"vertices\">True to clear the vertex normal map.</param>\n        /// <param name=\"faces\">True to clear the face normal map. </param>\n        void ClearNormalMaps(bool vertices, bool faces);\n\n        /// <summary>\n        /// Create a mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        void CreateMesh(Point3d[] points, int[] triangles, int[] quads = null);\n\n        /// <summary>\n        /// Create a triangle mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        void CreateTriangleMesh(Point3d[] points, int pointCount, int[] indices, int indexCount);\n\n        /// <summary>\n        /// Create a quad mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        void CreateQuadMesh(Point3d[] points, int pointCount, int[] indices, int indexCount);\n\n        /// <summary>\n        /// Create a mesh with quads and triangles.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointsCount\">The point array length.</param>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"triangleCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        void CreateTriangleQuadMesh(Point3d[] points, int pointsCount, int[] triangles, int triangleCount, int[] quads, int quadsCount);\n\n        /// <summary>\n        /// Create a mesh with riangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <param name=\"points\">The meshs points.</param>\n        /// <param name=\"pointsCount\">The length of the point array.</param>\n        /// <param name=\"indices\">The faces indices.</param>\n        void CreatePolygonalMesh(Point3d[] points, int pointsCount, PolygonalIndices indices);\n\n        /// <summary>\n        /// Create a mesh consisting of one polygon face.\n        /// </summary>\n        /// <param name=\"points\">The faces points</param>\n        /// <param name=\"count\">The length of the point array.</param>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        void CreatePolygonMesh(Point2d[] points, int count, bool xz);\n\n        /// <summary>\n        /// Get the triangle and quad indices.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        void GetIndices(int[] triangles, int[] quads = null);\n\n        /// <summary>\n        /// Get the meshes triangles.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        void GetTriangleIndices(int[] triangles, int trianglesCount);\n\n        /// <summary>\n        /// Get the meshes quads.\n        /// </summary>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        void GetQuadIndices(int[] quads, int quadsCount);\n\n        /// <summary>\n        /// Get the meshes triangles and quads.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        void GetTriangleQuadIndices(int[] triangles, int trianglesCount, int[] quads, int quadsCount);\n\n        /// <summary>\n        /// Get the meshes triangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <returns>The indices.</returns>\n        PolygonalIndices GetPolygonalIndices();\n\n        /*\n        /// <summary>\n        /// Get the dual meshes triangles, quads, pentagons and hexagons.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <param name=\"indices\">The faces indices</param>\n        PolygonalIndices GetDualPolygonalIndices();\n        */\n\n        /// <summary>\n        /// Array accessor for the polygon.\n        /// Getting a point wraps around the polygon.\n        /// </summary>\n        /// <param name=\"i\">The points index.</param>\n        /// <returns>The vertices point.</returns>\n        Point3d this[int i] { get; set; }\n\n        /// <summary>\n        /// Get the vertices point.\n        /// </summary>\n        /// <param name=\"index\">The vertex index in the mesh.</param>\n        /// <returns>The vertices point.</returns>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        Point3d GetPoint(int index);\n\n        /// <summary>\n        /// Get the points in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The array to copy points into.</param>\n        /// <param name=\"count\">The point array length.</param>\n        void GetPoints(Point3d[] points, int count);\n\n        /// <summary>\n        /// Set the point at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        /// <param name=\"point\">The points</param>am>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        void SetPoint(int index, Point3d point);\n\n        /// <summary>\n        /// Set the points from a array.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The point arrays length.</param>\n        void SetPoints(Point3d[] points, int count);\n\n        /// <summary>\n        /// Get a halfedges segment.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"segment\">The segment.</param>\n        /// <returns>True if halfedge found.</returns>\n        bool GetSegment(int index, out Segment3d segment);\n\n        /// <summary>\n        /// Get a segment for  each halfedge in the mesh.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The segment array length.</param>\n        void GetSegments(Segment3d[] segments, int count);\n\n        /// <summary>\n        /// Get the faces triangle. \n        /// Presumes face is a triangle with no checks.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"triangle\">The faces triangle</param>\n        /// <returns></returns>\n        bool GetTriangle(int index, out Triangle3d triangle);\n\n        /// <summary>\n        /// Get a triangle for each face in the mesh.\n        /// Presumes all faces are triangles with no checks.\n        /// </summary>\n        /// <param name=\"triangles\">The trainagle array.</param>\n        /// <param name=\"count\">The traingle  arrays length.</param>\n        void GetTriangles(Triangle3d[] triangles, int count);\n\n        /// <summary>\n        /// Get the mesh vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns>True if the vertex was found.</returns>\n        bool GetVertex(int index, out MeshVertex3 vertex);\n\n        /// <summary>\n        /// Get the vertices in the mesh.\n        /// </summary>\n        /// <param name=\"vertices\">The vertex array.</param>\n        /// <param name=\"count\">The vertex array length.</param>\n        void GetVertices(MeshVertex3[] vertices, int count);\n\n        /// <summary>\n        /// Get the mesh face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"face\">The face.</param>\n        /// <returns>True if the face was found.</returns>\n        bool GetFace(int index, out MeshFace3 face);\n \n        /// <summary>\n        /// Get the faces in the mesh.\n        /// </summary>\n        /// <param name=\"faces\">The face array.</param>\n        /// <param name=\"count\">The face array length.</param>\n        void GetFaces(MeshFace3[] faces, int count);\n\n        /// <summary>\n        /// Get the mesh halfedge.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"halfedge\">The halfedge.</param>\n        /// <returns>True if the halfedge was found.</returns>\n        bool GetHalfedge(int index, out MeshHalfedge3 halfedge);\n\n        /// <summary>\n        /// Get the halfedges in the mesh.\n        /// </summary>\n        /// <param name=\"halfedges\">The halfedge array.</param>\n        /// <param name=\"count\">The halfedge array length.</param>\n        void GetHalfedges(MeshHalfedge3[] halfedges, int count);\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the mesh.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        PolygonalCount GetPolygonalCount();\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the dual mesh.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        PolygonalCount GetDualPolygonalCount();\n\n        /// <summary>\n        /// Get a centroid (the avergae face position) for each face in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The points arrays lemgth.</param>\n        void GetCentroids(Point3d[] points, int count);\n\n        /// <summary>\n        /// Computes the vertex normals if needed.\n        /// </summary>\n        void ComputeVertexNormals();\n\n        /// <summary>\n        /// Computes the face normals if needed.\n        /// </summary>\n        void ComputeFaceNormals();\n\n        /// <summary>\n        /// Get the vertex normals.\n        /// </summary>\n        /// <param name=\"normals\">The normals array.</param>\n        /// <param name=\"count\">The normals array length.</param>\n        void GetVertexNormals(Vector3d[] normals, int count);\n\n        /// <summary>\n        /// Get the face normals.\n        /// </summary>\n        /// <param name=\"normals\">The normals array.</param>\n        /// <param name=\"count\">The normals array length.</param>\n        void GetFaceNormals(Vector3d[] normals, int count);\n\n        /// <summary>\n        /// Translate each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        void Translate(Point3d translation);\n\n        /// <summary>\n        /// Rotate each point in the mesh.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        void Rotate(Quaternion3d rotation);\n\n        /// <summary>\n        /// Scale each point in the mesh.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        void Scale(Point3d scale);\n\n        /// <summary>\n        /// Transform each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        void Transform(Point3d translation, Quaternion3d rotation, Point3d scale);\n\n        /// <summary>\n        /// Make all faces triangles.\n        /// </summary>\n        void Triangulate();\n\n        /// <summary>\n        /// Read data from a off file into the pollyhedron.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        void ReadOFF(string filename);\n\n        /// <summary>\n        /// Write data from a off file into the pollyhedron.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        void WriteOFF(string filename);\n\n        /// <summary>\n        /// Print the mesh into a string builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        void Print(StringBuilder builder);\n\n        /// <summary>\n        /// Reverses the orientation of the vertices in each face.\n        /// </summary>\n        void ReverseFaceOrientation();\n\n        /// <summary>\n        /// Find what side of the mesh the lies in.\n        /// </summary>\n        /// <param name=\"point\">The point to check.</param>\n        /// <returns>ON_BOUNDED_SIDE if point inside mesh, \n        /// ON_UNBOUNDED_SIDE if point not inside, \n        /// ON_BOUNDARY if point is on the surface.</returns>\n        public BOUNDED_SIDE BoundedSide(Point3d point);\n\n        /// <summary>\n        /// Does the mesh contain the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n        /// <returns>True if the poly contains the point</returns>\n        bool ContainsPoint(Point3d point, bool includeBoundary = true);\n\n        /// <summary>\n        /// Locate the face the rays hits.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <returns>The hit result.</returns>\n        MeshHitResult LocateFace(Ray3d ray);\n\n        /// <summary>\n        /// Find the face closest to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The hit result.</returns>\n        MeshHitResult ClosestFace(Point3d point);\n\n        /// <summary>\n        /// Locate the face hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"face\">The hit face.</param>\n        /// <returns>True if the ray hit a face.</returns>\n        bool LocateFace(Ray3d ray, out MeshFace3 face);\n\n        /// <summary>\n        /// Locate the vertex hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n        /// <param name=\"vertex\">The hit vertex.</param>\n        /// <returns>True if the ray hit a vertex.</returns>\n        bool LocateVertex(Ray3d ray, double radius, out MeshVertex3 vertex);\n\n        /// <summary>\n        /// Locate the edge hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the edge has to be within hit point.</param>\n        /// <param name=\"edge\">The hit edge.</param>\n        /// <returns>True if the ray hit a edge.</returns>\n        bool LocateHalfedge(Ray3d ray, double radius, out MeshHalfedge3 edge);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/MeshFace3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public struct MeshFace3 : IEquatable<MeshFace3>\n    {\n        /// <summary>\n        /// The faces index\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// THe faces edge\n        /// </summary>\n        public int Halfedge;\n\n        /// <summary>\n        /// A face where all compents are null index.\n        /// </summary>\n        public static MeshFace3 NullFace\n        {\n            get\n            {\n                var face = new MeshFace3();\n                face.Index = CGALGlobal.NULL_INDEX;\n                face.Halfedge = CGALGlobal.NULL_INDEX;\n                return face;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshFace3: Index={0}, Halfedge={1}]\",\n                Index, Halfedge);\n        }\n\n        /// <summary>\n        /// Are these faces equal.\n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static bool operator ==(MeshFace3 v1, MeshFace3 v2)\n        {\n            return v1.Index == v2.Index && v1.Halfedge == v2.Halfedge;\n        }\n\n        /// <summary>\n        /// Are these faces not equal.\n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static bool operator !=(MeshFace3 v1, MeshFace3 v2)\n        {\n            return v1.Index != v2.Index || v1.Halfedge != v2.Halfedge;\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is MeshFace3)) return false;\n            MeshFace3 v = (MeshFace3)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these faces equal.\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public bool Equals(MeshFace3 v)\n        {\n            return this == v;\n        }\n\n        /// <summary>\n        /// The faces hash code.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Halfedge.GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Enmerate all edges in this edge loop.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh the edges belong too.</param>\n        /// <returns>The next edge</returns>\n        public IEnumerable<MeshHalfedge3> EnumerateHalfedges(IMesh mesh)\n        {\n            if (Halfedge != CGALGlobal.NULL_INDEX)\n            {\n                MeshHalfedge3 edge;\n                mesh.GetHalfedge(Halfedge, out edge);\n\n                foreach (var e in edge.EnumerateHalfedges(mesh))\n                    yield return e;\n            }\n            else\n            {\n                yield break;\n            }\n        }\n\n        /// <summary>\n        /// Enmerate all vertices in this edge loop.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh the edges belong too.</param>\n        /// <returns>The next vertex</returns>\n        public IEnumerable<MeshVertex3> EnumerateVertices(IMesh mesh)\n        {\n            if (Halfedge != CGALGlobal.NULL_INDEX)\n            {\n                MeshHalfedge3 edge;\n                mesh.GetHalfedge(Halfedge, out edge);\n\n                foreach (var e in edge.EnumerateVertices(mesh))\n                    yield return e;\n            }\n            else\n            {\n                yield break;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/MeshFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tpublic struct UVSphereParams\n    {\n\t\tpublic int meridians;\n\t\tpublic int parallels;\n\t\tpublic double radius;\n\n\t\tpublic static UVSphereParams Default\n        {\n\t\t\tget\n            {\n\t\t\t\tvar param = new UVSphereParams();\n\t\t\t\tparam.parallels = 16;\n\t\t\t\tparam.meridians = 16;\n\t\t\t\tparam.radius = 0.5;\n\t\t\t\treturn param;\n            }\n        }\n\t}\n\n\tpublic struct NormalizedCubeParams\n\t{\n\n\t\tpublic int divisions;\n\t\tpublic double radius;\n\n\t\tpublic static NormalizedCubeParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new NormalizedCubeParams();\n\t\t\t\tparam.divisions = 8;\n\t\t\t\tparam.radius = 0.5;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic struct PlaneParams\n\t{\n\t\tpublic double width;\n\t\tpublic double height;\n\t\tpublic int divisionsX;\n\t\tpublic int divisionsZ;\n\n\t\tpublic static PlaneParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new PlaneParams();\n\t\t\t\tparam.width = 1;\n\t\t\t\tparam.height = 1;\n\t\t\t\tparam.divisionsX = 4;\n\t\t\t\tparam.divisionsZ = 4;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic struct TorusParams\n\t{\n\t\tpublic int radialDivisions;\n\t\tpublic int tubularDivisions;\n\t\tpublic double radius;\n\t\tpublic double tube;\n\t\tpublic double arc;\n\n\t\tpublic static TorusParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new TorusParams();\n\t\t\t\tparam.radialDivisions = 16;\n\t\t\t\tparam.tubularDivisions = 16;\n\t\t\t\tparam.radius = 0.5;\n\t\t\t\tparam.tube = 0.2;\n\t\t\t\tparam.arc = Math.PI * 2;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic struct CylinderParams\n\t{\n\t\tpublic double radiusTop;\n\t\tpublic double radiusBottom;\n\t\tpublic double height;\n\t\tpublic int radialDivisions;\n\t\tpublic int heightDivisions;\n\n\t\tpublic static CylinderParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new CylinderParams();\n\t\t\t\tparam.radiusTop = 0.5;\n\t\t\t\tparam.radiusBottom = 0.5;\n\t\t\t\tparam.height = 1;\n\t\t\t\tparam.radialDivisions = 8;\n\t\t\t\tparam.heightDivisions = 4;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic struct ConeParams\n\t{\n\t\tpublic double radiusBottom;\n\t\tpublic double height;\n\t\tpublic int radialDivisions;\n\t\tpublic int heightDivisions;\n\n\t\tpublic static ConeParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new ConeParams();\n\t\t\t\tparam.radiusBottom = 0.5;\n\t\t\t\tparam.height = 1;\n\t\t\t\tparam.radialDivisions = 8;\n\t\t\t\tparam.heightDivisions = 4;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t\tinternal CylinderParams AsCylinderParam()\n\t\t{\n\t\t\tvar param = new CylinderParams();\n\t\t\tparam.radiusTop = 0;\n\t\t\tparam.radiusBottom = this.radiusBottom;\n\t\t\tparam.height = this.height;\n\t\t\tparam.radialDivisions = this.radialDivisions;\n\t\t\tparam.heightDivisions = this.heightDivisions;\n\t\t\treturn param;\n\n\t\t}\n\t}\n\n\tpublic struct CapsuleParams\n\t{\n\t\tpublic int meridians;\n\t\tpublic int parallels;\n\t\tpublic double height;\n\t\tpublic double capHeight;\n\t\tpublic double radius;\n\n\t\tpublic static CapsuleParams Default\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar param = new CapsuleParams();\n\t\t\t\tparam.parallels = 16;\n\t\t\t\tparam.meridians = 16;\n\t\t\t\tparam.radius = 0.25;\n\t\t\t\tparam.height = 0.5;\n\t\t\t\tparam.capHeight = 0.25;\n\t\t\t\treturn param;\n\t\t\t}\n\t\t}\n\t}\n\n\tinternal class IndexList\n\t{\n\t\tinternal List<Point3d> points;\n\t\tinternal List<int> triangles;\n\t\tinternal List<int> quads;\n\t\tinternal List<int> pentagons;\n\t\tinternal List<int> hexagons;\n\n\t\tinternal void Clear()\n        {\n\t\t\tif( points != null) points.Clear();\n\t\t\tif (triangles != null) triangles.Clear();\n\t\t\tif (quads != null) quads.Clear();\n\t\t\tif (pentagons != null) pentagons.Clear();\n\t\t\tif (hexagons != null) hexagons.Clear();\n\t\t}\n\n\t\tinternal PolygonalIndices ToIndices()\n        {\n\t\t\tvar indices = new PolygonalIndices();\n\t\t\tif (triangles != null)  indices.triangles = triangles.ToArray();\n\t\t\tif (quads != null) indices.quads = quads.ToArray();\n\t\t\tif (pentagons != null) indices.pentagons = pentagons.ToArray();\n\t\t\tif (hexagons != null) indices.hexagons = hexagons.ToArray();\n\n\t\t\treturn indices;\n\t\t}\n\n\t\tinternal static IndexList CreateTriangleIndexList()\n\t\t{\n\t\t\tvar list = new IndexList();\n\t\t\tlist.points = new List<Point3d>();\n\t\t\tlist.triangles = new List<int>();\n\t\t\treturn list;\n\t\t}\n\n\t\tinternal static IndexList CreatePolygonIndexList()\n\t\t{\n\t\t\tvar list = new IndexList();\n\t\t\tlist.points = new List<Point3d>();\n\t\t\tlist.triangles = new List<int>();\n\t\t\tlist.quads = new List<int>();\n\t\t\tlist.pentagons = new List<int>();\n\t\t\tlist.hexagons = new List<int>();\n\t\t\treturn list;\n\t\t}\n\n\t}\n\n\t/// <summary>\n\t/// https://github.com/caosdoar/spheres/blob/master/src/spheres.cpp\n\t/// https://github.com/mrdoob/three.js/tree/dev/src/geometries\n\t/// </summary>\n\tinternal static class MeshFactory\n    {\n\n\t\tprivate const double WELD_EPS = 1e-4;\n\n\t\tprivate static Point3d[] Origins =\n\t\t{\n\t\tnew Point3d(-1.0, -1.0, -1.0),\n\t\tnew Point3d(1.0, -1.0, -1.0),\n\t\tnew Point3d(1.0, -1.0, 1.0),\n\t\tnew Point3d(-1.0, -1.0, 1.0),\n\t\tnew Point3d(-1.0, 1.0, -1.0),\n\t\tnew Point3d(-1.0, -1.0, 1.0)\n\t\t};\n\n\t\tprivate static Point3d[] Rights =\n\t\t{\n\t\tnew Point3d(2.0, 0.0, 0.0),\n\t\tnew Point3d(0.0, 0.0, 2.0),\n\t\tnew Point3d(-2.0, 0.0, 0.0),\n\t\tnew Point3d(0.0, 0.0, -2.0),\n\t\tnew Point3d(2.0, 0.0, 0.0),\n\t\tnew Point3d(2.0, 0.0, 0.0)\n\t\t};\n\n\t\tprivate static Point3d[] Ups =\n\t\t{\n\t\tnew Point3d(0.0, 2.0, 0.0),\n\t\tnew Point3d(0.0, 2.0, 0.0),\n\t\tnew Point3d(0.0, 2.0, 0.0),\n\t\tnew Point3d(0.0, 2.0, 0.0),\n\t\tnew Point3d(0.0, 0.0, 2.0),\n\t\tnew Point3d(0.0, 0.0, -2.0)\n\t\t};\n\n\t\tprivate static void AddTriangle(this List<int> list, int item1, int item2, int item3)\n        {\n            list.Add(item1);\n            list.Add(item2);\n            list.Add(item3);\n        }\n\n\t\tprivate static void AddTriangleAlt(this List<int> list, int item1, int item2, int item3)\n\t\t{\n\t\t\tlist.Add(item3);\n\t\t\tlist.Add(item2);\n\t\t\tlist.Add(item1);\n\t\t}\n\n\t\tprivate static void AddQuad(this List<int> list, int item1, int item2, int item3, int item4)\n\t\t{\n\t\t\tlist.Add(item1);\n\t\t\tlist.Add(item2);\n\t\t\tlist.Add(item3);\n\t\t\tlist.Add(item4);\n\t\t}\n\n\t\tprivate static void AddPentagon(this List<int> list, int item1, int item2, int item3, int item4, int item5)\n\t\t{\n\t\t\tlist.Add(item1);\n\t\t\tlist.Add(item2);\n\t\t\tlist.Add(item3);\n\t\t\tlist.Add(item4);\n\t\t\tlist.Add(item5);\n\t\t}\n\n\t\tprivate static void AddHexagon(this List<int> list, int item1, int item2, int item3, int item4, int item5, int item6)\n\t\t{\n\t\t\tlist.Add(item1);\n\t\t\tlist.Add(item2);\n\t\t\tlist.Add(item3);\n\t\t\tlist.Add(item4);\n\t\t\tlist.Add(item5);\n\t\t\tlist.Add(item6);\n\t\t}\n\n\t\tinternal static void CreateCube(IndexList list, double scale = 1)\n        {\n            list.points.Add(new Point3d(-0.5, -0.5, -0.5) * scale); //0\n            list.points.Add(new Point3d(0.5, -0.5, -0.5) * scale);  //1\n\t\t\tlist.points.Add(new Point3d(0.5, 0.5, -0.5) * scale);   //2\n\t\t\tlist.points.Add(new Point3d(-0.5, 0.5, -0.5) * scale);  //3\n\t\t\tlist.points.Add(new Point3d(-0.5, 0.5, 0.5) * scale);   //4\n\t\t\tlist.points.Add(new Point3d(0.5, 0.5, 0.5) * scale);    //5\n\t\t\tlist.points.Add(new Point3d(0.5, -0.5, 0.5) * scale);   //6\n\t\t\tlist.points.Add(new Point3d(-0.5, -0.5, 0.5) * scale);  //7\n\n\t\t\tif (list.quads != null)\n\t\t\t{\n\t\t\t\tlist.quads.AddQuad(3, 2, 1, 0);  //face front\n\t\t\t\tlist.quads.AddQuad(2, 3, 4, 5);\t//face top\n\t\t\t\tlist.quads.AddQuad(1, 2, 5, 6);\t//face right\n\t\t\t\tlist.quads.AddQuad(0, 7, 4, 3);\t//face left\n\t\t\t\tlist.quads.AddQuad(5, 4, 7, 6);  //face back\n\t\t\t\tlist.quads.AddQuad(1, 6, 7, 0);  //face bottom\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlist.triangles.AddTriangle(0, 3, 1); //face front\n\t\t\t\tlist.triangles.AddTriangle(1, 3, 2);\n\t\t\t\tlist.triangles.AddTriangle(2, 3, 4); //face top\n\t\t\t\tlist.triangles.AddTriangle(2, 4, 5);\n\t\t\t\tlist.triangles.AddTriangle(1, 2, 6); //face right\n\t\t\t\tlist.triangles.AddTriangle(2, 5, 6);\n\t\t\t\tlist.triangles.AddTriangle(0, 7, 4); //face left\n\t\t\t\tlist.triangles.AddTriangle(0, 4, 3);\n\t\t\t\tlist.triangles.AddTriangle(5, 4, 7); //face back\n\t\t\t\tlist.triangles.AddTriangle(5, 7, 6);\n\t\t\t\tlist.triangles.AddTriangle(0, 6, 7); //face bottom\n\t\t\t\tlist.triangles.AddTriangle(0, 1, 6);\n\t\t\t}\n        }\n\n\t\tinternal static void CreateCube(IndexList list, Box3d box)\n\t\t{\n\t\t\tPoint3d[] corners = new Point3d[8];\n\t\t\tbox.GetCorners(corners);\n\n\t\t\tlist.points.Add(corners[0]); //0\n\t\t\tlist.points.Add(corners[1]); //1\n\t\t\tlist.points.Add(corners[5]); //2\n\t\t\tlist.points.Add(corners[4]); //3\n\t\t\tlist.points.Add(corners[7]); //4\n\t\t\tlist.points.Add(corners[6]); //5\n\t\t\tlist.points.Add(corners[2]); //6\n\t\t\tlist.points.Add(corners[3]); //7\n\n\t\t\tif (list.quads != null)\n\t\t\t{\n\t\t\t\tlist.quads.AddQuad(3, 2, 1, 0);  //face front\n\t\t\t\tlist.quads.AddQuad(2, 3, 4, 5);  //face top\n\t\t\t\tlist.quads.AddQuad(1, 2, 5, 6);  //face right\n\t\t\t\tlist.quads.AddQuad(0, 7, 4, 3);  //face left\n\t\t\t\tlist.quads.AddQuad(5, 4, 7, 6);  //face back\n\t\t\t\tlist.quads.AddQuad(1, 6, 7, 0);  //face bottom\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlist.triangles.AddTriangle(0, 2, 1); //face front\n\t\t\t\tlist.triangles.AddTriangle(0, 3, 2);\n\t\t\t\tlist.triangles.AddTriangle(2, 3, 4); //face top\n\t\t\t\tlist.triangles.AddTriangle(2, 4, 5);\n\t\t\t\tlist.triangles.AddTriangle(1, 2, 5); //face right\n\t\t\t\tlist.triangles.AddTriangle(1, 5, 6);\n\t\t\t\tlist.triangles.AddTriangle(0, 7, 4); //face left\n\t\t\t\tlist.triangles.AddTriangle(0, 4, 3);\n\t\t\t\tlist.triangles.AddTriangle(5, 4, 7); //face back\n\t\t\t\tlist.triangles.AddTriangle(5, 7, 6);\n\t\t\t\tlist.triangles.AddTriangle(0, 6, 7); //face bottom\n\t\t\t\tlist.triangles.AddTriangle(0, 1, 6);\n\t\t\t}\n\t\t}\n\n\t\tinternal static void CreatePlane(IndexList list, PlaneParams param)\n\t\t{\n\t\t\tdouble width_half = param.width / 2;\n\t\t\tdouble height_half = param.height / 2;\n\n\t\t\tint gridX = param.divisionsX;\n\t\t\tint gridY = param.divisionsZ;\n\n\t\t\tint gridX1 = gridX + 1;\n\t\t\tint gridY1 = gridY + 1;\n\n\t\t\tdouble segment_width = param.width / gridX;\n\t\t\tdouble segment_height = param.height / gridY;\n\n\t\t\tfor (int iy = 0; iy < gridY1; iy++)\n\t\t\t{\n\t\t\t\tdouble y = iy * segment_height - height_half;\n\n\t\t\t\tfor (int ix = 0; ix < gridX1; ix++)\n\t\t\t\t{\n\t\t\t\t\tdouble x = ix * segment_width - width_half;\n\t\t\t\t\tlist.points.Add(new Point3d(x, 0, -y));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int iy = 0; iy < gridY; iy++)\n\t\t\t{\n\t\t\t\tfor (int ix = 0; ix < gridX; ix++)\n\t\t\t\t{\n\n\t\t\t\t\tint a = ix + gridX1 * iy;\n\t\t\t\t\tint b = ix + gridX1 * (iy + 1);\n\t\t\t\t\tint c = (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\t\tint d = (ix + 1) + gridX1 * iy;\n\n\t\t\t\t\tif(list.quads != null)\n                    {\n\t\t\t\t\t\tlist.quads.AddQuad(d, c, b, a);\n\t\t\t\t\t}\n\t\t\t\t\telse\n                    {\n\t\t\t\t\t\tlist.triangles.AddTriangle(d, b, a);\n\t\t\t\t\t\tlist.triangles.AddTriangle(d, c, b);\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tinternal static void CreateUVSphere(IndexList list, UVSphereParams param)\n\t\t{\n\t\t\tdouble radius = param.radius;\n\n\t\t\tlist.points.Add(new Point3d(0.0, 1.0, 0.0) * radius);\n\n\t\t\tfor (int j = 0; j < param.parallels - 1; ++j)\n\t\t\t{\n\t\t\t\tdouble polar = Math.PI * (j + 1) / (double)param.parallels;\n\t\t\t\tdouble sp = Math.Sin(polar);\n\t\t\t\tdouble cp = Math.Cos(polar);\n\n\t\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t\t{\n\t\t\t\t\tdouble azimuth = 2.0 * Math.PI * i / (double)param.meridians;\n\t\t\t\t\tdouble sa = Math.Sin(azimuth);\n\t\t\t\t\tdouble ca = Math.Cos(azimuth);\n\t\t\t\t\tdouble x = sp * ca;\n\t\t\t\t\tdouble y = cp;\n\t\t\t\t\tdouble z = sp * sa;\n\n\t\t\t\t\tlist.points.Add(new Point3d(x, y, z) * radius);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlist.points.Add(new Point3d(0.0, -1.0, 0.0) * radius);\n\n\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t{\n\t\t\t\tint a = i + 1;\n\t\t\t\tint b = (i + 1) % param.meridians + 1;\n\n\t\t\t\tlist.triangles.AddTriangle(0, b, a);\n\t\t\t}\n\n\t\t\tfor (int j = 0; j < param.parallels - 2; ++j)\n\t\t\t{\n\t\t\t\tint aStart = j * param.meridians + 1;\n\t\t\t\tint bStart = (j + 1) * param.meridians + 1;\n\n\t\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t\t{\n\t\t\t\t\tint a = aStart + i;\n\t\t\t\t\tint a1 = aStart + (i + 1) % param.meridians;\n\t\t\t\t\tint b = bStart + i;\n\t\t\t\t\tint b1 = bStart + (i + 1) % param.meridians;\n\n\t\t\t\t\tif(list.quads != null)\n                    {\n\t\t\t\t\t\tlist.quads.AddQuad(a, a1, b1, b);\n                    }\n\t\t\t\t\telse\n                    {\n\t\t\t\t\t\tlist.triangles.AddTriangle(a, a1, b1);\n\t\t\t\t\t\tlist.triangles.AddTriangle(a, b1, b);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t{\n\t\t\t\tint a = i + param.meridians * (param.parallels - 2) + 1;\n\t\t\t\tint b = (i + 1) % param.meridians + param.meridians * (param.parallels - 2) + 1;\n\n\t\t\t\tlist.triangles.AddTriangle(list.points.Count - 1, a, b);\n\t\t\t}\n\t\t}\n\n\t\tinternal static void CreateNormalizedCube(IndexList list, NormalizedCubeParams param)\n\t\t{\n\t\t\tdouble radius = param.radius;\n\n\t\t\tdouble step = 1.0 / param.divisions;\n\t\t\tPoint3d step3 = new Point3d(step, step, step);\n\n\t\t\tfor (int face = 0; face < 6; ++face)\n\t\t\t{\n\t\t\t\tPoint3d origin = Origins[face];\n\t\t\t\tPoint3d right = Rights[face];\n\t\t\t\tPoint3d up = Ups[face];\n\n\t\t\t\tfor (int j = 0; j < param.divisions + 1; ++j)\n\t\t\t\t{\n\t\t\t\t\tPoint3d j3 = new Point3d(j, j, j);\n\n\t\t\t\t\tfor (int i = 0; i < param.divisions + 1; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tPoint3d i3 = new Point3d(i, i, i);\n\t\t\t\t\t\tPoint3d p = origin + step3 * (i3 * right + j3 * up);\n\t\t\t\t\t\tVector3d v = (Vector3d)p;\n\n\t\t\t\t\t\tlist.points.Add(v.Normalized * radius);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tint k = param.divisions + 1;\n\n\t\t\tfor (int face = 0; face < 6; ++face)\n\t\t\t{\n\t\t\t\tfor (int j = 0; j < param.divisions; ++j)\n\t\t\t\t{\n\t\t\t\t\tbool bottom = j < (param.divisions / 2);\n\n\t\t\t\t\tfor (int i = 0; i < param.divisions; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tbool left = i < (param.divisions / 2);\n\n\t\t\t\t\t\tint a = (face * k + j) * k + i;\n\t\t\t\t\t\tint b = (face * k + j) * k + i + 1;\n\t\t\t\t\t\tint c = (face * k + j + 1) * k + i;\n\t\t\t\t\t\tint d = (face * k + j + 1) * k + i + 1;\n\n\t\t\t\t\t\tif (list.quads != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlist.quads.AddQuad(a, c, d, b);\n\t\t\t\t\t\t}\n                        else\n                        {\n\t\t\t\t\t\t\tlist.triangles.AddTriangle(a, c, d);\n\t\t\t\t\t\t\tlist.triangles.AddTriangle(a, d, b);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//WeldVertices(list);\n\t\t}\n\n\t\tinternal static void CreateTetrahedron(IndexList list, double scale = 1)\n        {\n\t\t\tscale *= 0.5;\n\n\t\t\t// choose coordinates on the unit sphere\n\t\t\tdouble a = 1.0 / 3.0;\n\t\t\tdouble b = Math.Sqrt(8.0 / 9.0);\n\t\t\tdouble c = Math.Sqrt(2.0 / 9.0);\n\t\t\tdouble d = Math.Sqrt(2.0 / 3.0);\n\n\t\t\tlist.points.Add(new Point3d(0, 1, 0) * scale);\n\t\t\tlist.points.Add(new Point3d(-c, -a, d) * scale);\n\t\t\tlist.points.Add(new Point3d(-c, -a, -d) * scale);\n\t\t\tlist.points.Add(new Point3d(b, -a, 0) * scale);\n\n\t\t\tlist.triangles.AddTriangle(0, 2, 1);\n\t\t\tlist.triangles.AddTriangle(0, 3, 2);\n\t\t\tlist.triangles.AddTriangle(0, 1, 3);\n\t\t\tlist.triangles.AddTriangle(3, 1, 2);\n\t\t}\n\n\t\tinternal static void CreateOctahedron(IndexList list, double scale = 1)\n        {\n\t\t\tscale *= 0.5;\n\n\t\t\tlist.points.Add(new Point3d(1, 0, 0) * scale);\n\t\t\tlist.points.Add(new Point3d(-1, 0, 0) * scale);\n\t\t\tlist.points.Add(new Point3d(0, 1, 0) * scale);\n\t\t\tlist.points.Add(new Point3d(0, -1, 0) * scale);\n\t\t\tlist.points.Add(new Point3d(0, 0, 1) * scale);\n\t\t\tlist.points.Add(new Point3d(0, 0, -1) * scale);\n\n\t\t\tlist.triangles.AddTriangle(0, 2, 4);\n\t\t\tlist.triangles.AddTriangle(0, 4, 3);\n\t\t\tlist.triangles.AddTriangle(0, 3, 5);\n\t\t\tlist.triangles.AddTriangle(0, 5, 2);\n\t\t\tlist.triangles.AddTriangle(1, 2, 5);\n\t\t\tlist.triangles.AddTriangle(1, 5, 3);\n\t\t\tlist.triangles.AddTriangle(1, 3, 4);\n\t\t\tlist.triangles.AddTriangle(1, 4, 2);\n\t\t}\n\n\t\tinternal static void CreateIcosahedron(IndexList list, double scale = 1)\n\t\t{\n\t\t\tscale *= 0.5;\n\t\t\tdouble t = (1.0 + Math.Sqrt(5.0)) / 2.0;\n\n\t\t\t// Vertices\n\t\t\tlist.points.Add(new Vector3d(-1.0, t, 0.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(1.0, t, 0.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(-1.0, -t, 0.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(1.0, -t, 0.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(0.0, -1.0, t).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(0.0, 1.0, t).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(0.0, -1.0, -t).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(0.0, 1.0, -t).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(t, 0.0, -1.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(t, 0.0, 1.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(-t, 0.0, -1.0).Normalized * scale);\n\t\t\tlist.points.Add(new Vector3d(-t, 0.0, 1.0).Normalized * scale);\n\n\t\t\t// Faces\n\t\t\tlist.triangles.AddTriangle(0, 11, 5);\n\t\t\tlist.triangles.AddTriangle(0, 5, 1);\n\t\t\tlist.triangles.AddTriangle(0, 1, 7);\n\t\t\tlist.triangles.AddTriangle(0, 7, 10);\n\t\t\tlist.triangles.AddTriangle(0, 10, 11);\n\t\t\tlist.triangles.AddTriangle(1, 5, 9);\n\t\t\tlist.triangles.AddTriangle(5, 11, 4);\n\t\t\tlist.triangles.AddTriangle(11, 10, 2);\n\t\t\tlist.triangles.AddTriangle(10, 7, 6);\n\t\t\tlist.triangles.AddTriangle(7, 1, 8);\n\t\t\tlist.triangles.AddTriangle(3, 9, 4);\n\t\t\tlist.triangles.AddTriangle(3, 4, 2);\n\t\t\tlist.triangles.AddTriangle(3, 2, 6);\n\t\t\tlist.triangles.AddTriangle(3, 6, 8);\n\t\t\tlist.triangles.AddTriangle(3, 8, 9);\n\t\t\tlist.triangles.AddTriangle(4, 9, 5);\n\t\t\tlist.triangles.AddTriangle(2, 4, 11);\n\t\t\tlist.triangles.AddTriangle(6, 2, 10);\n\t\t\tlist.triangles.AddTriangle(8, 6, 7);\n\t\t\tlist.triangles.AddTriangle(9, 8, 1);\n\t\t}\n\n\t\tinternal static void CreateDodecahedron(IndexList list, double scale = 1)\n        {\n\t\t\tscale *= 0.5;\n\t\t\tdouble t = (1 + Math.Sqrt(5)) / 2;\n\t\t\tdouble r = 1 / t;\n\n\t\t\tlist.points.Add(new Vector3d(-1, -1, -1).Normalized * scale);//0\n\t\t\tlist.points.Add(new Vector3d(-1, -1, 1).Normalized * scale); //1\n\t\t\tlist.points.Add(new Vector3d(-1, 1, -1).Normalized * scale); //2\n\t\t\tlist.points.Add(new Vector3d(-1, 1, 1).Normalized * scale);  //3\n\t\t\tlist.points.Add(new Vector3d(1, -1, -1).Normalized * scale); //4\n\t\t\tlist.points.Add(new Vector3d(1, -1, 1).Normalized * scale);  //5\n\t\t\tlist.points.Add(new Vector3d(1, 1, -1).Normalized * scale);  //6\n\t\t\tlist.points.Add(new Vector3d(1, 1, 1).Normalized * scale);   //7 \n\t\t\tlist.points.Add(new Vector3d(0, -r, -t).Normalized * scale); //8\n\t\t\tlist.points.Add(new Vector3d(0, -r, t).Normalized * scale);  //9 \n\t\t\tlist.points.Add(new Vector3d(0, r, -t).Normalized * scale);  //10\n\t\t\tlist.points.Add(new Vector3d(0, r, t).Normalized * scale );   //11\n\t\t\tlist.points.Add(new Vector3d(-r, -t, 0).Normalized * scale); //12\n\t\t\tlist.points.Add(new Vector3d(-r, t, 0).Normalized * scale );  //13\n\t\t\tlist.points.Add(new Vector3d(r, -t, 0).Normalized * scale);  //14\n\t\t\tlist.points.Add(new Vector3d(r, t, 0).Normalized * scale);   //15\n\t\t\tlist.points.Add(new Vector3d(-t, 0, -r).Normalized * scale); //16\n\t\t\tlist.points.Add(new Vector3d(t, 0, -r).Normalized * scale);  //17\n\t\t\tlist.points.Add(new Vector3d(-t, 0, r).Normalized * scale);  //18\n\t\t\tlist.points.Add(new Vector3d(t, 0, r).Normalized * scale);   //19\n\n\t\t\tif (list.pentagons != null)\n\t\t\t{\n\t\t\t\tlist.pentagons.AddPentagon(3, 11, 7, 15, 13);\n\t\t\t\tlist.pentagons.AddPentagon(15, 7, 19, 17, 6);\n\t\t\t\tlist.pentagons.AddPentagon(10, 6, 17, 4, 8);\n\t\t\t\tlist.pentagons.AddPentagon(2, 10, 8, 0, 16);\n\t\t\t\tlist.pentagons.AddPentagon(16, 0, 12, 1, 18);\n\t\t\t\tlist.pentagons.AddPentagon(6, 10, 2, 13, 15);\n\t\t\t\tlist.pentagons.AddPentagon(2, 16, 18, 3, 13);\n\t\t\t\tlist.pentagons.AddPentagon(11, 3, 18, 1, 9);\n\t\t\t\tlist.pentagons.AddPentagon(8, 4, 14, 12, 0);\n\t\t\t\tlist.pentagons.AddPentagon(11, 9, 5, 19, 7);\n\t\t\t\tlist.pentagons.AddPentagon(19, 5, 14, 4, 17);\n\t\t\t\tlist.pentagons.AddPentagon(9, 1, 12, 14, 5);\n\t\t\t}\n\t\t\telse\n\t\t\t{ \n\t\t\t\tlist.triangles.AddTriangle(3, 11, 7);\n\t\t\t\tlist.triangles.AddTriangle(3, 7, 15);\n\t\t\t\tlist.triangles.AddTriangle(3, 15, 13);\n\t\t\t\tlist.triangles.AddTriangle(7, 19, 17);\n\t\t\t\tlist.triangles.AddTriangle(7, 17, 6);\n\t\t\t\tlist.triangles.AddTriangle(7, 6, 15);\n\t\t\t\tlist.triangles.AddTriangle(17, 4, 8);\n\t\t\t\tlist.triangles.AddTriangle(17, 8, 10);\n\t\t\t\tlist.triangles.AddTriangle(17, 10, 6);\n\t\t\t\tlist.triangles.AddTriangle(8, 0, 16);\n\t\t\t\tlist.triangles.AddTriangle(8, 16, 2);\n\t\t\t\tlist.triangles.AddTriangle(8, 2, 10);\n\t\t\t\tlist.triangles.AddTriangle(0, 12, 1);\n\t\t\t\tlist.triangles.AddTriangle(0, 1, 18);\n\t\t\t\tlist.triangles.AddTriangle(0, 18, 16);\n\t\t\t\tlist.triangles.AddTriangle(6, 10, 2);\n\t\t\t\tlist.triangles.AddTriangle(6, 2, 13);\n\t\t\t\tlist.triangles.AddTriangle(6, 13, 15);\n\t\t\t\tlist.triangles.AddTriangle(2, 16, 18);\n\t\t\t\tlist.triangles.AddTriangle(2, 18, 3);\n\t\t\t\tlist.triangles.AddTriangle(2, 3, 13);\n\t\t\t\tlist.triangles.AddTriangle(18, 1, 9);\n\t\t\t\tlist.triangles.AddTriangle(18, 9, 11);\n\t\t\t\tlist.triangles.AddTriangle(18, 11, 3);\n\t\t\t\tlist.triangles.AddTriangle(4, 14, 12);\n\t\t\t\tlist.triangles.AddTriangle(4, 12, 0);\n\t\t\t\tlist.triangles.AddTriangle(4, 0, 8);\n\t\t\t\tlist.triangles.AddTriangle(11, 9, 5);\n\t\t\t\tlist.triangles.AddTriangle(11, 5, 19);\n\t\t\t\tlist.triangles.AddTriangle(11, 19, 7);\n\t\t\t\tlist.triangles.AddTriangle(19, 5, 14);\n\t\t\t\tlist.triangles.AddTriangle(19, 14, 4);\n\t\t\t\tlist.triangles.AddTriangle(19, 4, 17);\n\t\t\t\tlist.triangles.AddTriangle(1, 12, 14);\n\t\t\t\tlist.triangles.AddTriangle(1, 14, 5);\n\t\t\t\tlist.triangles.AddTriangle(1, 5, 9);\n\t\t\t}\n\n\t\t}\n\n\t\tinternal static void CreateTorus(IndexList list, TorusParams param)\n        {\n\n\t\t\tfor (int j = 0; j <= param.radialDivisions; j++)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i <= param.tubularDivisions; i++)\n\t\t\t\t{\n\t\t\t\t\tdouble u = i / (double)param.tubularDivisions * param.arc;\n\t\t\t\t\tdouble v = j / (double)param.radialDivisions * Math.PI * 2;\n\n\t\t\t\t\tvar vertex = new Point3d();\n\t\t\t\t\tvertex.x = (param.radius + param.tube * Math.Cos(v)) * Math.Cos(u);\n\t\t\t\t\tvertex.z = (param.radius + param.tube * Math.Cos(v)) * Math.Sin(u);\n\t\t\t\t\tvertex.y = param.tube * Math.Sin(v);\n\n\t\t\t\t\tlist.points.Add(vertex);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int j = 1; j <= param.radialDivisions; j++)\n\t\t\t{\n\t\t\t\tfor (int i = 1; i <= param.tubularDivisions; i++)\n\t\t\t\t{\n\t\t\t\t\tint a = (param.tubularDivisions + 1) * j + i - 1;\n\t\t\t\t\tint b = (param.tubularDivisions + 1) * (j - 1) + i - 1;\n\t\t\t\t\tint c = (param.tubularDivisions + 1) * (j - 1) + i;\n\t\t\t\t\tint d = (param.tubularDivisions + 1) * j + i;\n\n\t\t\t\t\tif(list.quads != null)\n                    {\n\t\t\t\t\t\tlist.quads.AddQuad(d, c, b, a);\n                    }\n\t\t\t\t\telse\n                    {\n\t\t\t\t\t\tlist.triangles.AddTriangle(d, b, a);\n\t\t\t\t\t\tlist.triangles.AddTriangle(d, c, b);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//WeldVertices(list);\n\t\t}\n\n\t\tinternal static void CreateCylinder(IndexList list, CylinderParams param)\n        {\n\n\t\t\tint index = 0;\n\t\t\tdouble thetaStart = 0;\n\t\t\tdouble thetaLength = Math.PI * 2;\n\n\t\t\tvar indexArray = new List<List<int>>();\n\t\t\tdouble halfHeight = param.height / 2;\n\n\t\t\tfor (int y = 0; y <= param.heightDivisions; y++)\n\t\t\t{\n\t\t\t\tvar indexRow = new List<int>();\n\n\t\t\t\tdouble v = y / (double)param.heightDivisions;\n\n\t\t\t\tdouble radius = v * (param.radiusBottom - param.radiusTop) + param.radiusTop;\n\n\t\t\t\tfor (int x = 0; x <= param.radialDivisions; x++)\n\t\t\t\t{\n\t\t\t\t\tdouble u = x / (double)param.radialDivisions;\n\n\t\t\t\t\tdouble theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tdouble sinTheta = Math.Sin(theta);\n\t\t\t\t\tdouble cosTheta = Math.Cos(theta);\n\n\t\t\t\t\tvar vertex = new Point3d();\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = -v * param.height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tlist.points.Add(vertex);\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.Add(index++);\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.Add(indexRow);\n\t\t\t}\n\n\t\t\tfor (int x = 0; x < param.radialDivisions; x++)\n\t\t\t{\n\n\t\t\t\tfor (int y = 0; y < param.heightDivisions; y++)\n\t\t\t\t{\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tint a = indexArray[y][x];\n\t\t\t\t\tint b = indexArray[y + 1][x];\n\t\t\t\t\tint c = indexArray[y + 1][x + 1];\n\t\t\t\t\tint d = indexArray[y][x + 1];\n\n\t\t\t\t\tif(list.quads != null)\n                    {\n\t\t\t\t\t\tlist.quads.AddQuad(a, b, c, d);\n                    }\n\t\t\t\t\telse\n                    {\n\t\t\t\t\t\tlist.triangles.AddTriangle(a, b, d);\n\t\t\t\t\t\tlist.triangles.AddTriangle(b, c, d);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (param.radiusTop > 0)\n\t\t\t\tGenerateCap(list, param, true, ref index);\n\n\t\t\tif (param.radiusBottom > 0)\n\t\t\t\tGenerateCap(list, param, false, ref index);\n\n\t\t\t//WeldVertices(list);\n\t\t}\n\n\t\tprivate static void GenerateCap(IndexList list, CylinderParams param, bool top, ref int index )\n\t\t{\n\t\t\tdouble thetaStart = 0;\n\t\t\tdouble thetaLength = Math.PI * 2;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tint centerIndexStart = index;\n\t\t\tdouble halfHeight = param.height / 2.0;\n\t\t\tdouble radius = top ? param.radiusTop : param.radiusBottom;\n\t\t\tdouble sign = top ? 1 : -1;\n\n\t\t\tfor (int x = 1; x <= param.radialDivisions; x++)\n\t\t\t{\n\t\t\t\tlist.points.Add(new Point3d(0, halfHeight * sign, 0));\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tint centerIndexEnd = index;\n\n\t\t\tfor (int x = 0; x <= param.radialDivisions; x++)\n\t\t\t{\n\t\t\t\tdouble u = x / (double)param.radialDivisions;\n\t\t\t\tdouble theta = u * thetaLength + thetaStart;\n\n\t\t\t\tdouble cosTheta = Math.Cos(theta);\n\t\t\t\tdouble sinTheta = Math.Sin(theta);\n\n\t\t\t\tvar vertex = new Point3d();\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tlist.points.Add(vertex);\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tfor (int x = 0; x < param.radialDivisions; x++)\n\t\t\t{\n\t\t\t\tint c = centerIndexStart + x;\n\t\t\t\tint i = centerIndexEnd + x;\n\n\t\t\t\tif (top)\n\t\t\t\t\tlist.triangles.AddTriangle(i, i + 1, c);\n\t\t\t\telse\n\t\t\t\t\tlist.triangles.AddTriangle(i + 1, i, c);\n\t\t\t}\n\n\t\t}\n\n\t\tinternal static void CreateCapsule(IndexList list, CapsuleParams param)\n\t\t{\n\t\t\tdouble radius = param.radius;\n\t\t\tint halfParallels = param.parallels / 2;\n\t\t\tdouble hafHeight = param.height * 0.5;\n\t\t\tdouble capHeight = param.capHeight;\n\n\t\t\tlist.points.Add(new Point3d(0.0, (capHeight + hafHeight), 0.0));\n\n\t\t\tfor (int j = 0; j < halfParallels - 1; ++j)\n\t\t\t{\n\t\t\t\tdouble polar = Math.PI * j / (double)param.parallels;\n\t\t\t\tdouble sp = Math.Sin(polar);\n\t\t\t\tdouble cp = Math.Cos(polar);\n\n\t\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t\t{\n\t\t\t\t\tdouble azimuth = 2.0 * Math.PI * i / (double)param.meridians;\n\t\t\t\t\tdouble sa = Math.Sin(azimuth);\n\t\t\t\t\tdouble ca = Math.Cos(azimuth);\n\t\t\t\t\tdouble x = sp * ca * radius;\n\t\t\t\t\tdouble y = (cp * capHeight) + hafHeight;\n\t\t\t\t\tdouble z = sp * sa * radius;\n\n\t\t\t\t\tlist.points.Add(new Point3d(x, y, z));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int j = halfParallels - 1; j < param.parallels - 1; ++j)\n\t\t\t{\n\t\t\t\tdouble polar = Math.PI * (j + 2) / (double)param.parallels;\n\t\t\t\tdouble sp = Math.Sin(polar);\n\t\t\t\tdouble cp = Math.Cos(polar);\n\n\t\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t\t{\n\t\t\t\t\tdouble azimuth = 2.0 * Math.PI * i / (double)param.meridians;\n\t\t\t\t\tdouble sa = Math.Sin(azimuth);\n\t\t\t\t\tdouble ca = Math.Cos(azimuth);\n\t\t\t\t\tdouble x = sp * ca * radius;\n\t\t\t\t\tdouble y = (cp * capHeight) - hafHeight;\n\t\t\t\t\tdouble z = sp * sa * radius;\n\n\t\t\t\t\tlist.points.Add(new Point3d(x, y, z));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlist.points.Add(new Point3d(0.0, -(capHeight + hafHeight), 0.0));\n\n\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t{\n\t\t\t\tint a = i + 1;\n\t\t\t\tint b = (i + 1) % param.meridians + 1;\n\t\t\t\tlist.triangles.AddTriangle(0, b, a);\n\t\t\t}\n\n\t\t\tfor (int j = 0; j < param.parallels - 2; ++j)\n\t\t\t{\n\t\t\t\tint aStart = j * param.meridians + 1;\n\t\t\t\tint bStart = (j + 1) * param.meridians + 1;\n\n\t\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t\t{\n\t\t\t\t\tint a = aStart + i;\n\t\t\t\t\tint a1 = aStart + (i + 1) % param.meridians;\n\t\t\t\t\tint b = bStart + i;\n\t\t\t\t\tint b1 = bStart + (i + 1) % param.meridians;\n\n\t\t\t\t\tif (list.quads != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tlist.quads.AddQuad(a, a1, b1, b);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tlist.triangles.AddTriangle(a, a1, b1);\n\t\t\t\t\t\tlist.triangles.AddTriangle(a, b1, b);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (int i = 0; i < param.meridians; ++i)\n\t\t\t{\n\t\t\t\tint a = i + param.meridians * (param.parallels - 2) + 1;\n\t\t\t\tint b = (i + 1) % param.meridians + param.meridians * (param.parallels - 2) + 1;\n\t\t\t\tlist.triangles.AddTriangle(list.points.Count - 1, a, b);\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\tprivate static void RemapIndices(List<Point3d> points, \n\t\t\tList<int> indices, \n\t\t\tDictionary<int, List<Point3d>> indexTable, \n\t\t\tDictionary<Point3d, int> pointTable)\n\t\t{\n\t\t\tif (indices == null) return;\n\n\t\t\tfor (int k = 0; k < indices.Count; k++)\n\t\t\t{\n\t\t\t\tint i = indices[k];\n\n\t\t\t\tif (indexTable.ContainsKey(i))\n\t\t\t\t{\n\t\t\t\t\tvar point = indexTable[i].First();\n\t\t\t\t\ti = pointTable[point];\n\t\t\t\t\tindices[k] = i;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar point = points[i];\n\n\t\t\t\t\tif (!pointTable.ContainsKey(point))\n\t\t\t\t\t\tpointTable.Add(point, i);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate static void RemapIndices(List<Point3d> points, List<int> indices, List<Point3d> newPoints)\n\t\t{\n\t\t\tif (indices == null) return;\n\n\t\t\tfor (int k = 0; k < indices.Count; k++)\n\t\t\t{\n\t\t\t\tint i = indices[k];\n\t\t\t\tvar point = points[i];\n\t\t\t\tindices[k] = newPoints.IndexOf(point);\n\t\t\t}\n\t\t}\n\n\n\t\t/// <summary>\n\t\t/// Welds duplicate vertices given some threshold.\n\t\t/// This is not optimized and will be slow for large point sets.\n\t\t/// </summary>\n\t\t/// <param name=\"list\"></param>\n\t\tprivate static void WeldVertices(IndexList list)\n\t\t{\n\n\t\t\tdouble sqthreshold = WELD_EPS * WELD_EPS;\n\n\t\t\t//Find the points that are to close and put them in a list together.\n\t\t\t//That set then goes in a dictionary with any one of the indices as the key.\n\t\t\tvar indexTable = new Dictionary<int, List<Point3d>>();\n\t\t\tfor (int i = 0; i < list.points.Count; i++)\n\t\t\t{\n\t\t\t\tfor (int j = 0; j < list.points.Count; j++)\n\t\t\t\t{\n\t\t\t\t\tif (i == j) continue;\n\n\t\t\t\t\tdouble sqdist = Point3d.SqrDistance(list.points[i], list.points[j]);\n\t\t\t\t\tif (sqdist <= sqthreshold)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(indexTable.ContainsKey(i))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindexTable[i].Add(list.points[i]);\n\t\t\t\t\t\t\tindexTable[i].Add(list.points[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (indexTable.ContainsKey(j))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tindexTable[j].Add(list.points[i]);\n\t\t\t\t\t\t\tindexTable[j].Add(list.points[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar set = new HashSet<Point3d>();\n\t\t\t\t\t\t\tset.Add(list.points[i]);\n\t\t\t\t\t\t\tset.Add(list.points[j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Take the first point in the index table\n\t\t\t//and make a point table where the point is\n\t\t\t//the key and any of the points indices is the value.\n\t\t\tvar pointTable = new Dictionary<Point3d, int>();\n\t\t\tforeach (var kvp in indexTable)\n\t\t\t{\n\t\t\t\tint index = kvp.Key;\n\t\t\t\tvar set = kvp.Value;\n\t\t\t\tpointTable.Add(set.First(), index);\n\t\t\t}\n\n\t\t\t//Remap the indies so the same index points to the same point.\n\t\t\tRemapIndices(list.points, list.triangles, indexTable, pointTable);\n\t\t\tRemapIndices(list.points, list.quads, indexTable, pointTable);\n\n\t\t\t//create a new point list containing only the points in used.\n\t\t\tvar newPoints = new List<Point3d>();\n\t\t\tforeach(var kvp in indexTable)\n\t\t\t\tnewPoints.Add(kvp.Value.First());\n\n\t\t\t//Remap the indices so point to the same point in the new point table\n\t\t\t//that has had all the duplicate points removed.\n\t\t\tRemapIndices(list.points, list.triangles, newPoints);\n\t\t\tRemapIndices(list.points, list.quads, newPoints);\n\n\t\t\t//copy back into point list.\n\t\t\tlist.points.Clear();\n\t\t\tlist.points.AddRange(newPoints);\n\n\t\t}\n\t\t*/\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/MeshHalfedge3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polyhedra\n{\n\n\tpublic struct MeshHalfedge3 : IEquatable<MeshHalfedge3>\n\t{\n\t\t/// <summary>\n\t\t/// Is the edge a border to a hole.\n\t\t/// </summary>\n\t\tpublic bool IsBorder;\n\n\t\t/// <summary>\n\t\t/// The edges index.\n\t\t/// </summary>\n\t\tpublic int Index;\n\n\t\t/// <summary>\n\t\t/// The edges  source vertices index.\n\t\t/// </summary>\n\t\tpublic int Source;\n\n\t\t/// <summary>\n\t\t/// The edges  target vertices index.\n\t\t/// </summary>\n\t\tpublic int Target;\n\n\t\t/// <summary>\n\t\t/// The edges opposite edge.\n\t\t/// </summary>\n\t\tpublic int Opposite;\n\n\t\t/// <summary>\n\t\t/// The edges next edge.\n\t\t/// </summary>\n\t\tpublic int Next;\n\n\t\t/// <summary>\n\t\t/// The edges previous edge.\n\t\t/// </summary>\n\t\tpublic int Previous;\n\n\t\t/// <summary>\n\t\t/// The edges face\n\t\t/// </summary>\n\t\tpublic int Face;\n\n\t\t/// <summary>\n\t\t/// A edge where everthing is set to null index.\n\t\t/// </summary>\n\t\tpublic static MeshHalfedge3 NullHalfedge\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tvar edge = new MeshHalfedge3();\n\t\t\t\tedge.Index = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Source = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Target = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Opposite = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Next = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Previous = CGALGlobal.NULL_INDEX;\n\t\t\t\tedge.Face = CGALGlobal.NULL_INDEX;\n\t\t\t\treturn edge;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Get the source point. \n\t\t/// </summary>\n\t\t/// <param name=\"mesh\">The mesh the point belongs to.</param>\n\t\t/// <returns>The  source point</returns>\n\t\t/// <exception cref=\"ArgumentException\">If point is null index.</exception>\n\t\tpublic Point3d SourcePoint(IMesh mesh)\n        {\n\t\t\tif (Source == CGALGlobal.NULL_INDEX)\n\t\t\t\tthrow new ArgumentException(\"Source is null\");\n\n\t\t\treturn mesh.GetPoint(Source);\n        }\n\n\t\t/// <summary>\n\t\t/// Get the target point. \n\t\t/// </summary>\n\t\t/// <param name=\"mesh\">The mesh the point belongs to.</param>\n\t\t/// <returns>The  target point</returns>\n\t\t/// <exception cref=\"ArgumentException\">If point is null index.</exception>\n\t\tpublic Point3d TargetPoint(IMesh mesh)\n\t\t{\n\t\t\tif (Target == CGALGlobal.NULL_INDEX)\n\t\t\t\tthrow new ArgumentException(\"Target is null\");\n\n\t\t\treturn mesh.GetPoint(Target);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn string.Format(\"[MeshHalfedge3: Index={0}, Source={1}, Target={2}, Opposite={3}, Next={4}, Previous={5}, Face={6}, IsBorder={7}]\",\n\t\t\t\tIndex, Source, Target, Opposite, Next, Previous, Face,  IsBorder);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these edges equal.\n\t\t/// </summary>\n\t\t/// <param name=\"v1\"></param>\n\t\t/// <param name=\"v2\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static bool operator ==(MeshHalfedge3 v1, MeshHalfedge3 v2)\n\t\t{\n\t\t\treturn v1.Index == v2.Index && v1.IsBorder == v2.IsBorder\n\t\t\t\t&& v1.Source == v2.Source && v1.Target == v2.Target\n\t\t\t\t&& v1.Opposite == v2.Opposite && v1.Next == v2.Next\n\t\t\t\t&& v1.Previous == v2.Previous && v1.Face == v2.Face;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these edges not equal.\n\t\t/// </summary>\n\t\t/// <param name=\"v1\"></param>\n\t\t/// <param name=\"v2\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static bool operator !=(MeshHalfedge3 v1, MeshHalfedge3 v2)\n\t\t{\n\t\t\treturn v1.Index != v2.Index || v1.IsBorder != v2.IsBorder\n\t\t\t\t|| v1.Source != v2.Source || v1.Target != v2.Target\n\t\t\t\t|| v1.Opposite != v2.Opposite || v1.Next != v2.Next\n\t\t\t\t|| v1.Previous != v2.Previous || v1.Face != v2.Face;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these objects equal.\n\t\t/// </summary>\n\t\t/// <param name=\"obj\"></param>\n\t\t/// <returns></returns>\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tif (!(obj is MeshHalfedge3)) return false;\n\t\t\tMeshHalfedge3 v = (MeshHalfedge3)obj;\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Are these edges equal.\n\t\t/// </summary>\n\t\t/// <param name=\"v\"></param>\n\t\t/// <returns></returns>\n\t\tpublic bool Equals(MeshHalfedge3 v)\n\t\t{\n\t\t\treturn this == v;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// The edges hahe code\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tunchecked\n\t\t\t{\n\t\t\t\tint hash = (int)MathUtil.HASH_PRIME_1;\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ IsBorder.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Source.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Target.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Opposite.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Next.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Previous.GetHashCode();\n\t\t\t\thash = (hash * MathUtil.HASH_PRIME_2) ^ Face.GetHashCode();\n\t\t\t\treturn hash;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Enmerate all edges in this edge loop.\n\t\t/// </summary>\n\t\t/// <param name=\"mesh\">The mesh the edges belong too.</param>\n\t\t/// <returns>The next edge</returns>\n\t\tpublic IEnumerable<MeshHalfedge3> EnumerateHalfedges(IMesh mesh)\n\t\t{\n\t\t\tvar start = this;\n\t\t\tvar e = start;\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tyield return e;\n\n\t\t\t\tif (e.Next != CGALGlobal.NULL_INDEX)\n\t\t\t\t\tmesh.GetHalfedge(e.Next, out e);\n\t\t\t\telse\n\t\t\t\t\tyield break;\n\n\t\t\t}\n\t\t\twhile (e.Index != start.Index);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Enmerate all vertices in this edge loop.\n\t\t/// </summary>\n\t\t/// <param name=\"mesh\">The mesh the edges belong too.</param>\n\t\t/// <returns>The next vertex</returns>\n\t\tpublic IEnumerable<MeshVertex3> EnumerateVertices(IMesh mesh)\n\t\t{\n\t\t\tvar start = this;\n\t\t\tvar e = start;\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (e.Source != CGALGlobal.NULL_INDEX)\n\t\t\t\t{\n\t\t\t\t\tMeshVertex3 vert;\n\t\t\t\t\tmesh.GetVertex(e.Source, out vert);\n\t\t\t\t\tyield return vert;\n\t\t\t\t}\n\n\t\t\t\tif (e.Next != CGALGlobal.NULL_INDEX)\n\t\t\t\t\tmesh.GetHalfedge(e.Next, out e);\n\t\t\t\telse\n\t\t\t\t\tyield break;\n\t\t\t}\n\t\t\twhile (e.Index != start.Index);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/MeshHitResult.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public struct MeshHitResult\n    {\n        public bool Hit => Face != CGALGlobal.NULL_INDEX;\n\n        public int Face;\n\n        public Point3d Point;\n\n        public Point3d Coord;\n\n        public override string ToString()\n        {\n            return String.Format(\"[MeshHitResult: Hit={0}, Face={1}, Point={2}, Coord={3}]\",\n                Hit, Face, Point, Coord);    \n        }\n\n        public static MeshHitResult NoHitResult\n        {\n            get\n            {\n                var result = new MeshHitResult();\n                result.Face = CGALGlobal.NULL_INDEX;\n                return result;\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/MeshVertex3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public struct MeshVertex3 : IEquatable<MeshVertex3>\n    {\n        /// <summary>\n        /// The vertices point.\n        /// </summary>\n        public Point3d Point;\n\n        /// <summary>\n        /// The vertices degree is how mang edges connect to it.\n        /// </summary>\n        public int Degree;\n\n        /// <summary>\n        /// The vertices index.\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// The vertices edge\n        /// </summary>\n        public int Halfedge;\n\n        /// <summary>\n        /// A vertex where all components are null.\n        /// </summary>\n        public static MeshVertex3 NullVertex\n        {\n            get\n            {\n                var vertex = new MeshVertex3();\n                vertex.Index = -CGALGlobal.NULL_INDEX;\n                vertex.Halfedge = -CGALGlobal.NULL_INDEX;\n                return vertex;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshVertex3: Index={0}, Halfedge={1}, Point={2}, Degree={3}]\",\n                Index, Halfedge, Point, Degree);\n        }\n\n        /// <summary>\n        /// Are these vertices equal.\n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static bool operator ==(MeshVertex3 v1, MeshVertex3 v2)\n        {\n            return v1.Index == v2.Index && v1.Halfedge == v2.Halfedge\n                && v1.Degree == v2.Degree && v1.Point == v2.Point;\n        }\n\n        /// <summary>\n        /// Are these vertices not equal.\n        /// </summary>\n        /// <param name=\"v1\"></param>\n        /// <param name=\"v2\"></param>\n        /// <returns></returns>\n        public static bool operator !=(MeshVertex3 v1, MeshVertex3 v2)\n        {\n            return v1.Index != v2.Index || v1.Halfedge != v2.Halfedge\n                || v1.Degree != v2.Degree || v1.Point != v2.Point;\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is MeshVertex3)) return false;\n            MeshVertex3 v = (MeshVertex3)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these vertices equal.\n        /// </summary>\n        /// <param name=\"v\"></param>\n        /// <returns></returns>\n        public bool Equals(MeshVertex3 v)\n        {\n            return this == v;\n        }\n\n        /// <summary>\n        /// The vertices hash code\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Point.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Degree.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Halfedge.GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Enmerate all edges surrounding the vertex.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh the edges belong too.</param>\n        /// <returns>The next edge</returns>\n        public IEnumerable<MeshHalfedge3> EnumerateHalfedges(IMesh mesh)\n        {\n            MeshHalfedge3 start;\n            mesh.GetHalfedge(Halfedge, out start);\n            MeshHalfedge3 e = start;\n\n            do\n            {\n                yield return e;\n\n                MeshHalfedge3 opp, next;\n\n                if (e.Next != CGALGlobal.NULL_INDEX)\n                    mesh.GetHalfedge(e.Next, out next);\n                else\n                    yield break;\n\n                if (next.Opposite != CGALGlobal.NULL_INDEX)\n                    mesh.GetHalfedge(next.Opposite, out opp);\n                else\n                    yield break;\n\n                e = opp;\n            }\n            while (e.Index != start.Index);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/NefPolyhedron3.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public enum NEF_BOUNDARY : int\n    {\n        EXCLUDED,\n        INCLUDED\n    }\n\n    public enum NEF_CONTENT : int\n    {\n        EMPTY,\n        COMPLETE\n    }\n\n    public enum NEF_INTERSECTION : int\n    {\n        CLOSED_HALFSPACE,\n        OPEN_HALFSPACE,\n        PLANE_ONLY\n    }\n\n\n    /// <summary>\n    /// Generic nef polyhedron definition.\n    /// A 3D Nef polyhedron is a subset of the 3-dimensional space that is the result of forming\n    /// complements and intersections starting from a finite set H of 3-dimensional halfspaces.\n    /// Nef polyhedra are closed under all binary set operations, i.e., intersection, union, \n    /// difference, complement, and under the topological operations boundary, closure, and interior.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class NefPolyhedron3<K> : NefPolyhedron3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// creates a Nef polyhedron and initializes it to the empty \n        /// set if plane == EMPTY and to the whole space if space == COMPLETE.\n        /// </summary>\n        /// <param name=\"space\">The nef's space</param>\n        public NefPolyhedron3(NEF_CONTENT space = NEF_CONTENT.EMPTY) : base(new K(), space)\n        {\n\n        }\n\n        /// <summary>\n        /// creates a Nef polyhedron containing the halfspace on the \n        /// negative side of plane including plane if boundary==INCLUDED, \n        /// excluding plane if boundary==EXCLUDED.\n        /// </summary>\n        /// <param name=\"plane\">The plane.</param>\n        /// <param name=\"boundary\">The boundary.</param>\n        internal NefPolyhedron3(Plane3d plane, NEF_BOUNDARY boundary = NEF_BOUNDARY.INCLUDED) : base(new K(), plane, boundary)\n        {\n\n        }\n\n        /// <summary>\n        /// creates a Nef polyhedron, which represents the same point \n        /// set as the polyhedral surface.\n        /// </summary>\n        /// <param name=\"polyhedra\">The polyhedron</param>\n        public NefPolyhedron3(Polyhedron3 polyhedra) : base(new K(), polyhedra)\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The polyhedrons pointer.</param>\n        internal NefPolyhedron3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The nef polyhdron as a string.\n        /// </summary>\n        /// <returns>The nef polyhedron as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[NefPolyhedra3<{0}>: VertexCount={1}, HalfEdgeCount={2}, FaceCount={3}]\",\n                Kernel.Name, VertexCount, HalfEdgeCount, FaceCount);\n        }\n\n        /// <summary>\n        /// Return the intersection of nef and nef1.\n        /// </summary>\n        /// <param name=\"nef\"></param>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Intersection(NefPolyhedron3<K> nef)\n        {\n            var ptr = Kernel.Intersection(Ptr, nef.Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Return the union of nef and nef1.\n        /// </summary>\n        /// <param name=\"nef\"></param>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Join(NefPolyhedron3<K> nef)\n        {\n            var ptr = Kernel.Join(Ptr, nef.Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Return the difference between nef and nef1.\n        /// </summary>\n        /// <param name=\"nef\"></param>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Difference(NefPolyhedron3<K> nef)\n        {\n            var ptr = Kernel.Difference(Ptr, nef.Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Return the symmetric difference of nef and nef1.\n        /// </summary>\n        /// <param name=\"nef\"></param>\n        /// <returns></returns>\n        public NefPolyhedron3<K> SymmetricDifference(NefPolyhedron3<K> nef)\n        {\n            var ptr = Kernel.SymmetricDifference(Ptr, nef.Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the complement of nef. \n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Complement()\n        {\n            var ptr = Kernel.Complement(Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the interior of nef. \n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Interior()\n        {\n            var ptr = Kernel.Interior(Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the boundary of nef. \n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Boundary()\n        {\n            var ptr = Kernel.Boundary(Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the closure of nef.\n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Closure()\n        {\n            var ptr = Kernel.Closure(Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the regularization, i.e. the closure of the interior, of nef.\n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> Regularization()\n        {\n            var ptr = Kernel.Regularization(Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Returns the MinkowskiSum.\n        /// </summary>\n        /// <returns></returns>\n        public NefPolyhedron3<K> MinkowskiSum(NefPolyhedron3<K> nef)\n        {\n            var ptr = Kernel.MinkowskiSum(Ptr, nef.Ptr);\n            return new NefPolyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Converts nef into a Polyhedron.\n        /// nef must be simple to convert.\n        /// </summary>\n        /// <param name=\"poly\">The result of the conversion.</param>\n        /// <returns>True if nef is simple and the conversion was successful.</returns>\n        public bool ConvertToPolyhedron(out Polyhedron3<K> poly)\n        {\n            if (IsSimple)\n            {\n                var ptr = Kernel.ConvertToPolyhedron(Ptr);\n                poly = new Polyhedron3<K>(ptr);\n                return true;\n            }\n            else\n            {\n                poly = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Converts nef into a surface mesh.\n        /// nef must be simple to convert.\n        /// </summary>\n        /// <param name=\"mesh\">The result of the conversion.</param>\n        /// <returns>True if nef is simple and the conversion was successful.</returns>\n        public bool ConvertToSurfaceMesh(out SurfaceMesh3<K> mesh)\n        {\n            if (IsSimple)\n            {\n                var ptr = Kernel.ConvertToSurfaceMesh(Ptr);\n                mesh = new SurfaceMesh3<K>(ptr);\n                return true;\n            }\n            else\n            {\n                mesh = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Get a list of the nef volumes.\n        /// </summary>\n        /// <param name=\"volumes\">Get a list of the nef volumes.</param>\n        public void GetVolumes(List<Polyhedron3<K>> volumes)\n        {\n            int count = VolumeCount;\n            if (count == 0) return;\n\n            var array = new IntPtr[count];\n            Kernel.GetVolumes(Ptr, array, count);\n\n            for(int i = 0; i < array.Length; i++)\n                volumes.Add(new Polyhedron3<K>(array[i]));\n        }\n    }\n\n    /// <summary>\n    /// The abstract nef polyhedra definition.\n    /// </summary>\n    public abstract class NefPolyhedron3 : CGALObject\n    {\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private NefPolyhedron3()\n        {\n\n        }\n\n        /// <summary>\n        /// creates a Nef polyhedron and initializes it to the empty \n        /// set if plane == EMPTY and to the whole space if space == COMPLETE.\n        /// </summary>\n        /// <param name=\"kernel\">The polyhedron kernel.</param>\n        /// <param name=\"space\">The nef's space</param>\n        public NefPolyhedron3(CGALKernel kernel, NEF_CONTENT space)\n        {\n            Kernel = kernel.NefPolyhedronKernel3;\n            Ptr = Kernel.CreateFromSpace(space);\n        }\n\n        /// <summary>\n        /// creates a Nef polyhedron containing the halfspace on the \n        /// negative side of plane including plane if boundary==INCLUDED, \n        /// excluding plane if boundary==EXCLUDED.\n        /// </summary>\n        /// <param name=\"kernel\">The polyhedron kernel.</param>\n        /// <param name=\"plane\">The plane.</param>\n        /// <param name=\"boundary\">The boundary.</param>\n        public NefPolyhedron3(CGALKernel kernel, Plane3d plane, NEF_BOUNDARY boundary)\n        {\n            Kernel = kernel.NefPolyhedronKernel3;\n            Ptr = Kernel.CreateFromPlane(plane, boundary);\n        }\n\n        /// <summary>\n        /// creates a Nef polyhedron, which represents the same point \n        /// set as the polyhedral surface.\n        /// </summary>\n        /// <param name=\"kernel\">The polyhedron kernel.</param>\n        /// <param name=\"polyhedra\">The polyhedron</param>\n        public NefPolyhedron3(CGALKernel kernel, Polyhedron3 polyhedra)\n        {\n            Kernel = kernel.NefPolyhedronKernel3;\n            Ptr = Kernel.CreateFromPolyhedron(polyhedra.Ptr);\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyhedron kernel.</param>\n        /// <param name=\"ptr\">The polyhedrons pointer.</param>\n        internal NefPolyhedron3(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.NefPolyhedronKernel3;\n        }\n\n        /// <summary>\n        /// The polyhedron kernel.\n        /// Contains the functions to the unmanaged CGAL polhedron.\n        /// </summary>\n        protected private NefPolyhedronKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        public int EdgeCount => Kernel.EdgeCount(Ptr);\n\n        /// <summary>\n        /// Return the number of halfedge pairs.\n        /// </summary>\n        public int FaceCount => Kernel.FacetCount(Ptr);\n\n        /// <summary>\n        /// Return the number of halfedges.\n        /// </summary>\n        public int HalfEdgeCount => Kernel.HalfEdgeCount(Ptr);\n\n        /// <summary>\n        /// Return the number of faces.\n        /// </summary>\n        public int HalfFaceCount => Kernel.HalfFacetCount(Ptr);\n\n        /// <summary>\n        /// Return the number of vertices.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// Return the number of volumes.\n        /// </summary>\n        public int VolumeCount => Kernel.VolumeCount(Ptr);\n\n        /// <summary>\n        /// Returns true, if nef is the empty point set.\n        /// </summary>\n        public bool IsEmpty => Kernel.IsEmpty(Ptr);\n\n        /// <summary>\n        /// Rreturns true, if nef is a 2-manifold.\n        /// </summary>\n        public bool IsSimple => Kernel.IsSimple(Ptr);\n\n        /// <summary>\n        /// Returns true, if nef is the complete 3D space.\n        /// </summary>\n        public bool IsSpace => Kernel.IsSpace(Ptr);\n\n        /// <summary>\n        /// Make nef the empty set if space == EMPTY and the complete \n        /// 3D space if space == COMPLETE.\n        /// </summary>\n        public void Clear(NEF_CONTENT space = NEF_CONTENT.EMPTY)\n        {\n            Kernel.Clear(Ptr, space);\n        }\n\n        /// <summary>\n        /// Checks the integrity of nef.\n        /// </summary>\n        /// <returns></returns>\n        public bool IsValid()\n        {\n            return Kernel.IsValid(Ptr);\n        }\n\n        /// <summary>\n        /// Decompose the nef into convex volumes.\n        /// </summary>\n        public void ConvexDecomposition()\n        {\n            Kernel.ConvexDecomposition(Ptr);\n        }\n\n        /// <summary>\n        /// Print the nef polyhedron into a string builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"EdgeCount = \" + EdgeCount);\n            builder.AppendLine(\"FaceCount = \" + FaceCount);\n            builder.AppendLine(\"HalfFaceCount = \" + HalfFaceCount);\n            builder.AppendLine(\"VolumeCount = \" + VolumeCount);\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"IsEmpty = \" + IsEmpty);\n            builder.AppendLine(\"IsSimple = \" + IsSimple);\n            builder.AppendLine(\"IsSpace = \" + IsSpace);\n            \n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/NefPolyhedronKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    internal abstract class NefPolyhedronKernel3 : CGALObjectKernel\n    {\n\t\tinternal abstract IntPtr CreateFromSpace(NEF_CONTENT space);\n\n\t\tinternal abstract IntPtr CreateFromPlane(Plane3d plane, NEF_BOUNDARY boundary);\n\n\t\tinternal abstract IntPtr CreateFromPolyhedron(IntPtr ptr);\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract void Clear(IntPtr ptr, NEF_CONTENT space);\n\n\t\tinternal abstract bool IsEmpty(IntPtr ptr);\n\n\t\tinternal abstract bool IsSimple(IntPtr ptr);\n\n\t\tinternal abstract bool IsSpace(IntPtr ptr);\n\n\t\tinternal abstract bool IsValid(IntPtr ptr);\n\n\t\tinternal abstract int EdgeCount(IntPtr ptr);\n\n\t\tinternal abstract int FacetCount(IntPtr ptr);\n\n\t\tinternal abstract int HalfEdgeCount(IntPtr ptr);\n\n\t\tinternal abstract int HalfFacetCount(IntPtr ptr);\n\n\t\tinternal abstract int VertexCount(IntPtr ptr);\n\n\t\tinternal abstract int VolumeCount(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Intersection(IntPtr ptr1, IntPtr ptr2);\n\n\t\tinternal abstract IntPtr Join(IntPtr ptr1, IntPtr ptr2);\n\n\t\tinternal abstract IntPtr Difference(IntPtr ptr1, IntPtr ptr2);\n\n\t\tinternal abstract IntPtr SymmetricDifference(IntPtr ptr1, IntPtr ptr2);\n\n\t\tinternal abstract IntPtr Complement(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Interior(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Boundary(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Closure(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Regularization(IntPtr ptr);\n\n\t\tinternal abstract IntPtr MinkowskiSum(IntPtr ptr1, IntPtr ptr2);\n\n\t\tinternal abstract IntPtr ConvertToPolyhedron(IntPtr ptr);\n\n\t\tinternal abstract IntPtr ConvertToSurfaceMesh(IntPtr ptr);\n\n\t\tinternal abstract void ConvexDecomposition(IntPtr ptr);\n\n\t\tinternal abstract void GetVolumes(IntPtr ptr, IntPtr[] volumes, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/NefPolyhedronKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tinternal class NefPolyhedronKernel3_EEK : NefPolyhedronKernel3\n\t{\n\t\tinternal override string Name => \"EEK\";\n\n\t\tinternal static readonly NefPolyhedronKernel3 Instance = new NefPolyhedronKernel3_EEK();\n\n\t\tinternal override IntPtr CreateFromSpace(NEF_CONTENT space)\n        {\n\t\t\treturn NefPolyhedron3_EEK_CreateFromSpace(space);\n        }\n\n\t\tinternal override IntPtr CreateFromPlane(Plane3d plane, NEF_BOUNDARY boundary)\n        {\n\t\t\treturn NefPolyhedron3_EEK_CreateFromPlane(plane, boundary);\n\t\t}\n\n\t\tinternal override IntPtr CreateFromPolyhedron(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_CreateFromPolyhedron(ptr);\n        }\n\n\t\tinternal override void Release(IntPtr ptr)\n        {\n\t\t\tNefPolyhedron3_EEK_Release(ptr);\n        }\n\n\t\tinternal override void Clear(IntPtr ptr, NEF_CONTENT space)\n        {\n\t\t\tNefPolyhedron3_EEK_Clear(ptr, space);\n        }\n\n\t\tinternal override bool IsEmpty(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_IsEmpty(ptr);\n        }\n\n\t\tinternal override bool IsSimple(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_IsSimple(ptr);\n        }\n\n\t\tinternal override bool IsSpace(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_IsSpace(ptr);\n        }\n\n\t\tinternal override bool IsValid(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_IsValid(ptr);\n        }\n\n\t\tinternal override int EdgeCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_EdgeCount(ptr);\n        }\n\n\t\tinternal override int FacetCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_FacetCount(ptr);\n        }\n\n\t\tinternal override int HalfEdgeCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_HalfEdgeCount(ptr);\n        }\n\n\t\tinternal override int HalfFacetCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_HalfFacetCount(ptr);\n        }\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_VertexCount(ptr);\n        }\n\n\t\tinternal override int VolumeCount(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_VolumeCount(ptr);\n        }\n\n\t\tinternal override IntPtr Intersection(IntPtr ptr1, IntPtr ptr2)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Intersection(ptr1, ptr2);\n        }\n\n\t\tinternal override IntPtr Join(IntPtr ptr1, IntPtr ptr2)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Join(ptr1, ptr2);\n        }\n\n\t\tinternal override IntPtr Difference(IntPtr ptr1, IntPtr ptr2)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Difference(ptr1, ptr2);\n        }\n\n\t\tinternal override IntPtr SymmetricDifference(IntPtr ptr1, IntPtr ptr2)\n        {\n\t\t\treturn NefPolyhedron3_EEK_SymmetricDifference(ptr1, ptr2);\n        }\n\n\t\tinternal override IntPtr Complement(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Complement(ptr);\n        }\n\n\t\tinternal override IntPtr Interior(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Interior(ptr);\n        }\n\n\t\tinternal override IntPtr Boundary(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Boundary(ptr);\n        }\n\n\t\tinternal override IntPtr Closure(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Closure(ptr);\n        }\n\n\t\tinternal override IntPtr Regularization(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_Regularization(ptr);\n        }\n\n\t\tinternal override IntPtr MinkowskiSum(IntPtr ptr1, IntPtr ptr2)\n        {\n\t\t\treturn NefPolyhedron3_EEK_MinkowskiSum(ptr1, ptr2);\n        }\n\n\t\tinternal override IntPtr ConvertToPolyhedron(IntPtr ptr)\n        {\n\t\t\treturn NefPolyhedron3_EEK_ConvertToPolyhedron(ptr);\n        }\n\n\t\tinternal override IntPtr ConvertToSurfaceMesh(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EEK_ConvertToSurfaceMesh(ptr);\n\t\t}\n\n\t\tinternal override void ConvexDecomposition(IntPtr ptr)\n        {\n\t\t\tNefPolyhedron3_EEK_ConvexDecomposition(ptr);\n        }\n\n\t\tinternal override void GetVolumes(IntPtr ptr, IntPtr[] volumes, int count)\n        {\n\t\t\tNefPolyhedron3_EEK_GetVolumes(ptr, volumes, count);\n        }\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_CreateFromSpace(NEF_CONTENT space);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_CreateFromPlane(Plane3d plane, NEF_BOUNDARY boundary);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_CreateFromPolyhedron(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EEK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EEK_Clear(IntPtr ptr, NEF_CONTENT space);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EEK_IsEmpty(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EEK_IsSimple(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EEK_IsSpace(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EEK_IsValid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_EdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_FacetCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_HalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_HalfFacetCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EEK_VolumeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Intersection(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Join(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Difference(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_SymmetricDifference(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Complement(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Interior(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Boundary(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Closure(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_Regularization(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_MinkowskiSum(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_ConvertToPolyhedron(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EEK_ConvertToSurfaceMesh(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EEK_ConvexDecomposition(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EEK_GetVolumes(IntPtr ptr, [Out] IntPtr[] volumes, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/NefPolyhedronKernel3_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tinternal class NefPolyhedronKernel3_EIK : NefPolyhedronKernel3\n\t{\n\t\tinternal override string Name => \"EIK\";\n\n\t\tinternal static readonly NefPolyhedronKernel3 Instance = new NefPolyhedronKernel3_EIK();\n\n\t\tinternal override IntPtr CreateFromSpace(NEF_CONTENT space)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_CreateFromSpace(space);\n\t\t}\n\n\t\tinternal override IntPtr CreateFromPlane(Plane3d plane, NEF_BOUNDARY boundary)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_CreateFromPlane(plane, boundary);\n\t\t}\n\n\t\tinternal override IntPtr CreateFromPolyhedron(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_CreateFromPolyhedron(ptr);\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tNefPolyhedron3_EIK_Release(ptr);\n\t\t}\n\n\t\tinternal override void Clear(IntPtr ptr, NEF_CONTENT space)\n\t\t{\n\t\t\tNefPolyhedron3_EIK_Clear(ptr, space);\n\t\t}\n\n\t\tinternal override bool IsEmpty(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_IsEmpty(ptr);\n\t\t}\n\n\t\tinternal override bool IsSimple(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_IsSimple(ptr);\n\t\t}\n\n\t\tinternal override bool IsSpace(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_IsSpace(ptr);\n\t\t}\n\n\t\tinternal override bool IsValid(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_IsValid(ptr);\n\t\t}\n\n\t\tinternal override int EdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_EdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int FacetCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_FacetCount(ptr);\n\t\t}\n\n\t\tinternal override int HalfEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_HalfEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int HalfFacetCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_HalfFacetCount(ptr);\n\t\t}\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_VertexCount(ptr);\n\t\t}\n\n\t\tinternal override int VolumeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_VolumeCount(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Intersection(IntPtr ptr1, IntPtr ptr2)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Intersection(ptr1, ptr2);\n\t\t}\n\n\t\tinternal override IntPtr Join(IntPtr ptr1, IntPtr ptr2)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Join(ptr1, ptr2);\n\t\t}\n\n\t\tinternal override IntPtr Difference(IntPtr ptr1, IntPtr ptr2)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Difference(ptr1, ptr2);\n\t\t}\n\n\t\tinternal override IntPtr SymmetricDifference(IntPtr ptr1, IntPtr ptr2)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_SymmetricDifference(ptr1, ptr2);\n\t\t}\n\n\t\tinternal override IntPtr Complement(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Complement(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Interior(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Interior(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Boundary(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Boundary(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Closure(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Closure(ptr);\n\t\t}\n\n\t\tinternal override IntPtr Regularization(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_Regularization(ptr);\n\t\t}\n\n\t\tinternal override IntPtr MinkowskiSum(IntPtr ptr1, IntPtr ptr2)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_MinkowskiSum(ptr1, ptr2);\n\t\t}\n\n\t\tinternal override IntPtr ConvertToPolyhedron(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_ConvertToPolyhedron(ptr);\n\t\t}\n\n\t\tinternal override IntPtr ConvertToSurfaceMesh(IntPtr ptr)\n\t\t{\n\t\t\treturn NefPolyhedron3_EIK_ConvertToSurfaceMesh(ptr);\n\t\t}\n\n\t\tinternal override void ConvexDecomposition(IntPtr ptr)\n\t\t{\n\t\t\tNefPolyhedron3_EIK_ConvexDecomposition(ptr);\n\t\t}\n\n\t\tinternal override void GetVolumes(IntPtr ptr, IntPtr[] volumes, int count)\n\t\t{\n\t\t\tNefPolyhedron3_EIK_GetVolumes(ptr, volumes, count);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_CreateFromSpace(NEF_CONTENT space);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_CreateFromPlane(Plane3d plane, NEF_BOUNDARY boundary);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_CreateFromPolyhedron(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EIK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EIK_Clear(IntPtr ptr, NEF_CONTENT space);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EIK_IsEmpty(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EIK_IsSimple(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EIK_IsSpace(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool NefPolyhedron3_EIK_IsValid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_EdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_FacetCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_HalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_HalfFacetCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int NefPolyhedron3_EIK_VolumeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Intersection(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Join(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Difference(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_SymmetricDifference(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Complement(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Interior(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Boundary(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Closure(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_Regularization(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_MinkowskiSum(IntPtr ptr1, IntPtr ptr2);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_ConvertToPolyhedron(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr NefPolyhedron3_EIK_ConvertToSurfaceMesh(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EIK_ConvexDecomposition(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void NefPolyhedron3_EIK_GetVolumes(IntPtr ptr, [Out] IntPtr[] volumes, int count);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolygonalCount.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public struct PolygonalCount\n    {\n        public int degenerate;\n        public int triangles;\n        public int quads;\n        public int pentagons;\n        public int hexagons;\n        public int greater;\n\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonalCount: Degenerate={0}, Triangles={1}, Quads={2}, Pentagons={3}, Hexagons={4}, Greater={5}]\",\n                degenerate, triangles, quads, pentagons, hexagons, greater);\n        }\n\n        public PolygonalIndices Indices()\n        {\n            return new PolygonalIndices(this);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolygonalIndices.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public struct PolygonalIndices\n    {\n        public int[] triangles;\n        public int[] quads;\n        public int[] pentagons;\n        public int[] hexagons;\n\n\n        public PolygonalIndices(PolygonalCount count)\n        {\n            triangles = count.triangles > 0 ? new int[count.triangles * 3] : null;\n            quads = count.quads > 0 ? new int[count.quads * 4] : null;\n            pentagons = count.pentagons > 0 ? new int[count.pentagons * 5] : null;\n            hexagons = count.hexagons > 0 ? new int[count.hexagons * 6] : null;\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"[PolygonalIndices: Triangles={0}, Quads={1}, Pentagons={2}, Hexagons={3}]\",\n                Len(triangles), Len(quads), Len(pentagons), Len(hexagons));\n        }\n\n        public int triangleCount => Len(triangles);\n\n        public int quadCount => Len(quads);\n\n        public int pentagonCount => Len(pentagons);\n\n        public int hexagonCount => Len(hexagons);\n\n        private int Len(int[] array)\n        {\n            return array == null ? 0 : array.Length;\n        }\n\n        public void Print()\n        {\n            var builder = new StringBuilder();\n            Print(builder);\n            Console.WriteLine(builder.ToString());\n        }\n\n        public void Print(StringBuilder builder)\n        {\n            if (triangleCount != 0)\n            {\n                builder.AppendLine(\"Triangles \" + triangleCount);\n\n                for (int i = 0; i < triangleCount / 3; i++)\n                {\n                    int i0 = triangles[i * 3 + 0];\n                    int i1 = triangles[i * 3 + 1];\n                    int i2 = triangles[i * 3 + 2];\n                    builder.AppendLine(i0 + \" \" + i1 + \" \" + i2);\n                }\n            }\n\n            if (quadCount != 0)\n            {\n                builder.AppendLine(\"Quads \" + quadCount);\n\n                for (int i = 0; i < quadCount / 4; i++)\n                {\n                    int i0 = quads[i * 4 + 0];\n                    int i1 = quads[i * 4 + 1];\n                    int i2 = quads[i * 4 + 2];\n                    int i3 = quads[i * 4 + 3];\n                    builder.AppendLine(i0 + \" \" + i1 + \" \" + i2 + \" \" + i3);\n                }\n            }\n\n            if (pentagonCount != 0)\n            {\n                builder.AppendLine(\"Pentagons \" + pentagonCount);\n\n                for (int i = 0; i < pentagonCount / 5; i++)\n                {\n                    int i0 = pentagons[i * 5 + 0];\n                    int i1 = pentagons[i * 5 + 1];\n                    int i2 = pentagons[i * 5 + 2];\n                    int i3 = pentagons[i * 5 + 3];\n                    int i4 = pentagons[i * 5 + 4];\n                    builder.AppendLine(i0 + \" \" + i1 + \" \" + i2 + \" \" + i3 + \" \" + i4);\n                }\n            }\n\n            if (hexagonCount != 0)\n            {\n                builder.AppendLine(\"Hexagons \" + hexagonCount);\n\n                for (int i = 0; i < hexagonCount / 6; i++)\n                {\n                    int i0 = hexagons[i * 6 + 0];\n                    int i1 = hexagons[i * 6 + 1];\n                    int i2 = hexagons[i * 6 + 2];\n                    int i3 = hexagons[i * 6 + 3];\n                    int i4 = hexagons[i * 6 + 4];\n                    int i5 = hexagons[i * 6 + 5];\n                    builder.AppendLine(i0 + \" \" + i1 + \" \" + i2 + \" \" + i3 + \" \" + i4 + \" \" + i5);\n                }\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolyhedraAlgorithm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public abstract class PolyhedraAlgorithm : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        internal PolyhedraAlgorithm()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal PolyhedraAlgorithm(IntPtr ptr) : base(ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// Should the input polygon be checked.\n        /// Can disable for better performance if \n        /// it is know all input if valid.\n        /// </summary>\n        public bool CheckInput = true;\n\n        /// <summary>\n        /// Check if the mesh is valid.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected void CheckIsValidException(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return;\n\n            if (!mesh.IsValid)\n                throw new InvalidOperationException(\"The mesh is not valid.\");\n        }\n\n        /// <summary>\n        /// Check if the mesh is valid.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected bool CheckIsValid(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return true;\n            return mesh.IsValid;\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid triangle mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected void CheckIsValidTriangleException(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return;\n\n            if (!mesh.IsValid)\n                throw new InvalidOperationException(\"The mesh is not valid.\");\n\n           if (!mesh.IsTriangle)\n                throw new InvalidOperationException(\"The mesh must be a pure triangle mesh.\");\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid triangle mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected bool CheckIsValidTriangle(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return true;\n            return mesh.IsValidTriangleMesh;\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid closed mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected void CheckIsValidClosedException(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return;\n\n            if (!mesh.IsValid)\n                throw new InvalidOperationException(\"The mesh is not valid.\");\n\n            if (!mesh.IsClosed)\n                throw new InvalidOperationException(\"The mesh must be a closed mesh.\");\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid closed mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon to check.</param>\n        protected bool CheckIsValidClosed(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return true;\n            return mesh.IsValidClosedMesh;\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid triangle mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected void CheckIsValidClosedTriangleException(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh is null.\");\n\n            if (!CheckInput) return;\n\n            if (!mesh.IsValid)\n                throw new InvalidOperationException(\"The mesh is not valid.\");\n\n            if (!mesh.IsTriangle)\n                throw new InvalidOperationException(\"The mesh must be a pure triangle mesh.\");\n\n            if (!mesh.IsClosed)\n                throw new InvalidOperationException(\"The mesh must be a closed mesh.\");\n        }\n\n        /// <summary>\n        /// Check if the mesh is a valid triangle mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh to check.</param>\n        protected bool CheckIsValidClosedTriangle(IMesh mesh)\n        {\n            if (mesh == null)\n                throw new NullReferenceException(\"The mesh mesh is null.\");\n\n            if (!CheckInput) return true;\n            return mesh.IsValidClosedTriangleMesh;\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/Polyhedron3.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNet.Polyhedra\n{\n\n    /// <summary>\n    /// A polyhedral surface consists of vertices, edges, \n    /// facets and an incidence relation on them.\n    ///  Each edge is represented by two halfedges with opposite orientations.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Polyhedron3<K> : Polyhedron3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Polyhedron3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct from points and triangle indices.\n        /// </summary>\n        public Polyhedron3(Point3d[] points, int[] triangles) : base(new K())\n        {\n            CreateMesh(points, triangles);\n        }\n\n        /// <summary>\n        /// Construct from points and polygon indices.\n        /// </summary>\n        public Polyhedron3(Point3d[] points, PolygonalIndices indices) : base(new K())\n        {\n            CreatePolygonalMesh(points, points.Length, indices);\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The meshs pointer.</param>\n        internal Polyhedron3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The polyhdron as a string.\n        /// </summary>\n        /// <returns>The mesh as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Polyhedron3<{0}>: VertexCount={1}, HalfEdgeCount={2}, FaceCount={3}]\",\n                Kernel.Name, VertexCount, HalfedgeCount, FaceCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the mesh.\n        /// </summary>\n        /// <returns>A deep copy of the mesh.</returns>\n        public Polyhedron3<K> Copy()\n        {\n            return new Polyhedron3<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Subdive the mesh.\n        /// </summary>\n        /// <param name=\"iterations\">The number of iterations to perfrom.</param>\n        /// <param name=\"method\">The subdivision method.</param>\n        public override void Subdivide(int iterations, SUBDIVISION_METHOD method = SUBDIVISION_METHOD.SQRT3)\n        {\n            try\n            {\n                var sub = SubdivisionSurface<K>.Instance;\n                sub.Subdivide(method, this, iterations);\n                IsUpdated = false;\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Simplify the polyhedra.\n        /// </summary>\n        /// <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        public override void Simplify(double stop_ratio)\n        {\n            try\n            {\n                var sim = SurfaceSimplification<K>.Instance;\n                sim.Simplify(this, stop_ratio);\n                IsUpdated = false;\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices.</returns>\n        public override int Refine(double density_control_factor = MathUtil.SQRT2_64)\n        {\n            try\n            {\n                IsUpdated = false;\n                var meshing = MeshProcessingMeshing<K>.Instance;\n                return meshing.Refine(this, density_control_factor);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"oriente\">The orientation method.</param>\n        public override void Orient(ORIENTATE oriente)\n        {\n            try\n            {\n                IsUpdated = false;\n                var orient = MeshProcessingOrientation<K>.Instance;\n                orient.Orient(oriente, this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Reverses the orientation of the vertices in each face.\n        /// </summary>\n        public override void ReverseFaceOrientation()\n        {\n            Orient(ORIENTATE.REVERSE_FACE_ORIENTATIONS);\n        }\n\n        /// <summary>\n        /// Split the mesh into its unconnected components.\n        /// </summary>\n        /// <param name=\"results\">Each unconnect component as a new mesh.</param>\n        public void Split(List<Polyhedron3<K>> results)\n        {\n            try\n            {\n                var con = MeshProcessingConnections<K>.Instance;\n                con.SplitUnconnectedComponents(this, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Remove all unconnected compontents except the largest.\n        /// Largest is defined by the face count.\n        /// </summary>\n        /// <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n        /// <returns>The number of components removed in the mesh.</returns>\n        public override int KeepLargest(int num_components_to_keep = 1)\n        {\n            try\n            {\n                var con = MeshProcessingConnections<K>.Instance;\n                return con.KeepLargestComponents(this, num_components_to_keep);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Create a mesh consisting of one polygon face.\n        /// </summary>\n        /// <param name=\"polygon\">The faces polygon.</param>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        /// <exception cref=\"InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        public void CreatePolygonMesh(Polygon2<K> polygon, bool xz)\n        {\n            if (!polygon.IsSimple)\n                throw new InvalidOperationException(\"Polygon must be simple to convert to mesh mesh.\");\n\n            var points = polygon.ToArray();\n            CreatePolygonMesh(points, points.Length, xz);  \n        }\n\n        /// <summary>\n        /// Create the dual mesh where each face becomes a vertex\n        /// and each vertex becomes a face.\n        /// Must be a valid closed mesh to create the dual.\n        /// </summary>\n        /// <returns>The duel mesh.</returns>\n        /// <exception cref=\"InvalidOperationException\">Is thrown if the mesh is not a valid closed mesh.</exception>\n        public Polyhedron3<K> Dual()\n        {\n            if (!IsValidClosedMesh)\n                throw new InvalidOperationException(\"Mesh must be a valid closed mesh to create a dual mesh.\");\n\n            int faceCount = FaceCount;\n            var points = new Point3d[faceCount];\n            GetCentroids(points, faceCount);\n\n            var indices = GetDualPolygonalIndices();\n\n            var dual = new Polyhedron3<K>();\n            dual.CreatePolygonalMesh(points, points.Length, indices);\n\n            return dual;\n        }\n\n        /// <summary>\n        /// Convert to a surface mesh.\n        /// </summary>\n        /// <returns>The surface mesh.</returns>\n        public SurfaceMesh3<K> ToSurfaceMesh()\n        {\n            var points = new Point3d[VertexCount];\n            GetPoints(points, points.Length);\n\n            var indices = GetPolygonalIndices();\n     \n            var mesh = new SurfaceMesh3<K>();\n            mesh.CreatePolygonalMesh(points, points.Length, indices);\n\n            return mesh;\n        }\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh\n        /// </summary>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public override MinMaxAvg FindMinMaxAvgEdgeLength()\n        {\n            try\n            {\n                var fea = MeshProcessingFeatures<K>.Instance;\n                return fea.EdgeLengthMinMaxAvg(this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return new MinMaxAvg();\n        }\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh\n        /// </summary>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public override MinMaxAvg FindMinMaxAvgFaceArea()\n        {\n            try\n            {\n                var fea = MeshProcessingFeatures<K>.Instance;\n                return fea.FaceAreaMinMaxAvg(this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return new MinMaxAvg();\n        }\n\n        /// <summary>\n        /// Locate the face the rays hits.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <returns>The hit result.</returns>\n        public override MeshHitResult LocateFace(Ray3d ray)\n        {\n            try\n            {\n                var locate = MeshProcessingLocate<K>.Instance;\n                return locate.LocateFace(this, ray);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return MeshHitResult.NoHitResult;\n        }\n\n        /// <summary>\n        /// Find the face closest to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The hit result.</returns>\n        public override MeshHitResult ClosestFace(Point3d point)\n        {\n            try\n            {\n                var locate = MeshProcessingLocate<K>.Instance;\n                return locate.ClosestFace(this, point);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return MeshHitResult.NoHitResult;\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract polyhedra definition.\n    /// </summary>\n    public abstract class Polyhedron3 : CGALObject, IMesh\n    {\n        /// <summary>\n        /// Cached values found by running Update.\n        /// </summary>\n        private bool m_isValid;\n        private bool m_isClosed;\n        private bool m_isTriangle;\n        private bool m_isQuad;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private Polyhedron3()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The mesh kernel.</param>\n        internal Polyhedron3(CGALKernel kernel)\n        {\n            Kernel = kernel.PolyhedronKernel3;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The mesh kernel.</param>\n        /// <param name=\"ptr\">The meshs pointer.</param>\n        internal Polyhedron3(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.PolyhedronKernel3;\n        }\n\n        /// <summary>\n        /// The mesh kernel.\n        /// Contains the functions to the unmanaged CGAL polhedron.\n        /// </summary>\n        protected private PolyhedronKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// Number of vertices.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// Number of faces.\n        /// </summary>\n        public int FaceCount => Kernel.FaceCount(Ptr);\n\n        /// <summary>\n        /// Number of half edges.\n        /// </summary>\n        public int HalfedgeCount => Kernel.HalfEdgeCount(Ptr);\n\n        /// <summary>\n        /// Number of border edges.\n        /// Since each border edge of a polyhedral surface has exactly one \n        /// border halfedge, this number is equal to size of border halfedges.\n        /// </summary>\n        public int BorderEdgeCount => Kernel.BorderEdgeCount(Ptr);\n\n        /// <summary>\n        /// Number of border halfedges.\n        /// </summary>\n        public int BorderHalfEdgeCount => Kernel.BorderHalfEdgeCount(Ptr);\n\n        /// <summary>\n        /// The current build stamp.\n        /// </summary>\n        public int BuildStamp => Kernel.GetBuildStamp(Ptr);\n\n        /// <summary>\n        /// Returns true if the polyhedral surface is combinatorially consistent.\n        /// Must be a valid mesh to check many other properties.\n        /// </summary>\n        public bool IsValid\n        {\n            get\n            {\n                Update();\n                return m_isValid;\n            }\n            protected set\n            {\n                m_isValid = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if there are no border edges.\n        /// </summary>\n        public bool IsClosed\n        {\n            get\n            {\n                Update();\n                return m_isClosed;\n            }\n            protected set\n            {\n                m_isClosed = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if all faces are triangles.\n        /// </summary>\n        public bool IsTriangle\n        {\n            get\n            {\n                Update();\n                return m_isTriangle;\n            }\n            protected set\n            {\n                m_isTriangle = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if all faces are quads.\n        /// </summary>\n        public bool IsQuad\n        {\n            get\n            {\n                Update();\n                return m_isQuad;\n            }\n            protected set\n            {\n                m_isQuad = value;\n            }\n        }\n\n        /// <summary>\n        /// Is the mesh a valid triangle mesh.\n        /// </summary>\n        public bool IsValidTriangleMesh => IsValid && IsTriangle;\n\n        /// <summary>\n        /// Is the mesh a valid closed mesh.\n        /// </summary>\n        public bool IsValidClosedMesh => IsValid && IsClosed;\n\n        /// <summary>\n        /// Is the mesh a valid closed triangle mesh.\n        /// </summary>\n        public bool IsValidClosedTriangleMesh => IsValid && IsClosed && IsTriangle;\n\n        /// <summary>\n        /// Has the update function been called.\n        /// </summary>\n        protected bool IsUpdated { get; set; }\n\n        /// <summary>\n        /// Mark th mesh as needing to be updated.\n        /// </summary>\n        public void SetIsUpdatedToFalse()\n        {\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Clear the mesh.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Clear the index maps.\n        /// The index maps are used to access the meshes elemnts by index.\n        /// They are automaticaly created when a elements is accessed\n        /// be a function requiring it.\n        /// </summary>\n        /// <param name=\"vertices\">True to clear the vertex index map.</param>\n        /// <param name=\"faces\">True to clear the face index map.</param>\n        /// <param name=\"edges\">True to clear the edges index map.</param>\n        public void ClearIndexMaps(bool vertices, bool faces, bool edges)\n        {\n            Kernel.ClearIndexMaps(Ptr, vertices, faces, edges);\n        }\n\n        /// <summary>\n        /// Clear the normal maps.\n        /// </summary>\n        /// <param name=\"vertices\">True to clear the vertex normal map.</param>\n        /// <param name=\"faces\">True to clear the face normal map</param>\n        public void ClearNormalMaps(bool vertices, bool faces)\n        {\n            Kernel.ClearNormalMaps(Ptr, vertices, faces);\n        }\n\n        /// <summary>\n        /// Builds the vertex and/or face index maps if needed.\n        /// </summary>\n        /// <param name=\"vertices\">True to build the vertex index map.</param>\n        /// <param name=\"faces\">True to build the face index map.</param>\n        /// <param name=\"edges\">True to build the face index map.</param>\n        /// <param name=\"force\">True to force the build even if already built.</param>\n        public void BuildIndices(bool vertices, bool faces, bool edges, bool force = false)\n        {\n            Kernel.BuildIndices(Ptr, vertices, faces, edges, force);\n        }\n\n        /// <summary>\n        /// A tetrahedron is added to the polyhedral surface\n        /// with its vertices initialized to p1, p2, p3, and p4.\n        /// </summary>\n        /// <param name=\"p1\"></param>\n        /// <param name=\"p2\"></param>\n        /// <param name=\"p3\"></param>\n        /// <param name=\"p4\"></param>\n        /// <returns>A edge in the tetrahdron.</returns>\n        public int MakeTetrahedron(Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n        {\n            IsUpdated = false;\n            return Kernel.MakeTetrahedron(Ptr, p1, p2, p3, p4);\n        }\n\n        /// <summary>\n        /// A triangle with border edges is added to the \n        /// polyhedral surface with its vertices initialized to p1, p2, and p3.\n        /// </summary>\n        /// <param name=\"p1\"></param>\n        /// <param name=\"p2\"></param>\n        /// <param name=\"p3\"></param>\n        /// <returns>A edge in the triangle.</returns>\n        public int MakeTriangle(Point3d p1, Point3d p2, Point3d p3)\n        {\n            IsUpdated = false;\n            return Kernel.MakeTriangle(Ptr, p1, p2, p3);\n        }\n\n        /// <summary>\n        /// Create a mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        public void CreateMesh(Point3d[] points, int[] triangles, int[] quads = null)\n        {\n            bool hasTriangles = triangles != null && triangles.Length > 0;\n            bool hasQuads = quads != null && quads.Length > 0;\n\n            if (hasTriangles && hasQuads)\n                CreateTriangleQuadMesh(points, points.Length, triangles, triangles.Length, quads, quads.Length);\n            else if (hasTriangles)\n                CreateTriangleMesh(points, points.Length, triangles, triangles.Length);\n            else if (hasQuads)\n                CreateQuadMesh(points, points.Length, quads, quads.Length);\n        }\n\n        /// <summary>\n        /// Create a triangle mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        public void CreateTriangleMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n            ErrorUtil.CheckArray(points, pointCount);\n            ErrorUtil.CheckArray(indices, indexCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointCount, indices, indexCount, null, 0, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a quad mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        public void CreateQuadMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n            ErrorUtil.CheckArray(points, pointCount);\n            ErrorUtil.CheckArray(indices, indexCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointCount, null, 0, indices, indexCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a mesh with quads and triangles.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointsCount\">The point array length.</param>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"triangleCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void CreateTriangleQuadMesh(Point3d[] points, int pointsCount, int[] triangles, int triangleCount, int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(points, pointsCount);\n            ErrorUtil.CheckArray(triangles, triangleCount);\n            ErrorUtil.CheckArray(quads, quadsCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointsCount, triangles, triangleCount, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a mesh with riangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <param name=\"points\">The meshs points.</param>\n        /// <param name=\"pointsCount\">The length of the point array.</param>\n        /// <param name=\"indices\">The faces indices.</param>\n        public void CreatePolygonalMesh(Point3d[] points, int pointsCount, PolygonalIndices indices)\n        {\n            ErrorUtil.CheckArray(points, pointsCount);\n            ErrorUtil.CheckArray(indices.triangles, indices.triangleCount);\n            ErrorUtil.CheckArray(indices.quads, indices.quadCount);\n            ErrorUtil.CheckArray(indices.pentagons, indices.pentagonCount);\n            ErrorUtil.CheckArray(indices.hexagons, indices.hexagonCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointsCount, \n                indices.triangles, indices.triangleCount,\n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n        }\n\n        /// <summary>\n        /// Create a mesh consisting of one polygon face.\n        /// </summary>\n        /// <param name=\"points\">The faces points</param>\n        /// <param name=\"count\">The point array length.</param>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        public void CreatePolygonMesh(Point2d[] points, int count, bool xz)\n        {\n            ErrorUtil.CheckArray(points, count);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonMesh(Ptr, points, count, xz);\n        }\n\n        /// <summary>\n        /// Get the triangle and quad indices.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        public void GetIndices(int[] triangles, int[] quads = null)\n        {\n            bool hasTriangles = triangles != null && triangles.Length > 0;\n            bool hasQuads = quads != null && quads.Length > 0;\n\n            if (hasTriangles && hasQuads)\n                GetTriangleQuadIndices(triangles, triangles.Length, quads, quads.Length);\n            else if (hasTriangles)\n                GetTriangleIndices(triangles, triangles.Length);\n            else if (hasQuads)\n                GetQuadIndices(quads, quads.Length);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        public void GetTriangleIndices(int[] triangles, int trianglesCount)\n        {\n            ErrorUtil.CheckArray(triangles, trianglesCount);\n            Kernel.GetPolygonalIndices(Ptr, triangles, trianglesCount, null, 0, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes quads.\n        /// </summary>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void GetQuadIndices(int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(quads, quadsCount);\n            Kernel.GetPolygonalIndices(Ptr, null, 0, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles and quads.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void GetTriangleQuadIndices(int[] triangles, int trianglesCount, int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(triangles, trianglesCount);\n            ErrorUtil.CheckArray(quads, quadsCount);\n            Kernel.GetPolygonalIndices(Ptr, triangles, trianglesCount, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <returns>The indices.</returns>\n        public PolygonalIndices GetPolygonalIndices()\n        {\n            var count = GetPolygonalCount();\n            var indices = count.Indices();\n\n            Kernel.GetPolygonalIndices(Ptr, \n                indices.triangles, indices.triangleCount, \n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n\n            return indices;\n        }\n\n\n        /// <summary>\n        /// Get the dual meshes triangles, quads, pentagons and hexagons.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <returns>The indices</returns>\n        public PolygonalIndices GetDualPolygonalIndices()\n        {\n            var count = GetDualPolygonalCount();\n            var indices = count.Indices();\n\n            Kernel.GetDualPolygonalIndices(Ptr,\n                indices.triangles, indices.triangleCount,\n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n\n            return indices;\n        }\n\n        /// <summary>\n        /// Array accessor for the polygon.\n        /// Getting a point wraps around the polygon.\n        /// </summary>\n        /// <param name=\"i\">The points index.</param>\n        /// <returns>The vertices point.</returns>\n        public Point3d this[int i]\n        {\n            get => GetPoint(i);\n            set => SetPoint(i, value);\n        }\n\n        /// <summary>\n        /// Get the vertices point.\n        /// </summary>\n        /// <param name=\"index\">The vertex index in the mesh.</param>\n        /// <returns>The vertices point.</returns>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        public Point3d GetPoint(int index)\n        {\n            if (index < 0 || index >= VertexCount)\n                throw new ArgumentOutOfRangeException(\"Index must be a number >= 0 and < count\");\n\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and wrap around the polygon.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point3d GetPointWrapped(int index)\n        {\n            index = MathUtil.Wrap(index, VertexCount);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and clamp to the polygons last point.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point3d GetPointClamped(int index)\n        {\n            index = MathUtil.Clamp(index, 0, VertexCount - 1);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the vertices point but wraps the index.\n        /// </summary>\n        /// <param name=\"index\">The vertex index in the mesh.</param>\n        /// <returns>The vertices point.</returns>\n        public Point3d GetPointClamp(int index)\n        {\n            index = MathUtil.Wrap(index, VertexCount);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the points in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The array to copy points into.</param>\n        /// <param name=\"count\">The point array length.</param>\n        public void GetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Set the point at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        /// <param name=\"point\">The points</param>am>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        public void SetPoint(int index, Point3d point)\n        {\n            if (index < 0 || index >= VertexCount)\n                throw new ArgumentOutOfRangeException(\"Index must be a number >= 0 and < count\");\n\n            IsUpdated = false;\n            Kernel.SetPoint(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Set the points from a array.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The point arrays length.</param>\n        public void SetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            IsUpdated = false;\n            Kernel.SetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get a halfedges segment.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"segment\">The segment.</param>\n        /// <returns>True if halfedge found.</returns>\n        public bool GetSegment(int index, out Segment3d segment)\n        {\n            return Kernel.GetSegment(Ptr, index, out segment);\n        }\n\n        /// <summary>\n        /// Get the segment.\n        /// </summary>\n        /// <param name=\"index\">The segment index.</param>\n        /// <returns>The segment</returns>\n        /// <exception cref=\"ArgumentException\">If segmentwith the index not found.</exception>\n        public Segment3d GetSegment(int index)\n        {\n            if (GetSegment(index, out Segment3d seg))\n                return seg;\n            else\n                throw new ArgumentException(\"Cound not get segment \" + index);\n        }\n\n        /// <summary>\n        /// Get a segment for  each halfedge in the mesh.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The segment array length.</param>\n        public void GetSegments(Segment3d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get the faces triangle. \n        /// Presumes face is a triangle with no checks.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"triangle\">The faces triangle</param>\n        /// <returns></returns>\n        public bool GetTriangle(int index, out Triangle3d triangle)\n        {\n            return Kernel.GetTriangle(Ptr, index, out triangle);\n        }\n\n        /// <summary>\n        /// Get the triangle.\n        /// </summary>\n        /// <param name=\"index\">The triangle index.</param>\n        /// <returns>The triangle</returns>\n        /// <exception cref=\"ArgumentException\">If triangle with the index not found.</exception>\n        public Triangle3d GetTriangle(int index)\n        {\n            if (GetTriangle(index, out Triangle3d tri))\n                return tri;\n            else\n                throw new ArgumentException(\"Cound not get triangle \" + index);\n        }\n\n        /// <summary>\n        /// Get a triangle for each face in the mesh.\n        /// Presumes all faces are triangles with no checks.\n        /// </summary>\n        /// <param name=\"triangles\">The trainagle array.</param>\n        /// <param name=\"count\">The traingle  arrays length.</param>\n        public void GetTriangles(Triangle3d[] triangles, int count)\n        {\n            ErrorUtil.CheckArray(triangles, count);\n            Kernel.GetTriangles(Ptr, triangles, count);\n        }\n\n        /// <summary>\n        /// Get the mesh vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool GetVertex(int index, out MeshVertex3 vertex)\n        {\n            return Kernel.GetVertex(Ptr, index, out vertex);\n        }\n\n        /// <summary>\n        /// Get the mesh vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertexs index.</param>\n        /// <returns>The vertexs</returns>\n        /// <exception cref=\"ArgumentException\">If vertex with the index not found.</exception>\n        public MeshVertex3 GetVertex(int index)\n        {\n            if (GetVertex(index, out MeshVertex3 vertex))\n                return vertex;\n            else\n                throw new ArgumentException(\"Cound not get vertex \" + index);\n        }\n\n        /// <summary>\n        /// Get the vertices in the mesh.\n        /// </summary>\n        /// <param name=\"vertices\">The vertex array.</param>\n        /// <param name=\"count\">The vertex array length.</param>\n        public void GetVertices(MeshVertex3[] vertices, int count)\n        {\n            ErrorUtil.CheckArray(vertices, count);\n            Kernel.GetVertices(Ptr, vertices, count);\n        }\n\n        /// <summary>\n        /// Get the mesh face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"face\">The face.</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetFace(int index, out MeshFace3 face)\n        {\n            return Kernel.GetFace(Ptr, index, out face);\n        }\n\n        /// <summary>\n        /// Get the mesh face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <returns>The faces</returns>\n        /// <exception cref=\"ArgumentException\">If face with the index not found.</exception>\n        public MeshFace3 GetFace(int index)\n        {\n            if(GetFace(index, out MeshFace3 face))\n                return face;\n            else\n                throw new ArgumentException(\"Cound not get face \" + index);\n        }\n\n        /// <summary>\n        /// Get the faces in the mesh.\n        /// </summary>\n        /// <param name=\"faces\">The face array.</param>\n        /// <param name=\"count\">The face array length.</param>\n        public void GetFaces(MeshFace3[] faces, int count)\n        {\n            ErrorUtil.CheckArray(faces, count);\n            Kernel.GetFaces(Ptr, faces, count);\n        }\n\n        /// <summary>\n        /// Get the mesh halfedge.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"halfedge\">The halfedge.</param>\n        /// <returns>True if the halfedge was found.</returns>\n        public bool GetHalfedge(int index, out MeshHalfedge3 halfedge)\n        {\n            return Kernel.GetHalfedge(Ptr, index, out halfedge);\n        }\n\n        /// <summary>\n        /// Get the mesh Halfedge.\n        /// </summary>\n        /// <param name=\"index\">The Halfedges index.</param>\n        /// <returns>The Halfedges</returns>\n        /// <exception cref=\"ArgumentException\">If Halfedge with the index not found.</exception>\n        public MeshHalfedge3 GetHalfedge(int index)\n        {\n            if (GetHalfedge(index, out MeshHalfedge3 Halfedge))\n                return Halfedge;\n            else\n                throw new ArgumentException(\"Cound not get Halfedge \" + index);\n        }\n\n        /// <summary>\n        /// Get the halfedges in the mesh.\n        /// </summary>\n        /// <param name=\"halfedges\">The halfedge array.</param>\n        /// <param name=\"count\">The halfedge array length.</param>\n        public void GetHalfedges(MeshHalfedge3[] halfedges, int count)\n        {\n            ErrorUtil.CheckArray(halfedges, count);\n            Kernel.GetHalfedges(Ptr, halfedges, count);\n        }\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the mesh.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        public PolygonalCount GetPolygonalCount()\n        {\n            return Kernel.GetPolygonalCount(Ptr);\n        }\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the dual mesh.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        public PolygonalCount GetDualPolygonalCount()\n        {\n            return Kernel.GetDualPolygonalCount(Ptr);\n        }\n\n        /// <summary>\n        /// Get a centroid (the avergae face position) for each face in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The points arrays lemgth.</param>\n        public void GetCentroids(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetCentroids(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Computes the vertex normals if needed.\n        /// </summary>\n        public void ComputeVertexNormals()\n        {\n            Kernel.ComputeVertexNormals(Ptr);\n        }\n\n        /// <summary>\n        /// Computes the face normals if needed.\n        /// </summary>\n        public void ComputeFaceNormals()\n        {\n            Kernel.ComputeFaceNormals(Ptr);\n        }\n\n        /// <summary>\n        /// Get the vertex normals.\n        /// </summary>\n        /// <param name=\"normals\">The normals array.</param>\n        /// <param name=\"count\">The normals array length.</param>\n        public void GetVertexNormals(Vector3d[] normals, int count)\n        {\n            ErrorUtil.CheckArray(normals, count);\n            Kernel.GetVertexNormals(Ptr, normals, count);\n        }\n\n        /// <summary>\n        /// Get the face normals.\n        /// </summary>\n        /// <param name=\"normals\">The normals array.</param>\n        /// <param name=\"count\">The normals array length.</param>\n        public void GetFaceNormals(Vector3d[] normals, int count)\n        {\n            ErrorUtil.CheckArray(normals, count);\n            Kernel.GetFaceNormals(Ptr, normals, count);\n        }\n\n        /// <summary>\n        /// Translate each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point3d translation)\n        {\n            var m = Matrix4x4d.Translate(translation);\n            Kernel.Transform(Ptr, m);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Rotate each point in the mesh.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Quaternion3d rotation)\n        {\n            var m = rotation.ToMatrix4x4d();\n            Kernel.Transform(Ptr, m);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Scale each point in the mesh.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(Point3d scale)\n        {\n            var m = Matrix4x4d.Scale(scale);\n            Kernel.Transform(Ptr, m);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Transform each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point3d translation, Quaternion3d rotation, Point3d scale)\n        {\n            var m = Matrix4x4d.TranslateRotateScale(translation, rotation, scale);\n            Kernel.Transform(Ptr, m);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Make all faces triangles.\n        /// </summary>\n        public void Triangulate()\n        {\n            if (!IsValid || IsTriangle) return;\n\n            Kernel.Triangulate(Ptr);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// sorts halfedges such that the non-border edges precede the border edges.\n        /// For each border edge the halfedge iterator will reference the halfedge \n        /// incident to the facet right before the halfedge incident to the hole.\n        /// </summary>\n        public void NormalizeBorder()\n        {\n            if (!IsValid) return;\n\n            Kernel.NormalizeBorder(Ptr);\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// returns true if the border halfedges are in normalized representation, \n        /// which is when enumerating all halfedges with the iterator: \n        /// The non-border edges precede the border edges and for border edges,\n        /// the second halfedge is the border halfedge.\n        /// </summary>\n        /// <returns></returns>\n        public bool NormalizedBorderIsValid()\n        {\n            return Kernel.NormalizedBorderIsValid(Ptr);\n        }\n\n        /// <summary>\n        /// Find what side of the mesh the lies in.\n        /// </summary>\n        /// <param name=\"point\">The point to check.</param>\n        /// <returns>ON_BOUNDED_SIDE if point inside mesh, \n        /// ON_UNBOUNDED_SIDE if point not inside, \n        /// ON_BOUNDARY if point is on the surface.</returns>\n        public BOUNDED_SIDE BoundedSide(Point3d point)\n        {\n            if (IsValid) \n                return Kernel.SideOfTriangleMesh(Ptr, point);\n            else\n                return BOUNDED_SIDE.UNDETERMINED;\n\n        }\n\n        /// <summary>\n        /// Does the mesh contain the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n        /// <returns>True if the poly contains the point</returns>\n        public bool ContainsPoint(Point3d point, bool includeBoundary = true)\n        {\n            var side = BoundedSide(point);\n\n            if (side == BOUNDED_SIDE.UNDETERMINED)\n                return false;\n\n            if (side == BOUNDED_SIDE.ON_BOUNDED_SIDE)\n                return true;\n\n            if (includeBoundary && side == BOUNDED_SIDE.ON_BOUNDARY)\n                return true;\n\n            return false;\n        }\n\n        /// <summary>\n        /// Locate the face the rays hits.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <returns>The hit result.</returns>\n        public abstract MeshHitResult LocateFace(Ray3d ray);\n\n        /// <summary>\n        /// Find the face closest to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The hit result.</returns>\n        public abstract MeshHitResult ClosestFace(Point3d point);\n\n        /// <summary>\n        /// Locate the face hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"face\">The hit face.</param>\n        /// <returns>True if the ray hit a face.</returns>\n        public bool LocateFace(Ray3d ray, out MeshFace3 face)\n        {\n            if (ray.IsDegenerate)\n            {\n                face = MeshFace3.NullFace;\n                return false;\n            }\n\n            var result = LocateFace(ray);\n            if(result.Hit && GetFace(result.Face, out face))\n            {\n                return true;\n            }\n            else\n            {\n                face = MeshFace3.NullFace;\n                return false;\n            }\n\n        }\n\n        /// <summary>\n        /// Locate the vertex hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n        /// <param name=\"vertex\">The hit vertex.</param>\n        /// <returns>True if the ray hit a vertex.</returns>\n        public bool LocateVertex(Ray3d ray, double radius, out MeshVertex3 vertex)\n        {\n            if (ray.IsDegenerate)\n            {\n                vertex = MeshVertex3.NullVertex;\n                return false;\n            }\n\n            var result = LocateFace(ray);\n            if (result.Hit && GetFace(result.Face, out MeshFace3 face))\n            {\n                double minSqDist = double.PositiveInfinity;\n                var closest = MeshVertex3.NullVertex;\n\n                foreach(var v in face.EnumerateVertices(this))\n                {\n                    var sqdist = Point3d.SqrDistance(result.Point, v.Point);\n                    if (sqdist < minSqDist)\n                    {\n                        minSqDist = sqdist;\n                        closest = v;\n                    }\n                }\n\n                if(closest.Index != CGALGlobal.NULL_INDEX && minSqDist < radius * radius)\n                {\n                    vertex = closest;\n                    return true;\n                }\n                else\n                {\n                    vertex = MeshVertex3.NullVertex;\n                    return false;\n                } \n            }\n            else\n            {\n                vertex = MeshVertex3.NullVertex;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Locate the edge hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the edge has to be within hit point.</param>\n        /// <param name=\"edge\">The hit edge.</param>\n        /// <returns>True if the ray hit a edge.</returns>\n        public bool LocateHalfedge(Ray3d ray, double radius, out MeshHalfedge3 edge)\n        {\n            if (ray.IsDegenerate)\n            {\n                edge = MeshHalfedge3.NullHalfedge;\n                return false;\n            }\n\n            var result = LocateFace(ray);\n            if (result.Hit && GetFace(result.Face, out MeshFace3 face))\n            {\n                double minSqDist = double.PositiveInfinity;\n                var closest = MeshHalfedge3.NullHalfedge;\n                MeshVertex3 source, target;\n                Segment3d seg;\n\n                foreach (var e in face.EnumerateHalfedges(this))\n                {\n                    if (!GetVertex(e.Source, out source)) continue;\n                    if (!GetVertex(e.Target, out target)) continue;\n\n                    seg.A = source.Point;\n                    seg.B = target.Point;\n                    var p = seg.Closest(result.Point);\n\n                    var sqdist = Point3d.SqrDistance(result.Point, p);\n                    if (sqdist < minSqDist)\n                    {\n                        minSqDist = sqdist;\n                        closest = e;\n                    }\n                }\n\n                if (closest.Index != CGALGlobal.NULL_INDEX && minSqDist < radius * radius)\n                {\n                    edge = closest;\n                    return true;\n                }\n                else\n                {\n                    edge = MeshHalfedge3.NullHalfedge;\n                    return false;\n                }\n            }\n            else\n            {\n                edge = MeshHalfedge3.NullHalfedge;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Tests if a set of faces of a triangulated surface mesh self-intersects.\n        /// Must be a triangle mesh.\n        /// </summary>\n        /// <returns>True/Fasle if a valid triangle polyhedra,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED DoesSelfIntersect()\n        {\n            if (IsValidTriangleMesh)\n                return Kernel.DoesSelfIntersect(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// returns true if the polyhedral surface is combinatorially consistent.\n        /// For level == 1 the normalization of the border edges is checked too.\n        /// This method checks that each face is at least a triangle and that the\n        /// two incident facets of a non-border edge are distinct.\n        /// </summary>\n        /// <returns></returns>\n        public bool FindIfValid(int level = 0)\n        {\n            return Kernel.IsValid(Ptr, level);\n        }\n\n        /// <summary>\n        /// Computes the bounding box.\n        /// </summary>\n        /// <returns>The bounding box.</returns>\n        public Box3d FindBoundingBox()\n        {\n            return Kernel.GetBoundingBox(Ptr);\n        }\n\n        /// <summary>\n        /// Computes the area of a range of faces\n        /// of a given triangulated surface mesh.\n        /// </summary>\n        /// <returns>The area or 0 if poyhedron is not valid triangle mesh.</returns>\n        public double FindArea()\n        {\n            if (IsValidTriangleMesh)\n                return Kernel.Area(Ptr);\n            else\n                return 0;\n\n        }\n\n        /// <summary>\n        /// computes the centroid of a volume bounded \n        /// by a closed triangulated surface mesh.\n        /// </summary>\n        /// <returns>The centroid or 0 if poyhedron is not valid.</returns>\n        public Point3d FindCentroid()\n        {\n            if (IsValid)\n                return Kernel.Centroid(Ptr);\n            else\n                return Point3d.Zero;\n        }\n\n        /// <summary>\n        /// Computes the volume of the domain bounded by a \n        /// closed triangulated surface mesh.\n        /// </summary>\n        /// <returns>The volume or 0 if poyhedron is not valid closed triangle mesh.</returns>\n        public double FindVolume()\n        {\n            if (IsValidClosedTriangleMesh)\n                return Kernel.Volume(Ptr);\n            else\n                return 0;\n        }\n\n        /// <summary>\n        /// Returns true if there are no border edges.\n        /// </summary>\n        /// <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        public BOOL_OR_UNDETERMINED FindIfClosed()\n        {\n            if (IsValid)\n                return Kernel.IsClosed(Ptr).ToBoolOrUndetermined();\n            else \n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Returns true if all vertices have exactly two incident edges.\n        /// </summary>\n        /// <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        public BOOL_OR_UNDETERMINED FindIfBivalent()\n        {\n            if (IsValid)\n                return Kernel.IsPureBivalent(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Returns true if all vertices have exactly three incident edges.\n        /// </summary>\n        /// <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        public BOOL_OR_UNDETERMINED FindIfTrivalent()\n        {\n            if (IsValid)\n                return Kernel.IsPureTrivalent(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Returns true if all faces are triangles.\n        /// </summary>\n        /// <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        public BOOL_OR_UNDETERMINED FindIfTriangleMesh()\n        {\n            if (IsValid)\n                return Kernel.IsPureTriangle(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Returns true if all faces are quads.\n        /// </summary>\n        /// <returns>True/Fasle if valid, or UNDETERMINED if not a valid polyhedra.</returns>\n        public BOOL_OR_UNDETERMINED FindIfQuadMesh()\n        {\n            if (IsValid)\n                return Kernel.IsPureQuad(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Indicates if the mesh bounds a volume.\n        /// Must be a closed and triangulated.\n        /// </summary>\n        /// <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED FindIfDoesBoundAVolume()\n        {\n            if (IsValidClosedTriangleMesh)\n                return Kernel.DoesBoundAVolume(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Builds the aabb tree used for location.\n        /// Tree will be automatically built if need so not \n        /// actually necessary to call this function.\n        /// </summary>\n        public void BuildAABBTree()\n        {\n            Kernel.BuildAABBTree(Ptr);\n        }\n\n        /// <summary>\n        /// Will delete the aabb tree.\n        /// </summary>\n        public void ReleaseAABBTree()\n        {\n            Kernel.ReleaseAABBTree(Ptr);\n        }\n\n        /// <summary>\n        /// Returns true if there exists a face of this poly and \n        /// a face of other poly which intersect, and false otherwise.\n        /// Must be a triangle mesh\n        /// </summary>\n        /// <param name=\"poly\">The other triangle poly.</param>\n        /// <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n        /// the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n        /// <returns>True/Fasle if a valid triangle closed polyhedra,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED DoIntersect(Polyhedron3 poly, bool test_bounded_sides = true)\n        {\n            if (IsValidTriangleMesh && poly.IsValidTriangleMesh)\n            {\n                //if test bounded side both must be closed meshes.\n                //If not test bounded side does not matter if not closed.\n                if ((test_bounded_sides && IsClosed && poly.IsClosed) || !test_bounded_sides)\n                {\n                    return Kernel.DoIntersects(Ptr, poly.Ptr, test_bounded_sides).ToBoolOrUndetermined();\n                }\n                else\n                    return BOOL_OR_UNDETERMINED.UNDETERMINED;\n            }\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Subdive the mesh.\n        /// </summary>\n        /// <param name=\"iterations\">The number of iterations to perfrom.</param>\n        /// <param name=\"method\">The subdivision method.</param>\n        public abstract void Subdivide(int iterations, SUBDIVISION_METHOD method = SUBDIVISION_METHOD.SQRT3);\n\n        /// <summary>\n        /// Simplify the polyhedra.\n        /// </summary>\n        /// <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        public abstract void Simplify(double stop_ratio);\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices.</returns>\n        public abstract int Refine(double density_control_factor = MathUtil.SQRT2_64);\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"orientate\">The orientation method.</param>\n        public abstract void Orient(ORIENTATE orientate);\n\n        /// <summary>\n        /// Reverses the orientation of the vertices in each face.\n        /// </summary>\n        public abstract void ReverseFaceOrientation();\n\n        /// <summary>\n        /// Remove all unconnected compontents except the largest.\n        /// Largest is defined by the face count.\n        /// </summary>\n        /// <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n        /// <returns>The number of components removed in the mesh.</returns>\n        public abstract int KeepLargest(int num_components_to_keep = 1);\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh\n        /// </summary>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public abstract MinMaxAvg FindMinMaxAvgEdgeLength();\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh\n        /// </summary>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public abstract MinMaxAvg FindMinMaxAvgFaceArea();\n\n        /// <summary>\n        /// Enumerate all points in the mesh.\n        /// </summary>\n        /// <returns>Each point in mesh.</returns>\n        public IEnumerator<Point3d> GetEnumerator()\n        {\n            for (int i = 0; i < VertexCount; i++)\n                yield return GetPoint(i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the mesh.\n        /// </summary>\n        /// <returns>Each point in mesh.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Read data from a off file into the pollyhedron.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        public void ReadOFF(string filename)\n        {\n            IsUpdated = false;\n            Kernel.ReadOFF(Ptr, filename);\n        }\n\n        /// <summary>\n        /// Write data from a off file into the pollyhedron.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        public void WriteOFF(string filename)\n        {\n            Kernel.WriteOFF(Ptr, filename);\n        }\n\n        /// <summary>\n        /// Return all the points in the mesh in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point3d[] ToArray()\n        {\n            var points = new Point3d[VertexCount];\n            GetPoints(points, points.Length);\n            return points;\n        }\n\n        /// <summary>\n        /// Return all the points in the mesh in a list.\n        /// </summary>\n        /// <returns>The list.</returns>\n        public List<Point3d> ToList()\n        {\n            int count = VertexCount;\n            var points = new List<Point3d>(count);\n           for (int i = 0; i < count; i++)\n                points.Add(GetPoint(i));\n        \n            return points;\n        }\n\n\n        /// <summary>\n        /// https://doc.cgal.org/latest/Polyhedron/classCGAL_1_1Polyhedron__3.html#a73119c0c90bf8612da003305af25a52a\n        /// creates a new facet within the hole incident to h and g by connecting the \n        /// vertex denoted by g with the vertex denoted by h with a new halfedge and \n        /// filling this separated part of the hole with a new facet, such that the \n        /// new facet is incident to g.\n        ///\n        /// Precondition\n        /// h->is_border(), g->is_border(), h != g, h->next() != g, \n        /// and g can be reached along the same hole starting with h.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <returns> Returns the halfedge of the new edge that is incident to the new facet.</returns>\n        public int AddFacetToBorder(int h, int g)\n        {\n            IsUpdated = false;\n            return Kernel.AddFacetToBorder(Ptr, h, g);\n        }\n\n        /// <summary>\n        /// creates a new facet within the hole incident to h and g by connecting the \n        /// tip of g with the tip of h with two new halfedges and a new vertex and \n        /// filling this separated part of the hole with a new facet, such that the \n        /// new facet is incident to g.\n        ///\n        /// Precondition\n        /// h->is_border(), g->is_border(), h != g, and g can be reached along the same hole starting with h.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <returns>Returns the halfedge of the new edge that is incident to the new facet and the new vertex.</returns>\n        public int AddVertexAndFacetToBorder(int h, int g)\n        {\n            IsUpdated = false;\n            return Kernel.AddVertexAndFacetToBorder(Ptr, h, g);\n        }\n\n        /// <summary>\n        /// barycentric triangulation of h->facet().\n        /// Creates a new vertex, a copy of h->vertex(), and connects it to each vertex incident \n        /// to h->facet() splitting h->facet() into triangles.h remains incident to the original \n        /// facet, all other triangles are copies of this facet.\n        /// Precondition\n        /// h is not a border halfedge.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns the halfedge h->next() \n        /// after the operation, i.e., a halfedge pointing to the new vertex.The time is \n        /// proportional to the size of the facet.</returns>\n        public int CreateCenterVertex(int h)\n        {\n            IsUpdated = false;\n            return Kernel.CreateCenterVertex(Ptr, h);\n        }\n\n        /// <summary>\n        /// reverses create_center_vertex().\n        /// Erases the vertex pointed to by g and all incident halfedges thereby merging all \n        /// incident facets.Only g->facet() remains. The neighborhood of g->vertex() may not \n        /// be triangulated, it can have larger facets.\n        /// Precondition\n        /// None of the incident facets of g->vertex() is a hole. There are at least two distinct facets incident to the facets that are incident to g->vertex(). (This prevents the operation from collapsing a volume into two facets glued together with opposite orientations, such as would happen with any vertex of a tetrahedron.)\n        /// Supports_removal must be CGAL::Tag_true.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns the halfedge g->prev(). \n        /// Thus, the invariant h == erase_center_vertex(create_center_vertex(h)) \n        /// holds if h is not a border halfedge.The time is proportional to the sum of the size of all incident facets.</returns>\n        public int EraseCenterVertex(int h)\n        {\n            IsUpdated = false;\n            return Kernel.EraseCenterVertex(Ptr, h);\n        }\n\n        /// <summary>\n        /// removes the incident facet of h and changes all halfedges incident to the facet \n        /// into border edges or removes them from the polyhedral surface if they were already border edges.\n        /// If this creates isolated vertices they get removed as well.See make_hole(h) for a more specialized variant.\n        /// Precondition\n        /// h->is_border() == false.\n        /// Supports_removal must be CGAL::Tag_true\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns></returns>\n        public bool EraseConnectedComponent(int h)\n        {\n            IsUpdated = false;\n            return Kernel.EraseConnectedComponent(Ptr, h);\n        }\n\n        /// <summary>\n        /// Erase a facet.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>returns a range of handles over the facets.</returns>\n        public bool EraseFacet(int h)\n        {\n            IsUpdated = false;\n            return Kernel.EraseFacet(Ptr, h);\n        }\n\n        /// <summary>\n        /// fills a hole with a newly created facet.\n        /// Makes all border halfedges of the hole denoted \n        /// by h incident to the new facet.Returns h.\n        /// Precondition\n        /// h.is_border().\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns></returns>\n        public int FillHole(int h)\n        {\n            IsUpdated = false;\n            return Kernel.FillHole(Ptr, h);\n        }\n\n        /// <summary>\n        /// performs an edge flip.\n        /// \n        /// Precondition\n        /// h != Halfedge_handle() and both facets incident to h are triangles.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>It returns h after rotating the edge h one vertex in the direction of the face orientation.</returns>\n        public int FlipEdge(int h)\n        {\n            IsUpdated = false;\n            return Kernel.FlipEdge(Ptr, h);\n        }\n\n        /// <summary>\n        /// joins the two facets incident to h.\n        /// The facet incident to h->opposite() gets removed.Both facets might be holes. \n        /// \n        /// Precondition\n        /// The degree of both vertices incident to h is at least three(no antennas).\n        /// Supports_removal must be CGAL::Tag_true.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns the predecessor of h around the facet. The invariant join_facet(split_facet(h, g)) \n        /// returns h and keeps the polyhedron unchanged.The time is proportional to the size of \n        /// the facet removed and the time to compute h->prev().</returns>\n        public int JoinFacet(int h)\n        {\n            IsUpdated = false;\n            return Kernel.JoinFacet(Ptr, h);\n        }\n\n        /// <summary>\n        /// glues the boundary of the two facets denoted by h and g together and returns h.\n        /// Both facets and the vertices along the facet denoted by g gets removed.Both facets may be holes.\n        /// The invariant join_loop(h, split_loop(h, i, j)) \n        /// Precondition\n        /// The facets denoted by h and g are different and have equal degree(i.e., number of edges).\n        /// Supports_removal must be CGAL::Tag_true.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <returns>returns h and keeps the polyhedron unchanged.</returns>\n        public int JoinLoop(int h, int g)\n        {\n            IsUpdated = false;\n            return Kernel.JoinLoop(Ptr, h, g);\n        }\n\n        /// <summary>\n        /// joins the two vertices incident to h.\n        /// The vertex denoted by h->opposite() gets removed.\n        /// Precondition\n        /// The size of both facets incident to h is at least four(no multi-edges).\n        /// Supports_removal must be CGAL::Tag_true.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns the predecessor of h around the vertex, i.e.,\n        /// h->opposite()->prev(). The invariant join_vertex(split_vertex(h, g)) \n        /// returns h and keeps the polyhedron unchanged.The time is proportional \n        /// to the degree of the vertex removed and the time to compute h->prev() and h->opposite()->prev().</returns>\n        public int JoinVertex(int h)\n        {\n            IsUpdated = false;\n            return Kernel.JoinVertex(Ptr, h);\n        }\n\n        /// <summary>\n        /// removes the incident facet of h and changes all halfedges incident to the facet into border edges.\n        /// \n        /// Precondition\n        /// None of the incident halfedges of the facet is a border edge.\n        /// Supports_removal must be CGAL::Tag_true.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns h.See erase_facet(h) for a more generalized variant.</returns>\n        public int MakeHole(int h)\n        {\n            IsUpdated = false;\n            return Kernel.MakeHole(Ptr, h);\n        }\n\n        /// <summary>\n        /// splits the halfedge h into two halfedges inserting a new vertex that is a copy of h->opposite()->vertex().\n        /// Is equivalent to split_vertex(h->prev(), h->opposite())->opposite(). The call of prev() can make this method \n        /// slower than a direct call of split_vertex() if the previous halfedge is already known and computing \n        /// it would be costly when the halfedge data structure does not support the prev() member function.\n        /// \n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <returns>Returns the new halfedge now pointing to the inserted vertex.The new halfedge is followed \n        /// by the old halfedge, i.e., hnew->next() == h.</returns>\n        public int SplitEdge(int h)\n        {\n            IsUpdated = false;\n            return Kernel.SplitEdge(Ptr, h);\n        }\n\n        /// <summary>\n        /// splits the facet incident to h and g into two facets with a new diagonal between \n        /// the two vertices denoted by h and g respectively.\n        /// The second(new) facet is a copy of the first facet.\n        /// Precondition\n        /// h and g are incident to the same facet.h != g (no loops). h->next() != g and g->next() != h (no multi-edges).\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <returns>Returns h->next() after the\n        /// operation, i.e., the new diagonal.The new face is to the right of the new diagonal,\n        /// the old face is to the left.The time is proportional to the distance from h to g around the facet.</returns>\n        /// <returns></returns>\n        public int SplitFacet(int h, int g)\n        {\n            IsUpdated = false;\n            return Kernel.SplitFacet(Ptr, h, g);\n        }\n\n        /// <summary>\n        /// cuts the polyhedron into two parts along the cycle (h,i,j) (edge j runs on the backside of the three dimensional figure above).\n        /// Three new vertices(one copy for each vertex in the cycle) and three new halfedges(one copy for each halfedge in the cycle), \n        /// and two new triangles are created.h,i,j will be incident to the first new triangle.\n        /// Precondition\n        /// h, i, j denote distinct, consecutive vertices of the polyhedron and form a cycle: i.e., h->vertex() == i->opposite()->vertex(),\n        /// … , j->vertex() == h->opposite()->vertex(). The six facets incident to(h, i, j) are all distinct.\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <param name=\"k\">a halfedge index</param>\n        /// <returns>The return value will be the halfedge \n        /// incident to the second new triangle which is the copy of h-opposite().</returns>\n        public int SplitLoop(int h, int g, int k)\n        {\n            IsUpdated = false;\n            return Kernel.SplitLoop(Ptr, h, g, k);\n        }\n\n        /// <summary>\n        /// splits the vertex incident to h and g into two vertices, the old vertex remains and a\n        /// new copy is created, and connects them with a new edge.\n        /// Let hnew be h->next()->opposite() after the split, i.e., a halfedge of the new edge.\n        /// The split regroups the halfedges around the two vertices.The halfedge sequence hnew,\n        /// g->next()->opposite(), … , h remains around the old vertex, while the halfedge \n        /// sequence hnew->opposite(), h->next()->opposite() (before the split), … , g is \n        /// regrouped around the new vertex.\n        /// Precondition\n        /// h and g are incident to the same vertex. h != g (antennas are not allowed).\n        /// </summary>\n        /// <param name=\"h\">a halfedge index</param>\n        /// <param name=\"g\">a halfedge index</param>\n        /// <returns>The split returns hnew, i.e., the new halfedge \n        /// incident to the old vertex.The time is proportional to the distance from h to \n        /// g around the vertex.</returns>\n        public int SplitVertex(int h, int g)\n        {\n            IsUpdated = false;\n            return Kernel.SplitVertex(Ptr, h, g);\n        }\n\n        /// <summary>\n        /// Update the mesh if needed.\n        /// </summary>\n        protected void Update()\n        {\n            if (IsUpdated) return;\n            IsUpdated = true;\n\n            if (FindIfValid())\n            {\n                m_isValid = true;\n                m_isClosed = FindIfClosed().ToBool();\n                m_isTriangle = FindIfTriangleMesh().ToBool();\n                m_isQuad = FindIfQuadMesh().ToBool();\n            }\n            else\n            {\n                m_isValid = false;\n                m_isClosed = false;\n                m_isTriangle = false;\n                m_isQuad = false;   \n            }\n        }\n\n        /// <summary>\n        /// Print the mesh into a string builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            Update();\n\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"FaceCount= \" + FaceCount);\n            builder.AppendLine(\"HalfEdgeCount = \" + HalfedgeCount);\n            builder.AppendLine(\"BorderEdgeCount = \" + BorderEdgeCount);\n            builder.AppendLine(\"BorderHalfEdgeCount = \" + BorderHalfEdgeCount);\n            builder.AppendLine(\"IsValid = \" + IsValid);\n            builder.AppendLine(\"NormalizedBorderIsValid = \" + NormalizedBorderIsValid());\n            builder.AppendLine(\"IsClosed = \" + IsClosed);\n            builder.AppendLine(\"IsTriangle = \" + IsTriangle);\n            builder.AppendLine(\"IsQuad = \" + IsQuad);\n            builder.AppendLine(\"IsBivalent = \" + FindIfBivalent());\n            builder.AppendLine(\"IsTrivalent = \" + FindIfTrivalent());\n            builder.AppendLine(\"DoesBoundAVolume = \" + FindIfDoesBoundAVolume());\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintVertices(StringBuilder builder)\n        {\n            builder.AppendLine(\"Vertices\");\n            var verts = new MeshVertex3[VertexCount];\n            GetVertices(verts, verts.Length);\n\n            foreach (var v in verts)\n                builder.AppendLine(v.ToString());\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintFaces(StringBuilder builder)\n        {\n            builder.AppendLine(\"Faces\");\n            var faces = new MeshFace3[FaceCount];\n            GetFaces(faces, faces.Length);\n\n            foreach (var f in faces)\n                builder.AppendLine(f.ToString());\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public void PrintHalfedges(StringBuilder builder)\n        {\n            builder.AppendLine(\"Edges\");\n            var edges = new MeshHalfedge3[HalfedgeCount];\n            GetHalfedges(edges, edges.Length);\n\n            foreach (var e in edges)\n                builder.AppendLine(e.ToString());\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolyhedronFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Processing;\n\nnamespace CGALDotNet.Polyhedra\n{\n    public static class PolyhedronFactory<K> where K : CGALKernel, new()\n    {\n\t\tprivate static IndexList triangleList = IndexList.CreateTriangleIndexList();\n\t\tprivate static IndexList polygonList = IndexList.CreatePolygonIndexList();\n\n\t\tpublic static Dictionary<string, Polyhedron3<K>> CreateAll(bool allowPolygons = false)\n        {\n\t\t\tvar meshes = new Dictionary<string, Polyhedron3<K>>();\n\n\t\t\tmeshes.Add(\"Cube\", CreateCube(1, allowPolygons));\n\t\t\tmeshes.Add(\"Plane\", CreatePlane(allowPolygons));\n\t\t\tmeshes.Add(\"Torus\", CreateTorus(allowPolygons));\n\t\t\tmeshes.Add(\"Cone\", CreateCone(allowPolygons));\n\t\t\tmeshes.Add(\"Cylinder\", CreateCylinder(allowPolygons));\n\t\t\tmeshes.Add(\"Capsule\", CreateCapsule(allowPolygons));\n\t\t\tmeshes.Add(\"UVSphere\", CreateUVSphere(allowPolygons));\n\t\t\tmeshes.Add(\"NormalizedCube\", CreateNormalizedCube(allowPolygons));\n\t\t\tmeshes.Add(\"Icosahedron\", CreateIcosahedron());\n\t\t\tmeshes.Add(\"Tetrahedron\", CreateTetrahedron());\n\t\t\tmeshes.Add(\"Octahedron\", CreateOctahedron());\n\t\t\tmeshes.Add(\"Dodecahedron\", CreateDodecahedron(1, allowPolygons));\n\n\t\t\treturn meshes;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCube( double scale = 1, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCube(polygonList, scale);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCube(triangleList, scale);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCube(Box3d box, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCube(polygonList, box);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCube(triangleList, box);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreatePlane(bool allowPolygons = false)\n        {\n\t\t\treturn CreatePlane(PlaneParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreatePlane(PlaneParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n            {\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreatePlane(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n            {\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreatePlane(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateTorus(bool allowPolygons = false)\n        {\n\t\t\treturn CreateTorus(TorusParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreateTorus(TorusParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateTorus(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateTorus(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCone(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateCone(ConeParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCone(ConeParams param, bool allowPolygons = false)\n        {\n\t\t\treturn CreateCylinder(param.AsCylinderParam(), allowPolygons);\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCylinder(bool allowPolygons = false)\n        {\n\t\t\treturn CreateCylinder(CylinderParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreateCylinder(CylinderParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCylinder(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCylinder(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateCapsule(bool allowPolygons = false)\n        {\n\t\t\treturn CreateCapsule(CapsuleParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreateCapsule(CapsuleParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCapsule(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCapsule(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateUVSphere(bool allowPolygons = false)\n        {\n\t\t\treturn CreateUVSphere(UVSphereParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreateUVSphere(UVSphereParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateUVSphere(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n            {\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateUVSphere(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateNormalizedCube(bool allowPolygons = false)\n        {\n\t\t\treturn CreateNormalizedCube(NormalizedCubeParams.Default, allowPolygons);\n        }\n\n\t\tpublic static Polyhedron3<K> CreateNormalizedCube(NormalizedCubeParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateNormalizedCube(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateNormalizedCube(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateTetrahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateTetrahedron(triangleList, scale);\n\n\t\t\tvar mesh = new Polyhedron3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateIcosahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateIcosahedron(triangleList, scale);\n\n\t\t\tvar mesh = new Polyhedron3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateOctahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateOctahedron(triangleList, scale);\n\n\t\t\tvar mesh = new Polyhedron3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static Polyhedron3<K> CreateDodecahedron(double scale = 1, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new Polyhedron3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateDodecahedron(polygonList, scale);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateDodecahedron(triangleList, scale);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tprivate static void WeldVertices(Polyhedron3<K> mesh)\n        {\n\t\t\tvar repair = MeshProcessingRepair<K>.Instance;\n\t\t\trepair.RepairPolygonSoup(mesh);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolyhedronKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    internal abstract class PolyhedronKernel3 : CGALObjectKernel\n\t{\n        internal abstract IntPtr Create();\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract int GetBuildStamp(IntPtr ptr);\n\n\t\tinternal abstract void Clear(IntPtr ptr);\n\n\t\tinternal abstract void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges);\n\n\t\tinternal abstract void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n\t\tinternal abstract void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool force);\n\n\t\tinternal abstract IntPtr Copy(IntPtr ptr);\n\n\t\tinternal abstract int VertexCount(IntPtr ptr);\n\n\t\tinternal abstract int FaceCount(IntPtr ptr);\n\n\t\tinternal abstract int HalfEdgeCount(IntPtr ptr);\n\n\t\tinternal abstract int BorderEdgeCount(IntPtr ptr);\n\n\t\tinternal abstract int BorderHalfEdgeCount(IntPtr ptr);\n\n\t\tinternal abstract bool IsValid(IntPtr ptr, int level);\n\n\t\tinternal abstract bool IsClosed(IntPtr ptr);\n\n\t\tinternal abstract bool IsPureBivalent(IntPtr ptr);\n\n\t\tinternal abstract bool IsPureTrivalent(IntPtr ptr);\n\n\t\tinternal abstract bool IsPureTriangle(IntPtr ptr);\n\n\t\tinternal abstract bool IsPureQuad(IntPtr ptr);\n\n\t\tinternal abstract Box3d GetBoundingBox(IntPtr ptr);\n\n\t\tinternal abstract int MakeTetrahedron(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4);\n\n\t\tinternal abstract int MakeTriangle(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3);\n\n\t\tinternal abstract Point3d GetPoint(IntPtr ptr, int index);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract void SetPoint(IntPtr ptr, int index, Point3d point);\n\n\t\tinternal abstract void SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract bool GetSegment(IntPtr ptr, int index, out Segment3d segment);\n\n\t\tinternal abstract bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri);\n\n\t\tinternal abstract bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert);\n\n\t\tinternal abstract bool GetFace(IntPtr ptr, int index, out MeshFace3 face);\n\n\t\tinternal abstract bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge);\n\n\t\tinternal abstract void GetSegments(IntPtr ptr, Segment3d[] segments, int count);\n\n\t\tinternal abstract void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count);\n\n\t\tinternal abstract void GetVertices(IntPtr ptr, MeshVertex3[] vertices, int count);\n\n\t\tinternal abstract void GetFaces(IntPtr ptr, MeshFace3[] faces, int count);\n\n\t\tinternal abstract void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edges, int count);\n\n\t\tinternal abstract void Transform(IntPtr ptr, Matrix4x4d matrix);\n\n\t\tinternal abstract void InsideOut(IntPtr ptr);\n\n\t\tinternal abstract void Triangulate(IntPtr ptr);\n\n\t\tinternal abstract void NormalizeBorder(IntPtr ptr);\n\n\t\tinternal abstract bool NormalizedBorderIsValid(IntPtr ptr);\n\n\t\tinternal abstract BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n\t\tinternal abstract double Area(IntPtr ptr);\n\n\t\tinternal abstract Point3d Centroid(IntPtr ptr);\n\n\t\tinternal abstract double Volume(IntPtr ptr);\n\n\t\tinternal abstract bool DoesBoundAVolume(IntPtr ptr);\n\n\t\tinternal abstract void BuildAABBTree(IntPtr ptr);\n\n\t\tinternal abstract void ReleaseAABBTree(IntPtr ptr);\n\n\t\tinternal abstract bool DoesSelfIntersect(IntPtr ptr);\n\n\t\tinternal abstract bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n\t\tinternal abstract void ReadOFF(IntPtr ptr, string filename);\n\n\t\tinternal abstract void WriteOFF(IntPtr ptr, string filename);\n\n\t\tinternal abstract void GetCentroids(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract void ComputeVertexNormals(IntPtr ptr);\n\n\t\tinternal abstract void ComputeFaceNormals(IntPtr ptr);\n\n\t\tinternal abstract void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count);\n\n\t\tinternal abstract void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count);\n\n\t\tinternal abstract void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int pointsCount, bool xz);\n\n\t\tinternal abstract PolygonalCount GetPolygonalCount(IntPtr ptr);\n\n\t\tinternal abstract PolygonalCount GetDualPolygonalCount(IntPtr ptr);\n\n\t\tinternal abstract void CreatePolygonalMesh(IntPtr ptr,\n\t\t\tPoint3d[] points, int pointsCount,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount);\n\n\t\tinternal abstract void GetPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount);\n\n\t\tinternal abstract void GetDualPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount);\n\n\t\tinternal abstract int AddFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\tinternal abstract int AddVertexAndFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\tinternal abstract int CreateCenterVertex(IntPtr ptr, int h);\n\n\t\tinternal abstract int EraseCenterVertex(IntPtr ptr, int h);\n\n\t\tinternal abstract bool EraseConnectedComponent(IntPtr ptr, int h);\n\n\t\tinternal abstract bool EraseFacet(IntPtr ptr, int h);\n\n\t\tinternal abstract int FillHole(IntPtr ptr, int h);\n\n\t\tinternal abstract int FlipEdge(IntPtr ptr, int h);\n\n\t\tinternal abstract int JoinFacet(IntPtr ptr, int h);\n\n\t\tinternal abstract int JoinLoop(IntPtr ptr, int h, int g);\n\n\t\tinternal abstract int JoinVertex(IntPtr ptr, int h);\n\n\t\tinternal abstract int MakeHole(IntPtr ptr, int h);\n\n\t\tinternal abstract int SplitEdge(IntPtr ptr, int h);\n\n\t\tinternal abstract int SplitFacet(IntPtr ptr, int h, int g);\n\n\t\tinternal abstract int SplitLoop(IntPtr ptr, int h, int g, int k);\n\n\t\tinternal abstract int SplitVertex(IntPtr ptr, int h, int g);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolyhedronKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tinternal class PolyhedronKernel3_EEK : PolyhedronKernel3\n\t{\n\t\tinternal override string Name => \"EEK\";\n\n\t\tinternal static readonly PolyhedronKernel3 Instance = new PolyhedronKernel3_EEK();\n\n\t\tinternal override IntPtr Create()\n\t\t{\n\t\t\treturn Polyhedron3_EEK_Create();\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_Release(ptr);\n\t\t}\n\n\t\tinternal override int GetBuildStamp(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_GetBuildStamp(ptr);\n\t\t}\n\n\t\tinternal override void Clear(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_Clear(ptr);\n\t\t}\n\n\t\tinternal override void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges)\n\t\t{\n\t\t\tPolyhedron3_EEK_ClearIndexMaps(ptr, vertices, faces, edges);\n\t\t}\n\n\t\tinternal override void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces)\n\t\t{\n\t\t\tPolyhedron3_EEK_ClearNormalMaps(ptr, vertices, faces);\n\t\t}\n\n\t\tinternal override void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool force)\n\t\t{\n\t\t\tPolyhedron3_EEK_BuildIndices(ptr, vertices, faces, edges, force);\n\t\t}\n\n\t\tinternal override IntPtr Copy(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_Copy(ptr);\n\t\t}\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_VertexCount(ptr);\n\t\t}\n\n\t\tinternal override int FaceCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_FaceCount(ptr);\n\t\t}\n\n\t\tinternal override int HalfEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_HalfEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int BorderEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_BorderEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int BorderHalfEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_BorderHalfEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override bool IsValid(IntPtr ptr, int level)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsValid(ptr, level);\n\t\t}\n\n\t\tinternal override bool IsClosed(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsClosed(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureBivalent(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsPureBivalent(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureTrivalent(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsPureTrivalent(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureTriangle(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsPureTriangle(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureQuad(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_IsPureQuad(ptr);\n\t\t}\n\n\t\tinternal override Box3d GetBoundingBox(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_GetBoundingBox(ptr);\n\t\t}\n\n\t\tinternal override int MakeTetrahedron(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_MakeTetrahedron(ptr, p1, p2, p3, p4);\n\t\t}\n\n\t\tinternal override int MakeTriangle(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_MakeTriangle(ptr, p1, p2, p3);\n\t\t}\n\n\t\tinternal override Point3d GetPoint(IntPtr ptr, int index)\n        {\n\t\t\treturn Polyhedron3_EEK_GetPoint(ptr, index);\n        }\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void SetPoint(IntPtr ptr, int index, Point3d point)\n        {\n\t\t\tPolyhedron3_EEK_SetPoint(ptr, index, point);\n        }\n\n\t\tinternal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n\t\t\tPolyhedron3_EEK_SetPoints(ptr, points, count);\n        }\n\n\t\tinternal override bool GetSegment(IntPtr ptr, int index, out Segment3d segment)\n        {\n\t\t\treturn Polyhedron3_EEK_GetSegment(ptr, index, out segment);\n        }\n\n\t\tinternal override bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri)\n        {\n\t\t\treturn Polyhedron3_EEK_GetTriangle(ptr, index, out tri);\n        }\n\n\t\tinternal override bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert)\n        {\n\t\t\treturn Polyhedron3_EEK_GetVertex(ptr, index, out vert);\n        }\n\n\t\tinternal override bool GetFace(IntPtr ptr, int index, out MeshFace3 face)\n        {\n\t\t\treturn Polyhedron3_EEK_GetFace(ptr, index, out face);\n\t\t}\n\n\t\tinternal override bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge)\n        {\n\t\t\treturn Polyhedron3_EEK_GetHalfedge(ptr, index, out edge);\n\t\t}\n\n\t\tinternal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n        {\n\t\t\tPolyhedron3_EEK_GetSegments(ptr, segments, count);\n        }\n\n\t\tinternal override void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count)\n        {\n\t\t\tPolyhedron3_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n\t\tinternal override void GetVertices(IntPtr ptr, MeshVertex3[] vertices, int count)\n        {\n\t\t\tPolyhedron3_EEK_GetVertices(ptr, vertices, count);\n\t\t}\n\n\t\tinternal override void GetFaces(IntPtr ptr, MeshFace3[] faces, int count)\n        {\n\t\t\tPolyhedron3_EEK_GetFaces(ptr, faces, count);\n\t\t}\n\n\t\tinternal override void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edges, int count)\n        {\n\t\t\tPolyhedron3_EEK_GetHalfedges(ptr, edges, count);\n\t\t}\n\n\t\tinternal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n\t\t{\n\t\t\tPolyhedron3_EEK_Transform(ptr, matrix);\n\t\t}\n\n\t\tinternal override void InsideOut(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_InsideOut(ptr);\n\t\t}\n\n\t\tinternal override void Triangulate(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_Triangulate(ptr);\n\t\t}\n\n\t\tinternal override void NormalizeBorder(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_NormalizeBorder(ptr);\n\t\t}\n\n\t\tinternal override bool NormalizedBorderIsValid(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_NormalizedBorderIsValid(ptr);\n\t\t}\n\n\t\tinternal override BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_SideOfTriangleMesh(ptr, point);\n\t\t}\n\n\t\tinternal override bool DoesSelfIntersect(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_DoesSelfIntersect(ptr);\n\t\t}\n\n\t\tinternal override double Area(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_Area(ptr);\n\t\t}\n\n\t\tinternal override Point3d Centroid(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_Centroid(ptr);\n\t\t}\n\n\t\tinternal override double Volume(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_Volume(ptr);\n\t\t}\n\n\t\tinternal override bool DoesBoundAVolume(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_DoesBoundAVolume(ptr);\n\t\t}\n\n\t\tinternal override void BuildAABBTree(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_BuildAABBTree(ptr);\n\t\t}\n\n\t\tinternal override void ReleaseAABBTree(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_ReleaseAABBTree(ptr);\n\t\t}\n\n\t\tinternal override bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_DoIntersects(ptr, otherPtr, test_bounded_sides);\n\t\t}\n\n\t\tinternal override void ReadOFF(IntPtr ptr, string filename)\n\t\t{\n\t\t\tPolyhedron3_EEK_ReadOFF(ptr, filename);\n\t\t}\n\n\t\tinternal override void WriteOFF(IntPtr ptr, string filename)\n\t\t{\n\t\t\tPolyhedron3_EEK_WriteOFF(ptr, filename);\n\t\t}\n\n\t\tinternal override void GetCentroids(IntPtr ptr, Point3d[] points, int count)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetCentroids(ptr, points, count);\n\t\t}\n\n\t\tinternal override void ComputeVertexNormals(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_ComputeVertexNormals(ptr);\n\t\t}\n\n\t\tinternal override void ComputeFaceNormals(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EEK_ComputeFaceNormals(ptr);\n\t\t}\n\n\t\tinternal override void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetVertexNormals(ptr, normals, count);\n\t\t}\n\n\t\tinternal override void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetFaceNormals(ptr, normals, count);\n\t\t}\n\n\t\tinternal override void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int pointsCount, bool xz)\n\t\t{\n\t\t\tPolyhedron3_EEK_CreatePolygonMesh(ptr, points, pointsCount, xz);\n\t\t}\n\n\t\tinternal override PolygonalCount GetPolygonalCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_GetPolygonalCount(ptr);\n\t\t}\n\n\t\tinternal override PolygonalCount GetDualPolygonalCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EEK_GetDualPolygonalCount(ptr);\n\t\t}\n\n\t\tinternal override void CreatePolygonalMesh(IntPtr ptr,\n\t\t\tPoint3d[] points, int pointsCount,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EEK_CreatePolygonalMesh(ptr,\n\t\t\t\tpoints, pointsCount,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount, pentagons,\n\t\t\t\tpentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override void GetPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetPolygonalIndices(ptr,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount,\n\t\t\t\tpentagons, pentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override void GetDualPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EEK_GetDualPolygonalIndices(ptr,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount,\n\t\t\t\tpentagons, pentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override int AddFacetToBorder(IntPtr ptr, int h, int g)\n        {\n\t\t\treturn Polyhedron3_EEK_AddFacetToBorder(ptr, h, g);\n        }\n\n\t\tinternal override int AddVertexAndFacetToBorder(IntPtr ptr, int h, int g)\n        {\n\t\t\treturn Polyhedron3_EEK_AddVertexAndFacetToBorder(ptr, h, g);\n\n\t\t}\n\n\t\tinternal override int CreateCenterVertex(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_CreateCenterVertex(ptr, h);\n        }\n\n\t\tinternal override int EraseCenterVertex(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_EraseCenterVertex(ptr, h);\n        }\n\n\t\tinternal override bool EraseConnectedComponent(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_EraseConnectedComponent(ptr, h);\n        }\n\n\t\tinternal override bool EraseFacet(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_EraseFacet(ptr, h);\t\n        }\n\n\t\tinternal override int FillHole(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_FillHole(ptr, h);\t\n        }\n\n\t\tinternal override int FlipEdge(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_FlipEdge(ptr, h);\n        }\n\n\t\tinternal override int JoinFacet(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_JoinFacet(ptr, h);\t\n        }\n\n\t\tinternal override int JoinLoop(IntPtr ptr, int h, int g)\n        {\n\t\t\treturn Polyhedron3_EEK_JoinLoop(ptr, h, g);\t\n        }\n\n\t\tinternal override int JoinVertex(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_JoinVertex(ptr, h);\n        }\n\n\t\tinternal override int MakeHole(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_MakeHole(ptr, h);\t\n        }\n\n\t\tinternal override int SplitEdge(IntPtr ptr, int h)\n        {\n\t\t\treturn Polyhedron3_EEK_SplitEdge(ptr, h);\t\n        }\n\n\t\tinternal override int SplitFacet(IntPtr ptr, int h, int g)\n        {\n\t\t\treturn Polyhedron3_EEK_SplitFacet(ptr, h, g);\t\n        }\n\n\t\tinternal override int SplitLoop(IntPtr ptr, int h, int g, int k)\n        {\n\t\t\treturn Polyhedron3_EEK_SplitLoop(ptr, h, g, k);\n        }\n\n\t\tinternal override int SplitVertex(IntPtr ptr, int h, int g)\n        {\n\t\t\treturn Polyhedron3_EEK_SplitVertex(ptr, h, g);\n        }\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr Polyhedron3_EEK_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_GetBuildStamp(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_Clear(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool force);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr Polyhedron3_EEK_Copy(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_FaceCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_HalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_BorderEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_BorderHalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsValid(IntPtr ptr, int level);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsClosed(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsPureBivalent(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsPureTrivalent(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsPureTriangle(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_IsPureQuad(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Box3d Polyhedron3_EEK_GetBoundingBox(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_MakeTetrahedron(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_MakeTriangle(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Point3d Polyhedron3_EEK_GetPoint(IntPtr ptr, int index);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_GetSegment(IntPtr ptr, int index, [Out] out Segment3d segment);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_GetTriangle(IntPtr ptr, int index, [Out] out Triangle3d tri);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_GetVertex(IntPtr ptr, int index, [Out] out MeshVertex3 vert);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_GetFace(IntPtr ptr, int index, [Out] out MeshFace3 face);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_GetHalfedge(IntPtr ptr, int index, [Out] out MeshHalfedge3 edge);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetVertices(IntPtr ptr, [Out] MeshVertex3[] vertices, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetFaces(IntPtr ptr, [Out] MeshFace3[] faces, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetHalfedges(IntPtr ptr, [Out] MeshHalfedge3[] edges, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_InsideOut(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_Triangulate(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_NormalizeBorder(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_NormalizedBorderIsValid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern BOUNDED_SIDE Polyhedron3_EEK_SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_DoesSelfIntersect(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double Polyhedron3_EEK_Area(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Point3d Polyhedron3_EEK_Centroid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double Polyhedron3_EEK_Volume(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_DoesBoundAVolume(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_BuildAABBTree(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ReleaseAABBTree(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ReadOFF(IntPtr ptr, string filename);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_WriteOFF(IntPtr ptr, string filename);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetCentroids(IntPtr ptr, [Out] Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ComputeVertexNormals(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_ComputeFaceNormals(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetVertexNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetFaceNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_CreatePolygonMesh(IntPtr ptr, Point2d[] points, int pointsCount, bool xz);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern PolygonalCount Polyhedron3_EEK_GetPolygonalCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern PolygonalCount Polyhedron3_EEK_GetDualPolygonalCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_CreatePolygonalMesh(IntPtr ptr,\n\t\t\tPoint3d[] points, int pointsCount,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetPolygonalIndices(IntPtr ptr,\n\t\t\t[Out] int[] triangles, int triangleCount,\n\t\t\t[Out] int[] quads, int quadCount,\n\t\t\t[Out] int[] pentagons, int pentagonCount,\n\t\t\t[Out] int[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EEK_GetDualPolygonalIndices(IntPtr ptr,\n\t\t\t[Out] int[] triangles, int triangleCount,\n\t\t\t[Out] int[] quads, int quadCount,\n\t\t\t[Out] int[] pentagons, int pentagonCount,\n\t\t\t[Out] int[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_AddFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_AddVertexAndFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_CreateCenterVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_EraseCenterVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_EraseConnectedComponent(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EEK_EraseFacet(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_FillHole(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_FlipEdge(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_JoinFacet(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_JoinLoop(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_JoinVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_MakeHole(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_SplitEdge(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_SplitFacet(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_SplitLoop(IntPtr ptr, int h, int g, int k);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EEK_SplitVertex(IntPtr ptr, int h, int g);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/PolyhedronKernel3_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tinternal class PolyhedronKernel3_EIK : PolyhedronKernel3\n\t{\n\t\tinternal override string Name => \"EIK\";\n\n\t\tinternal static readonly PolyhedronKernel3 Instance = new PolyhedronKernel3_EIK();\n\n\t\tinternal override IntPtr Create()\n\t\t{\n\t\t\treturn Polyhedron3_EIK_Create();\n\t\t}\n\n\t\tinternal override void Release(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_Release(ptr);\n\t\t}\n\n\t\tinternal override int GetBuildStamp(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetBuildStamp(ptr);\n\t\t}\n\n\t\tinternal override void Clear(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_Clear(ptr);\n\t\t}\n\n\t\tinternal override void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges)\n\t\t{\n\t\t\tPolyhedron3_EIK_ClearIndexMaps(ptr, vertices, faces, edges);\n\t\t}\n\n\t\tinternal override void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces)\n\t\t{\n\t\t\tPolyhedron3_EIK_ClearNormalMaps(ptr, vertices, faces);\n\t\t}\n\n\t\tinternal override void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool force)\n\t\t{\n\t\t\tPolyhedron3_EIK_BuildIndices(ptr, vertices, faces, edges, force);\n\t\t}\n\n\t\tinternal override IntPtr Copy(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_Copy(ptr);\n\t\t}\n\n\t\tinternal override int VertexCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_VertexCount(ptr);\n\t\t}\n\n\t\tinternal override int FaceCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_FaceCount(ptr);\n\t\t}\n\n\t\tinternal override int HalfEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_HalfEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int BorderEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_BorderEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override int BorderHalfEdgeCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_BorderHalfEdgeCount(ptr);\n\t\t}\n\n\t\tinternal override bool IsValid(IntPtr ptr, int level)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsValid(ptr, level);\n\t\t}\n\n\t\tinternal override bool IsClosed(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsClosed(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureBivalent(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsPureBivalent(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureTrivalent(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsPureTrivalent(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureTriangle(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsPureTriangle(ptr);\n\t\t}\n\n\t\tinternal override bool IsPureQuad(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_IsPureQuad(ptr);\n\t\t}\n\n\t\tinternal override Box3d GetBoundingBox(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetBoundingBox(ptr);\n\t\t}\n\n\t\tinternal override int MakeTetrahedron(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_MakeTetrahedron(ptr, p1, p2, p3, p4);\n\t\t}\n\n\t\tinternal override int MakeTriangle(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_MakeTriangle(ptr, p1, p2, p3);\n\t\t}\n\n\t\tinternal override Point3d GetPoint(IntPtr ptr, int index)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetPoint(ptr, index);\n\t\t}\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override void SetPoint(IntPtr ptr, int index, Point3d point)\n\t\t{\n\t\t\tPolyhedron3_EIK_SetPoint(ptr, index, point);\n\t\t}\n\n\t\tinternal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_SetPoints(ptr, points, count);\n\t\t}\n\n\t\tinternal override bool GetSegment(IntPtr ptr, int index, out Segment3d segment)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetSegment(ptr, index, out segment);\n\t\t}\n\n\t\tinternal override bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetTriangle(ptr, index, out tri);\n\t\t}\n\n\t\tinternal override bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetVertex(ptr, index, out vert);\n\t\t}\n\n\t\tinternal override bool GetFace(IntPtr ptr, int index, out MeshFace3 face)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetFace(ptr, index, out face);\n\t\t}\n\n\t\tinternal override bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetHalfedge(ptr, index, out edge);\n\t\t}\n\n\t\tinternal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetSegments(ptr, segments, count);\n\t\t}\n\n\t\tinternal override void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetTriangles(ptr, triangles, count);\n\t\t}\n\n\t\tinternal override void GetVertices(IntPtr ptr, MeshVertex3[] vertices, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetVertices(ptr, vertices, count);\n\t\t}\n\n\t\tinternal override void GetFaces(IntPtr ptr, MeshFace3[] faces, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetFaces(ptr, faces, count);\n\t\t}\n\n\t\tinternal override void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edges, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetHalfedges(ptr, edges, count);\n\t\t}\n\n\t\tinternal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n\t\t{\n\t\t\tPolyhedron3_EIK_Transform(ptr, matrix);\n\t\t}\n\n\t\tinternal override void InsideOut(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_InsideOut(ptr);\n\t\t}\n\n\t\tinternal override void Triangulate(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_Triangulate(ptr);\n\t\t}\n\n\t\tinternal override void NormalizeBorder(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_NormalizeBorder(ptr);\n\t\t}\n\n\t\tinternal override bool NormalizedBorderIsValid(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_NormalizedBorderIsValid(ptr);\n\t\t}\n\n\t\tinternal override BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_SideOfTriangleMesh(ptr, point);\n\t\t}\n\n\t\tinternal override bool DoesSelfIntersect(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_DoesSelfIntersect(ptr);\n\t\t}\n\n\t\tinternal override double Area(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_Area(ptr);\n\t\t}\n\n\t\tinternal override Point3d Centroid(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_Centroid(ptr);\n\t\t}\n\n\t\tinternal override double Volume(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_Volume(ptr);\n\t\t}\n\n\t\tinternal override bool DoesBoundAVolume(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_DoesBoundAVolume(ptr);\n\t\t}\n\n\t\tinternal override void BuildAABBTree(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_BuildAABBTree(ptr);\n\t\t}\n\n\t\tinternal override void ReleaseAABBTree(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_ReleaseAABBTree(ptr);\n\t\t}\n\n\t\tinternal override bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_DoIntersects(ptr, otherPtr, test_bounded_sides);\n\t\t}\n\n\t\tinternal override void ReadOFF(IntPtr ptr, string filename)\n\t\t{\n\t\t\tPolyhedron3_EIK_ReadOFF(ptr, filename);\n\t\t}\n\n\t\tinternal override void WriteOFF(IntPtr ptr, string filename)\n\t\t{\n\t\t\tPolyhedron3_EIK_WriteOFF(ptr, filename);\n\t\t}\n\n\t\tinternal override void GetCentroids(IntPtr ptr, Point3d[] points, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetCentroids(ptr, points, count);\n\t\t}\n\n\t\tinternal override void ComputeVertexNormals(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_ComputeVertexNormals(ptr);\n\t\t}\n\n\t\tinternal override void ComputeFaceNormals(IntPtr ptr)\n\t\t{\n\t\t\tPolyhedron3_EIK_ComputeFaceNormals(ptr);\n\t\t}\n\n\t\tinternal override void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetVertexNormals(ptr, normals, count);\n\t\t}\n\n\t\tinternal override void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetFaceNormals(ptr, normals, count);\n\t\t}\n\n\t\tinternal override void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int pointsCount, bool xz)\n\t\t{\n\t\t\tPolyhedron3_EIK_CreatePolygonMesh(ptr, points, pointsCount, xz);\n\t\t}\n\n\t\tinternal override PolygonalCount GetPolygonalCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetPolygonalCount(ptr);\n\t\t}\n\n\t\tinternal override PolygonalCount GetDualPolygonalCount(IntPtr ptr)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_GetDualPolygonalCount(ptr);\n\t\t}\n\n\t\tinternal override void CreatePolygonalMesh(IntPtr ptr,\n\t\t\tPoint3d[] points, int pointsCount,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EIK_CreatePolygonalMesh(ptr,\n\t\t\t\tpoints, pointsCount,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount, pentagons,\n\t\t\t\tpentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override void GetPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetPolygonalIndices(ptr,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount,\n\t\t\t\tpentagons, pentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override void GetDualPolygonalIndices(IntPtr ptr,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount)\n\t\t{\n\t\t\tPolyhedron3_EIK_GetDualPolygonalIndices(ptr,\n\t\t\t\ttriangles, triangleCount,\n\t\t\t\tquads, quadCount,\n\t\t\t\tpentagons, pentagonCount,\n\t\t\t\thexagons, hexagonCount);\n\t\t}\n\n\t\tinternal override int AddFacetToBorder(IntPtr ptr, int h, int g)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_AddFacetToBorder(ptr, h, g);\n\t\t}\n\n\t\tinternal override int AddVertexAndFacetToBorder(IntPtr ptr, int h, int g)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_AddVertexAndFacetToBorder(ptr, h, g);\n\n\t\t}\n\n\t\tinternal override int CreateCenterVertex(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_CreateCenterVertex(ptr, h);\n\t\t}\n\n\t\tinternal override int EraseCenterVertex(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_EraseCenterVertex(ptr, h);\n\t\t}\n\n\t\tinternal override bool EraseConnectedComponent(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_EraseConnectedComponent(ptr, h);\n\t\t}\n\n\t\tinternal override bool EraseFacet(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_EraseFacet(ptr, h);\n\t\t}\n\n\t\tinternal override int FillHole(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_FillHole(ptr, h);\n\t\t}\n\n\t\tinternal override int FlipEdge(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_FlipEdge(ptr, h);\n\t\t}\n\n\t\tinternal override int JoinFacet(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_JoinFacet(ptr, h);\n\t\t}\n\n\t\tinternal override int JoinLoop(IntPtr ptr, int h, int g)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_JoinLoop(ptr, h, g);\n\t\t}\n\n\t\tinternal override int JoinVertex(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_JoinVertex(ptr, h);\n\t\t}\n\n\t\tinternal override int MakeHole(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_MakeHole(ptr, h);\n\t\t}\n\n\t\tinternal override int SplitEdge(IntPtr ptr, int h)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_SplitEdge(ptr, h);\n\t\t}\n\n\t\tinternal override int SplitFacet(IntPtr ptr, int h, int g)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_SplitFacet(ptr, h, g);\n\t\t}\n\n\t\tinternal override int SplitLoop(IntPtr ptr, int h, int g, int k)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_SplitLoop(ptr, h, g, k);\n\t\t}\n\n\t\tinternal override int SplitVertex(IntPtr ptr, int h, int g)\n\t\t{\n\t\t\treturn Polyhedron3_EIK_SplitVertex(ptr, h, g);\n\t\t}\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr Polyhedron3_EIK_Create();\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_Release(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_GetBuildStamp(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_Clear(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool force);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern IntPtr Polyhedron3_EIK_Copy(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_VertexCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_FaceCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_HalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_BorderEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_BorderHalfEdgeCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsValid(IntPtr ptr, int level);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsClosed(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsPureBivalent(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsPureTrivalent(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsPureTriangle(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_IsPureQuad(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Box3d Polyhedron3_EIK_GetBoundingBox(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_MakeTetrahedron(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_MakeTriangle(IntPtr ptr, Point3d p1, Point3d p2, Point3d p3);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Point3d Polyhedron3_EIK_GetPoint(IntPtr ptr, int index);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_GetSegment(IntPtr ptr, int index, [Out] out Segment3d segment);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_GetTriangle(IntPtr ptr, int index, [Out] out Triangle3d tri);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_GetVertex(IntPtr ptr, int index, [Out] out MeshVertex3 vert);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_GetFace(IntPtr ptr, int index, [Out] out MeshFace3 face);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_GetHalfedge(IntPtr ptr, int index, [Out] out MeshHalfedge3 edge);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetVertices(IntPtr ptr, [Out] MeshVertex3[] vertices, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetFaces(IntPtr ptr, [Out] MeshFace3[] faces, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetHalfedges(IntPtr ptr, [Out] MeshHalfedge3[] edges, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_InsideOut(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_Triangulate(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_NormalizeBorder(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_NormalizedBorderIsValid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern BOUNDED_SIDE Polyhedron3_EIK_SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_DoesSelfIntersect(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double Polyhedron3_EIK_Area(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern Point3d Polyhedron3_EIK_Centroid(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern double Polyhedron3_EIK_Volume(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_DoesBoundAVolume(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_BuildAABBTree(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ReleaseAABBTree(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ReadOFF(IntPtr ptr, string filename);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_WriteOFF(IntPtr ptr, string filename);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetCentroids(IntPtr ptr, [Out] Point3d[] points, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ComputeVertexNormals(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_ComputeFaceNormals(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetVertexNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetFaceNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_CreatePolygonMesh(IntPtr ptr, Point2d[] points, int pointsCount, bool xz);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern PolygonalCount Polyhedron3_EIK_GetPolygonalCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern PolygonalCount Polyhedron3_EIK_GetDualPolygonalCount(IntPtr ptr);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_CreatePolygonalMesh(IntPtr ptr,\n\t\t\tPoint3d[] points, int pointsCount,\n\t\t\tint[] triangles, int triangleCount,\n\t\t\tint[] quads, int quadCount,\n\t\t\tint[] pentagons, int pentagonCount,\n\t\t\tint[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetPolygonalIndices(IntPtr ptr,\n\t\t\t[Out] int[] triangles, int triangleCount,\n\t\t\t[Out] int[] quads, int quadCount,\n\t\t\t[Out] int[] pentagons, int pentagonCount,\n\t\t\t[Out] int[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern void Polyhedron3_EIK_GetDualPolygonalIndices(IntPtr ptr,\n\t\t\t[Out] int[] triangles, int triangleCount,\n\t\t\t[Out] int[] quads, int quadCount,\n\t\t\t[Out] int[] pentagons, int pentagonCount,\n\t\t\t[Out] int[] hexagons, int hexagonCount);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_AddFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_AddVertexAndFacetToBorder(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_CreateCenterVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_EraseCenterVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_EraseConnectedComponent(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern bool Polyhedron3_EIK_EraseFacet(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_FillHole(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_FlipEdge(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_JoinFacet(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_JoinLoop(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_JoinVertex(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_MakeHole(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_SplitEdge(IntPtr ptr, int h);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_SplitFacet(IntPtr ptr, int h, int g);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_SplitLoop(IntPtr ptr, int h, int g, int k);\n\n\t\t[DllImport(DLL_NAME, CallingConvention = CDECL)]\n\t\tprivate static extern int Polyhedron3_EIK_SplitVertex(IntPtr ptr, int h, int g);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/SurfaceMesh3.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNet.Polyhedra\n{\n\n\n    /// <summary>\n    /// This class is a data structure that can be used as halfedge data structure.\n    /// It is an alternative to the classes Polyhedron3.The main difference is that it is indexed based and not pointer based, \n    /// and that the mechanism for adding information to vertices, halfedges, edges, and faces is much simpler.\n    /// When elements are removed, they are only marked as removed, and a garbage collection function must be called to really remove them.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type</typeparam>\n    public sealed class SurfaceMesh3<K> : SurfaceMesh3 where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public SurfaceMesh3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct from points and triangle indices.\n        /// </summary>\n        public SurfaceMesh3(Point3d[] points, int[] triangles) : base(new K())\n        {\n            CreateMesh(points, triangles);\n        }\n\n        /// <summary>\n        /// Construct from points and polygon indices.\n        /// </summary>\n        public SurfaceMesh3(Point3d[] points, PolygonalIndices indices) : base(new K())\n        {\n            CreatePolygonalMesh(points, points.Length, indices);\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The surface meshes pointer.</param>\n        internal SurfaceMesh3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The mesh as a string.\n        /// </summary>\n        /// <returns>The mesh as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[SurfaceMesh3<{0}>: VertexCount={1}, HalfEdgeCount={2}, FaceCount={3}]\",\n                Kernel.Name, VertexCount, HalfedgeCount, FaceCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the mesh.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public SurfaceMesh3<K> Copy()\n        {\n            var ptr = Kernel.Copy(Ptr);\n            return new SurfaceMesh3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Subdive the mesh.\n        /// </summary>\n        /// <param name=\"iterations\">The number of iterations to perfrom.</param>\n        /// <param name=\"method\">The subdivision method.</param>\n        public override void Subdivide(int iterations, SUBDIVISION_METHOD method = SUBDIVISION_METHOD.SQRT3)\n        {\n            try\n            {\n                var sub = SubdivisionSurface<K>.Instance;\n                sub.Subdivide(method, this, iterations);\n                IsUpdated = false;\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Simplify the polyhedra.\n        /// </summary>\n        /// <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        public override void Simplify(double stop_ratio)\n        {\n            try\n            {\n                var sim = SurfaceSimplification<K>.Instance;\n                sim.Simplify(this, stop_ratio);\n                IsUpdated = false;\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices.</returns>\n        public override int Refine(double density_control_factor = MathUtil.SQRT2_64)\n        {\n            try\n            {\n                IsUpdated = false;\n                var meshing = MeshProcessingMeshing<K>.Instance;\n                return meshing.Refine(this, density_control_factor);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"oriente\">The orientation method.</param>\n        public override void Orient(ORIENTATE oriente)\n        {\n            try\n            {\n                IsUpdated = false;\n                var orient = MeshProcessingOrientation<K>.Instance;\n                orient.Orient(oriente, this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Reverses the orientation of the vertices in each face.\n        /// </summary>\n        public override void ReverseFaceOrientation()\n        {\n            Orient(ORIENTATE.REVERSE_FACE_ORIENTATIONS);\n        }\n\n        /// <summary>\n        /// Split the mesh into its unconnected components.\n        /// </summary>\n        /// <param name=\"results\">Each unconnect component as a new mesh.</param>\n        public void Split(List<SurfaceMesh3<K>> results)\n        {\n            try\n            {\n                var con = MeshProcessingConnections<K>.Instance;\n                con.SplitUnconnectedComponents(this, results);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n        }\n\n        /// <summary>\n        /// Remove all unconnected compontents except the largest.\n        /// Largest is defined by the face count.\n        /// </summary>\n        /// <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n        /// <returns>The number of components removed in the mesh.</returns>\n        public override int KeepLargest(int num_components_to_keep = 1)\n        {\n            try\n            {\n                var con = MeshProcessingConnections<K>.Instance;\n                return con.KeepLargestComponents(this, num_components_to_keep);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Copy the other mesh to this one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public void Join(SurfaceMesh3<K> other)\n        {\n            IsUpdated = false;\n            Kernel.Join(Ptr, other.Ptr);\n        }\n\n        /// <summary>\n        /// Create a mesh consisting of one polygon face.\n        /// </summary>\n        /// <param name=\"polygon\">The faces polygon.</param>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        /// <exception cref=\"InvalidOperationException\">Thrown if the polygon is not simple.</exception>\n        public void CreatePolygonMesh(Polygon2<K> polygon, bool xz)\n        {\n            if (!polygon.IsSimple)\n                throw new InvalidOperationException(\"Polygon must be simple to convert to mesh mesh.\");\n\n            var points = polygon.ToArray();\n            CreatePolygonMesh(points, points.Length, xz);\n        }\n\n        /*\n        /// <summary>\n        /// Create the dual mesh where each face becomes a vertex\n        /// and each vertex becomes a face.\n        /// Must be a valid closed mesh to create the dual.\n        /// </summary>\n        /// <returns>The duel mesh.</returns>\n        /// <exception cref=\"InvalidOperationException\">Is thrown if the mesh is not a valid closed mesh.</exception>\n        public SurfaceMesh3<K> CreateDualMesh()\n        {\n            if (!IsValidClosedMesh)\n                throw new InvalidOperationException(\"Mesh must be a valid closed mesh to create a dual mesh.\");\n\n            int faceCount = FaceCount;\n            var points = new Point3d[faceCount];\n            GetCentroids(points, faceCount);\n\n            var indices = GetDualPolygonalIndices();\n  \n            var dual = new SurfaceMesh3<K>();\n            dual.CreatePolygonalMesh(points, points.Length, indices);\n\n            return dual;\n        }\n        */\n\n        /// <summary>\n        /// Convert to a polyhedron mesh.\n        /// </summary>\n        /// <returns>The polyhedron mesh.</returns>\n        public Polyhedron3<K> ToPolyhedronMesh()\n        {\n            var points = new Point3d[VertexCount];\n            GetPoints(points, points.Length);\n\n            var indices = GetPolygonalIndices();\n\n            var mesh = new Polyhedron3<K>();\n            mesh.CreatePolygonalMesh(points, points.Length, indices);\n\n            return mesh;\n        }\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh\n        /// </summary>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public override MinMaxAvg FindMinMaxAvgEdgeLength()\n        {\n            try\n            {\n                var fea = MeshProcessingFeatures<K>.Instance;\n                return fea.EdgeLengthMinMaxAvg(this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return new MinMaxAvg();\n        }\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh\n        /// </summary>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public override MinMaxAvg FindMinMaxAvgFaceArea()\n        {\n            try\n            {\n                var fea = MeshProcessingFeatures<K>.Instance;\n                return fea.FaceAreaMinMaxAvg(this);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return new MinMaxAvg();\n        }\n\n        /// <summary>\n        /// Locate the face the rays hits.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <returns>The hit result.</returns>\n        public override MeshHitResult LocateFace(Ray3d ray)\n        {\n            try\n            {\n                var locate = MeshProcessingLocate<K>.Instance;\n                return locate.LocateFace(this, ray);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return MeshHitResult.NoHitResult;\n        }\n\n        /// <summary>\n        /// Find the face closest to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The hit result.</returns>\n        public override MeshHitResult ClosestFace(Point3d point)\n        {\n            try\n            {\n                var locate = MeshProcessingLocate<K>.Instance;\n                return locate.ClosestFace(this, point);\n            }\n            catch (NotImplementedException) { }\n            catch (NotSupportedException) { };\n\n            return MeshHitResult.NoHitResult;\n        }\n\n    }\n\n    /// <summary>\n    /// The surface mesh abstract base class.\n    /// </summary>\n    public abstract class SurfaceMesh3 : CGALObject, IMesh\n    {\n        /// <summary>\n        /// Cached values found by running Update.\n        /// </summary>\n        private bool m_isValid;\n        private bool m_isClosed;\n        private bool m_isTriangle;\n        private bool m_isQuad;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private SurfaceMesh3()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct mesh with the kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The kernel</param>\n        internal SurfaceMesh3(CGALKernel kernel)\n        {\n            Kernel = kernel.SurfaceMeshKernel3;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The surface meshes kernel.</param>\n        /// <param name=\"ptr\">The surface meshes pointer.</param>\n        internal SurfaceMesh3(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.SurfaceMeshKernel3;\n        }\n\n        /// <summary>\n        /// The meshes kernel type.\n        /// </summary>\n        protected private SurfaceMeshKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// The number of vertices in the mesh.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// The number of half edges in the mesh.\n        /// </summary>\n        public int HalfedgeCount => Kernel.HalfedgeCount(Ptr);\n\n        /// <summary>\n        /// The number of edges in the mesh.\n        /// </summary>\n        public int EdgeCount => Kernel.EdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of faces in the mesh.\n        /// </summary>\n        public int FaceCount => Kernel.FaceCount(Ptr);\n\n        /// <summary>\n        /// The number of border edges.\n        /// </summary>\n        public int BorderEdgeCount => Kernel.BorderEdgeCount(Ptr);\n\n        /// <summary>\n        /// The current build stamp.\n        /// </summary>\n        public int BuildStamp => Kernel.GetBuildStamp(Ptr);\n\n        /// <summary>\n        /// The number of vertices currenly maked to be removed\n        /// but have not. Calling collect garbage will remove them.\n        /// </summary>\n        /// <returns>The number of vertices marked to be removed.</returns>\n        public int RemovedVertexCount => Kernel.RemovedVertexCount(Ptr);\n\n        /// <summary>\n        /// The number of halfedges currenly maked to be removed\n        /// but have not. Calling collect garbage will remove them.\n        /// </summary>\n        /// <returns>The number of half edges marked to be removed.</returns>\n        public int RemovedHalfedgeCount => Kernel.RemovedHalfedgeCount(Ptr);\n\n        /// <summary>\n        /// The number of edges currenly maked to be removed\n        /// but have not. Calling collect garbage will remove them.\n        /// </summary>\n        /// <returns>The number of edges marked to be removed.</returns>\n        public int RemovedEdgeCount => Kernel.RemovedEdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of faces currenly maked to be removed\n        /// but have not. Calling collect garbage will remove them.\n        /// </summary>\n        /// <returns>The number of face marked to be removed.</returns>\n        public int RemovedFaceCount => Kernel.RemovedFaceCount(Ptr);\n\n        /// <summary>\n        /// Returns true if the meshl surface is combinatorially consistent.\n        /// Must be a valid mesh to check many other properties.\n        /// </summary>\n        public bool IsValid\n        {\n            get\n            {\n                Update();\n                return m_isValid;\n            }\n            protected set\n            {\n                m_isValid = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if there are no border edges.\n        /// </summary>\n        public bool IsClosed\n        {\n            get\n            {\n                Update();\n                return m_isClosed;\n            }\n            protected set\n            {\n                m_isClosed = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if all faces are triangles.\n        /// </summary>\n        public bool IsTriangle\n        {\n            get\n            {\n                Update();\n                return m_isTriangle;\n            }\n            protected set\n            {\n                m_isTriangle = value;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if all faces are quads.\n        /// </summary>\n        public bool IsQuad\n        {\n            get\n            {\n                Update();\n                return m_isQuad;\n            }\n            protected set\n            {\n                m_isQuad = value;\n            }\n        }\n\n        /// <summary>\n        /// Is the mesh a valid triangle mesh.\n        /// </summary>\n        public bool IsValidTriangleMesh => IsValid && IsTriangle;\n\n        /// <summary>\n        /// Is the mesh a valid closed mesh.\n        /// </summary>\n        public bool IsValidClosedMesh => IsValid && IsClosed;\n\n        /// <summary>\n        /// Is the mesh a valid closed triangle mesh.\n        /// </summary>\n        public bool IsValidClosedTriangleMesh => IsValid && IsClosed && IsTriangle;\n\n        /// <summary>\n        /// Has the update function been called.\n        /// </summary>\n        protected bool IsUpdated { get; set; }\n\n        /// <summary>\n        /// Mark the mesh as needing to be updated.\n        /// </summary>\n        public void SetIsUpdatedToFalse()\n        {\n            IsUpdated = false;\n        }\n\n        /// <summary>\n        /// Clear the mesh.\n        /// </summary>\n        public void Clear()\n        {\n            IsUpdated = false;\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// Clear the index maps.\n        /// The index maps are used to access the meshes elemnts by index.\n        /// They are automaticaly created when a elements is accessed\n        /// be a function requiring it.\n        /// </summary>\n        /// <param name=\"vertices\">True to clear the vertex index map.</param>\n        /// <param name=\"faces\">True to clear the face index map.</param>\n        /// <param name=\"edges\">True to clear the edges index map.</param>\n        /// <param name=\"halfedges\">True to clear the halfedges index map.</param>\n        public void ClearIndexMaps(bool vertices, bool faces, bool edges, bool halfedges)\n        {\n            Kernel.ClearIndexMaps(Ptr, vertices, faces, edges, halfedges);\n        }\n\n        /// <summary>\n        /// Clear the normal maps.\n        /// </summary>\n        /// <param name=\"vertices\">True to clear the vertex normal map.</param>\n        /// <param name=\"faces\">True to clear the face normal map</param>\n        public void ClearNormalMaps(bool vertices, bool faces)\n        {\n            Kernel.ClearNormalMaps(Ptr, vertices, faces);\n        }\n\n        /// <summary>\n        /// Clear the property maps.\n        /// </summary>\n        public void ClearProperyMaps()\n        {\n            Kernel.ClearProperyMaps(Ptr);\n        }\n\n        /// <summary>\n        /// Build the index maps.\n        /// The index maps are used to access the meshes elemnts by index.\n        /// They are automaticaly created when a elements is accessed\n        /// be a function requiring it but can be create ahead of time.\n        /// </summary>\n        /// <param name=\"vertices\">True to build the vertex index maps.</param>\n        /// <param name=\"faces\">True to build the face index maps.</param>\n        /// <param name=\"edges\">True to build the edge index maps.</param>\n        /// <param name=\"halfedges\">True to build the halfedge index maps.</param>\n        /// <param name=\"force\">The index maps wont be build if the mesh knows they are already built and upto date.\n        /// Setting force to true will build them always.</param>\n        public void BuildIndices(bool vertices, bool faces, bool edges, bool halfedges, bool force = false)\n        {\n            Kernel.BuildIndices(Ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"vertices\"></param>\n        /// <param name=\"faces\"></param>\n        /// <param name=\"edges\"></param>\n        /// <param name=\"halfedges\"></param>\n        /// <param name=\"force\"></param>\n        internal void PrintIndices(bool vertices, bool faces, bool edges, bool halfedges, bool force = false)\n        {\n            Kernel.PrintIndices(Ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        /// <summary>\n        /// Adds a vertex to the mesh.\n        /// </summary>\n        /// <param name=\"point\">The vertices position</param>\n        /// <returns>The vertices index in the mesh.</returns>\n        public int AddVertex(Point3d point)\n        {\n            IsUpdated = false;\n            return Kernel.AddVertex(Ptr, point);\n        }\n\n        /// <summary>\n        /// Adds a edge between the two vertices.\n        /// </summary>\n        /// <param name=\"v0\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v1\">The index of the vertex in the mesh.</param>\n        /// <returns>The index of the edge in the mesh.</returns>\n        public int AddEdge(int v0, int v1)\n        {\n            IsUpdated = false;\n            return Kernel.AddEdge(Ptr, v0, v1);\n        }\n\n        /// <summary>\n        /// Adds a triangle face to the mesh.\n        /// </summary>\n        /// <param name=\"v0\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v1\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v2\">The index of the vertex in the mesh.</param>\n        /// <returns>The index of the face in the mesh.</returns>\n        public int AddTriangle(int v0, int v1, int v2)\n        {\n            IsUpdated = false;\n            return Kernel.AddTriangle(Ptr, v0, v1, v2);\n        }\n\n        /// <summary>\n        /// Adds a quad face to the mesh.\n        /// </summary>\n        /// <param name=\"v0\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v1\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v2\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v3\">The index of the vertex in the mesh.</param>\n        /// <returns>The index of the face in the mesh.</returns>\n        public int AddQuad(int v0, int v1, int v2, int v3)\n        {\n            IsUpdated = false;\n            return Kernel.AddQuad(Ptr, v0, v1, v2, v3);\n        }\n\n        /// <summary>\n        /// Adds a pentagon face to the mesh.\n        /// </summary>\n        /// <param name=\"v0\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v1\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v2\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v3\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v4\">The index of the vertex in the mesh.</param>\n        /// <returns>The index of the face in the mesh.</returns>\n        public int AddPentagon(int v0, int v1, int v2, int v3, int v4)\n        {\n            IsUpdated = false;\n            return Kernel.AddPentagon(Ptr, v0, v1, v2, v3, v4);\n        }\n\n        /// <summary>\n        /// Adds a hexagon face to the mesh.\n        /// </summary>\n        /// <param name=\"v0\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v1\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v2\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v3\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v4\">The index of the vertex in the mesh.</param>\n        /// <param name=\"v5\">The index of the vertex in the mesh.</param>\n        /// <returns>The index of the face in the mesh.</returns>\n        public int AddHexagon(int v0, int v1, int v2, int v3, int v4, int v5)\n        {\n            IsUpdated = false;\n            return Kernel.AddHexagon(Ptr, v0, v1, v2, v3, v4, v5);\n        }\n\n        /// <summary>\n        /// Add a polygon face to the mesh.\n        /// </summary>\n        /// <param name=\"indices\">The indices of the points in the mesm.</param>\n        /// <param name=\"count\">The indices array length.</param>\n        /// <returns>The index of the face in the mesh.</returns>\n        public int AddPolygon(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            IsUpdated = false;\n            return Kernel.AddFace(Ptr, indices, count);\n        }\n\n        /// <summary>\n        /// Checks if any vertices, halfedges, edges, or faces are marked as removed.\n        /// </summary>\n        /// <returns></returns>\n        public bool HasGarbage => Kernel.HasGarbage(Ptr);\n\n        /// <summary>\n        /// Really removes vertices, halfedges, edges, and faces which are marked removed.\n        /// By garbage collecting elements get new indices. In case you store indices in an \n        /// auxiliary data structure or in a property these indices are potentially no \n        /// longer refering to the right elements.\n        /// </summary>\n        public void CollectGarbage()\n        {\n            Kernel.CollectGarbage(Ptr);\n        }\n\n        /// <summary>\n        /// Controls the recycling or not of simplices previously marked as removed \n        /// upon addition of new elements.\n        /// When set to true (default value), new elements are first picked in the \n        /// garbage(if any) while if set to false only new elements are created.\n        /// </summary>\n        /// <returns></returns>\n        public bool DoesRecycleGarbage\n        {\n            get { return Kernel.DoesRecycleGarbage(Ptr); }\n            set { Kernel.SetRecycleGarbage(Ptr, value); }\n        }\n\n        /// <summary>\n        /// Array accessor for the polygon.\n        /// Getting a point wraps around the polygon.\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public Point3d this[int i]\n        {\n            get => GetPoint(i);\n            set => SetPoint(i, value);\n        }\n\n        /// <summary>\n        /// Get the vertices point.\n        /// </summary>\n        /// <param name=\"index\">The vertex index in the mesh.</param>\n        /// <returns>The vertices point.</returns>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        public Point3d GetPoint(int index)\n        {\n            if(index < 0 || index >= VertexCount) \n                    throw new ArgumentOutOfRangeException(\"Index must be a number >= 0 and < count\");\n\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the points in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The array to copy points into.</param>\n        /// <param name=\"count\">The point array length.</param>\n        public void GetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Set the point at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        /// <param name=\"point\">The points</param>am>\n        /// <exception cref=\"ArgumentOutOfRangeException\">If index is out of range.</exception>\n        public void SetPoint(int index, Point3d point)\n        {\n            if (index < 0 || index >= VertexCount)\n                throw new ArgumentOutOfRangeException(\"Index must be a number >= 0 and < count\");\n\n\n            IsUpdated = false;\n            Kernel.SetPoint(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Set the points from a array.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The point arrays length.</param>\n        public void SetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            IsUpdated = false;\n            Kernel.SetPoints(Ptr, points, count);\n        }\n        /// <summary>\n        /// Get a halfedges segment.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"segment\">The segment.</param>\n        /// <returns>True if halfedge found.</returns>\n        public bool GetSegment(int index, out Segment3d segment)\n        {\n            return Kernel.GetSegment(Ptr, index, out segment);\n        }\n\n        /// <summary>\n        /// Get a segment for  each halfedge in the mesh.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The segment array length.</param>\n        public void GetSegments(Segment3d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get the faces triangle. \n        /// Presumes face is a triangle with no checks.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"triangle\">The faces triangle</param>\n        /// <returns></returns>\n        public bool GetTriangle(int index, out Triangle3d triangle)\n        {\n            return Kernel.GetTriangle(Ptr, index, out triangle);\n        }\n\n        /// <summary>\n        /// Get a triangle for each face in the mesh.\n        /// Presumes all faces are triangles with no checks.\n        /// </summary>\n        /// <param name=\"triangles\">The trainagle array.</param>\n        /// <param name=\"count\">The traingle  arrays length.</param>\n        public void GetTriangles(Triangle3d[] triangles, int count)\n        {\n            ErrorUtil.CheckArray(triangles, count);\n            Kernel.GetTriangles(Ptr, triangles, count);\n        }\n\n        /// <summary>\n        /// Get the mesh vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool GetVertex(int index, out MeshVertex3 vertex)\n        {\n            return Kernel.GetVertex(Ptr, index, out vertex);\n        }\n\n        /// <summary>\n        /// Get the mesh vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <returns>The vertex.</returns>\n        public MeshVertex3 GetVertex(int index)\n        {\n            Kernel.GetVertex(Ptr, index, out MeshVertex3 vertex);\n            return vertex;\n        }\n\n        /// <summary>\n        /// Get the vertices in the mesh.\n        /// </summary>\n        /// <param name=\"vertices\">The vertex array.</param>\n        /// <param name=\"count\">The vertex array length.</param>\n        public void GetVertices(MeshVertex3[] vertices, int count)\n        {\n            ErrorUtil.CheckArray(vertices, count);\n            Kernel.GetVertices(Ptr, vertices, count);\n        }\n\n        /// <summary>\n        /// Get the mesh face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <param name=\"face\">The face.</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetFace(int index, out MeshFace3 face)\n        {\n            return Kernel.GetFace(Ptr, index, out face);\n        }\n\n        /// <summary>\n        /// Get the mesh face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <returns>The face.</returns>\n        public MeshFace3 GetFace(int index)\n        {\n            Kernel.GetFace(Ptr, index, out MeshFace3 face);\n            return face;\n        }\n\n        /// <summary>\n        /// Get the faces in the mesh.\n        /// </summary>\n        /// <param name=\"faces\">The face array.</param>\n        /// <param name=\"count\">The face array length.</param>\n        public void GetFaces(MeshFace3[] faces, int count)\n        {\n            ErrorUtil.CheckArray(faces, count);\n            Kernel.GetFaces(Ptr, faces, count);\n        }\n\n        /// <summary>\n        /// Get the mesh halfedge.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <param name=\"halfedge\">The halfedge.</param>\n        /// <returns>True if the halfedge was found.</returns>\n        public bool GetHalfedge(int index, out MeshHalfedge3 halfedge)\n        {\n            return Kernel.GetHalfedge(Ptr, index, out halfedge);\n        }\n\n        /// <summary>\n        /// Get the mesh halfedge.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <returns>THe healfedge.</returns>\n        public MeshHalfedge3 GetHalfedge(int index)\n        {\n            Kernel.GetHalfedge(Ptr, index, out MeshHalfedge3 halfedge);\n            return halfedge;\n        }\n\n        /// <summary>\n        /// Get the halfedges in the mesh.\n        /// </summary>\n        /// <param name=\"halfedges\">The halfedge array.</param>\n        /// <param name=\"count\">The halfedge array length.</param>\n        public void GetHalfedges(MeshHalfedge3[] halfedges, int count)\n        {\n            ErrorUtil.CheckArray(halfedges, count);\n            Kernel.GetHalfedges(Ptr, halfedges, count);\n        }\n\n        /// <summary>\n        /// Returns the number of incident halfedges of vertex.\n        /// </summary>\n        /// <param name=\"vertex\">The index of the vertex in the mesh.</param>\n        /// <returns>Returns the number of incident halfedges of vertex.</returns>\n        public int VertexDegree(int vertex)\n        {\n            return Kernel.VertexDegree(Ptr, vertex);\n        }\n\n        /// <summary>\n        /// Returns the number of incident halfedges of face.\n        /// </summary>\n        /// <param name=\"face\">The index of the face in the mesh.</param>\n        /// <returns>Returns the number of incident halfedges of face.</returns>\n        public int FaceDegree(int face)\n        {\n            return Kernel.FaceDegree(Ptr, face);\n        }\n\n        /// <summary>\n        /// Returns whether vertex is isolated.\n        /// </summary>\n        /// <param name=\"vertex\">The index of the vertex in the mesh.</param>\n        /// <returns>Returns whether vertex is isolated.</returns>\n        public bool VertexIsIsolated(int vertex)\n        {\n            return Kernel.VertexIsIsolated(Ptr, vertex);\n        }\n\n        /// <summary>\n        /// Returns whether vertex is a border vertex.\n        /// If the data contained in the Surface_mesh is not\n        /// a 2-manifold, then this operation is not \n        /// guaranteed to return the right result.\n        /// </summary>\n        /// <param name=\"vertex\">he index of the vertex in the mesh.</param>\n        /// <param name=\"check_all_incident_halfedges\">With the default value for \n        /// check_all_incident_halfedges the function iteratates over the incident \n        /// halfedges. With check_all_incident_halfedges == false the function \n        /// returns true, if the incident halfedge associated to vertex is a\n        /// border halfedge, or if the vertex is isolated.</param>\n        /// <returns>Returns whether vertex is a border vertex.</returns>\n        public bool VertexIsBorder(int vertex, bool check_all_incident_halfedges = true)\n        {\n            return Kernel.VertexIsBorder(Ptr, vertex, check_all_incident_halfedges);\n        }\n\n        /// <summary>\n        /// Returns whether edge is a border edge, i.e., if any of its two halfedges is a border halfedge.\n        /// </summary>\n        /// <param name=\"edge\">The index of the edge in the mesh.</param>\n        /// <returns>Returns whether edge is a border edge.</returns>\n        public bool EdgeIsBorder(int edge)\n        {\n            return Kernel.EdgeIsBorder(Ptr, edge);\n        }\n\n        /// <summary>\n        /// Returns the next halfedge within the incident face.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>Returns the next halfedge within the incident face.</returns>\n        public int NextHalfedge(int halfedge)\n        {\n            return  Kernel.NextHalfedge(Ptr, halfedge);\n        }\n\n        /// <summary>\n        /// Returns the previous halfedge within the incident face.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>Returns the previous halfedge within the incident face.</returns>\n        public int PreviousHalfedge(int halfedge)\n        {\n            return Kernel.PreviousHalfedge(Ptr, halfedge);\n        }\n\n        /// <summary>\n        /// Returns the opposite halfedge of halfedge.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>Returns the opposite halfedge of halfedge.</returns>\n        public int OppositeHalfedge(int halfedge)\n        {\n            return Kernel.OppositeHalfedge(Ptr, halfedge);   \n        }\n\n        /// <summary>\n        /// Returns the vertex the halfedge emanates from.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>Returns the vertex the halfedge emanates from.</returns>\n        public int SourceVertex(int halfedge)\n        {\n            return Kernel.SourceVertex(Ptr, halfedge);\n        }\n\n        /// <summary>\n        /// Returns the vertex the halfedge points to.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>Returns the vertex the halfedge points to.</returns>\n        public int TargetVertex(int halfedge)\n        {\n            return Kernel.TargetVertex(Ptr, halfedge);\n        }\n\n        /// <summary>\n        /// Removes vertex from the halfedge data structure without adjusting anything.\n        /// </summary>\n        /// <param name=\"vertex\">The index of the vertex in the mesh.</param>\n        /// <returns>True if face removed.</returns>\n        public bool RemoveVertex(int vertex)\n        {\n            IsUpdated = false;\n            return Kernel.RemoveVertex(Ptr, vertex);\n        }\n\n        /// <summary>\n        /// Removes the two halfedges corresponding to edge from the halfedge\n        /// data structure without adjusting anything.\n        /// </summary>\n        /// <param name=\"edge\">The index of the edge in the mesh.</param>\n        /// <returns>True if face removed.</returns>\n        public bool RemoveEdge(int edge)\n        {\n            IsUpdated = false;\n            return Kernel.RemoveEdge(Ptr, edge);\n        }\n\n        /// <summary>\n        /// Removes face from the halfedge data structure without adjusting anything.\n        /// </summary>\n        /// <param name=\"face\">The index of the face in the mesh.</param>\n        /// <returns>True if face removed.</returns>\n        public bool RemoveFace(int face)\n        {\n            IsUpdated = false;\n            return Kernel.RemoveFace(Ptr, face);\n        }\n\n        /// <summary>\n        /// Has this vertex been marked to be removed.\n        /// </summary>\n        /// <param name=\"index\">The vertices index in the mesh.</param>\n        /// <returns>Has this vertex been marked to be removed.</returns>\n        public bool IsVertexRemoved(int index)\n        {\n            return Kernel.IsVertexRemoved(Ptr, index);\n        }\n\n        /// <summary>\n        /// Has this face been marked to be removed.\n        /// </summary>\n        /// <param name=\"index\">The faces index in the mesh.</param>\n        /// <returns>Has this face been marked to be removed.</returns>\n        public bool IsFaceRemoved(int index)\n        {\n            return Kernel.IsFaceRemoved(Ptr, index);\n        }\n\n        /// <summary>\n        /// Has this halfedge been marked to be removed.\n        /// </summary>\n        /// <param name=\"index\">The halfedge index in the mesh.</param>\n        /// <returns>Has this halfedge been marked to be removed.</returns>\n        public bool IsHalfedgeRemoved(int index)\n        {\n            return Kernel.IsHalfedgeRemoved(Ptr, index);\n        }\n\n        /// <summary>\n        /// Has this edge been marked to be removed.\n        /// </summary>\n        /// <param name=\"index\">The edges index in the mesh.</param>\n        /// <returns>Has this edge been marked to be removed.</returns>\n        public bool IsEdgeRemoved(int index)\n        {\n            return Kernel.IsEdgeRemoved(Ptr, index);\n        }\n\n        /// <summary>\n        /// Performs a validity check on a single vertex.\n        /// </summary>\n        /// <param name=\"vertex\">The index of the vertex in the mesh.</param>\n        /// <returns>True if valid.</returns>\n        public bool IsVertexValid(int vertex)\n        {\n            return Kernel.IsVertexValid(Ptr, vertex);\n        }\n\n        /// <summary>\n        /// Performs a validity check on a single edge.\n        /// </summary>\n        /// <param name=\"edge\">The index of the edge in the mesh.</param>\n        /// <returns>True if valid.</returns>\n        public bool IsEdgeValid(int edge)\n        {\n            return  Kernel.IsEdgeValid(Ptr, edge);\n        }\n\n        /// <summary>\n        /// Performs a validity check on a single halfedge.\n        /// </summary>\n        /// <param name=\"halfedge\">The index of the halfedge in the mesh.</param>\n        /// <returns>True if valid.</returns>\n        public bool IsHalfedgeValid(int halfedge)\n        {\n            return  Kernel.IsHalfedgeValid(Ptr, halfedge);\n        }\n\n        /// <summary>\n        /// Performs a validity check on a single face.\n        /// </summary>\n        /// <param name=\"face\">The index of the face in the mesh.</param>\n        /// <returns>True if valid.</returns>\n        public bool IsFaceValid(int face)\n        {\n            return Kernel.IsFaceValid(Ptr, face);\n        }\n\n        /// <summary>\n        /// Translate each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point3d translation)\n        {\n            IsUpdated = false;\n            var m = Matrix4x4d.Translate(translation);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Rotate each point in the mesh.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Quaternion3d rotation)\n        {\n            IsUpdated = false;\n            var m = rotation.ToMatrix4x4d();\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Scale each point in the mesh.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(Point3d scale)\n        {\n            IsUpdated = false;\n            var m = Matrix4x4d.Scale(scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Transform each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point3d translation, Quaternion3d rotation, Point3d scale)\n        {\n            IsUpdated = false;\n            var m = Matrix4x4d.TranslateRotateScale(translation, rotation, scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Create a mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        public void CreateMesh(Point3d[] points, int[] triangles, int[] quads = null)\n        {\n            bool hasTriangles = triangles != null && triangles.Length > 0;\n            bool hasQuads = quads != null && quads.Length > 0;\n\n            if (hasTriangles && hasQuads)\n                CreateTriangleQuadMesh(points, points.Length, triangles, triangles.Length, quads, quads.Length);\n            else if (hasTriangles)\n                CreateTriangleMesh(points, points.Length, triangles, triangles.Length);\n            else if (hasQuads)\n                CreateQuadMesh(points, points.Length, quads, quads.Length);\n        }\n\n        /// <summary>\n        /// Create a triangle mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        public void CreateTriangleMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n            ErrorUtil.CheckArray(points, pointCount);\n            ErrorUtil.CheckArray(indices, indexCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointCount, indices, indexCount, null, 0, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a quad mesh from the points and indices.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointCount\">The point arrays length.</param>\n        /// <param name=\"indices\">The meshes trinagles as a index array.</param>\n        /// <param name=\"indexCount\">The indices array length.</param>\n        public void CreateQuadMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n            ErrorUtil.CheckArray(points, pointCount);\n            ErrorUtil.CheckArray(indices, indexCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointCount, null, 0, indices, indexCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a mesh with quads and triangles.\n        /// </summary>\n        /// <param name=\"points\">The meshes points.</param>\n        /// <param name=\"pointsCount\">The point array length.</param>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"triangleCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void CreateTriangleQuadMesh(Point3d[] points, int pointsCount, int[] triangles, int triangleCount, int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(points, pointsCount);\n            ErrorUtil.CheckArray(triangles, triangleCount);\n            ErrorUtil.CheckArray(quads, quadsCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointsCount, triangles, triangleCount, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Create a mesh with riangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <param name=\"points\">The meshs points.</param>\n        /// <param name=\"pointsCount\">The length of the point array.</param>\n        /// <param name=\"indices\">The faces indices.</param>\n        public void CreatePolygonalMesh(Point3d[] points, int pointsCount, PolygonalIndices indices)\n        {\n            ErrorUtil.CheckArray(points, pointsCount);\n            ErrorUtil.CheckArray(indices.triangles, indices.triangleCount);\n            ErrorUtil.CheckArray(indices.quads, indices.quadCount);\n            ErrorUtil.CheckArray(indices.pentagons, indices.pentagonCount);\n            ErrorUtil.CheckArray(indices.hexagons, indices.hexagonCount);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonalMesh(Ptr, points, pointsCount,\n                indices.triangles, indices.triangleCount,\n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n        }\n\n        /// <summary>\n        /// Create a mesh consisting of one polygon face.\n        /// </summary>\n        /// <param name=\"points\">The faces points</param>\n        /// <param name=\"count\">The paoint array length.</param>\n        /// <param name=\"xz\">Should the y coord of the points be used for the z coord.</param>\n        public void CreatePolygonMesh(Point2d[] points, int count, bool xz)\n        {\n            ErrorUtil.CheckArray(points, count);\n\n            Clear();\n            IsUpdated = false;\n            Kernel.CreatePolygonMesh(Ptr, points, count, xz);\n        }\n\n        /// <summary>\n        /// Get the triangle and quad indices.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles as a index array. Maybe null.</param>\n        /// <param name=\"quads\">The meshes quads as a index array. Maybe null.</param>\n        public void GetIndices(int[] triangles, int[] quads = null)\n        {\n            bool hasTriangles = triangles != null && triangles.Length > 0;\n            bool hasQuads = quads != null && quads.Length > 0;\n\n            if (hasTriangles && hasQuads)\n                GetTriangleQuadIndices(triangles, triangles.Length, quads, quads.Length);\n            else if (hasTriangles)\n                GetTriangleIndices(triangles, triangles.Length);\n            else if (hasQuads)\n                GetQuadIndices(quads, quads.Length);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        public void GetTriangleIndices(int[] triangles, int trianglesCount)\n        {\n            ErrorUtil.CheckArray(triangles, trianglesCount);\n            Kernel.GetPolygonalIndices(Ptr, triangles, trianglesCount, null, 0, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes quads.\n        /// </summary>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void GetQuadIndices(int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(quads, quadsCount);\n            Kernel.GetPolygonalIndices(Ptr, null, 0, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles and quads.\n        /// </summary>\n        /// <param name=\"triangles\">The meshes triangles.</param>\n        /// <param name=\"trianglesCount\">The triangle array length.</param>\n        /// <param name=\"quads\">The meshes quads.</param>\n        /// <param name=\"quadsCount\">The quads array length.</param>\n        public void GetTriangleQuadIndices(int[] triangles, int trianglesCount, int[] quads, int quadsCount)\n        {\n            ErrorUtil.CheckArray(triangles, trianglesCount);\n            ErrorUtil.CheckArray(quads, quadsCount);\n            Kernel.GetPolygonalIndices(Ptr, triangles, trianglesCount, quads, quadsCount, null, 0, null, 0);\n        }\n\n        /// <summary>\n        /// Get the meshes triangles, quads, pentagons and hexagons.\n        /// </summary>\n        /// <returns>The indices.</returns>\n        public PolygonalIndices GetPolygonalIndices()\n        {\n            var count = GetPolygonalCount();\n            var indices = count.Indices();\n\n            Kernel.GetPolygonalIndices(Ptr,\n                indices.triangles, indices.triangleCount,\n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n\n            return indices;\n        }\n\n        /*\n        /// <summary>\n        /// Get the dual meshes triangles, quads, pentagons and hexagons.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <returns>The indices</returns>\n        public PolygonalIndices GetDualPolygonalIndices()\n        {\n            var count = GetDualPolygonalCount();\n            var indices = count.Indices();\n\n            Kernel.GetDualPolygonalIndices(Ptr,\n                indices.triangles, indices.triangleCount,\n                indices.quads, indices.quadCount,\n                indices.pentagons, indices.pentagonCount,\n                indices.hexagons, indices.hexagonCount);\n\n            return indices;\n        }\n        */\n\n        /// <summary>\n        /// Whether v is a border vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <param name=\"check_all_incident_halfedges\">With the default value for \n        /// check_all_incident_halfedges the function iteratates over the incident halfedges. \n        /// With check_all_incident_halfedges == false the function returns true, \n        /// if the incident halfedge associated to vertex v is a border halfedge, \n        /// or if the vertex is isolated.</param>\n        /// <returns>Whether v is a border vertex.</returns>\n        public bool IsVertexBorder(int index, bool check_all_incident_halfedges)\n        {\n            return Kernel.IsVertexBorder(Ptr, index, check_all_incident_halfedges);\n        }\n\n        /// <summary>\n        /// Whether half edge is a border halfege, that is if its incident face is null.\n        /// </summary>\n        /// <param name=\"index\">The halfedges index.</param>\n        /// <returns>Whether half edge is a border halfege.</returns>\n        public bool IsHalfedgeBorder(int index)\n        {\n            return Kernel.IsHalfedgeBorder(Ptr, index);\n        }\n\n        /// <summary>\n        /// Whether e is a border edge, i.e., if any of its two halfedges is a border halfedge.\n        /// </summary>\n        /// <param name=\"index\">The edges index.</param>\n        /// <returns>Whether e is a border edge.</returns>\n        public bool IsEdgeBorder(int index)\n        {\n            return  Kernel.IsEdgeBorder(Ptr, index);    \n        }\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the mesh.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        public PolygonalCount GetPolygonalCount()\n        {\n            return Kernel.GetPolygonalCount(Ptr);\n        }\n\n        /// <summary>\n        /// Count the number of triangles, quads and polygons in the dual mesh.\n        /// A dual mesh is were faces become vertices and vertices become faces.\n        /// </summary>\n        /// <returns>The number of triangles, quads and polygons in the mesh.</returns>\n        public PolygonalCount GetDualPolygonalCount()\n        {\n            return Kernel.GetDualPolygonalCount(Ptr);\n        }\n\n        /// <summary>\n        /// Build the aabb tree.\n        /// </summary>\n        public void BuildAABBTree()\n        {\n            Kernel.BuildAABBTree(Ptr);\n        }\n\n        /// <summary>\n        /// Release the aabb tree.\n        /// </summary>\n        public void ReleaseAABBTree()\n        {\n            Kernel.ReleaseAABBTree(Ptr);\n        }\n\n        /// <summary>\n        /// Find the bounding box of the meshes points.\n        /// </summary>\n        /// <returns></returns>\n        public Box3d FindBoundingBox()\n        {\n            return Kernel.GetBoundingBox(Ptr);\n        }\n\n        /// <summary>\n        /// Read the mesh from a off file format.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        public void ReadOFF(string filename)\n        {\n            IsUpdated = false;\n            Kernel.ReadOFF(Ptr, filename);\n        }\n\n        /// <summary>\n        /// Write the mesh to off file format.\n        /// </summary>\n        /// <param name=\"filename\">The files name.</param>\n        public void WriteOFF(string filename)\n        {\n            Kernel.WriteOFF(Ptr, filename);\n        }\n\n        /// <summary>\n        /// Make all faces triangles.\n        /// </summary>\n        public void Triangulate()\n        {\n            if (!IsValid || IsTriangle) return;\n\n            IsUpdated = false;\n            Kernel.Triangulate(Ptr);\n        }\n\n        /// <summary>\n        /// Tests if a set of faces of a triangulated surface mesh self-intersects.\n        /// Must be a triangle mesh.\n        /// </summary>\n        /// <returns>True/Fasle if a valid triangle mesh,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED DoesSelfIntersect()\n        {\n            if (IsValidTriangleMesh)\n                return Kernel.DoesSelfIntersect(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Perform an expensive validity check on the data structure.\n        /// </summary>\n        /// <returns>If the mesh is valid.</returns>\n        public bool FindIfValid()\n        {\n            return Kernel.IsValid(Ptr);\n        }\n\n        /// <summary>\n        /// Find if all the faces in the mesh are triangles.\n        /// </summary>\n        /// <returns>True if all the faces in the mesh are triangles, Will be undetermined if no a valid mesh.</returns>\n        public BOOL_OR_UNDETERMINED FindIfTriangleMesh()\n        {\n            if (IsValid)\n                return Kernel.CheckFaceVertexCount(Ptr, 3).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find if all the faces in the mesh are quads.\n        /// </summary>\n        /// <returns>True if all the faces in the mesh are quads, Will be undetermined if no a valid mesh.</returns>\n        public BOOL_OR_UNDETERMINED FindIfQuadMesh()\n        {\n            if (IsValid)\n                return Kernel.CheckFaceVertexCount(Ptr, 4).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find if the mesh is closed, ie has no border edges.\n        /// </summary>\n        //// <returns>True if all closed, Will be undetermined if no a valid mesh.</returns>\n        public BOOL_OR_UNDETERMINED FindIfClosed()\n        {\n            if (IsValid)\n                return Kernel.IsClosed(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Computes the area of a range of faces\n        /// of a given triangulated surface mesh.\n        /// </summary>\n        /// <returns>The area or 0 if mesh is not valid triangle mesh.</returns>\n        public double FindArea()\n        {\n            if (IsValidTriangleMesh)\n                return Kernel.Area(Ptr);\n            else\n                return 0;\n\n        }\n\n        /// <summary>\n        /// computes the centroid of a volume bounded \n        /// by a closed triangulated surface mesh.\n        /// </summary>\n        /// <returns>The centroid or 0 if mesh is not valid.</returns>\n        public Point3d FindCentroid()\n        {\n            if (IsValid)\n                return Kernel.Centroid(Ptr);\n            else\n                return Point3d.Zero;\n        }\n\n        /// <summary>\n        /// Computes the volume of the domain bounded by a \n        /// closed triangulated surface mesh.\n        /// </summary>\n        /// <returns>The volume or 0 if mesh is not valid closed triangle mesh.</returns>\n        public double FindVolume()\n        {\n            if (IsValidClosedTriangleMesh)\n                return Kernel.Volume(Ptr);\n            else\n                return 0;\n        }\n\n        /// <summary>\n        /// Indicates if the mesh bounds a volume.\n        /// Must be a closed and triangulated.\n        /// </summary>\n        /// <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED FindIfDoesBoundAVolume()\n        {\n            if (IsValidClosedTriangleMesh)\n                return Kernel.DoesBoundAVolume(Ptr).ToBoolOrUndetermined();\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find what side of the mesh the lies in.\n        /// </summary>\n        /// <param name=\"point\">The point to check.</param>\n        /// <returns>ON_BOUNDED_SIDE if point inside mesh, \n        /// ON_UNBOUNDED_SIDE if point not inside, \n        /// ON_BOUNDARY if point is on the surface.</returns>\n        public BOUNDED_SIDE BoundedSide(Point3d point)\n        {\n            if (IsValid)\n                return Kernel.SideOfTriangleMesh(Ptr, point);\n            else\n                return BOUNDED_SIDE.UNDETERMINED;\n\n        }\n\n        /// <summary>\n        /// Does the mesh contain the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"includeBoundary\">If point is on the boundary does it count a being contained.</param>\n        /// <returns>True if the poly contains the point</returns>\n        public bool ContainsPoint(Point3d point, bool includeBoundary = true)\n        {\n            var side = BoundedSide(point);\n\n            if (side == BOUNDED_SIDE.UNDETERMINED)\n                return false;\n\n            if (side == BOUNDED_SIDE.ON_BOUNDED_SIDE)\n                return true;\n\n            if (includeBoundary && side == BOUNDED_SIDE.ON_BOUNDARY)\n                return true;\n\n            return false;\n        }\n\n        /// <summary>\n        /// Locate the face the rays hits.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <returns>The hit result.</returns>\n        public abstract MeshHitResult LocateFace(Ray3d ray);\n\n        /// <summary>\n        /// Find the face closest to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The hit result.</returns>\n        public abstract MeshHitResult ClosestFace(Point3d point);\n\n        /// <summary>\n        /// Locate the face hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"face\">The hit face.</param>\n        /// <returns>True if the ray hit a face.</returns>\n        public bool LocateFace(Ray3d ray, out MeshFace3 face)\n        {\n            var result = LocateFace(ray);\n            if (result.Hit && GetFace(result.Face, out face))\n            {\n                return true;\n            }\n            else\n            {\n                face = MeshFace3.NullFace;\n                return false;\n            }\n\n        }\n\n        /// <summary>\n        /// Locate the vertex hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the vertex has to be within hit point.</param>\n        /// <param name=\"vertex\">The hit vertex.</param>\n        /// <returns>True if the ray hit a vertex.</returns>\n        public bool LocateVertex(Ray3d ray, double radius, out MeshVertex3 vertex)\n        {\n            var result = LocateFace(ray);\n            if (result.Hit && GetFace(result.Face, out MeshFace3 face))\n            {\n                double minSqDist = double.PositiveInfinity;\n                var closest = MeshVertex3.NullVertex;\n\n                foreach (var v in face.EnumerateVertices(this))\n                {\n                    var sqdist = Point3d.SqrDistance(result.Point, v.Point);\n                    if (sqdist < minSqDist)\n                    {\n                        minSqDist = sqdist;\n                        closest = v;\n                    }\n                }\n\n                if (closest.Index != CGALGlobal.NULL_INDEX && minSqDist < radius * radius)\n                {\n                    vertex = closest;\n                    return true;\n                }\n                else\n                {\n                    vertex = MeshVertex3.NullVertex;\n                    return false;\n                }\n            }\n            else\n            {\n                vertex = MeshVertex3.NullVertex;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Locate the edge hit by the ray.\n        /// </summary>\n        /// <param name=\"ray\">The ray.</param>\n        /// <param name=\"radius\">The distance the edge has to be within hit point.</param>\n        /// <param name=\"edge\">The hit edge.</param>\n        /// <returns>True if the ray hit a edge.</returns>\n        public bool LocateHalfedge(Ray3d ray, double radius, out MeshHalfedge3 edge)\n        {\n            var result = LocateFace(ray);\n            if (result.Hit && GetFace(result.Face, out MeshFace3 face))\n            {\n                double minSqDist = double.PositiveInfinity;\n                var closest = MeshHalfedge3.NullHalfedge;\n                MeshVertex3 source, target;\n                Segment3d seg;\n\n                foreach (var e in face.EnumerateHalfedges(this))\n                {\n                    if (!GetVertex(e.Source, out source)) continue;\n                    if (!GetVertex(e.Target, out target)) continue;\n\n                    seg.A = source.Point;\n                    seg.B = target.Point;\n                    var p = seg.Closest(result.Point);\n\n                    var sqdist = Point3d.SqrDistance(result.Point, p);\n                    if (sqdist < minSqDist)\n                    {\n                        minSqDist = sqdist;\n                        closest = e;\n                    }\n                }\n\n                if (closest.Index != CGALGlobal.NULL_INDEX && minSqDist < radius * radius)\n                {\n                    edge = closest;\n                    return true;\n                }\n                else\n                {\n                    edge = MeshHalfedge3.NullHalfedge;\n                    return false;\n                }\n            }\n            else\n            {\n                edge = MeshHalfedge3.NullHalfedge;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if there exists a face of this poly and \n        /// a face of other mesh which intersect, and false otherwise.\n        /// Must be a triangle mesh\n        /// </summary>\n        /// <param name=\"mesh\">The other triangle poly.</param>\n        /// <param name=\"test_bounded_sides\">If test_bounded_sides is set to true, \n        /// the overlap of bounded sides are tested as well. In that case, the meshes must be closed.</param>\n        /// <returns>True/Fasle if a valid triangle closed mesh,or UNDETERMINED if not.</returns>\n        public BOOL_OR_UNDETERMINED DoIntersect(SurfaceMesh3 mesh, bool test_bounded_sides = true)\n        {\n            if (IsValidTriangleMesh && mesh.IsValidTriangleMesh)\n            {\n                //if test bounded side both must be closed meshes.\n                //If not test bounded side does not matter if not closed.\n                if ((test_bounded_sides && IsClosed && mesh.IsClosed) || !test_bounded_sides)\n                {\n                    return Kernel.DoIntersects(Ptr, mesh.Ptr, test_bounded_sides).ToBoolOrUndetermined();\n                }\n                else\n                    return BOOL_OR_UNDETERMINED.UNDETERMINED;\n            }\n            else\n                return BOOL_OR_UNDETERMINED.UNDETERMINED;\n        }\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh\n        /// </summary>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public abstract MinMaxAvg FindMinMaxAvgEdgeLength();\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh\n        /// </summary>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public abstract MinMaxAvg FindMinMaxAvgFaceArea();\n\n        /// <summary>\n        /// Subdive the mesh.\n        /// </summary>\n        /// <param name=\"iterations\">The number of iterations to perfrom.</param>\n        /// <param name=\"method\">The subdivision method.</param>\n        public abstract void Subdivide(int iterations, SUBDIVISION_METHOD method = SUBDIVISION_METHOD.SQRT3);\n\n        /// <summary>\n        /// Simplify the polyhedra.\n        /// </summary>\n        /// <param name=\"stop_ratio\">A number between 0-1 that represents the percentage of vertices to remove.</param>\n        public abstract void Simplify(double stop_ratio);\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices.</returns>\n        public abstract int Refine(double density_control_factor = MathUtil.SQRT2_64);\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"orientate\">The orientation method.</param>\n        public abstract void Orient(ORIENTATE orientate);\n\n        /// <summary>\n        /// Reverses the orientation of the vertices in each face.\n        /// </summary>\n        public abstract void ReverseFaceOrientation();\n\n        /// <summary>\n        /// Remove all unconnected compontents except the largest.\n        /// Largest is defined by the face count.\n        /// </summary>\n        /// <param name=\"num_components_to_keep\">The numbero of largest components to keep.</param>\n        /// <returns>The number of components removed in the mesh.</returns>\n        public abstract int KeepLargest(int num_components_to_keep = 1);\n\n        /// <summary>\n        /// Get a centroid (the avergae face position) for each face in the mesh.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The points arrays lemgth.</param>\n        public void GetCentroids(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetCentroids(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Compute the vertex normal map.\n        /// Will only be computed if mesh has\n        /// changed since last computation or \n        /// no current nomral maps have been computed.\n        /// </summary>\n        public void ComputeVertexNormals()\n        {\n            Kernel.ComputeVertexNormals(Ptr);\n        }\n\n        /// <summary>\n        /// Compute the face normal map.\n        /// Will only be computed if mesh has\n        /// changed since last computation or \n        /// no current nomral maps have been computed.\n        /// </summary>\n        public void ComputeFaceNormals()\n        {\n            Kernel.ComputeFaceNormals(Ptr);\n        }\n\n        /// <summary>\n        /// Get the vertex normals.\n        /// Will be compute if they have not aready.\n        /// </summary>\n        /// <param name=\"normals\">The normal map array.</param>\n        /// <param name=\"count\">The normal maps array length.</param>\n        public void GetVertexNormals(Vector3d[] normals, int count)\n        {\n            Kernel.GetVertexNormals(Ptr, normals, count);\n        }\n\n        /// <summary>\n        /// Get the face normals.\n        /// Will be compute if they have not aready.\n        /// </summary>\n        /// <param name=\"normals\">The normal map array.</param>\n        /// <param name=\"count\">The normal maps array length.</param>\n        public void GetFaceNormals(Vector3d[] normals, int count)\n        {\n            Kernel.GetFaceNormals(Ptr, normals, count);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the mesh.\n        /// </summary>\n        /// <returns>Each point in mesh.</returns>\n        public IEnumerator<Point3d> GetEnumerator()\n        {\n            for (int i = 0; i < VertexCount; i++)\n                yield return GetPoint(i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the mesh.\n        /// </summary>\n        /// <returns>Each point in mesh.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Return all the points in the mesh in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point3d[] ToArray()\n        {\n            var points = new Point3d[VertexCount];\n            GetPoints(points, points.Length);\n            return points;\n        }\n\n        /// <summary>\n        /// Return all the points in the mesh in a list.\n        /// </summary>\n        /// <returns>The list.</returns>\n        public List<Point3d> ToList()\n        {\n            int count = VertexCount;\n            var points = new List<Point3d>(count);\n            for (int i = 0; i < count; i++)\n                points.Add(GetPoint(i));\n        \n            return points;\n        }\n\n        /// <summary>\n        /// Update the mesh if needed.\n        /// </summary>\n        protected void Update()\n        {\n            if (IsUpdated) return;\n            IsUpdated = true;\n\n            if (FindIfValid())\n            {\n                m_isValid = true;\n                m_isClosed = FindIfClosed().ToBool();\n                m_isTriangle = FindIfTriangleMesh().ToBool();\n                m_isQuad = FindIfQuadMesh().ToBool();\n            }\n            else\n            {\n                m_isValid = false;\n                m_isClosed = false;\n                m_isTriangle = false;\n                m_isQuad = false;\n            }\n        }\n\n        /// <summary>\n        /// Print the mesh into a string builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"IsValid = \" + IsValid);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"FaceCount = \" + FaceCount);\n            builder.AppendLine(\"EdgeCount = \" + EdgeCount);\n            builder.AppendLine(\"RemovedVertexCount = \" + RemovedVertexCount);\n            builder.AppendLine(\"RemovedFaceCount = \" + RemovedFaceCount);\n            builder.AppendLine(\"RemovedHalfdgeCount = \" + RemovedHalfedgeCount);\n            builder.AppendLine(\"RemovedEdgeCount = \" + RemovedEdgeCount);\n            builder.AppendLine(\"BorderEdgeCount = \" + BorderEdgeCount);\n            builder.AppendLine(\"HasGarbage = \" + HasGarbage);\n            builder.AppendLine(\"IsTriangle = \" + IsTriangle);\n            builder.AppendLine(\"IsQuad = \" + IsQuad);\n            builder.AppendLine(\"IsClosed = \" + IsClosed);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal void PrintVertices()\n        {\n            foreach(var p in this)\n                Console.WriteLine(p);\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/SurfaceMeshFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Processing;\n\nnamespace CGALDotNet.Polyhedra\n{\n\tpublic static class SurfaceMeshFactory<K> where K : CGALKernel, new()\n\t{\n\t\tprivate static IndexList triangleList = IndexList.CreateTriangleIndexList();\n\t\tprivate static IndexList polygonList = IndexList.CreatePolygonIndexList();\n\n\t\tpublic static Dictionary<string, SurfaceMesh3<K>> CreateAll(bool allowPolygons = false)\n\t\t{\n\t\t\tvar meshes = new Dictionary<string, SurfaceMesh3<K>>();\n\n\t\t\tmeshes.Add(\"Cube\", CreateCube(1, allowPolygons));\n\t\t\tmeshes.Add(\"Plane\", CreatePlane(allowPolygons));\n\t\t\tmeshes.Add(\"Torus\", CreateTorus(allowPolygons));\n\t\t\tmeshes.Add(\"Cone\", CreateCone(allowPolygons));\n\t\t\tmeshes.Add(\"Cylinder\", CreateCylinder(allowPolygons));\n\t\t\tmeshes.Add(\"Capsule\", CreateCapsule(allowPolygons));\n\t\t\tmeshes.Add(\"UVSphere\", CreateUVSphere(allowPolygons));\n\t\t\tmeshes.Add(\"NormalizedCube\", CreateNormalizedCube(allowPolygons));\n\t\t\tmeshes.Add(\"Icosahedron\", CreateIcosahedron());\n\t\t\tmeshes.Add(\"Tetrahedron\", CreateTetrahedron());\n\t\t\tmeshes.Add(\"Octahedron\", CreateOctahedron());\n\t\t\tmeshes.Add(\"Dodecahedron\", CreateDodecahedron(1, allowPolygons));\n\n\t\t\treturn meshes;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCube(double scale = 1, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCube(polygonList, scale);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCube(triangleList, scale);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCube(Box3d box, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCube(polygonList, box);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCube(triangleList, box);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreatePlane(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreatePlane(PlaneParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreatePlane(PlaneParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreatePlane(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreatePlane(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateTorus(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateTorus(TorusParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateTorus(TorusParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateTorus(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateTorus(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCone(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateCone(ConeParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCone(ConeParams param, bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateCylinder(param.AsCylinderParam(), allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCylinder(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateCylinder(CylinderParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCylinder(CylinderParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCylinder(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCylinder(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCapsule(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateCapsule(CapsuleParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateCapsule(CapsuleParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateCapsule(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateCapsule(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateUVSphere(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateUVSphere(UVSphereParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateUVSphere(UVSphereParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateUVSphere(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateUVSphere(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateNormalizedCube(bool allowPolygons = false)\n\t\t{\n\t\t\treturn CreateNormalizedCube(NormalizedCubeParams.Default, allowPolygons);\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateNormalizedCube(NormalizedCubeParams param, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateNormalizedCube(polygonList, param);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateNormalizedCube(triangleList, param);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\tWeldVertices(mesh);\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateTetrahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateTetrahedron(triangleList, scale);\n\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateIcosahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateIcosahedron(triangleList, scale);\n\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateOctahedron(double scale = 1)\n\t\t{\n\t\t\ttriangleList.Clear();\n\t\t\tMeshFactory.CreateOctahedron(triangleList, scale);\n\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tpublic static SurfaceMesh3<K> CreateDodecahedron(double scale = 1, bool allowPolygons = false)\n\t\t{\n\t\t\tvar mesh = new SurfaceMesh3<K>();\n\n\t\t\tif (allowPolygons)\n\t\t\t{\n\t\t\t\tpolygonList.Clear();\n\t\t\t\tMeshFactory.CreateDodecahedron(polygonList, scale);\n\t\t\t\tvar indices = polygonList.ToIndices();\n\t\t\t\tvar points = polygonList.points.ToArray();\n\t\t\t\tmesh.CreatePolygonalMesh(points, points.Length, indices);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttriangleList.Clear();\n\t\t\t\tMeshFactory.CreateDodecahedron(triangleList, scale);\n\t\t\t\tmesh.CreateMesh(triangleList.points.ToArray(), triangleList.triangles.ToArray());\n\t\t\t}\n\n\t\t\treturn mesh;\n\t\t}\n\n\t\tprivate static void WeldVertices(SurfaceMesh3<K> mesh)\n\t\t{\n\t\t\tvar repair = MeshProcessingRepair<K>.Instance;\n\t\t\trepair.RepairPolygonSoup(mesh);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/SurfaceMeshKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    internal abstract class SurfaceMeshKernel3 : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract int GetBuildStamp(IntPtr ptr);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges);\n\n        internal abstract void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n        internal abstract void ClearProperyMaps(IntPtr ptr);\n\n        internal abstract void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force);\n\n        internal abstract void PrintIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force);\n\n        internal abstract IntPtr Copy(IntPtr ptr);\n\n        internal abstract bool IsValid(IntPtr ptr);\n\n        internal abstract int VertexCount(IntPtr ptr);\n\n        internal abstract int HalfedgeCount(IntPtr ptr);\n\n        internal abstract int EdgeCount(IntPtr ptr);\n\n        internal abstract int FaceCount(IntPtr ptr);\n\n        internal abstract int RemovedVertexCount(IntPtr ptr);\n\n        internal abstract int RemovedHalfedgeCount(IntPtr ptr);\n\n        internal abstract int RemovedEdgeCount(IntPtr ptr);\n\n        internal abstract int RemovedFaceCount(IntPtr ptr);\n\n        internal abstract bool IsVertexRemoved(IntPtr ptr, int index);\n\n        internal abstract bool IsFaceRemoved(IntPtr ptr, int index);\n\n        internal abstract bool IsHalfedgeRemoved(IntPtr ptr, int index);\n\n        internal abstract bool IsEdgeRemoved(IntPtr ptr, int index);\n\n        internal abstract int AddVertex(IntPtr ptr, Point3d point);\n\n        internal abstract int AddEdge(IntPtr ptr, int v0, int v1);\n\n        internal abstract int AddTriangle(IntPtr ptr, int v0, int v1, int v2);\n\n        internal abstract int AddQuad(IntPtr ptr, int v0, int v1, int v2, int v3);\n\n        internal abstract int AddPentagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4);\n\n        internal abstract int AddHexagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4, int v5);\n\n        internal abstract int AddFace(IntPtr ptr, int[] indices, int count);\n\n        internal abstract bool HasGarbage(IntPtr ptr);\n\n        internal abstract void CollectGarbage(IntPtr ptr);\n\n        internal abstract void SetRecycleGarbage(IntPtr ptr, bool collect);\n\n        internal abstract bool DoesRecycleGarbage(IntPtr ptr);\n\n        internal abstract int VertexDegree(IntPtr ptr, int index);\n\n        internal abstract int FaceDegree(IntPtr ptr, int index);\n\n        internal abstract bool VertexIsIsolated(IntPtr ptr, int index);\n\n        internal abstract bool VertexIsBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        internal abstract bool EdgeIsBorder(IntPtr ptr, int index);\n\n        internal abstract int NextHalfedge(IntPtr ptr, int index);\n\n        internal abstract int PreviousHalfedge(IntPtr ptr, int index);\n\n        internal abstract int OppositeHalfedge(IntPtr ptr, int index);\n\n        internal abstract int SourceVertex(IntPtr ptr, int index);\n\n        internal abstract int TargetVertex(IntPtr ptr, int index);\n\n        internal abstract int NextAroundSource(IntPtr ptr, int index);\n\n        internal abstract int NextAroundTarget(IntPtr ptr, int index);\n\n        internal abstract int PreviousAroundSource(IntPtr ptr, int index);\n\n        internal abstract int PreviousAroundTarget(IntPtr ptr, int index);\n\n        internal abstract int EdgesHalfedge(IntPtr ptr, int edgeIndex, int halfedgeIndex);\n\n        internal abstract bool RemoveVertex(IntPtr ptr, int index);\n\n        internal abstract bool RemoveEdge(IntPtr ptr, int index);\n\n        internal abstract bool RemoveFace(IntPtr ptr, int index);\n\n        internal abstract bool IsVertexValid(IntPtr ptr, int index);\n\n        internal abstract bool IsEdgeValid(IntPtr ptr, int index);\n\n        internal abstract bool IsHalfedgeValid(IntPtr ptr, int index);\n\n        internal abstract bool IsFaceValid(IntPtr ptr, int index);\n\n        internal abstract Point3d GetPoint(IntPtr ptr, int index);\n\n        internal abstract void GetPoints(IntPtr ptr, Point3d[] points, int count);\n\n        internal abstract void SetPoint(IntPtr ptr, int index, Point3d point);\n\n        internal abstract void SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n        internal abstract bool GetSegment(IntPtr ptr, int index, out Segment3d segment);\n\n        internal abstract void GetSegments(IntPtr ptr, Segment3d[] segments, int count);\n\n        internal abstract bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri);\n\n        internal abstract void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count);\n\n        internal abstract bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert);\n\n        internal abstract void GetVertices(IntPtr ptr, MeshVertex3[] vertexArray, int count);\n\n        internal abstract bool GetFace(IntPtr ptr, int index, out MeshFace3 face);\n\n        internal abstract void GetFaces(IntPtr ptr, MeshFace3[] faceArray, int count);\n\n        internal abstract bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge);\n\n        internal abstract void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edgeArray, int count);\n\n        internal abstract void Transform(IntPtr ptr, Matrix4x4d matrix);\n\n        internal abstract bool IsVertexBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        internal abstract bool IsHalfedgeBorder(IntPtr ptr, int index);\n\n        internal abstract bool IsEdgeBorder(IntPtr ptr, int index);\n\n        internal abstract int BorderEdgeCount(IntPtr ptr);\n\n        internal abstract bool IsClosed(IntPtr ptr);\n\n        internal abstract bool CheckFaceVertexCount(IntPtr ptr, int count);\n\n        internal abstract void Join(IntPtr ptr, IntPtr otherPtr);\n\n        internal abstract void BuildAABBTree(IntPtr ptr);\n\n        internal abstract void ReleaseAABBTree(IntPtr ptr);\n\n        internal abstract Box3d GetBoundingBox(IntPtr ptr);\n\n        internal abstract void ReadOFF(IntPtr ptr, string filename);\n\n        internal abstract void WriteOFF(IntPtr ptr, string filename);\n\n        internal abstract void Triangulate(IntPtr ptr);\n\n        internal abstract bool DoesSelfIntersect(IntPtr ptr);\n\n        internal abstract double Area(IntPtr ptr);\n\n        internal abstract Point3d Centroid(IntPtr ptr);\n\n        internal abstract double Volume(IntPtr ptr);\n\n        internal abstract bool DoesBoundAVolume(IntPtr ptr);\n\n        internal abstract BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n        internal abstract bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n        internal abstract void GetCentroids(IntPtr ptr, Point3d[] points, int count);\n\n        internal abstract void ComputeVertexNormals(IntPtr ptr);\n\n        internal abstract void ComputeFaceNormals(IntPtr ptr);\n\n        internal abstract void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count);\n\n        internal abstract void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count);\n\n        internal abstract PolygonalCount GetPolygonalCount(IntPtr ptr);\n\n        internal abstract PolygonalCount GetDualPolygonalCount(IntPtr ptr);\n\n        internal abstract void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int count, bool xz);\n\n        internal abstract void CreatePolygonalMesh(IntPtr ptr,\n            Point3d[] points, int pointsCount,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount);\n\n        internal abstract void GetPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount);\n\n        internal abstract void GetDualPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount);\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/SurfaceMeshKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    internal class SurfaceMeshKernel3_EEK : SurfaceMeshKernel3\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly SurfaceMeshKernel3 Instance = new SurfaceMeshKernel3_EEK();\n\n        internal override IntPtr Create()\n        {\n            return SurfaceMesh3_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_Release(ptr);\n        }\n\n        internal override int GetBuildStamp(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_GetBuildStamp(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_Clear(ptr);\n        }\n\n        internal override void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges)\n        {\n            SurfaceMesh3_EEK_ClearIndexMaps(ptr, vertices, faces, edges, halfedges);\n        }\n\n        internal override void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces)\n        {\n            SurfaceMesh3_EEK_ClearNormalMaps(ptr, vertices, faces);\n        }\n\n        internal override void ClearProperyMaps(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_ClearProperyMaps(ptr);\n        }\n\n        internal override void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force)\n        {\n            SurfaceMesh3_EEK_BuildIndices(ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        internal override void PrintIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force)\n        {\n            SurfaceMesh3_EEK_PrintIndices(ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_Copy(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_IsValid(ptr);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_VertexCount(ptr);\n        }\n\n        internal override int HalfedgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_HalfedgeCount(ptr);\n        }\n\n        internal override int EdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_EdgeCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_FaceCount(ptr);\n        }\n\n        internal override int RemovedVertexCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_RemovedVertexCount(ptr);\n        }\n\n        internal override int RemovedHalfedgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_RemovedHalfedgeCount(ptr);\n        }\n\n        internal override int RemovedEdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_RemovedEdgeCount(ptr);\n        }\n\n        internal override int RemovedFaceCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_RemovedFaceCount(ptr);\n        }\n\n        internal override bool IsVertexRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsVertexRemoved(ptr, index);\n        }\n\n        internal override bool IsFaceRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsFaceRemoved(ptr, index);\n        }\n\n        internal override bool IsHalfedgeRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsHalfedgeRemoved(ptr, index);\n        }\n\n        internal override bool IsEdgeRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsEdgeRemoved(ptr, index);\n        }\n\n        internal override int AddVertex(IntPtr ptr, Point3d point)\n        {\n            return SurfaceMesh3_EEK_AddVertex(ptr, point);\n        }\n\n        internal override int AddEdge(IntPtr ptr, int v0, int v1)\n        {\n            return SurfaceMesh3_EEK_AddEdge(ptr, v0, v1);\n        }\n\n        internal override int AddTriangle(IntPtr ptr, int v0, int v1, int v2)\n        {\n            return SurfaceMesh3_EEK_AddTriangle(ptr, v0, v1, v2);\n        }\n\n        internal override int AddQuad(IntPtr ptr, int v0, int v1, int v2, int v3)\n        {\n            return SurfaceMesh3_EEK_AddQuad(ptr, v0, v1, v2, v3);\n        }\n\n        internal override bool HasGarbage(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_HasGarbage(ptr);\n        }\n\n        internal override void CollectGarbage(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_CollectGarbage(ptr);\n        }\n\n        internal override void SetRecycleGarbage(IntPtr ptr, bool collect)\n        {\n            SurfaceMesh3_EEK_SetRecycleGarbage(ptr, collect);\n        }\n\n        internal override bool DoesRecycleGarbage(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_DoesRecycleGarbage(ptr);\n        }\n\n        internal override int VertexDegree(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_VertexDegree(ptr, index);\n        }\n\n        internal override int FaceDegree(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_FaceDegree(ptr, index);\n        }\n\n        internal override bool VertexIsIsolated(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_VertexIsIsolated(ptr, index);\n        }\n\n        internal override bool VertexIsBorder(IntPtr ptr, int index, bool check_all_incident_halfedges)\n        {\n            return SurfaceMesh3_EEK_VertexIsBorder(ptr, index, check_all_incident_halfedges);\n        }\n\n        internal override bool EdgeIsBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_EdgeIsBorder(ptr, index);\n        }\n\n        internal override int NextHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_NextHalfedge(ptr, index);\n        }\n\n        internal override int PreviousHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_PreviousHalfedge(ptr, index);\n        }\n\n        internal override int OppositeHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_OppositeHalfedge(ptr, index);\n        }\n\n        internal override int SourceVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_SourceVertex(ptr, index);\n        }\n\n        internal override int TargetVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_TargetVertex(ptr, index);\n        }\n\n        internal override int NextAroundSource(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_NextAroundSource(ptr, index);\n        }\n\n        internal override int NextAroundTarget(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_NextAroundTarget(ptr, index);\n        }\n\n        internal override int PreviousAroundSource(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_PreviousAroundSource(ptr, index);\n        }\n\n        internal override int PreviousAroundTarget(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_PreviousAroundTarget(ptr, index);\n        }\n\n        internal override int EdgesHalfedge(IntPtr ptr, int edgeIndex, int halfedgeIndex)\n        {\n            return SurfaceMesh3_EdgesHalfedge(ptr, edgeIndex, halfedgeIndex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool RemoveEdge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_RemoveEdge(ptr, index);\n        }\n\n        internal override bool RemoveFace(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_RemoveFace(ptr, index);\n        }\n\n        internal override bool IsVertexValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsVertexValid(ptr, index);\n        }\n\n        internal override bool IsEdgeValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsEdgeValid(ptr, index);\n        }\n\n        internal override bool IsHalfedgeValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsHalfedgeValid(ptr, index);\n        }\n\n        internal override bool IsFaceValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsFaceValid(ptr, index);\n        }\n\n        internal override Point3d GetPoint(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            SurfaceMesh3_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point3d point)\n        {\n            SurfaceMesh3_EEK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            SurfaceMesh3_EEK_SetPoints(ptr, points, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int index, out Segment3d segment)\n        {\n            return SurfaceMesh3_EEK_GetSegment(ptr, index, out segment);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n        {\n            SurfaceMesh3_EEK_GetSegments(ptr, segments, count);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri)\n        {\n            return SurfaceMesh3_EEK_GetTriangle(ptr, index, out tri);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count)\n        {\n            SurfaceMesh3_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert)\n        {\n            return SurfaceMesh3_EEK_GetVertex(ptr,index, out vert);\n        }\n\n        internal override void GetVertices(IntPtr ptr, MeshVertex3[] vertexArray, int count)\n        {\n            SurfaceMesh3_EEK_GetVertices(ptr, vertexArray, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out MeshFace3 face)\n        {\n            return SurfaceMesh3_EEK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, MeshFace3[] faceArray, int count)\n        {\n            SurfaceMesh3_EEK_GetFaces(ptr, faceArray, count);\n        }\n\n        internal override bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge)\n        {\n            return SurfaceMesh3_EEK_GetHalfedge(ptr, index, out edge);\n        }\n\n        internal override void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edgeArray, int count)\n        {\n            SurfaceMesh3_EEK_GetHalfedges(ptr, edgeArray, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            SurfaceMesh3_EEK_Transform(ptr, matrix);\n        }\n\n        internal override bool IsVertexBorder(IntPtr ptr, int index, bool check_all_incident_halfedges)\n        {\n            return SurfaceMesh3_EEK_IsVertexBorder(ptr,index, check_all_incident_halfedges);\n        }\n\n        internal override bool IsHalfedgeBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsHalfedgeBorder(ptr,index);\n        }\n\n        internal override bool IsEdgeBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EEK_IsEdgeBorder(ptr,index);\n        }\n\n        internal override int BorderEdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_BorderEdgeCount(ptr);   \n        }\n\n        internal override bool IsClosed(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_IsClosed(ptr);\n        }\n\n        internal override bool CheckFaceVertexCount(IntPtr ptr, int count)\n        {\n            return SurfaceMesh3_EEK_CheckFaceVertexCount(ptr, count);   \n        }\n\n        internal override int AddPentagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4)\n        {\n            return SurfaceMesh3_EEK_AddPentagon(ptr, v0, v1, v2, v3, v4);\n        }\n\n        internal override int AddHexagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4, int v5)\n        {\n            return SurfaceMesh3_EEK_AddHexagon(ptr, v0, v1, v2, v3, v4, v5);\n        }\n\n        internal override int AddFace(IntPtr ptr, int[] indices, int count)\n        {\n            return SurfaceMesh3_EEK_AddFace(ptr, indices, count);\n        }\n\n        internal override void Join(IntPtr ptr, IntPtr otherPtr)\n        {\n            SurfaceMesh3_EEK_Join(ptr, otherPtr);\n        }\n\n        internal override void BuildAABBTree(IntPtr ptr)\n        { \n            SurfaceMesh3_EEK_BuildAABBTree(ptr);\n        }\n\n        internal override void ReleaseAABBTree(IntPtr ptr)\n        { \n            SurfaceMesh3_EEK_ReleaseAABBTree(ptr);\n        }\n\n        internal override Box3d GetBoundingBox(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_GetBoundingBox(ptr);\n        }\n\n        internal override void ReadOFF(IntPtr ptr, string filename)\n        { \n            SurfaceMesh3_EEK_ReadOFF(ptr, filename);    \n        }\n\n        internal override void WriteOFF(IntPtr ptr, string filename)\n        { \n            SurfaceMesh3_EEK_WriteOFF(ptr, filename);\n        }\n\n        internal override void Triangulate(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_Triangulate(ptr);\n        }\n\n        internal override bool DoesSelfIntersect(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_DoesBoundAVolume(ptr);\n        }\n\n        internal override double Area(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_Area(ptr);\n        }\n\n        internal override Point3d Centroid(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_Centroid(ptr);\n        }\n\n        internal override double Volume(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_Volume(ptr);\n        }\n\n        internal override bool DoesBoundAVolume(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_DoesBoundAVolume(ptr);\n        }\n\n        internal override BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point)\n        {\n            return SurfaceMesh3_EEK_SideOfTriangleMesh(ptr, point);\n        }\n\n        internal override bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides)\n        {\n            return SurfaceMesh3_EEK_DoIntersects(ptr, otherPtr, test_bounded_sides);\n        }\n\n        internal override void GetCentroids(IntPtr ptr, Point3d[] points, int count) \n        { \n            SurfaceMesh3_EEK_GetCentroids(ptr, points, count);  \n        }\n\n        internal override void ComputeVertexNormals(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_ComputeVertexNormals(ptr);\n        }\n\n        internal override void ComputeFaceNormals(IntPtr ptr)\n        {\n            SurfaceMesh3_EEK_ComputeFaceNormals(ptr);\n        }\n\n        internal override void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count)\n        {\n            SurfaceMesh3_EEK_GetVertexNormals(ptr, normals, count);\n        }\n\n        internal override void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count)\n        {\n            SurfaceMesh3_EEK_GetFaceNormals(ptr, normals, count);\n        }\n\n        internal override PolygonalCount GetPolygonalCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_GetPolygonalCount(ptr);    \n        }\n\n        internal override PolygonalCount GetDualPolygonalCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EEK_GetDualPolygonalCount(ptr);\n        }\n\n        internal override void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int count, bool xz)\n        {\n            SurfaceMesh3_EEK_CreatePolygonMesh(ptr, points, count, xz);\n        }\n\n        internal override void CreatePolygonalMesh(IntPtr ptr,\n            Point3d[] points, int pointsCount,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EEK_CreatePolygonalMesh(ptr, \n                points, pointsCount, \n                triangles, triangleCount, \n                quads, quadCount, \n                pentagons, pentagonCount, \n                hexagons, hexagonCount);\n        }\n\n        internal override void GetPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EEK_GetPolygonalIndices(ptr,\n                triangles, triangleCount,\n                quads, quadCount,\n                pentagons, pentagonCount,\n                hexagons, hexagonCount);\n        }\n\n        internal override void GetDualPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EEK_GetDualPolygonalIndices(ptr,\n                triangles, triangleCount,\n                quads, quadCount,\n                pentagons, pentagonCount,\n                hexagons, hexagonCount);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceMesh3_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_GetBuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool halfedges, bool edges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ClearProperyMaps(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_PrintIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool build);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceMesh3_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsValid(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_HalfedgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_EdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_RemovedVertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_RemovedHalfedgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_RemovedEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_RemovedFaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsVertexRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsFaceRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsHalfedgeRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsEdgeRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddVertex(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddEdge(IntPtr ptr, int v0, int v1);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddTriangle(IntPtr ptr, int v0, int v1, int v2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddQuad(IntPtr ptr, int v0, int v1, int v2, int v3);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddPentagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddHexagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4, int v5);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_AddFace(IntPtr ptr, int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_HasGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_CollectGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_SetRecycleGarbage(IntPtr ptr, bool collect);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_DoesRecycleGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_VertexDegree(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_FaceDegree(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_VertexIsIsolated(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_VertexIsBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_EdgeIsBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_NextHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_PreviousHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_OppositeHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_SourceVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_TargetVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_NextAroundSource(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_NextAroundTarget(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_PreviousAroundSource(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_PreviousAroundTarget(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EdgesHalfedge(IntPtr ptr, int edgeIndex, int halfedgeIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_RemoveEdge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_RemoveFace(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsVertexValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsEdgeValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsHalfedgeValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsFaceValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d SurfaceMesh3_EEK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_SetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_GetSegment(IntPtr ptr, int index, [Out] out Segment3d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_GetTriangle(IntPtr ptr, int index, [Out] out Triangle3d tri);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_GetVertex(IntPtr ptr, int index, [Out] out MeshVertex3 vert);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetVertices(IntPtr ptr, [Out] MeshVertex3[] vertexArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_GetFace(IntPtr ptr, int index, [Out] out MeshFace3 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetFaces(IntPtr ptr, [Out] MeshFace3[] faceArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_GetHalfedge(IntPtr ptr, int index, [Out] out MeshHalfedge3 edge);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetHalfedges(IntPtr ptr, [Out] MeshHalfedge3[] edgeArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsVertexBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsHalfedgeBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsEdgeBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EEK_BorderEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_IsClosed(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_CheckFaceVertexCount(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_Join(IntPtr ptr, IntPtr otherPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_BuildAABBTree(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ReleaseAABBTree(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box3d SurfaceMesh3_EEK_GetBoundingBox(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ReadOFF(IntPtr ptr, string filename);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_WriteOFF(IntPtr ptr, string filename);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_Triangulate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_DoesSelfIntersect(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double SurfaceMesh3_EEK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d SurfaceMesh3_EEK_Centroid(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double SurfaceMesh3_EEK_Volume(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_DoesBoundAVolume(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE SurfaceMesh3_EEK_SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EEK_DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetCentroids(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ComputeVertexNormals(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_ComputeFaceNormals(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetVertexNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetFaceNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern PolygonalCount SurfaceMesh3_EEK_GetPolygonalCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern PolygonalCount SurfaceMesh3_EEK_GetDualPolygonalCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_CreatePolygonMesh(IntPtr ptr, Point2d[] points, int count, bool xz);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_CreatePolygonalMesh(IntPtr ptr,\n            Point3d[] points, int pointsCount,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetPolygonalIndices(IntPtr ptr,\n            [Out] int[] triangles, int triangleCount,\n            [Out] int[] quads, int quadCount,\n            [Out] int[] pentagons, int pentagonCount,\n            [Out] int[] hexagons, int hexagonCount);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EEK_GetDualPolygonalIndices(IntPtr ptr,\n            [Out] int[] triangles, int triangleCount,\n            [Out] int[] quads, int quadCount,\n            [Out] int[] pentagons, int pentagonCount,\n            [Out] int[] hexagons, int hexagonCount);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polyhedra/SurfaceMeshKernel3_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polyhedra\n{\n    internal class SurfaceMeshKernel3_EIK : SurfaceMeshKernel3\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly SurfaceMeshKernel3 Instance = new SurfaceMeshKernel3_EIK();\n\n        internal override IntPtr Create()\n        {\n            return SurfaceMesh3_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_Release(ptr);\n        }\n\n        internal override int GetBuildStamp(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_GetBuildStamp(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_Clear(ptr);\n        }\n\n        internal override void ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges)\n        {\n            SurfaceMesh3_EIK_ClearIndexMaps(ptr, vertices, faces, edges, halfedges);\n        }\n\n        internal override void ClearNormalMaps(IntPtr ptr, bool vertices, bool faces)\n        {\n            SurfaceMesh3_EIK_ClearNormalMaps(ptr, vertices, faces);\n        }\n\n        internal override void ClearProperyMaps(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_ClearProperyMaps(ptr);\n        }\n\n        internal override void BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force)\n        {\n            SurfaceMesh3_EIK_BuildIndices(ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        internal override void PrintIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force)\n        {\n            SurfaceMesh3_EIK_PrintIndices(ptr, vertices, faces, edges, halfedges, force);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_Copy(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_IsValid(ptr);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_VertexCount(ptr);\n        }\n\n        internal override int HalfedgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_HalfedgeCount(ptr);\n        }\n\n        internal override int EdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_EdgeCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_FaceCount(ptr);\n        }\n\n        internal override int RemovedVertexCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_RemovedVertexCount(ptr);\n        }\n\n        internal override int RemovedHalfedgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_RemovedHalfedgeCount(ptr);\n        }\n\n        internal override int RemovedEdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_RemovedEdgeCount(ptr);\n        }\n\n        internal override int RemovedFaceCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_RemovedFaceCount(ptr);\n        }\n\n        internal override bool IsVertexRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsVertexRemoved(ptr, index);\n        }\n\n        internal override bool IsFaceRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsFaceRemoved(ptr, index);\n        }\n\n        internal override bool IsHalfedgeRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsHalfedgeRemoved(ptr, index);\n        }\n\n        internal override bool IsEdgeRemoved(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsEdgeRemoved(ptr, index);\n        }\n\n        internal override int AddVertex(IntPtr ptr, Point3d point)\n        {\n            return SurfaceMesh3_EIK_AddVertex(ptr, point);\n        }\n\n        internal override int AddEdge(IntPtr ptr, int v0, int v1)\n        {\n            return SurfaceMesh3_EIK_AddEdge(ptr, v0, v1);\n        }\n\n        internal override int AddTriangle(IntPtr ptr, int v0, int v1, int v2)\n        {\n            return SurfaceMesh3_EIK_AddTriangle(ptr, v0, v1, v2);\n        }\n\n        internal override int AddQuad(IntPtr ptr, int v0, int v1, int v2, int v3)\n        {\n            return SurfaceMesh3_EIK_AddQuad(ptr, v0, v1, v2, v3);\n        }\n\n        internal override bool HasGarbage(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_HasGarbage(ptr);\n        }\n\n        internal override void CollectGarbage(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_CollectGarbage(ptr);\n        }\n\n        internal override void SetRecycleGarbage(IntPtr ptr, bool collect)\n        {\n            SurfaceMesh3_EIK_SetRecycleGarbage(ptr, collect);\n        }\n\n        internal override bool DoesRecycleGarbage(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_DoesRecycleGarbage(ptr);\n        }\n\n        internal override int VertexDegree(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_VertexDegree(ptr, index);\n        }\n\n        internal override int FaceDegree(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_FaceDegree(ptr, index);\n        }\n\n        internal override bool VertexIsIsolated(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_VertexIsIsolated(ptr, index);\n        }\n\n        internal override bool VertexIsBorder(IntPtr ptr, int index, bool check_all_incident_halfedges)\n        {\n            return SurfaceMesh3_EIK_VertexIsBorder(ptr, index, check_all_incident_halfedges);\n        }\n\n        internal override bool EdgeIsBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_EdgeIsBorder(ptr, index);\n        }\n\n        internal override int NextHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_NextHalfedge(ptr, index);\n        }\n\n        internal override int PreviousHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_PreviousHalfedge(ptr, index);\n        }\n\n        internal override int OppositeHalfedge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_OppositeHalfedge(ptr, index);\n        }\n\n        internal override int SourceVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_SourceVertex(ptr, index);\n        }\n\n        internal override int TargetVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_TargetVertex(ptr, index);\n        }\n\n        internal override int NextAroundSource(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_NextAroundSource(ptr, index);\n        }\n\n        internal override int NextAroundTarget(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_NextAroundTarget(ptr, index);\n        }\n\n        internal override int PreviousAroundSource(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_PreviousAroundSource(ptr, index);\n        }\n\n        internal override int PreviousAroundTarget(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_PreviousAroundTarget(ptr, index);\n        }\n\n        internal override int EdgesHalfedge(IntPtr ptr, int edgeIndex, int halfedgeIndex)\n        {\n            return SurfaceMesh3_EdgesHalfedge(ptr, edgeIndex, halfedgeIndex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool RemoveEdge(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_RemoveEdge(ptr, index);\n        }\n\n        internal override bool RemoveFace(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_RemoveFace(ptr, index);\n        }\n\n        internal override bool IsVertexValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsVertexValid(ptr, index);\n        }\n\n        internal override bool IsEdgeValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsEdgeValid(ptr, index);\n        }\n\n        internal override bool IsHalfedgeValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsHalfedgeValid(ptr, index);\n        }\n\n        internal override bool IsFaceValid(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsFaceValid(ptr, index);\n        }\n\n        internal override Point3d GetPoint(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            SurfaceMesh3_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point3d point)\n        {\n            SurfaceMesh3_EIK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            SurfaceMesh3_EIK_SetPoints(ptr, points, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int index, out Segment3d segment)\n        {\n            return SurfaceMesh3_EIK_GetSegment(ptr, index, out segment);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n        {\n            SurfaceMesh3_EIK_GetSegments(ptr, segments, count);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int index, out Triangle3d tri)\n        {\n            return SurfaceMesh3_EIK_GetTriangle(ptr, index, out tri);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle3d[] triangles, int count)\n        {\n            SurfaceMesh3_EIK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out MeshVertex3 vert)\n        {\n            return SurfaceMesh3_EIK_GetVertex(ptr, index, out vert);\n        }\n\n        internal override void GetVertices(IntPtr ptr, MeshVertex3[] vertexArray, int count)\n        {\n            SurfaceMesh3_EIK_GetVertices(ptr, vertexArray, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out MeshFace3 face)\n        {\n            return SurfaceMesh3_EIK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, MeshFace3[] faceArray, int count)\n        {\n            SurfaceMesh3_EIK_GetFaces(ptr, faceArray, count);\n        }\n\n        internal override bool GetHalfedge(IntPtr ptr, int index, out MeshHalfedge3 edge)\n        {\n            return SurfaceMesh3_EIK_GetHalfedge(ptr, index, out edge);\n        }\n\n        internal override void GetHalfedges(IntPtr ptr, MeshHalfedge3[] edgeArray, int count)\n        {\n            SurfaceMesh3_EIK_GetHalfedges(ptr, edgeArray, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            SurfaceMesh3_EIK_Transform(ptr, matrix);\n        }\n\n        internal override bool IsVertexBorder(IntPtr ptr, int index, bool check_all_incident_halfedges)\n        {\n            return SurfaceMesh3_EIK_IsVertexBorder(ptr, index, check_all_incident_halfedges);\n        }\n\n        internal override bool IsHalfedgeBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsHalfedgeBorder(ptr, index);\n        }\n\n        internal override bool IsEdgeBorder(IntPtr ptr, int index)\n        {\n            return SurfaceMesh3_EIK_IsEdgeBorder(ptr, index);\n        }\n\n        internal override int BorderEdgeCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_BorderEdgeCount(ptr);\n        }\n\n        internal override bool IsClosed(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_IsClosed(ptr);\n        }\n\n        internal override bool CheckFaceVertexCount(IntPtr ptr, int count)\n        {\n            return SurfaceMesh3_EIK_CheckFaceVertexCount(ptr, count);\n        }\n\n        internal override int AddPentagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4)\n        {\n            return SurfaceMesh3_EIK_AddPentagon(ptr, v0, v1, v2, v3, v4);\n        }\n\n        internal override int AddHexagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4, int v5)\n        {\n            return SurfaceMesh3_EIK_AddHexagon(ptr, v0, v1, v2, v3, v4, v5);\n        }\n\n        internal override int AddFace(IntPtr ptr, int[] indices, int count)\n        {\n            return SurfaceMesh3_EIK_AddFace(ptr, indices, count);\n        }\n\n        internal override void Join(IntPtr ptr, IntPtr otherPtr)\n        {\n            SurfaceMesh3_EIK_Join(ptr, otherPtr);\n        }\n\n        internal override void BuildAABBTree(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_BuildAABBTree(ptr);\n        }\n\n        internal override void ReleaseAABBTree(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_ReleaseAABBTree(ptr);\n        }\n\n        internal override Box3d GetBoundingBox(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_GetBoundingBox(ptr);\n        }\n\n        internal override void ReadOFF(IntPtr ptr, string filename)\n        {\n            SurfaceMesh3_EIK_ReadOFF(ptr, filename);\n        }\n\n        internal override void WriteOFF(IntPtr ptr, string filename)\n        {\n            SurfaceMesh3_EIK_WriteOFF(ptr, filename);\n        }\n\n        internal override void Triangulate(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_Triangulate(ptr);\n        }\n\n        internal override bool DoesSelfIntersect(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_DoesBoundAVolume(ptr);\n        }\n\n        internal override double Area(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_Area(ptr);\n        }\n\n        internal override Point3d Centroid(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_Centroid(ptr);\n        }\n\n        internal override double Volume(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_Volume(ptr);\n        }\n\n        internal override bool DoesBoundAVolume(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_DoesBoundAVolume(ptr);\n        }\n\n        internal override BOUNDED_SIDE SideOfTriangleMesh(IntPtr ptr, Point3d point)\n        {\n            return SurfaceMesh3_EIK_SideOfTriangleMesh(ptr, point);\n        }\n\n        internal override bool DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides)\n        {\n            return SurfaceMesh3_EIK_DoIntersects(ptr, otherPtr, test_bounded_sides);\n        }\n\n        internal override void GetCentroids(IntPtr ptr, Point3d[] points, int count)\n        {\n            SurfaceMesh3_EIK_GetCentroids(ptr, points, count);\n        }\n\n        internal override void ComputeVertexNormals(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_ComputeVertexNormals(ptr);\n        }\n\n        internal override void ComputeFaceNormals(IntPtr ptr)\n        {\n            SurfaceMesh3_EIK_ComputeFaceNormals(ptr);\n        }\n\n        internal override void GetVertexNormals(IntPtr ptr, Vector3d[] normals, int count)\n        {\n            SurfaceMesh3_EIK_GetVertexNormals(ptr, normals, count);\n        }\n\n        internal override void GetFaceNormals(IntPtr ptr, Vector3d[] normals, int count)\n        {\n            SurfaceMesh3_EIK_GetFaceNormals(ptr, normals, count);\n        }\n\n        internal override PolygonalCount GetPolygonalCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_GetPolygonalCount(ptr);\n        }\n\n        internal override PolygonalCount GetDualPolygonalCount(IntPtr ptr)\n        {\n            return SurfaceMesh3_EIK_GetDualPolygonalCount(ptr);\n        }\n\n        internal override void CreatePolygonMesh(IntPtr ptr, Point2d[] points, int count, bool xz)\n        {\n            SurfaceMesh3_EIK_CreatePolygonMesh(ptr, points, count, xz);\n        }\n\n        internal override void CreatePolygonalMesh(IntPtr ptr,\n            Point3d[] points, int pointsCount,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EIK_CreatePolygonalMesh(ptr,\n                points, pointsCount,\n                triangles, triangleCount,\n                quads, quadCount,\n                pentagons, pentagonCount,\n                hexagons, hexagonCount);\n        }\n\n        internal override void GetPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EIK_GetPolygonalIndices(ptr,\n                triangles, triangleCount,\n                quads, quadCount,\n                pentagons, pentagonCount,\n                hexagons, hexagonCount);\n        }\n\n        internal override void GetDualPolygonalIndices(IntPtr ptr,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount)\n        {\n            SurfaceMesh3_EIK_GetDualPolygonalIndices(ptr,\n                triangles, triangleCount,\n                quads, quadCount,\n                pentagons, pentagonCount,\n                hexagons, hexagonCount);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceMesh3_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_GetBuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ClearIndexMaps(IntPtr ptr, bool vertices, bool faces, bool halfedges, bool edges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ClearNormalMaps(IntPtr ptr, bool vertices, bool faces);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ClearProperyMaps(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_BuildIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool force);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_PrintIndices(IntPtr ptr, bool vertices, bool faces, bool edges, bool halfedges, bool build);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceMesh3_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsValid(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_HalfedgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_EdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_RemovedVertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_RemovedHalfedgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_RemovedEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_RemovedFaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsVertexRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsFaceRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsHalfedgeRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsEdgeRemoved(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddVertex(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddEdge(IntPtr ptr, int v0, int v1);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddTriangle(IntPtr ptr, int v0, int v1, int v2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddQuad(IntPtr ptr, int v0, int v1, int v2, int v3);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddPentagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddHexagon(IntPtr ptr, int v0, int v1, int v2, int v3, int v4, int v5);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_AddFace(IntPtr ptr, int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_HasGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_CollectGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_SetRecycleGarbage(IntPtr ptr, bool collect);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_DoesRecycleGarbage(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_VertexDegree(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_FaceDegree(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_VertexIsIsolated(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_VertexIsBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_EdgeIsBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_NextHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_PreviousHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_OppositeHalfedge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_SourceVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_TargetVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_NextAroundSource(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_NextAroundTarget(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_PreviousAroundSource(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_PreviousAroundTarget(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EdgesHalfedge(IntPtr ptr, int edgeIndex, int halfedgeIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_RemoveEdge(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_RemoveFace(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsVertexValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsEdgeValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsHalfedgeValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsFaceValid(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d SurfaceMesh3_EIK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_SetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_GetSegment(IntPtr ptr, int index, [Out] out Segment3d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_GetTriangle(IntPtr ptr, int index, [Out] out Triangle3d tri);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_GetVertex(IntPtr ptr, int index, [Out] out MeshVertex3 vert);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetVertices(IntPtr ptr, [Out] MeshVertex3[] vertexArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_GetFace(IntPtr ptr, int index, [Out] out MeshFace3 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetFaces(IntPtr ptr, [Out] MeshFace3[] faceArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_GetHalfedge(IntPtr ptr, int index, [Out] out MeshHalfedge3 edge);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetHalfedges(IntPtr ptr, [Out] MeshHalfedge3[] edgeArray, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsVertexBorder(IntPtr ptr, int index, bool check_all_incident_halfedges);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsHalfedgeBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsEdgeBorder(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int SurfaceMesh3_EIK_BorderEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_IsClosed(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_CheckFaceVertexCount(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_Join(IntPtr ptr, IntPtr otherPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_BuildAABBTree(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ReleaseAABBTree(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Box3d SurfaceMesh3_EIK_GetBoundingBox(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ReadOFF(IntPtr ptr, string filename);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_WriteOFF(IntPtr ptr, string filename);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_Triangulate(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_DoesSelfIntersect(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double SurfaceMesh3_EIK_Area(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d SurfaceMesh3_EIK_Centroid(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double SurfaceMesh3_EIK_Volume(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_DoesBoundAVolume(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern BOUNDED_SIDE SurfaceMesh3_EIK_SideOfTriangleMesh(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool SurfaceMesh3_EIK_DoIntersects(IntPtr ptr, IntPtr otherPtr, bool test_bounded_sides);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetCentroids(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ComputeVertexNormals(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_ComputeFaceNormals(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetVertexNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetFaceNormals(IntPtr ptr, [Out] Vector3d[] normals, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern PolygonalCount SurfaceMesh3_EIK_GetPolygonalCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern PolygonalCount SurfaceMesh3_EIK_GetDualPolygonalCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_CreatePolygonMesh(IntPtr ptr, Point2d[] points, int count, bool xz);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_CreatePolygonalMesh(IntPtr ptr,\n            Point3d[] points, int pointsCount,\n            int[] triangles, int triangleCount,\n            int[] quads, int quadCount,\n            int[] pentagons, int pentagonCount,\n            int[] hexagons, int hexagonCount);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetPolygonalIndices(IntPtr ptr,\n            [Out] int[] triangles, int triangleCount,\n            [Out] int[] quads, int quadCount,\n            [Out] int[] pentagons, int pentagonCount,\n            [Out] int[] hexagons, int hexagonCount);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceMesh3_EIK_GetDualPolygonalIndices(IntPtr ptr,\n            [Out] int[] triangles, int triangleCount,\n            [Out] int[] quads, int quadCount,\n            [Out] int[] pentagons, int pentagonCount,\n            [Out] int[] hexagons, int hexagonCount);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/Polyline2.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Polylines\n{\n\n    /// <summary>\n    /// Generic polyline definition.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Polyline2<K> : Polyline2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Polyline2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a set of points.\n        /// </summary>\n        /// <param name=\"points\">The polylines points.</param>\n        public Polyline2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The polylines pointer.</param>\n        internal Polyline2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The polyline as a string.\n        /// </summary>\n        /// <returns>The polyline as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Polyline2<{0}>: Count={1}]\",\n                Kernel.Name, Count);\n        }\n\n        /// <summary>\n        /// Copy the polyline.\n        /// </summary>\n        /// <returns>The copied polyline.</returns>\n        public Polyline2<K> Copy()\n        {\n            var ptr = Kernel.Copy(Ptr);\n            var copy = new Polyline2<K>(ptr);\n            return copy;\n        }\n\n        /// <summary>\n        /// Create a polygon from the line.\n        /// </summary>\n        /// <param name=\"threshold\">Threshold for the firat and last points being equal.</param>\n        /// <returns>The polygon.</returns>\n        public Polygon2<K> ToPoylgon(double threshold = MathUtil.EPS_64)\n        {\n            var points = ToList();\n\n            if (Point2d.Distance(First, Last) < threshold)\n                points.RemoveAt(points.Count-1);\n\n            return new Polygon2<K>(points.ToArray());\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract polyline definition.\n    /// </summary>\n    public abstract class Polyline2 : CGALObject, IEnumerable<Point2d>\n    {\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private Polyline2()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        internal Polyline2(CGALKernel kernel)\n        {\n            Kernel = kernel.PolylineKernel2;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        /// <param name=\"points\">The points to construct from.</param>\n        internal Polyline2(CGALKernel kernel, Point2d[] points)\n        {\n            Kernel = kernel.PolylineKernel2;\n            Ptr = Kernel.Create();\n            SetPoints(points, points.Length);\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        /// <param name=\"ptr\">The polylines pointer.</param>\n        internal Polyline2(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.PolylineKernel2;\n            Count = Kernel.Count(Ptr);\n        }\n\n        /// <summary>\n        /// The number of points in the polyline.\n        /// </summary>\n        public int Count { get; private set; }\n\n        /// <summary>\n        /// The capacity of the point array.\n        /// </summary>\n        public int Capacity => Kernel.Capacity(Ptr);\n\n        /// <summary>\n        /// Get the first point.\n        /// </summary>\n        public Point2d First => this[0];\n\n        /// <summary>\n        /// Get the last point.\n        /// </summary>\n        public Point2d Last => this[Count-1];\n\n        /// <summary>\n        /// The polylines kernel.\n        /// Contains the functions to the unmanaged CGAL polyline.\n        /// </summary>\n        protected private PolylineKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// Array accessor for the polyline.\n        /// Getting a point clamps to the last point in polyline.\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public Point2d this[int i]\n        {\n            get => GetPointClamped(i);\n            set => SetPoint(i, value);\n        }\n\n        /// <summary>\n        /// Clear the polyline of all points.\n        /// </summary>\n        public void Clear()\n        {\n            Count = 0;\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// Shrink the capacity to match the point count.\n        /// </summary>\n        public void ShrinkCapacityToFitCount()\n        {\n            Kernel.ShrinkToFit(Ptr);\n        }\n\n        /// <summary>\n        /// Resize the point array.\n        /// New elements will default to zero.\n        /// </summary>\n        /// <param name=\"count\"></param>\n        public void Resize(int count)\n        {\n            Count = count;\n            Kernel.Resize(Ptr, count);\n        }\n\n        /// <summary>\n        /// Reverse the polints in the line.\n        /// </summary>\n        public void Reverse()\n        {\n            Kernel.Reverse(Ptr);\n        }\n\n        /// <summary>\n        /// Remove the point at the index from the array.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        public void Remove(int index)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count--;\n            Kernel.Erase(Ptr, index);\n        }\n\n        /// <summary>\n        /// Remove a range of points from the array.\n        /// </summary>\n        /// <param name=\"start\">The starting index</param>\n        /// <param name=\"count\">The number of points to remove.</param>\n        public void Remove(int start, int count)\n        {\n            if (start < 0 || start >= Count ||  start + count >= Count || count > Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count -= count;\n            Kernel.EraseRange(Ptr, start, count);\n        }\n\n        /// <summary>\n        /// Remove the last point.\n        /// </summary>\n        public void RemoveLast()\n        {\n            if (Count == 0) return;\n            Kernel.Erase(Ptr, Count-1);\n            Count--;\n        }\n\n        /// <summary>\n        /// Remove the point at the index from the array.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The point to insert.</param>\n        public void Insert(int index, Point2d point)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count++;\n            Kernel.Insert(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Remove a range of points from the array.\n        /// </summary>\n        /// <param name=\"points\">The points to insert.</param>\n        /// <param name=\"start\">The starting index.</param>\n        /// <param name=\"count\">The number of points to insert.</param>\n        public void Insert(Point2d[] points, int start, int count)\n        {\n            if (start < 0 || start >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            ErrorUtil.CheckArray(points, count);\n            Count += count;\n            Kernel.InsertRange(Ptr, start, count, points);\n        }\n\n        /// <summary>\n        /// Add the point to the end of the poylline.\n        /// </summary>\n        /// <param name=\"point\">The point to add.</param>\n        public void Add(Point2d point)\n        {\n            Insert(Count - 1, point);\n        }\n\n        /// <summary>\n        /// Does the first and last point match.\n        /// </summary>\n        /// <param name=\"threshold\">The distance threshold that counts as match.</param>\n        /// <returns></returns>\n        public bool IsClosed(double threshold = 0)\n        {\n            return Kernel.IsClosed(Ptr, threshold);\n        }\n\n        /// <summary>\n        /// Get the point a the index.\n        /// </summary>\n        /// <param name=\"index\">The points index to get.</param>\n        /// <returns>The point at index.</returns>\n        public Point2d GetPoint(int index)\n        {\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and wrap around the polyline.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point2d GetPointWrapped(int index)\n        {\n            index = MathUtil.Wrap(index, Count);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and clamp to the polylines last point.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point2d GetPointClamped(int index)\n        {\n            index = MathUtil.Clamp(index, 0, Count - 1);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get all the points in the polyline.\n        /// </summary>\n        /// <param name=\"points\">The point array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get all the polyline points.\n        /// </summary>\n        /// <param name=\"points\">The list to copy the data into.</param>\n        public void GetPoints(List<Point2d> points)\n        {\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(i));\n        }\n\n        /// <summary>\n        /// Get all the polyline segments.\n        /// </summary>\n        /// <param name=\"segments\">The segment array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetSegments(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Set the points at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The points value.</param>\n        public void SetPoint(int index, Point2d point)\n        {\n            Kernel.SetPoint(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Set the points from the array.\n        /// If the array is larger than the polyline then \n        /// the new points will be appended to end of polyline.\n        /// </summary>\n        /// <param name=\"points\">The points array.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void SetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.SetPoints(Ptr, points, count);\n            Count = count;\n        }\n\n        /// <summary>\n        /// Finds the length of the polyline.\n        /// </summary>\n        /// <returns></returns>\n        public double FindLength()\n        {\n            return Math.Sqrt(Kernel.SqLength(Ptr));\n        }\n\n        /// <summary>\n        /// Finds the square length of the polyline.\n        /// </summary>\n        /// <returns></returns>\n        public double FindSquareLength()\n        {\n            return Kernel.SqLength(Ptr);\n        }\n\n        /// <summary>\n        /// Translate the polyline.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Translate(Ptr, translation);\n        }\n\n        /// <summary>\n        /// Rotate the polyline.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        public void Rotate(Radian rotation)\n        {\n            Kernel.Rotate(Ptr, rotation.angle);\n        }\n\n        /// <summary>\n        /// Scale the polyline.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Scale(Ptr, scale);\n        }\n\n        /// <summary>\n        /// Transform the polyline with a TRS matrix.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Radian rotation, double scale)\n        {\n            Kernel.Transform(Ptr, translation, rotation.angle, scale);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polyline.\n        /// </summary>\n        /// <returns>Each point in polyline.</returns>\n        public IEnumerator<Point2d> GetEnumerator()\n        {\n            for (int i = 0; i < Count; i++)\n                yield return GetPoint(i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polyline.\n        /// </summary>\n        /// <returns>Each point in polyline.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Return all the points in the polyline in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point2d[] ToArray()\n        {\n            var points = new Point2d[Count];\n            GetPoints(points, points.Length);\n            return points;\n        }\n\n        /// <summary>\n        /// Return all the points in the polyline in a list.\n        /// </summary>\n        /// <returns>The list.</returns>\n        public List<Point2d> ToList()\n        {\n            var points = new List<Point2d>(Count);\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(i));\n\n            return points;\n        }\n\n        /// <summary>\n        /// Convert the polyline to a new polyline with a different kernel.\n        /// May result in different values due to precision issues.\n        /// </summary>\n        /// <typeparam name=\"T\">The new kernel type.</typeparam>\n        /// <returns>The new polline.</returns>\n        public Polyline2<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Convert(Ptr, e);\n            return new Polyline2<T>(ptr);\n        }\n\n        /// <summary>\n        /// Print the polyline into a styring builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Capacity = \" + Capacity);\n            builder.AppendLine(\"IsClosed = \" + IsClosed());\n            builder.AppendLine(\"Length = \" + FindLength());\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Release(ptr);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/Polyline3.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n\n    /// <summary>\n    /// Generic polyline definition.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel type.</typeparam>\n    public sealed class Polyline3<K> : Polyline3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Polyline3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a set of points.\n        /// </summary>\n        /// <param name=\"points\">The polylines points.</param>\n        public Polyline3(Point3d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Create from a pointer.\n        /// </summary>\n        /// <param name=\"ptr\">The polylines pointer.</param>\n        internal Polyline3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The polyline as a string.\n        /// </summary>\n        /// <returns>The polyline as a string.</returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Polyline3<{0}>: Count={1}]\",\n                Kernel.Name, Count);\n        }\n\n        /// <summary>\n        /// Copy the polyline.\n        /// </summary>\n        /// <returns>The copied polyline.</returns>\n        public Polyline3<K> Copy()\n        {\n            var ptr = Kernel.Copy(Ptr);\n            var copy = new Polyline3<K>(ptr);\n            return copy;\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract polyline definition.\n    /// </summary>\n    public abstract class Polyline3 : CGALObject, IEnumerable<Point3d>\n    {\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private Polyline3()\n        {\n\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        internal Polyline3(CGALKernel kernel)\n        {\n            Kernel = kernel.PolylineKernel3;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        /// <param name=\"points\">The points to construct from.</param>\n        internal Polyline3(CGALKernel kernel, Point3d[] points)\n        {\n            Kernel = kernel.PolylineKernel3;\n            Ptr = Kernel.Create();\n            SetPoints(points, points.Length);\n        }\n\n        /// <summary>\n        /// Construct with a new kernel.\n        /// </summary>\n        /// <param name=\"kernel\">The polyline kernel.</param>\n        /// <param name=\"ptr\">The polylines pointer.</param>\n        internal Polyline3(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.PolylineKernel3;\n            Count = Kernel.Count(Ptr);\n        }\n\n        /// <summary>\n        /// The number of points in the polyline.\n        /// </summary>\n        public int Count { get; private set; }\n\n        /// <summary>\n        /// The capacity of the point array.\n        /// </summary>\n        public int Capacity => Kernel.Capacity(Ptr);\n\n        /// <summary>\n        /// Get the first point.\n        /// </summary>\n        public Point3d First => this[0];\n\n        /// <summary>\n        /// Get the last point.\n        /// </summary>\n        public Point3d Last => this[Count - 1];\n\n        /// <summary>\n        /// The polylines kernel.\n        /// Contains the functions to the unmanaged CGAL polyline.\n        /// </summary>\n        protected private PolylineKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// Array accessor for the polyline.\n        /// Getting a point clamps to the last point in polyline.\n        /// </summary>\n        /// <param name=\"i\"></param>\n        /// <returns></returns>\n        public Point3d this[int i]\n        {\n            get => GetPointClamped(i);\n            set => SetPoint(i, value);\n        }\n\n        /// <summary>\n        /// Clear the polyline of all points.\n        /// </summary>\n        public void Clear()\n        {\n            Count = 0;\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// Shrink the capacity to match the point count.\n        /// </summary>\n        public void ShrinkCapacityToFitCount()\n        {\n            Kernel.ShrinkToFit(Ptr);\n        }\n\n        /// <summary>\n        /// Resize the point array.\n        /// New elements will default to zero.\n        /// </summary>\n        /// <param name=\"count\"></param>\n        public void Resize(int count)\n        {\n            Count = count;\n            Kernel.Resize(Ptr, count);\n        }\n\n        /// <summary>\n        /// Reverse the polints in the line.\n        /// </summary>\n        public void Reverse()\n        {\n            Kernel.Reverse(Ptr);\n        }\n\n        /// <summary>\n        /// Remove the point at the index from the array.\n        /// </summary>\n        /// <param name=\"index\">The points index</param>\n        public void Remove(int index)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count--;\n            Kernel.Erase(Ptr, index);\n        }\n\n        /// <summary>\n        /// Remove a range of points from the array.\n        /// </summary>\n        /// <param name=\"start\">The starting index</param>\n        /// <param name=\"count\">The number of points to remove.</param>\n        public void Remove(int start, int count)\n        {\n            if (start < 0 || start >= Count || start + count >= Count || count > Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count -= count;\n            Kernel.EraseRange(Ptr, start, count);\n        }\n\n        /// <summary>\n        /// Remove the last point.\n        /// </summary>\n        public void RemoveLast()\n        {\n            if (Count == 0) return;\n            Kernel.Erase(Ptr, Count - 1);\n            Count--;\n        }\n\n        /// <summary>\n        /// Remove the point at the index from the array.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The point to insert.</param>\n        public void Insert(int index, Point3d point)\n        {\n            if (index < 0 || index >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            Count++;\n            Kernel.Insert(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Remove a range of points from the array.\n        /// </summary>\n        /// <param name=\"points\">The points to insert.</param>\n        /// <param name=\"start\">The starting index.</param>\n        /// <param name=\"count\">The number of points to insert.</param>\n        public void Insert(Point3d[] points, int start, int count)\n        {\n            if (start < 0 || start >= Count)\n                throw new IndexOutOfRangeException(\"Index out of range.\");\n\n            ErrorUtil.CheckArray(points, count);\n            Count += count;\n            Kernel.InsertRange(Ptr, start, count, points);\n        }\n\n        /// <summary>\n        /// Add the point to the end of the poylline.\n        /// </summary>\n        /// <param name=\"point\">The point to add.</param>\n        public void Add(Point3d point)\n        {\n            Insert(Count - 1, point);\n        }\n\n        /// <summary>\n        /// Does the first and last point match.\n        /// </summary>\n        /// <param name=\"threshold\">The distance threshold that counts as match.</param>\n        /// <returns></returns>\n        public bool IsClosed(double threshold = 0)\n        {\n            return Kernel.IsClosed(Ptr, threshold);\n        }\n\n        /// <summary>\n        /// Get the point a the index.\n        /// </summary>\n        /// <param name=\"index\">The points index to get.</param>\n        /// <returns>The point at index.</returns>\n        public Point3d GetPoint(int index)\n        {\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and wrap around the polyline.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point3d GetPointWrapped(int index)\n        {\n            index = MathUtil.Wrap(index, Count);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get the point at the index\n        /// and clamp to the polylines last point.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point at the index.</returns>\n        public Point3d GetPointClamped(int index)\n        {\n            index = MathUtil.Clamp(index, 0, Count - 1);\n            return Kernel.GetPoint(Ptr, index);\n        }\n\n        /// <summary>\n        /// Get all the points in the polyline.\n        /// </summary>\n        /// <param name=\"points\">The point array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get all the polyline points.\n        /// </summary>\n        /// <param name=\"points\">The list to copy the data into.</param>\n        public void GetPoints(List<Point3d> points)\n        {\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(i));\n        }\n\n        /// <summary>\n        /// Get all the polyline segments.\n        /// </summary>\n        /// <param name=\"segments\">The segment array to copy the data into.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void GetSegments(Segment3d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Set the points at the index.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <param name=\"point\">The points value.</param>\n        public void SetPoint(int index, Point3d point)\n        {\n            Kernel.SetPoint(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Set the points from the array.\n        /// If the array is larger than the polyline then \n        /// the new points will be appended to end of polyline.\n        /// </summary>\n        /// <param name=\"points\">The points array.</param>\n        /// <param name=\"count\">The array length.</param>\n        public void SetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.SetPoints(Ptr, points, count);\n            Count = count;\n        }\n\n        /// <summary>\n        /// Finds the length of the polyline.\n        /// </summary>\n        /// <returns></returns>\n        public double FindLength()\n        {\n            return Math.Sqrt(Kernel.SqLength(Ptr));\n        }\n\n        /// <summary>\n        /// Finds the square length of the polyline.\n        /// </summary>\n        /// <returns></returns>\n        public double FindSquareLength()\n        {\n            return Kernel.SqLength(Ptr);\n        }\n\n        /// <summary>\n        /// Translate each point in the polyline.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point3d translation)\n        {\n            var m = Matrix4x4d.Translate(translation);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Rotate each point in the polyline.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Quaternion3d rotation)\n        {\n            var m = rotation.ToMatrix4x4d();\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Scale each point in the polyline.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(Point3d scale)\n        {\n            var m = Matrix4x4d.Scale(scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Transform each point in the polyline.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point3d translation, Quaternion3d rotation, Point3d scale)\n        {\n            var m = Matrix4x4d.TranslateRotateScale(translation, rotation, scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polyline.\n        /// </summary>\n        /// <returns>Each point in polyline.</returns>\n        public IEnumerator<Point3d> GetEnumerator()\n        {\n            for (int i = 0; i < Count; i++)\n                yield return GetPoint(i);\n        }\n\n        /// <summary>\n        /// Enumerate all points in the polyline.\n        /// </summary>\n        /// <returns>Each point in polyline.</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return GetEnumerator();\n        }\n\n        /// <summary>\n        /// Return all the points in the polyline in a array.\n        /// </summary>\n        /// <returns>The array.</returns>\n        public Point3d[] ToArray()\n        {\n            var points = new Point3d[Count];\n            GetPoints(points, points.Length);\n            return points;\n        }\n\n        /// <summary>\n        /// Return all the points in the polyline in a list.\n        /// </summary>\n        /// <returns>The list.</returns>\n        public List<Point3d> ToList()\n        {\n            var points = new List<Point3d>(Count);\n            for (int i = 0; i < Count; i++)\n                points.Add(GetPoint(i));\n\n            return points;\n        }\n\n        /// <summary>\n        /// Convert the polyline to a new polyline with a different kernel.\n        /// May result in different values due to precision issues.\n        /// </summary>\n        /// <typeparam name=\"T\">The new kernel type.</typeparam>\n        /// <returns>The new polline.</returns>\n        public Polyline3<T> Convert<T>() where T : CGALKernel, new()\n        {\n            var k = typeof(T).Name;\n            var e = CGALEnum.ToKernelEnum(k);\n            var ptr = Kernel.Convert(Ptr, e);\n            return new Polyline3<T>(ptr);\n        }\n\n        /// <summary>\n        /// Print the polyline into a styring builder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"Capacity = \" + Capacity);\n            builder.AppendLine(\"IsClosed = \" + IsClosed());\n            builder.AppendLine(\"Length = \" + FindLength());\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n        /// <summary>\n        /// Release the unmanaged pointer.\n        /// </summary>\n        protected override void ReleasePtr(IntPtr ptr)\n        {\n            Kernel.Release(ptr);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n\tinternal abstract class PolylineKernel2 : CGALObjectKernel\n\t{\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract IntPtr CreateWithCount(int count);\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract int Count(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Copy(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Convert(IntPtr ptr, CGAL_KERNEL k);\n\n\t\tinternal abstract void Clear(IntPtr ptr);\n\n\t\tinternal abstract int Capacity(IntPtr ptr);\n\n\t\tinternal abstract void Resize(IntPtr ptr, int count);\n\n\t\tinternal abstract void Reverse(IntPtr ptr);\n\n\t\tinternal abstract void ShrinkToFit(IntPtr ptr);\n\n\t\tinternal abstract void Erase(IntPtr ptr, int index);\n\n\t\tinternal abstract void EraseRange(IntPtr ptr, int start, int count);\n\n\t\tinternal abstract void Insert(IntPtr ptr, int index, Point2d point);\n\n\t\tinternal abstract void InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n\t\tinternal abstract bool IsClosed(IntPtr ptr, double threshold);\n\n\t\tinternal abstract double SqLength(IntPtr ptr);\n\n\t\tinternal abstract Point2d GetPoint(IntPtr ptr, int index);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\tinternal abstract void GetSegments(IntPtr ptr, Segment2d[] segments, int count);\n\n\t\tinternal abstract void SetPoint(IntPtr ptr, int index, Point2d point);\n\n\t\tinternal abstract void SetPoints(IntPtr ptr, Point2d[] points, int count);\n\n\t\tinternal abstract void Translate(IntPtr ptr, Point2d translation);\n\n\t\tinternal abstract void Rotate(IntPtr ptr, double rotation);\n\n\t\tinternal abstract void Scale(IntPtr ptr, double scale);\n\n\t\tinternal abstract void Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n    internal class PolylineKernel2_EEK : PolylineKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolylineKernel2 Instance = new PolylineKernel2_EEK();\n\n\t\tinternal override IntPtr Create()\n        {\n            return Polyline2_EEK_Create();\n        }\n\n\t\tinternal override IntPtr CreateWithCount(int count)\n        {\n            return Polyline2_EEK_CreateWithCount(count);    \n        }\n\n\t\tinternal override void Release(IntPtr ptr)\n        {\n            Polyline2_EEK_Release(ptr);\n        }\n\n\t\tinternal override int Count(IntPtr ptr)\n        {\n            return Polyline2_EEK_Count(ptr);\n        }\n\n\t\tinternal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polyline2_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polyline2_EEK_Convert(ptr, k);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polyline2_EEK_Clear(ptr);   \n        }\n\n\t\tinternal override int Capacity(IntPtr ptr)\n        {\n            return Polyline2_EEK_Capacity(ptr);\n        }\n\n\t\tinternal override void Resize(IntPtr ptr, int count)\n        {\n            Polyline2_EEK_Resize(ptr, count);\n        }\n\n\t\tinternal override void Reverse(IntPtr ptr)\n        {\n            Polyline2_EEK_Reverse(ptr);\n        }\n\n\t\tinternal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polyline2_EEK_ShrinkToFit(ptr);\n        }\n\n\t\tinternal override void Erase(IntPtr ptr, int index)\n        {\n            Polyline2_EEK_Erase(ptr, index);\n        }\n\n\t\tinternal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polyline2_EEK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point2d point)\n        {\n            Polyline2_EEK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point2d[] points)\n        {\n            Polyline2_EEK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override bool IsClosed(IntPtr ptr, double threshold)\n        {\n            return Polyline2_EEK_IsClosed(ptr, threshold);\n        }\n\n        internal override double SqLength(IntPtr ptr)\n        {\n            return Polyline2_EEK_SqLength(ptr);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int index)\n        {\n            return Polyline2_EEK_GetPoint(ptr, index);\n        }\n\n\t\tinternal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polyline2_EEK_GetPoints(ptr, points, count);\n        }\n\n\t\tinternal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            Polyline2_EEK_GetSegments(ptr, segments, count);\n        }\n\n\t\tinternal override void SetPoint(IntPtr ptr, int index, Point2d point)\n        {\n            Polyline2_EEK_SetPoint(ptr, index, point);\n        }\n\n\t\tinternal override void SetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polyline2_EEK_SetPoints(ptr, points, count);\n        }\n\n\t\tinternal override void Translate(IntPtr ptr, Point2d translation)\n        { \n            Polyline2_EEK_Translate(ptr, translation);\n        }\n\n\t\tinternal override void Rotate(IntPtr ptr, double rotation)\n        {\n            Polyline2_EEK_Rotate(ptr, rotation);\n        }\n\n\t\tinternal override void Scale(IntPtr ptr, double scale)\n        {\n            Polyline2_EEK_Scale(ptr, scale);\n        }\n\n\t\tinternal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Polyline2_EEK_Transform(ptr, translation, rotation, scale); \n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EEK_CreateWithCount(int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline2_EEK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline2_EEK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Insert(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polyline2_EEK_IsClosed(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polyline2_EEK_SqLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polyline2_EEK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_SetPoint(IntPtr ptr, int index, Point2d point);\n\n       [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_SetPoints(IntPtr ptr, Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Translate(IntPtr ptr, Point2d translation);\n\n            [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Rotate(IntPtr ptr, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Scale(IntPtr ptr, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n    internal class PolylineKernel2_EIK : PolylineKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolylineKernel2 Instance = new PolylineKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return Polyline2_EIK_Create();\n        }\n\n        internal override IntPtr CreateWithCount(int count)\n        {\n            return Polyline2_EIK_CreateWithCount(count);\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Polyline2_EIK_Release(ptr);\n        }\n\n        internal override int Count(IntPtr ptr)\n        {\n            return Polyline2_EIK_Count(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polyline2_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polyline2_EIK_Convert(ptr, k);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polyline2_EIK_Clear(ptr);\n        }\n\n        internal override int Capacity(IntPtr ptr)\n        {\n            return Polyline2_EIK_Capacity(ptr);\n        }\n\n        internal override void Resize(IntPtr ptr, int count)\n        {\n            Polyline2_EIK_Resize(ptr, count);\n        }\n\n        internal override void Reverse(IntPtr ptr)\n        {\n            Polyline2_EIK_Reverse(ptr);\n        }\n\n        internal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polyline2_EIK_ShrinkToFit(ptr);\n        }\n\n        internal override void Erase(IntPtr ptr, int index)\n        {\n            Polyline2_EIK_Erase(ptr, index);\n        }\n\n        internal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polyline2_EIK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point2d point)\n        {\n            Polyline2_EIK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point2d[] points)\n        {\n            Polyline2_EIK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override bool IsClosed(IntPtr ptr, double threshold)\n        {\n            return Polyline2_EIK_IsClosed(ptr, threshold);\n        }\n\n        internal override double SqLength(IntPtr ptr)\n        {\n            return Polyline2_EIK_SqLength(ptr);\n        }\n\n        internal override Point2d GetPoint(IntPtr ptr, int index)\n        {\n            return Polyline2_EIK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polyline2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            Polyline2_EIK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point2d point)\n        {\n            Polyline2_EIK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Polyline2_EIK_SetPoints(ptr, points, count);\n        }\n\n        internal override void Translate(IntPtr ptr, Point2d translation)\n        {\n            Polyline2_EIK_Translate(ptr, translation);\n        }\n\n        internal override void Rotate(IntPtr ptr, double rotation)\n        {\n            Polyline2_EIK_Rotate(ptr, rotation);\n        }\n\n        internal override void Scale(IntPtr ptr, double scale)\n        {\n            Polyline2_EIK_Scale(ptr, scale);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Polyline2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EIK_CreateWithCount(int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline2_EIK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline2_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline2_EIK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Insert(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_InsertRange(IntPtr ptr, int start, int count, Point2d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polyline2_EIK_IsClosed(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polyline2_EIK_SqLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point2d Polyline2_EIK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_GetSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_SetPoint(IntPtr ptr, int index, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_SetPoints(IntPtr ptr, Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Translate(IntPtr ptr, Point2d translation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Rotate(IntPtr ptr, double rotation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Scale(IntPtr ptr, double scale);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n\tinternal abstract class PolylineKernel3 : CGALObjectKernel\n\t{\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract IntPtr CreateWithCount(int count);\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\tinternal abstract int Count(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Copy(IntPtr ptr);\n\n\t\tinternal abstract IntPtr Convert(IntPtr ptr, CGAL_KERNEL k);\n\n\t\tinternal abstract void Clear(IntPtr ptr);\n\n\t\tinternal abstract int Capacity(IntPtr ptr);\n\n\t\tinternal abstract void Resize(IntPtr ptr, int count);\n\n\t\tinternal abstract void Reverse(IntPtr ptr);\n\n\t\tinternal abstract void ShrinkToFit(IntPtr ptr);\n\n\t\tinternal abstract void Erase(IntPtr ptr, int index);\n\n\t\tinternal abstract void EraseRange(IntPtr ptr, int start, int count);\n\n\t\tinternal abstract void Insert(IntPtr ptr, int index, Point3d point);\n\n\t\tinternal abstract void InsertRange(IntPtr ptr, int start, int count, Point3d[] points);\n\n\t\tinternal abstract bool IsClosed(IntPtr ptr, double threshold);\n\n\t\tinternal abstract double SqLength(IntPtr ptr);\n\n\t\tinternal abstract Point3d GetPoint(IntPtr ptr, int index);\n\n\t\tinternal abstract void GetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract void GetSegments(IntPtr ptr, Segment3d[] segments, int count);\n\n\t\tinternal abstract void SetPoint(IntPtr ptr, int index, Point3d point);\n\n\t\tinternal abstract void SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n\t\tinternal abstract void Transform(IntPtr ptr, Matrix4x4d matrix);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n    internal class PolylineKernel3_EEK : PolylineKernel3\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly PolylineKernel3 Instance = new PolylineKernel3_EEK();\n\n        internal override IntPtr Create()\n        {\n            return Polyline3_EEK_Create();\n        }\n\n        internal override IntPtr CreateWithCount(int count)\n        {\n            return Polyline3_EEK_CreateWithCount(count);\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Polyline3_EEK_Release(ptr);\n        }\n\n        internal override int Count(IntPtr ptr)\n        {\n            return Polyline3_EEK_Count(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polyline3_EEK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polyline3_EEK_Convert(ptr, k);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polyline3_EEK_Clear(ptr);\n        }\n\n        internal override int Capacity(IntPtr ptr)\n        {\n            return Polyline3_EEK_Capacity(ptr);\n        }\n\n        internal override void Resize(IntPtr ptr, int count)\n        {\n            Polyline3_EEK_Resize(ptr, count);\n        }\n\n        internal override void Reverse(IntPtr ptr)\n        {\n            Polyline3_EEK_Reverse(ptr);\n        }\n\n        internal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polyline3_EEK_ShrinkToFit(ptr);\n        }\n\n        internal override void Erase(IntPtr ptr, int index)\n        {\n            Polyline3_EEK_Erase(ptr, index);\n        }\n\n        internal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polyline3_EEK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point3d point)\n        {\n            Polyline3_EEK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point3d[] points)\n        {\n            Polyline3_EEK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override bool IsClosed(IntPtr ptr, double threshold)\n        {\n            return Polyline3_EEK_IsClosed(ptr, threshold);\n        }\n\n        internal override double SqLength(IntPtr ptr)\n        {\n            return Polyline3_EEK_SqLength(ptr);\n        }\n\n        internal override Point3d GetPoint(IntPtr ptr, int index)\n        {\n            return Polyline3_EEK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Polyline3_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n        {\n            Polyline3_EEK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point3d point)\n        {\n            Polyline3_EEK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Polyline3_EEK_SetPoints(ptr, points, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            Polyline3_EEK_Transform(ptr, matrix);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EEK_CreateWithCount(int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline3_EEK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EEK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline3_EEK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Insert(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_InsertRange(IntPtr ptr, int start, int count, Point3d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polyline3_EEK_IsClosed(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polyline3_EEK_SqLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d Polyline3_EEK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EEK_Transform(IntPtr ptr, Matrix4x4d matrix);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Polylines/PolylineKernel3_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Polylines\n{\n    internal class PolylineKernel3_EIK : PolylineKernel3\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly PolylineKernel3 Instance = new PolylineKernel3_EIK();\n\n        internal override IntPtr Create()\n        {\n            return Polyline3_EIK_Create();\n        }\n\n        internal override IntPtr CreateWithCount(int count)\n        {\n            return Polyline3_EIK_CreateWithCount(count);\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Polyline3_EIK_Release(ptr);\n        }\n\n        internal override int Count(IntPtr ptr)\n        {\n            return Polyline3_EIK_Count(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Polyline3_EIK_Copy(ptr);\n        }\n\n        internal override IntPtr Convert(IntPtr ptr, CGAL_KERNEL k)\n        {\n            return Polyline3_EIK_Convert(ptr, k);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Polyline3_EIK_Clear(ptr);\n        }\n\n        internal override int Capacity(IntPtr ptr)\n        {\n            return Polyline3_EIK_Capacity(ptr);\n        }\n\n        internal override void Resize(IntPtr ptr, int count)\n        {\n            Polyline3_EIK_Resize(ptr, count);\n        }\n\n        internal override void Reverse(IntPtr ptr)\n        {\n            Polyline3_EIK_Reverse(ptr);\n        }\n\n        internal override void ShrinkToFit(IntPtr ptr)\n        {\n            Polyline3_EIK_ShrinkToFit(ptr);\n        }\n\n        internal override void Erase(IntPtr ptr, int index)\n        {\n            Polyline3_EIK_Erase(ptr, index);\n        }\n\n        internal override void EraseRange(IntPtr ptr, int start, int count)\n        {\n            Polyline3_EIK_EraseRange(ptr, start, count);\n        }\n\n        internal override void Insert(IntPtr ptr, int index, Point3d point)\n        {\n            Polyline3_EIK_Insert(ptr, index, point);\n        }\n\n        internal override void InsertRange(IntPtr ptr, int start, int count, Point3d[] points)\n        {\n            Polyline3_EIK_InsertRange(ptr, start, count, points);\n        }\n\n        internal override bool IsClosed(IntPtr ptr, double threshold)\n        {\n            return Polyline3_EIK_IsClosed(ptr, threshold);\n        }\n\n        internal override double SqLength(IntPtr ptr)\n        {\n            return Polyline3_EIK_SqLength(ptr);\n        }\n\n        internal override Point3d GetPoint(IntPtr ptr, int index)\n        {\n            return Polyline3_EIK_GetPoint(ptr, index);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Polyline3_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] segments, int count)\n        {\n            Polyline3_EIK_GetSegments(ptr, segments, count);\n        }\n\n        internal override void SetPoint(IntPtr ptr, int index, Point3d point)\n        {\n            Polyline3_EIK_SetPoint(ptr, index, point);\n        }\n\n        internal override void SetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Polyline3_EIK_SetPoints(ptr, points, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            Polyline3_EIK_Transform(ptr, matrix);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EIK_CreateWithCount(int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline3_EIK_Count(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Polyline3_EIK_Convert(IntPtr ptr, CGAL_KERNEL k);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Polyline3_EIK_Capacity(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Resize(IntPtr ptr, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Reverse(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_ShrinkToFit(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Erase(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_EraseRange(IntPtr ptr, int start, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Insert(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_InsertRange(IntPtr ptr, int start, int count, Point3d[] points);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Polyline3_EIK_IsClosed(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double Polyline3_EIK_SqLength(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d Polyline3_EIK_GetPoint(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_SetPoint(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_SetPoints(IntPtr ptr, Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Polyline3_EIK_Transform(IntPtr ptr, Matrix4x4d matrix);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/HeatMethod.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// The heat method is an algorithm that solves the single- or multiple-source shortest \n    /// path problem by returning an approximation of the geodesic distance for all vertices\n    /// of a triangle mesh to the closest vertex in a given set of source vertices. \n    /// The geodesic distance between two vertices of a mesh is the distance when walking \n    /// on the surface, potentially through the interior of faces. Two vertices that are \n    /// close in 3D space may be far away on the surface.\n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class HeatMethod<K> : HeatMethod where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Create a static instance.\n        /// </summary>\n        public static readonly HeatMethod<K> Instance = new HeatMethod<K>();\n\n        /// <summary>\n        /// Create a new instance.\n        /// </summary>\n        public HeatMethod() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new instance from a existing pointer to a unmanaged object.\n        /// </summary>\n        /// <param name=\"ptr\">The unmanaged objects pointer.</param>\n        internal HeatMethod(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[HeatMethod<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Find the distances for each vertex in the mesh to the vertex at the provided index.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh containing the vertices.</param>\n        /// <param name=\"index\">The vertices index to find the distances to.</param>\n        /// <param name=\"distances\">The distances for each vertex in the mesh.</param>\n        /// <param name=\"useIDT\">Should the intrinsitic delaunay triangulation be used. \n        /// This will improve the results for meshes that have bad triangle quality.</param>\n        /// <returns>The maximum distance value.</returns>\n        public double EstimateGeodesicDistances(SurfaceMesh3<K> mesh, int index, List<double> distances, bool useIDT = true)\n        {\n            CheckIsValidTriangleException(mesh);\n\n            int count = Kernel.EstimateGeodesicDistances_SM(Ptr, mesh.Ptr, index, useIDT);\n\n            double max = GetDistances(count, distances);\n            ClearDistances();\n\n            return max;\n        }\n\n        /// <summary>\n        /// Find the distances for each vertex in the mesh to the vertex at the provided index.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh containing the vertices.</param>\n        /// <param name=\"index\">The vertices index to find the distances to.</param>\n        /// <param name=\"distances\">The distances for each vertex in the mesh.\n        /// This will improve the results for meshes that have bad triangle quality.</param>\n        /// <returns>The maximum distance value.</returns>\n        public double EstimateGeodesicDistances(Polyhedron3<K> mesh, int index, List<double> distances)\n        {\n            CheckIsValidTriangleException(mesh);\n\n            int count = Kernel.EstimateGeodesicDistances_PH(Ptr, mesh.Ptr, index, false);\n\n            double max = GetDistances(count, distances);\n            ClearDistances();\n\n            return max;\n        }\n\n    }\n\n\n    public abstract class HeatMethod : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private HeatMethod()\n        {\n\n        }\n\n        /// <summary>\n        /// Create a new instance.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal HeatMethod(CGALKernel kernel)\n        {\n            Kernel = kernel.HeatMethodKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// Create a new instance from a existing pointer to a unmanaged object.\n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\">The unmanaged objects pointer.</param>\n        internal HeatMethod(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.HeatMethodKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal HeatMethodKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"count\"></param>\n        /// <param name=\"distances\"></param>\n        /// <returns></returns>\n        protected double GetDistances(int count, List<double> distances)\n        {\n            double max = double.NegativeInfinity;\n            for (int i = 0; i < count; i++)\n            {\n                var dist = GetDistance(i);\n\n                if (dist > max)\n                    max = dist;\n\n                distances.Add(dist);\n            }\n\n            return max;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        protected double GetDistance(int index)\n        {\n            return Kernel.GetDistance(Ptr, index);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected void ClearDistances()\n        {\n            Kernel.ClearDistances(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/HeatMethodKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class HeatMethodKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract double GetDistance(IntPtr ptr, int index);\n\n        internal abstract void ClearDistances(IntPtr ptr);\n\n        internal abstract int EstimateGeodesicDistances_SM(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n\n        internal abstract int EstimateGeodesicDistances_PH(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/HeatMethodKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class HeatMethodKernel_EEK : HeatMethodKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly HeatMethodKernel Instance = new HeatMethodKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return HeatMethod_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            HeatMethod_EEK_Release(ptr);\n        }\n\n        internal override double GetDistance(IntPtr ptr, int index)\n        {\n            return HeatMethod_EEK_GetDistance(ptr, index);  \n        }\n\n        internal override void ClearDistances(IntPtr ptr)\n        {\n            HeatMethod_EEK_ClearDistances(ptr);  \n        }\n\n        internal override int EstimateGeodesicDistances_SM(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT)\n        {\n            return HeatMethod_EEK_EstimateGeodesicDistances_SM(ptr, meshPtr, vertexIndex, useIDT);\n        }\n\n        internal override int EstimateGeodesicDistances_PH(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT)\n        {\n            return HeatMethod_EEK_EstimateGeodesicDistances_PH(ptr, meshPtr, vertexIndex, useIDT);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HeatMethod_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HeatMethod_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HeatMethod_EEK_GetDistance(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HeatMethod_EEK_ClearDistances(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int HeatMethod_EEK_EstimateGeodesicDistances_SM(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int HeatMethod_EEK_EstimateGeodesicDistances_PH(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/HeatMethodKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class HeatMethodKernel_EIK : HeatMethodKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly HeatMethodKernel Instance = new HeatMethodKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return HeatMethod_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            HeatMethod_EIK_Release(ptr);\n        }\n\n        internal override double GetDistance(IntPtr ptr, int index)\n        {\n            return HeatMethod_EIK_GetDistance(ptr, index);\n        }\n\n        internal override void ClearDistances(IntPtr ptr)\n        {\n            HeatMethod_EIK_ClearDistances(ptr);\n        }\n\n        internal override int EstimateGeodesicDistances_SM(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT)\n        {\n            return HeatMethod_EIK_EstimateGeodesicDistances_SM(ptr, meshPtr, vertexIndex, useIDT);\n        }\n\n        internal override int EstimateGeodesicDistances_PH(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT)\n        {\n            return HeatMethod_EIK_EstimateGeodesicDistances_PH(ptr, meshPtr, vertexIndex, useIDT);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr HeatMethod_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HeatMethod_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern double HeatMethod_EIK_GetDistance(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void HeatMethod_EIK_ClearDistances(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int HeatMethod_EIK_EstimateGeodesicDistances_SM(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int HeatMethod_EIK_EstimateGeodesicDistances_PH(IntPtr ptr, IntPtr meshPtr, int vertexIndex, bool useIDT);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingBoolean.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    public enum POLYHEDRA_BOOLEAN\n    {\n        UNION,\n        INTERSECT,\n        DIFFERENCE\n    };\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingBoolean<K> : MeshProcessingBoolean where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingBoolean<K> Instance = new MeshProcessingBoolean<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingBoolean() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingBoolean(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingBoolean<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"op\"></param>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Op(POLYHEDRA_BOOLEAN op, Polyhedron3<K> mesh1, Polyhedron3<K> mesh2, out Polyhedron3<K> result)\n        {\n            switch (op)\n            {\n                case POLYHEDRA_BOOLEAN.UNION:\n                    return Union(mesh1, mesh2, out result);\n                case POLYHEDRA_BOOLEAN.INTERSECT:\n                    return Intersection(mesh1, mesh2, out result);\n                case POLYHEDRA_BOOLEAN.DIFFERENCE:\n                    return Difference(mesh1, mesh2, out result);\n            }\n\n            result = null;\n            return false;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"op\"></param>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Op(POLYHEDRA_BOOLEAN op, SurfaceMesh3<K> mesh1, SurfaceMesh3<K> mesh2, out SurfaceMesh3<K> result)\n        {\n            switch (op)\n            {\n                case POLYHEDRA_BOOLEAN.UNION:\n                    return Union(mesh1, mesh2, out result);\n                case POLYHEDRA_BOOLEAN.INTERSECT:\n                    return Intersection(mesh1, mesh2, out result);\n                case POLYHEDRA_BOOLEAN.DIFFERENCE:\n                    return Difference(mesh1, mesh2, out result);\n            }\n\n            result = null;\n            return false;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Union(Polyhedron3<K> mesh1, Polyhedron3<K> mesh2, out Polyhedron3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Union_PH(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new Polyhedron3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Union(SurfaceMesh3<K> mesh1, SurfaceMesh3<K> mesh2, out SurfaceMesh3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Union_SM(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new SurfaceMesh3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Difference(Polyhedron3<K> mesh1, Polyhedron3<K> mesh2, out Polyhedron3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Difference_PH(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new Polyhedron3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Difference(SurfaceMesh3<K> mesh1, SurfaceMesh3<K> mesh2, out SurfaceMesh3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Difference_SM(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new SurfaceMesh3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Intersection(Polyhedron3<K> mesh1, Polyhedron3<K> mesh2, out Polyhedron3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Intersection_PH(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new Polyhedron3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"mesh1\"></param>\n        /// <param name=\"mesh2\"></param>\n        /// <param name=\"result\"></param>\n        /// <returns></returns>\n        public bool Intersection(SurfaceMesh3<K> mesh1, SurfaceMesh3<K> mesh2, out SurfaceMesh3<K> result)\n        {\n            CheckIsValidException(mesh1);\n            CheckIsValidException(mesh2);\n\n            if (Kernel.Intersection_PH(mesh1.Ptr, mesh2.Ptr, out IntPtr resultPtr))\n            {\n                result = new SurfaceMesh3<K>(resultPtr);\n                return true;\n            }\n            else\n            {\n                result = null;\n                return false;\n            }\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingBoolean : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingBoolean()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingBoolean(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingBooleanKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingBoolean(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingBooleanKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingBooleanKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingBooleanKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingBooleanKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        //Polyhedron \n\n        internal abstract bool Union_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Difference_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Intersection_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Clip_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool PlaneClip_PH(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        internal abstract bool BoxClip_PH(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n\n        //Surface Mesh\n\n        internal abstract bool Union_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Difference_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Intersection_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool Clip_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        internal abstract bool PlaneClip_SM(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        internal abstract bool BoxClip_SM(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingBooleanKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingBooleanKernel_EEK : MeshProcessingBooleanKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingBooleanKernel Instance = new MeshProcessingBooleanKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingBoolean_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingBoolean_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override bool Union_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Union_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Difference_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Difference_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Intersection_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Intersection_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Clip_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Clip_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool PlaneClip_PH(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_PlaneClip_PH(meshPtr1, plane, out resultPtr);\n        }\n\n        internal override bool BoxClip_PH(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_BoxClip_PH(meshPtr1, box, out resultPtr);\n        }\n\n        //Surface Mesh\n\n        internal override bool Union_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Union_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Difference_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Difference_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Intersection_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Intersection_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Clip_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_Clip_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool PlaneClip_SM(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_PlaneClip_SM(meshPtr1, plane, out resultPtr);\n        }\n\n        internal override bool BoxClip_SM(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EEK_BoxClip_SM(meshPtr1, box, out resultPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingBoolean_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingBoolean_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Union_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Difference_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Intersection_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Clip_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_PlaneClip_PH(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_BoxClip_PH(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Union_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Difference_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Intersection_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_Clip_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_PlaneClip_SM(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EEK_BoxClip_SM(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingBooleanKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingBooleanKernel_EIK : MeshProcessingBooleanKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingBooleanKernel Instance = new MeshProcessingBooleanKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingBoolean_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingBoolean_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override bool Union_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Union_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Difference_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Difference_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Intersection_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Intersection_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Clip_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Clip_PH(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool PlaneClip_PH(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_PlaneClip_PH(meshPtr1, plane, out resultPtr);\n        }\n\n        internal override bool BoxClip_PH(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_BoxClip_PH(meshPtr1, box, out resultPtr);\n        }\n\n        //Surface Mesh\n\n        internal override bool Union_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Union_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Difference_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Difference_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Intersection_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Intersection_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool Clip_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_Clip_SM(meshPtr1, meshPtr2, out resultPtr);\n        }\n\n        internal override bool PlaneClip_SM(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_PlaneClip_SM(meshPtr1, plane, out resultPtr);\n        }\n\n        internal override bool BoxClip_SM(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr)\n        {\n            return MeshProcessingBoolean_EIK_BoxClip_SM(meshPtr1, box, out resultPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingBoolean_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingBoolean_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Union_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Difference_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Intersection_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Clip_PH(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_PlaneClip_PH(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_BoxClip_PH(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Union_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Difference_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Intersection_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_Clip_SM(IntPtr meshPtr1, IntPtr meshPtr2, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_PlaneClip_SM(IntPtr meshPtr1, Plane3d plane, out IntPtr resultPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingBoolean_EIK_BoxClip_SM(IntPtr meshPtr1, Box3d box, out IntPtr resultPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingConnections.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingConnections<K> : MeshProcessingConnections where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingConnections<K> Instance = new MeshProcessingConnections<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingConnections() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingConnections(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingConnections<{0}>: ]\", Kernel.Name);\n        }\n\n        /*\n        /// <summary>\n        /// Returns the number of unconnect components in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>Returns the number of unconnect components in the mesh.</returns>\n        public int UnconnectedComponents(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.ConnectedComponents_PH(mesh.Ptr);\n        }\n        */\n\n        /// <summary>\n        /// Returns the number of unconnect components in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>Returns the number of unconnect components in the mesh.</returns>\n        public int UnconnectedComponents(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.ConnectedComponents_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Returns a list of face indices that are part of the same component as the provided face index.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"faceIndex\">The faces index in the mesh.</param>\n        /// <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        public void ConnectedFaces(Polyhedron3<K> mesh, int faceIndex, List<int> results)\n        {\n            CheckIsValidException(mesh);\n\n            int count = Kernel.ConnectedComponent_PH(Ptr, mesh.Ptr, faceIndex);\n            if (count == 0) return;\n\n            var indices = new int[count];\n            Kernel.GetConnectedComponentsFaceIndex_PH(Ptr, mesh.Ptr, indices, count);\n            results.AddRange(indices);\n        }\n\n        /// <summary>\n        /// Returns a list of face indices that are part of the same component as the provided face index.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"faceIndex\">The faces index in the mesh.</param>\n        /// <param name=\"results\">A list of face indices that are part of the same component as the provided face index.</param>\n        public void ConnectedFaces(SurfaceMesh3<K> mesh, int faceIndex, List<int> results)\n        {\n            CheckIsValidException(mesh);\n\n            int count = Kernel.ConnectedComponent_SM(Ptr, mesh.Ptr, faceIndex);\n            if (count == 0) return;\n\n            var indices = new int[count];\n            Kernel.GetConnectedComponentsFaceIndex_SM(Ptr, mesh.Ptr, indices, count);\n            results.AddRange(indices);\n        }\n\n        /// <summary>\n        /// Split each component in the mesh into individual meshes.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"results\">The split meshes.</param>\n        public void SplitUnconnectedComponents(Polyhedron3<K> mesh, List<Polyhedron3<K>> results)\n        {\n            CheckIsValidException(mesh);\n\n            int count = Kernel.SplitConnectedComponents_PH(Ptr, mesh.Ptr);\n            if (count == 0) return;\n\n            var ptrs = new IntPtr[count];\n            Kernel.GetSplitConnectedComponents_PH(Ptr, ptrs, count);\n\n            for (int i = 0; i < count; i++)\n                results.Add( new Polyhedron3<K>(ptrs[i]));\n        }\n\n        /// <summary>\n        /// Split each component in the mesh into individual meshes.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"results\">The split meshes.</param>\n        public void SplitUnconnectedComponents(SurfaceMesh3<K> mesh, List<SurfaceMesh3<K>> results)\n        {\n            CheckIsValidException(mesh);\n\n            int count = Kernel.SplitConnectedComponents_SM(Ptr, mesh.Ptr);\n            if (count == 0) return;\n\n            var ptrs = new IntPtr[count];\n            Kernel.GetSplitConnectedComponents_SM(Ptr, ptrs, count);\n\n            for (int i = 0; i < count; i++)\n                results.Add(new SurfaceMesh3<K>(ptrs[i]));\n        }\n\n        /// <summary>\n        /// Removes connected components with less than a given number of faces.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n        /// <returns>The number of components removed.</returns>\n        public int KeepLargeComponents(Polyhedron3<K> mesh, int threshold_value)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.KeepLargeConnectedComponents_PH(mesh.Ptr, threshold_value);\n        }\n\n        /// <summary>\n        /// Removes connected components with less than a given number of faces.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"threshold_value\">The number of faces a component must have so that it is kept</param>\n        /// <returns>The number of components removed.</returns>\n        public int KeepLargeComponents(SurfaceMesh3<K> mesh, int threshold_value)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.KeepLargeConnectedComponents_SM(mesh.Ptr, threshold_value);\n        }\n\n        /// <summary>\n        /// Removes the small connected components and all isolated vertices.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n        /// <returns>The number of components removed.</returns>\n        public int KeepLargestComponents(Polyhedron3<K> mesh, int num_components_to_keep)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.KeepLargestConnectedComponents_PH(mesh.Ptr, num_components_to_keep);\n        }\n\n        /// <summary>\n        /// Removes the small connected components and all isolated vertices.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"num_components_to_keep\">Keep this number of the largest connected components.</param>\n        /// <returns>The number of components removed.</returns>\n        public int KeepLargestComponents(SurfaceMesh3<K> mesh, int num_components_to_keep)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.KeepLargestConnectedComponents_SM(mesh.Ptr, num_components_to_keep);\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingConnections : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingConnections()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingConnections(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingConnectionsKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingConnections(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingConnectionsKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingConnectionsKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingConnectionsKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingConnectionsKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        //Polyhedron\n\n        internal abstract int ConnectedComponents_PH(IntPtr meshPtr);\n\n        internal abstract int ConnectedComponent_PH(IntPtr ptr, IntPtr meshPtr, int index);\n\n        internal abstract void GetConnectedComponentsFaceIndex_PH(IntPtr ptr, IntPtr meshPtr, int[] indices, int count);\n\n        internal abstract int SplitConnectedComponents_PH(IntPtr ptr, IntPtr meshPtr);\n\n        internal abstract void GetSplitConnectedComponents_PH(IntPtr ptr, IntPtr[] meshPtrs, int count);\n\n        internal abstract int KeepLargeConnectedComponents_PH(IntPtr meshPtr, int threshold_value);\n\n        internal abstract int KeepLargestConnectedComponents_PH(IntPtr meshPtr, int nb_components_to_keep);\n\n        //Surface Mesh\n\n        internal abstract int ConnectedComponents_SM(IntPtr meshPtr);\n\n        internal abstract int ConnectedComponent_SM(IntPtr ptr, IntPtr meshPtr, int index);\n\n        internal abstract void GetConnectedComponentsFaceIndex_SM(IntPtr ptr, IntPtr meshPtr, int[] indices, int count);\n\n        internal abstract int SplitConnectedComponents_SM(IntPtr ptr, IntPtr meshPtr);\n\n        internal abstract void GetSplitConnectedComponents_SM(IntPtr ptr, IntPtr[] meshPtrs, int count);\n\n        internal abstract  int KeepLargeConnectedComponents_SM(IntPtr meshPtr, int threshold_value);\n\n        internal abstract int KeepLargestConnectedComponents_SM(IntPtr meshPtr, int nb_components_to_keep);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingConnectionsKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingConnectionsKernel_EEK : MeshProcessingConnectionsKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingConnectionsKernel Instance = new MeshProcessingConnectionsKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingConnections_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingConnections_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int ConnectedComponents_PH(IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EEK_ConnectedComponents_PH(meshPtr);\n        }\n\n        internal override int ConnectedComponent_PH(IntPtr ptr, IntPtr meshPtr, int index)\n        {\n            return MeshProcessingConnections_EEK_ConnectedComponent_PH(ptr, meshPtr, index);\n        }\n\n        internal override void GetConnectedComponentsFaceIndex_PH(IntPtr ptr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_PH(ptr, meshPtr, indices, count);\n        }\n\n        internal override int SplitConnectedComponents_PH(IntPtr ptr, IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EEK_SplitConnectedComponents_PH(ptr, meshPtr);\n        }\n\n        internal override void GetSplitConnectedComponents_PH(IntPtr ptr, IntPtr[] meshPtrs, int count)\n        {\n            MeshProcessingConnections_EEK_GetSplitConnectedComponents_PH(ptr, meshPtrs, count);\n        }\n\n        internal override int KeepLargeConnectedComponents_PH(IntPtr meshPtr, int threshold_value)\n        {\n            return MeshProcessingConnections_EEK_KeepLargeConnectedComponents_PH(meshPtr, threshold_value);\n        }\n\n        internal override int KeepLargestConnectedComponents_PH(IntPtr meshPtr, int nb_components_to_keep)\n        {\n            return MeshProcessingConnections_EEK_KeepLargestConnectedComponents_PH(meshPtr, nb_components_to_keep);\n        }\n\n        //Surface MEsh\n\n        internal override int ConnectedComponents_SM(IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EEK_ConnectedComponents_SM(meshPtr);\n        }\n\n        internal override int ConnectedComponent_SM(IntPtr ptr, IntPtr meshPtr, int index)\n        {\n            return MeshProcessingConnections_EEK_ConnectedComponent_SM(ptr, meshPtr, index);\n        }\n\n        internal override void GetConnectedComponentsFaceIndex_SM(IntPtr ptr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_SM(ptr, meshPtr, indices, count);\n        }\n\n        internal override int SplitConnectedComponents_SM(IntPtr ptr, IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EEK_SplitConnectedComponents_SM(ptr, meshPtr);\n        }\n\n        internal override void GetSplitConnectedComponents_SM(IntPtr ptr, IntPtr[] meshPtrs, int count)\n        {\n            MeshProcessingConnections_EEK_GetSplitConnectedComponents_SM(ptr, meshPtrs, count);\n        }\n\n        internal override int KeepLargeConnectedComponents_SM(IntPtr meshPtr, int threshold_value)\n        {\n            return MeshProcessingConnections_EEK_KeepLargeConnectedComponents_SM(meshPtr, threshold_value);\n        }\n\n        internal override int KeepLargestConnectedComponents_SM(IntPtr meshPtr, int nb_components_to_keep)\n        {\n            return MeshProcessingConnections_EEK_KeepLargestConnectedComponents_SM(meshPtr, nb_components_to_keep);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingConnections_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponents_PH(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponent_PH(IntPtr ptr, IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_PH(IntPtr ptr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponent_PH(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_SplitConnectedComponents_PH(IntPtr ptr, IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EEK_GetSplitConnectedComponents_PH(IntPtr ptr, [Out] IntPtr[] meshPtrs, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_KeepLargeConnectedComponents_PH(IntPtr meshPtr, int threshold_value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_KeepLargestConnectedComponents_PH(IntPtr meshPtr, int nb_components_to_keep);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponents_SM(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponent_SM(IntPtr ptr, IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_SM(IntPtr ptr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_ConnectedComponent_SM(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_SplitConnectedComponents_SM(IntPtr ptr, IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EEK_GetSplitConnectedComponents_SM(IntPtr ptr, [Out] IntPtr[] meshPtrs, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_KeepLargeConnectedComponents_SM(IntPtr meshPtr, int threshold_value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EEK_KeepLargestConnectedComponents_SM(IntPtr meshPtr, int nb_components_to_keep);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingConnectionsKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingConnectionsKernel_EIK : MeshProcessingConnectionsKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingConnectionsKernel Instance = new MeshProcessingConnectionsKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingConnections_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingConnections_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int ConnectedComponents_PH(IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EIK_ConnectedComponents_PH(meshPtr);\n        }\n\n        internal override int ConnectedComponent_PH(IntPtr ptr, IntPtr meshPtr, int index)\n        {\n            return MeshProcessingConnections_EIK_ConnectedComponent_PH(ptr, meshPtr, index);\n        }\n\n        internal override void GetConnectedComponentsFaceIndex_PH(IntPtr ptr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_PH(ptr, meshPtr, indices, count);\n        }\n\n        internal override int SplitConnectedComponents_PH(IntPtr ptr, IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EIK_SplitConnectedComponents_PH(ptr, meshPtr);\n        }\n\n        internal override void GetSplitConnectedComponents_PH(IntPtr ptr, IntPtr[] meshPtrs, int count)\n        {\n            MeshProcessingConnections_EIK_GetSplitConnectedComponents_PH(ptr, meshPtrs, count);\n        }\n\n        internal override int KeepLargeConnectedComponents_PH(IntPtr meshPtr, int threshold_value)\n        {\n            return MeshProcessingConnections_EIK_KeepLargeConnectedComponents_PH(meshPtr, threshold_value);\n        }\n\n        internal override int KeepLargestConnectedComponents_PH(IntPtr meshPtr, int nb_components_to_keep)\n        {\n            return MeshProcessingConnections_EIK_KeepLargestConnectedComponents_PH(meshPtr, nb_components_to_keep);\n        }\n\n        //Surface MEsh\n\n        internal override int ConnectedComponents_SM(IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EIK_ConnectedComponents_SM(meshPtr);\n        }\n\n        internal override int ConnectedComponent_SM(IntPtr ptr, IntPtr meshPtr, int index)\n        {\n            return MeshProcessingConnections_EIK_ConnectedComponent_SM(ptr, meshPtr, index);\n        }\n\n        internal override void GetConnectedComponentsFaceIndex_SM(IntPtr ptr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_SM(ptr, meshPtr, indices, count);\n        }\n\n        internal override int SplitConnectedComponents_SM(IntPtr ptr, IntPtr meshPtr)\n        {\n            return MeshProcessingConnections_EIK_SplitConnectedComponents_SM(ptr, meshPtr);\n        }\n\n        internal override void GetSplitConnectedComponents_SM(IntPtr ptr, IntPtr[] meshPtrs, int count)\n        {\n            MeshProcessingConnections_EIK_GetSplitConnectedComponents_SM(ptr, meshPtrs, count);\n        }\n\n        internal override int KeepLargeConnectedComponents_SM(IntPtr meshPtr, int threshold_value)\n        {\n            return MeshProcessingConnections_EIK_KeepLargeConnectedComponents_SM(meshPtr, threshold_value);\n        }\n\n        internal override int KeepLargestConnectedComponents_SM(IntPtr meshPtr, int nb_components_to_keep)\n        {\n            return MeshProcessingConnections_EIK_KeepLargestConnectedComponents_SM(meshPtr, nb_components_to_keep);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingConnections_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponents_PH(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponent_PH(IntPtr ptr, IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_PH(IntPtr ptr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponent_PH(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_SplitConnectedComponents_PH(IntPtr ptr, IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EIK_GetSplitConnectedComponents_PH(IntPtr ptr, [Out] IntPtr[] meshPtrs, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_KeepLargeConnectedComponents_PH(IntPtr meshPtr, int threshold_value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_KeepLargestConnectedComponents_PH(IntPtr meshPtr, int nb_components_to_keep);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponents_SM(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponent_SM(IntPtr ptr, IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_SM(IntPtr ptr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_ConnectedComponent_SM(IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_SplitConnectedComponents_SM(IntPtr ptr, IntPtr meshPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingConnections_EIK_GetSplitConnectedComponents_SM(IntPtr ptr, [Out] IntPtr[] meshPtrs, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_KeepLargeConnectedComponents_SM(IntPtr meshPtr, int threshold_value);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingConnections_EIK_KeepLargestConnectedComponents_SM(IntPtr meshPtr, int nb_components_to_keep);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingFeatures.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Polylines;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingFeatures<K> : MeshProcessingFeatures where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingFeatures<K> Instance = new MeshProcessingFeatures<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingFeatures() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingFeatures(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// Detects the edges that are considered to be sharp with respect to the given angle bound.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n        /// the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n        /// if the angle between the two normal vectors of its incident facets is bigger than \n        /// the given bound, then the edge is marked as being a feature edge.</param>\n        /// <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        public void DetectSharpEdges(Polyhedron3<K> mesh, Degree feature_angle, List<int> featureEdges)\n        {\n            CheckIsValidException(mesh);\n            int num_edges = Kernel.DetectSharpEdges_PH(Ptr, mesh.Ptr, feature_angle.angle);\n\n            GetFeatureEdges(MESH_TYPE.POLYHEDRON, mesh.Ptr, num_edges, featureEdges);\n        }\n\n        /// <summary>\n        /// Detects the edges that are considered to be sharp with respect to the given angle bound.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n        /// the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n        /// if the angle between the two normal vectors of its incident facets is bigger than \n        /// the given bound, then the edge is marked as being a feature edge.</param>\n        /// <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        public void DetectSharpEdges(SurfaceMesh3<K> mesh, Degree feature_angle, List<int> featureEdges)\n        {\n            CheckIsValidException(mesh);\n            int num_edges = Kernel.DetectSharpEdges_SM(Ptr, mesh.Ptr, feature_angle.angle);\n\n            GetFeatureEdges(MESH_TYPE.SURFACE_MESH, mesh.Ptr, num_edges, featureEdges);\n        }\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public MinMaxAvg EdgeLengthMinMaxAvg(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.EdgeLengthMinMaxAvg_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the min, max and average edge lengths in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>The min, max and average edge lengths in the mesh.</returns>\n        public MinMaxAvg EdgeLengthMinMaxAvg(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.EdgeLengthMinMaxAvg_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public MinMaxAvg FaceAreaMinMaxAvg(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.FaceAreaMinMaxAvg_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the min, max and average face areas in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <returns>The min, max and average face areas in the mesh.</returns>\n        public MinMaxAvg FaceAreaMinMaxAvg(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            return Kernel.FaceAreaMinMaxAvg_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Detects the sharp edges of mesh according to angle as the DetectSharpEdges function does. \n        /// The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n        /// a surface patch id for each face.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n        /// the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n        /// if the angle between the two normal vectors of its incident facets is bigger than \n        /// the given bound, then the edge is marked as being a feature edge.</param>\n        /// <param name=\"featureEdges\">The halfedge indices of the edges that count as sharp.</param>\n        /// <param name=\"featurePatches\">The face indices for each patch found.</param>\n        public void SharpEdgesSegmentation(SurfaceMesh3<K> mesh, Degree feature_angle, List<int> featureEdges, List<List<int>> featurePatches)\n        {\n            CheckIsValidException(mesh);\n            var count = Kernel.SharpEdgesSegmentation_SM(Ptr, mesh.Ptr, feature_angle.angle);\n\n            int num_edges = count.first;\n            int num_patches = count.second;\n\n            GetFeatureEdges(MESH_TYPE.SURFACE_MESH, mesh.Ptr, num_edges, featureEdges);\n            GetFeaturePatches(MESH_TYPE.SURFACE_MESH, mesh.Ptr, num_patches, featurePatches);\n        }\n\n        /// <summary>\n        /// Detects the sharp edges of pmesh according to angle as the DetectSharpEdges function does. \n        /// The sharp edges are then used to define a segmentation of a mesh, that is done by computing \n        /// a surface patch id for each face.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"feature_angle\">Angle in deg gives the maximum angle between \n        /// the two normal vectors of adjacent triangles. For an edge of the input polygon mesh, \n        /// if the angle between the two normal vectors of its incident facets is bigger than \n        /// the given bound, then the edge is marked as being a feature edge.</param>\n        /// <param name=\"featurePatches\">The face indices for each patch found.</param>\n        public void SharpEdgesSegmentation(SurfaceMesh3<K> mesh, Degree feature_angle, List<List<int>> featurePatches)\n        {\n            CheckIsValidException(mesh);\n            var count = Kernel.SharpEdgesSegmentation_SM(Ptr, mesh.Ptr, feature_angle.angle);\n\n            int num_patches = count.second;\n\n            GetFeaturePatches(MESH_TYPE.SURFACE_MESH, mesh.Ptr, num_patches, featurePatches);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingFeatures<{0}>: ]\", Kernel.Name);\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingFeatures : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingFeatures(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingFeaturesKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingFeatures(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingFeaturesKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingFeatures()\n        {\n\n        }\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingFeaturesKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"meshPtr\"></param>\n        /// <param name=\"num_edges\"></param>\n        /// <param name=\"featureEdges\"></param>\n        protected void GetFeatureEdges(MESH_TYPE type, IntPtr meshPtr, int num_edges, List<int> featureEdges)\n        {\n            if (num_edges == 0) return;\n    \n            if (type == MESH_TYPE.POLYHEDRON)\n            {\n                var indices = new int[num_edges];\n                Kernel.GetSharpEdges_PH(Ptr, meshPtr, indices, num_edges);\n                featureEdges.AddRange(indices);\n            }\n            else if (type == MESH_TYPE.SURFACE_MESH)\n            {\n                var indices = new int[num_edges];\n                Kernel.GetSharpEdges_SM(Ptr, meshPtr, indices, num_edges);\n                featureEdges.AddRange(indices);\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"meshPtr\"></param>\n        /// <param name=\"num_patches\"></param>\n        /// <param name=\"featurePatches\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        protected void GetFeaturePatches(MESH_TYPE type, IntPtr meshPtr, int num_patches, List<List<int>> featurePatches)\n        {\n            if (num_patches == 0) return;\n \n            if (type == MESH_TYPE.POLYHEDRON)\n            {\n                throw new NotImplementedException();\n            }\n            else if (type == MESH_TYPE.SURFACE_MESH)\n            {\n                for (int i = 0; i < num_patches; i++)\n                {\n                    int num_faces = Kernel.GetPatchBufferFaceCount_SM(Ptr, i);\n       \n                    var faces = new List<int>();\n                    for (int j = 0; j < num_faces; j++)\n                    {\n                        int index = Kernel.GetPatchBufferFaceIndex_SM(Ptr, i, j);\n                        if (index == CGALGlobal.NULL_INDEX) continue;\n\n                        faces.Add(index);\n                    }\n\n                    if(faces.Count > 0)\n                        featurePatches.Add(faces);\n                }\n\n                Kernel.ClearPatchBuffer_SM(Ptr);\n            }\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingFeaturesKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n\tinternal abstract class MeshProcessingFeaturesKernel : CGALObjectKernel\n\t{\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\t//Polyhedron\n\n\t\tinternal abstract int DetectSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n\t\tinternal abstract void GetSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count);\n\n\t\tinternal abstract Index2 SharpEdgesSegmentation_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n\t\tinternal abstract void ClearPatchBuffer_PH(IntPtr feaPtr);\n\n\t\tinternal abstract int GetPatchBufferFaceCount_PH(IntPtr feaPtr, int patchIndex);\n\n\t\tinternal abstract int GetPatchBufferFaceIndex_PH(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n\t\tinternal abstract MinMaxAvg EdgeLengthMinMaxAvg_PH(IntPtr ptr);\n\n\t\tinternal abstract MinMaxAvg FaceAreaMinMaxAvg_PH(IntPtr ptr);\n\n\t\t//Surface Mesh\n\n\t\tinternal abstract int DetectSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n\t\tinternal abstract void GetSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count);\n\n\t\tinternal abstract Index2 SharpEdgesSegmentation_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n\t\tinternal abstract void ClearPatchBuffer_SM(IntPtr feaPtr);\n\n\t\tinternal abstract int GetPatchBufferFaceCount_SM(IntPtr feaPtr, int patchIndex);\n\n\t\tinternal abstract int GetPatchBufferFaceIndex_SM(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n\t\tinternal abstract MinMaxAvg EdgeLengthMinMaxAvg_SM(IntPtr ptr);\n\n\t\tinternal abstract MinMaxAvg FaceAreaMinMaxAvg_SM(IntPtr ptr);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingFeaturesKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingFeaturesKernel_EEK : MeshProcessingFeaturesKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingFeaturesKernel Instance = new MeshProcessingFeaturesKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingFeatures_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingFeatures_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int DetectSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EEK_DetectSharpEdges_PH(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void GetSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingFeatures_EEK_GetSharpEdges_PH(feaPtr, meshPtr, indices, count);\n        }\n\n        internal override Index2 SharpEdgesSegmentation_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EEK_SharpEdgesSegmentation_PH(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void ClearPatchBuffer_PH(IntPtr feaPtr)\n        {\n            MeshProcessingFeatures_EEK_ClearPatchBuffer_PH(feaPtr);\n        }\n\n        internal override int GetPatchBufferFaceCount_PH(IntPtr feaPtr, int patchIndex)\n        {\n            return MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_PH(feaPtr, patchIndex);\n        }\n\n        internal override int GetPatchBufferFaceIndex_PH(IntPtr feaPtr, int patchIndex, int faceIndex)\n        {\n            return MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_PH(feaPtr, patchIndex, faceIndex);\n        }\n\n        internal override MinMaxAvg EdgeLengthMinMaxAvg_PH(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_PH(ptr);\n        }\n\n        internal override MinMaxAvg FaceAreaMinMaxAvg_PH(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_PH(ptr);\n        }\n\n        //Surface Mesh\n\n        internal override int DetectSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EEK_DetectSharpEdges_SM(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void GetSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingFeatures_EEK_GetSharpEdges_SM(feaPtr, meshPtr, indices, count);\n        }\n\n        internal override Index2 SharpEdgesSegmentation_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EEK_SharpEdgesSegmentation_SM(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void ClearPatchBuffer_SM(IntPtr feaPtr)\n        {\n            MeshProcessingFeatures_EEK_ClearPatchBuffer_SM(feaPtr);\n        }\n\n        internal override int GetPatchBufferFaceCount_SM(IntPtr feaPtr, int patchIndex)\n        {\n            return MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_SM(feaPtr, patchIndex);\n        }\n\n        internal override int GetPatchBufferFaceIndex_SM(IntPtr feaPtr, int patchIndex, int faceIndex)\n        {\n            return MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_SM(feaPtr, patchIndex, faceIndex);\n        }\n\n        internal override MinMaxAvg EdgeLengthMinMaxAvg_SM(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_SM(ptr);\n        }\n\n        internal override MinMaxAvg FaceAreaMinMaxAvg_SM(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_SM(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingFeatures_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_DetectSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EEK_GetSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EEK_ClearPatchBuffer_PH(IntPtr feaPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_PH(IntPtr feaPtr, int patchIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_PH(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_PH(IntPtr ptr);\n\n        //Surface Mesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_DetectSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EEK_GetSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EEK_ClearPatchBuffer_SM(IntPtr feaPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_SM(IntPtr feaPtr, int patchIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_SM(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_SM(IntPtr ptr);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingFeaturesKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingFeaturesKernel_EIK : MeshProcessingFeaturesKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingFeaturesKernel Instance = new MeshProcessingFeaturesKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingFeatures_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingFeatures_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int DetectSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EIK_DetectSharpEdges_PH(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void GetSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingFeatures_EIK_GetSharpEdges_PH(feaPtr, meshPtr, indices, count);\n        }\n\n        internal override Index2 SharpEdgesSegmentation_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EIK_SharpEdgesSegmentation_PH(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void ClearPatchBuffer_PH(IntPtr feaPtr)\n        {\n            MeshProcessingFeatures_EIK_ClearPatchBuffer_PH(feaPtr);\n        }\n\n        internal override int GetPatchBufferFaceCount_PH(IntPtr feaPtr, int patchIndex)\n        {\n            return MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_PH(feaPtr, patchIndex);\n        }\n\n        internal override int GetPatchBufferFaceIndex_PH(IntPtr feaPtr, int patchIndex, int faceIndex)\n        {\n            return MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_PH(feaPtr, patchIndex, faceIndex);\n        }\n\n        internal override MinMaxAvg EdgeLengthMinMaxAvg_PH(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_PH(ptr);\n        }\n\n        internal override MinMaxAvg FaceAreaMinMaxAvg_PH(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_PH(ptr);\n        }\n\n        //Surface Mesh\n\n        internal override int DetectSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EIK_DetectSharpEdges_SM(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void GetSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, int[] indices, int count)\n        {\n            MeshProcessingFeatures_EIK_GetSharpEdges_SM(feaPtr, meshPtr, indices, count);\n        }\n\n        internal override Index2 SharpEdgesSegmentation_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle)\n        {\n            return MeshProcessingFeatures_EIK_SharpEdgesSegmentation_SM(feaPtr, meshPtr, feature_angle);\n        }\n\n        internal override void ClearPatchBuffer_SM(IntPtr feaPtr)\n        {\n            MeshProcessingFeatures_EIK_ClearPatchBuffer_SM(feaPtr);\n        }\n\n        internal override int GetPatchBufferFaceCount_SM(IntPtr feaPtr, int patchIndex)\n        {\n            return MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_SM(feaPtr, patchIndex);\n        }\n\n        internal override int GetPatchBufferFaceIndex_SM(IntPtr feaPtr, int patchIndex, int faceIndex)\n        {\n            return MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_SM(feaPtr, patchIndex, faceIndex);\n        }\n\n        internal override MinMaxAvg EdgeLengthMinMaxAvg_SM(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_SM(ptr);\n        }\n\n        internal override MinMaxAvg FaceAreaMinMaxAvg_SM(IntPtr ptr)\n        {\n            return MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_SM(ptr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingFeatures_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_DetectSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EIK_GetSharpEdges_PH(IntPtr feaPtr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_PH(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EIK_ClearPatchBuffer_PH(IntPtr feaPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_PH(IntPtr feaPtr, int patchIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_PH(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_PH(IntPtr ptr);\n\n        //Surface Mesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_DetectSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EIK_GetSharpEdges_SM(IntPtr feaPtr, IntPtr meshPtr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_SM(IntPtr feaPtr, IntPtr meshPtr, double feature_angle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingFeatures_EIK_ClearPatchBuffer_SM(IntPtr feaPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_SM(IntPtr feaPtr, int patchIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_SM(IntPtr feaPtr, int patchIndex, int faceIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_SM(IntPtr ptr);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingLocate.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Polylines;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingLocate<K> : MeshProcessingLocate where K : CGALKernel, new()\n    {\n\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingLocate<K> Instance = new MeshProcessingLocate<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingLocate() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingLocate(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingLocate<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Find a random point on mesh surface.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <returns>A random point on mesh surface.</returns>\n        public Point3d RandomLocationOnMesh(Polyhedron3<K> mesh)\n        {\n            return Kernel.RandomLocationOnMesh_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find a random point on mesh surface.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <returns>A random point on mesh surface.</returns>\n        public Point3d RandomLocationOnMesh(SurfaceMesh3<K> mesh)\n        {\n            return Kernel.RandomLocationOnMesh_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the face the ray intersects with.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <param name=\"ray\">Th ray.</param>\n        /// <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        public MeshHitResult LocateFace(Polyhedron3<K> mesh, Ray3d ray)\n        {\n            return Kernel.LocateFaceRay_PH(mesh.Ptr, ray);\n        }\n\n        /// <summary>\n        /// Find the face the ray intersects with.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <param name=\"ray\">Th ray.</param>\n        /// <returns>The hit result with theface index, hit point and the barycentric coords.</returns>\n        public MeshHitResult LocateFace(SurfaceMesh3<K> mesh, Ray3d ray)\n        {\n            return Kernel.LocateFaceRay_SM(mesh.Ptr, ray);\n        }\n\n        /// <summary>\n        /// Find the closest face to the point.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <param name=\"point\">Th point.</param>\n        /// <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        public MeshHitResult ClosestFace(Polyhedron3<K> mesh, Point3d point)\n        {\n            return Kernel.LocateFacePoint_PH(mesh.Ptr, point);\n        }\n\n        /// <summary>\n        /// Find the closest face to the point.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh.</param>\n        /// <param name=\"point\">Th point.</param>\n        /// <returns>The hit result with the face index, closest point and the barycentric coords.</returns>\n        public MeshHitResult ClosestFace(SurfaceMesh3<K> mesh, Point3d point)\n        {\n            return Kernel.LocateFacePoint_SM(mesh.Ptr, point);\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingLocate : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingLocate()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingLocate(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingLocateKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingLocate(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingLocateKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingLocateKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingLocateKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n\tinternal abstract class MeshProcessingLocateKernel : CGALObjectKernel\n\t{\n\t\tinternal abstract IntPtr Create();\n\n\t\tinternal abstract void Release(IntPtr ptr);\n\n\t\t//Polyhedron\n\n\t\tinternal abstract Point3d RandomLocationOnMesh_PH(IntPtr ptr);\n\n\t\tinternal abstract MeshHitResult LocateFaceRay_PH(IntPtr ptr, Ray3d ray);\n\n\t\tinternal abstract MeshHitResult LocateFacePoint_PH(IntPtr ptr, Point3d point);\n\n\t\t//SurfaceMesh\n\n\t\tinternal abstract Point3d RandomLocationOnMesh_SM(IntPtr ptr);\n\n\t\tinternal abstract MeshHitResult LocateFaceRay_SM(IntPtr ptr, Ray3d ray);\n\n\t\tinternal abstract MeshHitResult LocateFacePoint_SM(IntPtr ptr, Point3d point);\n\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingLocateKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingLocateKernel_EEK : MeshProcessingLocateKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingLocateKernel Instance = new MeshProcessingLocateKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingLocate_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingLocate_EEK_Release(ptr);\n        }\n\n        //Polyhedron \n\n        internal override Point3d RandomLocationOnMesh_PH(IntPtr ptr)\n        {\n            return MeshProcessingLocate_EEK_RandomLocationOnMesh_PH(ptr);\n        }\n\n        internal override MeshHitResult LocateFaceRay_PH(IntPtr ptr, Ray3d ray)\n        {\n            return MeshProcessingLocate_EEK_LocateFaceRay_PH(ptr, ray);\n        }\n\n\t    internal override MeshHitResult LocateFacePoint_PH(IntPtr ptr, Point3d point)\n        {\n            return MeshProcessingLocate_EEK_LocateFacePoint_PH(ptr, point);\n        }\n\n        //SUrfaceMesh \n\n        internal override Point3d RandomLocationOnMesh_SM(IntPtr ptr)\n        {\n            return MeshProcessingLocate_EEK_RandomLocationOnMesh_SM(ptr);\n        }\n\n        internal override MeshHitResult LocateFaceRay_SM(IntPtr ptr, Ray3d ray)\n        {\n            return MeshProcessingLocate_EEK_LocateFaceRay_SM(ptr, ray);\n        }\n\n        internal override MeshHitResult LocateFacePoint_SM(IntPtr ptr, Point3d point)\n        {\n            return MeshProcessingLocate_EEK_LocateFacePoint_SM(ptr, point);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingLocate_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingLocate_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d MeshProcessingLocate_EEK_RandomLocationOnMesh_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_PH(IntPtr ptr, Ray3d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_PH(IntPtr ptr, Point3d point);\n\n        //SurfaceMesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d MeshProcessingLocate_EEK_RandomLocationOnMesh_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_SM(IntPtr ptr, Ray3d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_SM(IntPtr ptr, Point3d point);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingLocateKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingLocateKernel_EIK : MeshProcessingLocateKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingLocateKernel Instance = new MeshProcessingLocateKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingLocate_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingLocate_EIK_Release(ptr);\n        }\n\n        //Polyhedron \n\n        internal override Point3d RandomLocationOnMesh_PH(IntPtr ptr)\n        {\n            return MeshProcessingLocate_EIK_RandomLocationOnMesh_PH(ptr);\n        }\n\n        internal override MeshHitResult LocateFaceRay_PH(IntPtr ptr, Ray3d ray)\n        {\n            return MeshProcessingLocate_EIK_LocateFaceRay_PH(ptr, ray);\n        }\n\n        internal override MeshHitResult LocateFacePoint_PH(IntPtr ptr, Point3d point)\n        {\n            return MeshProcessingLocate_EIK_LocateFacePoint_PH(ptr, point);\n        }\n\n        //SUrfaceMesh \n\n        internal override Point3d RandomLocationOnMesh_SM(IntPtr ptr)\n        {\n            return MeshProcessingLocate_EIK_RandomLocationOnMesh_SM(ptr);\n        }\n\n        internal override MeshHitResult LocateFaceRay_SM(IntPtr ptr, Ray3d ray)\n        {\n            return MeshProcessingLocate_EIK_LocateFaceRay_SM(ptr, ray);\n        }\n\n        internal override MeshHitResult LocateFacePoint_SM(IntPtr ptr, Point3d point)\n        {\n            return MeshProcessingLocate_EIK_LocateFacePoint_SM(ptr, point);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingLocate_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingLocate_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d MeshProcessingLocate_EIK_RandomLocationOnMesh_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_PH(IntPtr ptr, Ray3d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_PH(IntPtr ptr, Point3d point);\n\n        //SurfaceMesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Point3d MeshProcessingLocate_EIK_RandomLocationOnMesh_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_SM(IntPtr ptr, Ray3d ray);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern MeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_SM(IntPtr ptr, Point3d point);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingMeshing.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingMeshing<K> : MeshProcessingMeshing where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingMeshing<K> Instance = new MeshProcessingMeshing<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingMeshing() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingMeshing(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingMeshing<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n        /// The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n        /// </summary>\n        /// <param name=\"mesh\">The a valid closed mesh.</param>\n        /// <param name=\"dir\">The direction vector.</param>\n        /// <returns>The extuded mesh.</returns>\n        public Polyhedron3<K> Extrude(Polyhedron3<K> mesh, Vector3d dir)\n        {\n            CheckIsValidClosedException(mesh);\n\n            var ptr = Kernel.Extrude_PH(mesh.Ptr, dir);\n            return new Polyhedron3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Fills output with a closed mesh bounding the volume swept by input when translating its vertices by dir.\n        /// The mesh is oriented so that the faces corresponding to input in output have the same orientation.\n        /// </summary>\n        /// <param name=\"mesh\">The a valid closed mesh.</param>\n        /// <param name=\"dir\">The direction vector.</param>\n        /// <returns>The extuded mesh.</returns>\n        public SurfaceMesh3<K> Extrude(SurfaceMesh3<K> mesh, Vector3d dir)\n        {\n            CheckIsValidClosedException(mesh);\n\n            var ptr = Kernel.Extrude_SM(mesh.Ptr, dir);\n            return new SurfaceMesh3<K>(ptr);\n        }\n\n        /// <summary>\n        /// Fairs a region on a triangle mesh based on a ring of k vertices from the index vertex.\n        /// The points of the selected vertices are relocated to yield an as-smooth-as-possible surface patch,\n        /// based on solving a linear bi-Laplacian system with boundary constraints\n        /// The region described by vertices might contain multiple disconnected components.\n        /// Note that the mesh connectivity is not altered in any way, only vertex locations get updated.\n        /// Fairing might fail if fixed vertices, which are used as boundary conditions, \n        /// do not suffice to solve constructed linear system.\n        /// Note that if the vertex range to which fairing is applied contains all the vertices of the triangle mesh, \n        /// fairing does not fail, but the mesh gets shrinked to the origin.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"index\">The vertex index in the mesh to start hthe k ring region from.</param>\n        /// <param name=\"k_ring\">The number of vertics to expand the region to.</param>\n        /// <returns>If the fairing was successfully run.</returns>\n        public bool Fair(Polyhedron3<K> mesh, int index, int k_ring)\n        {\n            CheckIsValidTriangle(mesh);\n\n            var i = Kernel.Fair_PH(mesh.Ptr, index, k_ring);\n\n            bool successful = i.first != 0;\n            //int region_size = i.second;\n\n            return successful;\n        }\n\n        /*\n\n        /// <summary>\n        /// Fairs a region on a triangle mesh based on a ring of k vertices from the index vertex.\n        /// The points of the selected vertices are relocated to yield an as-smooth-as-possible surface patch,\n        /// based on solving a linear bi-Laplacian system with boundary constraints\n        /// The region described by vertices might contain multiple disconnected components.\n        /// Note that the mesh connectivity is not altered in any way, only vertex locations get updated.\n        /// Fairing might fail if fixed vertices, which are used as boundary conditions, \n        /// do not suffice to solve constructed linear system.\n        /// Note that if the vertex range to which fairing is applied contains all the vertices of the triangle mesh, \n        /// fairing does not fail, but the mesh gets shrinked to the origin.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"index\">The vertex index in the mesh to start hthe k ring region from.</param>\n        /// <param name=\"k_ring\">The number of vertics to expand the region to.</param>\n        /// <returns>If the fairing was successfully run.</returns>\n        public bool Fair(SurfaceMesh3<K> mesh, int index, int k_ring)\n        {\n            CheckIsValidTriangle(mesh);\n        \n            //TODO - need to implemt kring\n            var i = Kernel.Fair_SM(mesh.Ptr, index, k_ring);\n        \n            bool successful = i.first != 0;\n            //int region_size = i.second;\n        \n            return successful;\n        }\n        */\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices added.</returns>\n        public int Refine(Polyhedron3<K> mesh, double density_control_factor = MathUtil.SQRT2_64)\n        {\n            if (density_control_factor <= 0)\n                return 0;\n\n            CheckIsValidTriangleException(mesh);\n\n            mesh.SetIsUpdatedToFalse();\n            var count = Kernel.Refine_PH(mesh.Ptr, density_control_factor);\n\n            int new_vertices = count.first;\n            int new_faces = count.second;\n\n            return new_vertices;\n        }\n\n        /// <summary>\n        /// Refines a triangle mesh\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"density_control_factor\">a factor to control density of the output mesh, \n        /// where larger values lead to denser refinements. Defalus to sqrt of 2.</param>\n        /// <returns>The number of new vertices added.</returns>\n        public int Refine(SurfaceMesh3<K> mesh, double density_control_factor = MathUtil.SQRT2_64)\n        {\n            if (density_control_factor <= 0)\n                return 0;\n\n            CheckIsValidTriangleException(mesh);\n\n            mesh.SetIsUpdatedToFalse();\n            var count = Kernel.Refine_SM(mesh.Ptr, density_control_factor);\n\n            int new_vertices = count.first;\n            int new_faces = count.second;\n\n            return new_vertices;\n        }\n\n        /// <summary>\n        /// Remeshes a triangulated region of a meshgon mesh.\n        /// This operation sequentially performs edge splits, edge collapses, edge flips, \n        /// tangential relaxation and projection to the initial surface to generate \n        /// a smooth mesh with a prescribed edge length.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of times to perform the remeshing.</param>\n        /// <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n        /// If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n        /// <returns>The number of new vertices added.</returns>\n        public int IsotropicRemeshing(Polyhedron3<K> mesh, double target_edge_length, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n\n            if (target_edge_length < 0)\n                target_edge_length = 0;\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.IsotropicRemeshing_PH(mesh.Ptr, iterations, target_edge_length);\n        }\n\n        /// <summary>\n        /// Remeshes a triangulated region of a meshgon mesh.\n        /// This operation sequentially performs edge splits, edge collapses, edge flips, \n        /// tangential relaxation and projection to the initial surface to generate \n        /// a smooth mesh with a prescribed edge length.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of times to perform the remeshing.</param>\n        /// <param name=\"target_edge_length\">the edge length that is targeted in the remeshed patch. \n        /// If 0 is passed then only the edge-flip, tangential relaxation, and projection steps will be done.</param>\n        /// <returns>The number of new vertices added.</returns>\n        public int IsotropicRemeshing(SurfaceMesh3<K> mesh, double target_edge_length, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n\n            if (target_edge_length < 0)\n                target_edge_length = 0;\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.IsotropicRemeshing_SM(mesh.Ptr, iterations, target_edge_length);\n        }\n\n        /// <summary>\n        /// randomly perturbs the locations of vertices of a triangulated surface mesh.\n        /// By default, the vertices are re-projected onto the input surface after \n        /// perturbation.Note that no geometric checks are done after the perturbation \n        /// (face orientation might become incorrect and self-intersections might be introduced).\n        /// </summary>\n        /// <param name=\"mesh\">A mesh.</param>\n        /// <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        public void RandomPerturbation(Polyhedron3<K> mesh, double perturbation_max_size)\n        {\n           if (perturbation_max_size <= 0)\n               return;\n        \n            mesh.SetIsUpdatedToFalse();\n           Kernel.RandomPerturbation_PH(mesh.Ptr, perturbation_max_size);\n        }\n\n        /// <summary>\n        /// randomly perturbs the locations of vertices of a triangulated surface mesh.\n        /// By default, the vertices are re-projected onto the input surface after \n        /// perturbation.Note that no geometric checks are done after the perturbation \n        /// (face orientation might become incorrect and self-intersections might be introduced).\n        /// </summary>\n        /// <param name=\"mesh\">A mesh.</param>\n        /// <param name=\"perturbation_max_size\">The maximun amount a vertex will be pertured. Must be greater tha 0.</param>\n        public void RandomPerturbation(SurfaceMesh3<K> mesh, double perturbation_max_size)\n        {\n            if (perturbation_max_size <= 0)\n                return;\n\n            mesh.SetIsUpdatedToFalse();\n            Kernel.RandomPerturbation_SM(mesh.Ptr, perturbation_max_size);\n        }\n\n        /*\n\n        /// <summary>\n        /// Smooths a triangulated mesh.\n        /// This function attempts to make the triangle angle and area distributions as uniform \n        /// as possible by moving(non-constrained) vertices.\n        /// Angle-based smoothing does not change the combinatorial information of the mesh.\n        /// Area-based smoothing might change the combinatorial information, unless specified otherwise.\n        /// It is also possible to make the smoothing algorithm \"safer\" by rejecting moves that, \n        /// when applied, would worsen the quality of the mesh, e.g.that would decrease the value\n        /// of the smallest angle around a vertex or create self-intersections.\n        /// Optionally, the points are reprojected after each iteration.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"featureAngle\">The edge angle that counts a feature and wont be smoothed.</param>\n        /// <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed</param>\n        public void SmoothMeshByAngle(Polyhedron3<K> mesh, Degree featureAngle, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n            if (featureAngle.angle <= 0 || iterations < 0) return;\n        \n            Kernel.SmoothMesh_PH(mesh.Ptr, featureAngle.angle, iterations);\n        }\n        */\n\n        /// <summary>\n        /// Smooths a triangulated mesh.\n        /// This function attempts to make the triangle angle and area distributions as uniform \n        /// as possible by moving(non-constrained) vertices.\n        /// Angle-based smoothing does not change the combinatorial information of the mesh.\n        /// Area-based smoothing might change the combinatorial information, unless specified otherwise.\n        /// It is also possible to make the smoothing algorithm \"safer\" by rejecting moves that, \n        /// when applied, would worsen the quality of the mesh, e.g.that would decrease the value\n        /// of the smallest angle around a vertex or create self-intersections.\n        /// Optionally, the points are reprojected after each iteration.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"featureAngle\">The edge angle that counts a feature and wont be smoothed.</param>\n        /// <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed</param>\n        public void SmoothMeshByAngle(SurfaceMesh3<K> mesh, Degree featureAngle, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n            if (featureAngle.angle <= 0 || iterations < 0) return;\n\n            Kernel.SmoothMesh_SM(mesh.Ptr, featureAngle.angle, iterations);\n        }\n\n        /*\n        /// <summary>\n        /// smooths the overall shape of the mesh by using the mean curvature flow.\n        /// The effect depends on the curvature of each area and on a time step which \n        /// represents the amount by which vertices are allowed to move.\n        /// The result conformally maps the initial surface to a sphere.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"timeStep\">A time step that corresponds to the speed by which the surface is smoothed. \n        /// A larger time step results in faster convergence but details may be distorted to have a larger \n        /// extent compared to more iterations with a smaller step. Typical values scale in the interval (1e-6, 1].</param>\n        /// <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed.</param>\n        public void SmoothShape(Polyhedron3<K> mesh, double timeStep = 0.0001, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n            if (timeStep <= 0 || iterations < 0) return;\n        \n            Kernel.SmoothShape_PH(mesh.Ptr, timeStep, iterations);\n        }\n        */\n\n        /*\n        /// <summary>\n        /// smooths the overall shape of the mesh by using the mean curvature flow.\n        /// The effect depends on the curvature of each area and on a time step which \n        /// represents the amount by which vertices are allowed to move.\n        /// The result conformally maps the initial surface to a sphere.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"timeStep\">A time step that corresponds to the speed by which the surface is smoothed. \n        /// A larger time step results in faster convergence but details may be distorted to have a larger \n        /// extent compared to more iterations with a smaller step. Typical values scale in the interval (1e-6, 1].</param>\n        /// <param name=\"iterations\">The number of iterations for the sequence of the smoothing iterations performed.</param>\n        public void SmoothShape(SurfaceMesh3<K> mesh, double timeStep = 0.0001, int iterations = 1)\n        {\n            CheckIsValidTriangleException(mesh);\n            if (timeStep <= 0 || iterations < 0) return;\n        \n            Kernel.SmoothShape_SM(mesh.Ptr, timeStep, iterations);\n        }\n        */\n\n        /// <summary>\n        /// splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n        /// Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n        /// of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n        /// <returns>The number of new edges added to the mesh.</returns>\n        public int SplitLongEdges(Polyhedron3<K> mesh, double target_edge_length)\n        {\n            CheckIsValidException(mesh);\n\n            if (target_edge_length <= 0) \n                return 0;\n\n            mesh.SetIsUpdatedToFalse();\n            int new_halfedges = Kernel.SplitLongEdges_PH(mesh.Ptr, target_edge_length);\n            int new_edges = new_halfedges / 2;\n\n            return new_edges;\n        }\n\n        /// <summary>\n        /// splits the edges listed in edges into sub-edges that are not longer than the given threshold max_length.\n        /// Note this function is useful to split constrained edges before calling isotropic_remeshing() with protection\n        /// of constraints activated (to match the constrained edge length required by the remeshing algorithm to be guaranteed to terminate)\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"target_edge_length\">The edge length above which an edge from edges is split into to sub-edges</param>\n        /// <returns>The number of new edges added to the mesh.</returns>\n        public int SplitLongEdges(SurfaceMesh3<K> mesh, double target_edge_length)\n        {\n            CheckIsValidException(mesh);\n\n            if (target_edge_length <= 0)\n                return 0;\n\n            mesh.SetIsUpdatedToFalse();\n            int new_halfedges = Kernel.SplitLongEdges_SM(mesh.Ptr, target_edge_length);\n            int new_edges = new_halfedges / 2;\n\n            return new_edges;\n        }\n\n        /// <summary>\n        /// Triangulate a single face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"face\">The faces index in the mesh.</param>\n        /// <returns>True if successful.</returns>\n        public bool TriangulateFace(Polyhedron3<K> mesh, int face)\n        {\n            CheckIsValidException(mesh);\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.TriangulateFace_PH(mesh.Ptr, face);\n        }\n\n        /// <summary>\n        /// Triangulate a single face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"face\">The faces index in the mesh.</param>\n        /// <returns>True if successful.</returns>\n        public bool TriangulateFace(SurfaceMesh3<K> mesh, int face)\n        {\n            CheckIsValidException(mesh);\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.TriangulateFace_SM(mesh.Ptr, face);\n        }\n\n        /// <summary>\n        /// Triangulate a range of faces in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"faces\">The faces to triangulate.</param>\n        /// <param name=\"count\">The length of the face array.</param>\n        /// <returns>True if successful.</returns>\n        public bool TriangulateFaces(Polyhedron3<K> mesh, int[] faces, int count)\n        {\n            CheckIsValidException(mesh);\n            ErrorUtil.CheckArray(faces, count);\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.TriangulateFaces_PH(mesh.Ptr, faces, count);\n        }\n\n        /// <summary>\n        /// Triangulate a range of faces in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"faces\">The faces to triangulate.</param>\n        /// <param name=\"count\">The length of the face array.</param>\n        /// <returns>True if successful.</returns>\n        public bool TriangulateFaces(SurfaceMesh3<K> mesh, int[] faces, int count)\n        {\n            CheckIsValidException(mesh);\n            ErrorUtil.CheckArray(faces, count);\n\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.TriangulateFaces_SM(mesh.Ptr, faces, count);\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingMeshing : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingMeshing()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingMeshing(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingMeshingKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingMeshing(CGALKernel kernel, IntPtr ptr)\n        {\n            Kernel = kernel.MeshProcessingMeshingKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingMeshingKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingMeshingKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingMeshingKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n\t\t//Polyhedron\n\n\t\tinternal abstract IntPtr Extrude_PH(IntPtr meshPtr, Vector3d dir);\n\n\t\tinternal abstract Index2 Fair_PH(IntPtr meshPtr, int index, int k_ring);\n\n\t\tinternal abstract Index2 Refine_PH(IntPtr meshPtr, double density_control_factor);\n\n\t\tinternal abstract int IsotropicRemeshing_PH(IntPtr meshPtr, int iterations, double target_edge_length);\n\n\t\tinternal abstract void RandomPerturbation_PH(IntPtr meshPtr, double perturbation_max_size);\n\n\t\tinternal abstract void SmoothMesh_PH(IntPtr meshPtr, double featureAngle, int iterations);\n\n\t\tinternal abstract void SmoothShape_PH(IntPtr meshPtr, double timeStep, int iterations);\n\n\t\tinternal abstract int SplitLongEdges_PH(IntPtr meshPtr, double target_edge_length);\n\n\t\tinternal abstract bool TriangulateFace_PH(IntPtr meshPtr, int index);\n\n\t\tinternal abstract bool TriangulateFaces_PH(IntPtr meshPtr, int[] faces, int count);\n\n\t\t//Surface Mesh\n\n\t\tinternal abstract IntPtr Extrude_SM(IntPtr meshPtr, Vector3d dir);\n\n\t\tinternal abstract Index2 Fair_SM(IntPtr meshPtr, int index, int k_ring);\n\n\t\tinternal abstract Index2 Refine_SM(IntPtr meshPtr, double density_control_factor);\n\n\t\tinternal abstract int IsotropicRemeshing_SM(IntPtr meshPtr, int iterations, double target_edge_length);\n\n\t\tinternal abstract void RandomPerturbation_SM(IntPtr meshPtr, double perturbation_max_size);\n\n\t\tinternal abstract void SmoothMesh_SM(IntPtr meshPtr, double featureAngle, int iterations);\n\n\t\tinternal abstract void SmoothShape_SM(IntPtr meshPtr, double timeStep, int iterations);\n\n\t\tinternal abstract int SplitLongEdges_SM(IntPtr meshPtr, double target_edge_length);\n\n\t\tinternal abstract bool TriangulateFace_SM(IntPtr meshPtr, int index);\n\n\t\tinternal abstract bool TriangulateFaces_SM(IntPtr meshPtr, int[] faces, int count);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingMeshingKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingMeshingKernel_EEK : MeshProcessingMeshingKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingMeshingKernel Instance = new MeshProcessingMeshingKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingMeshing_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingMeshing_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override IntPtr Extrude_PH(IntPtr meshPtr, Vector3d dir)\n        {\n            return MeshProcessingMeshing_EEK_Extrude_PH(meshPtr, dir);\n        }\n\n        internal override Index2 Fair_PH(IntPtr meshPtr, int index, int k_ring)\n        {\n            return MeshProcessingMeshing_EEK_Fair_PH(meshPtr, index, k_ring);\n        }\n\n        internal override Index2 Refine_PH(IntPtr meshPtr, double density_control_factor)\n        {\n            return MeshProcessingMeshing_EEK_Refine_PH(meshPtr, density_control_factor);\n        }\n\n        internal override int IsotropicRemeshing_PH(IntPtr meshPtr, int iterations, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EEK_IsotropicRemeshing_PH(meshPtr, iterations, target_edge_length);\n        }\n\n        internal override void RandomPerturbation_PH(IntPtr meshPtr, double perturbation_max_size)\n        {\n            MeshProcessingMeshing_EEK_RandomPerturbation_PH (meshPtr, perturbation_max_size);\n        }\n\n        internal override void SmoothMesh_PH(IntPtr meshPtr, double featureAngle, int iterations)\n        {\n            MeshProcessingMeshing_EEK_SmoothMesh_PH(meshPtr, featureAngle, iterations);\n        }\n\n        internal override void SmoothShape_PH(IntPtr meshPtr, double timeStep, int iterations)\n        {\n            MeshProcessingMeshing_EEK_SmoothShape_PH(meshPtr, timeStep, iterations);\n        }\n\n        internal override int SplitLongEdges_PH(IntPtr meshPtr, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EEK_SplitLongEdges_PH(meshPtr, target_edge_length);\n        }\n\n        internal override bool TriangulateFace_PH(IntPtr meshPtr, int index)\n        {\n            return MeshProcessingMeshing_EEK_TriangulateFace_PH(meshPtr, index);\n        }\n\n        internal override bool TriangulateFaces_PH(IntPtr meshPtr, int[] faces, int count)\n        {\n            return MeshProcessingMeshing_EEK_TriangulateFaces_PH(meshPtr, faces, count);\n        }\n\n        //Surface Mesh\n\n        internal override IntPtr Extrude_SM(IntPtr meshPtr, Vector3d dir)\n        {\n            return MeshProcessingMeshing_EEK_Extrude_SM(meshPtr, dir);\n        }\n\n        internal override Index2 Fair_SM(IntPtr meshPtr, int index, int k_ring)\n        {\n            return MeshProcessingMeshing_EEK_Fair_SM(meshPtr, index, k_ring);\n        }\n\n        internal override Index2 Refine_SM(IntPtr meshPtr, double density_control_factor)\n        {\n            return MeshProcessingMeshing_EEK_Refine_SM(meshPtr, density_control_factor);\n        }\n\n        internal override int IsotropicRemeshing_SM(IntPtr meshPtr, int iterations, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EEK_IsotropicRemeshing_SM(meshPtr, iterations, target_edge_length);\n        }\n\n        internal override void RandomPerturbation_SM(IntPtr meshPtr, double perturbation_max_size)\n        {\n            MeshProcessingMeshing_EEK_RandomPerturbation_SM(meshPtr, perturbation_max_size);\n        }\n\n        internal override void SmoothMesh_SM(IntPtr meshPtr, double featureAngle, int iterations)\n        {\n            MeshProcessingMeshing_EEK_SmoothMesh_SM(meshPtr, featureAngle, iterations);\n        }\n\n        internal override void SmoothShape_SM(IntPtr meshPtr, double timeStep, int iterations)\n        {\n            MeshProcessingMeshing_EEK_SmoothShape_SM(meshPtr, timeStep, iterations);\n        }\n\n        internal override int SplitLongEdges_SM(IntPtr meshPtr, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EEK_SplitLongEdges_SM(meshPtr, target_edge_length);\n        }\n\n        internal override bool TriangulateFace_SM(IntPtr meshPtr, int index)\n        {\n            return MeshProcessingMeshing_EEK_TriangulateFace_SM(meshPtr, index);\n        }\n\n        internal override bool TriangulateFaces_SM(IntPtr meshPtr, int[] faces, int count)\n        {\n            return MeshProcessingMeshing_EEK_TriangulateFaces_SM(meshPtr, faces, count);\n        }\n\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EEK_Extrude_PH(IntPtr meshPtr, Vector3d dir);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EEK_Fair_PH(IntPtr meshPtr, int index, int k_ring);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EEK_Refine_PH(IntPtr meshPtr, double density_control_factor);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EEK_IsotropicRemeshing_PH(IntPtr meshPtr, int iterations, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_RandomPerturbation_PH(IntPtr meshPtr, double perturbation_max_size);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_SmoothMesh_PH(IntPtr meshPtr, double featureAngle, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_SmoothShape_PH(IntPtr meshPtr, double timeStep, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EEK_SplitLongEdges_PH(IntPtr meshPtr, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EEK_TriangulateFace_PH(IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EEK_TriangulateFaces_PH(IntPtr meshPtr, int[] faces, int count);\n\n        //SurfaceMesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EEK_Extrude_SM(IntPtr meshPtr, Vector3d dir);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EEK_Fair_SM(IntPtr meshPtr, int index, int k_ring);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EEK_Refine_SM(IntPtr meshPtr, double density_control_factor);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EEK_IsotropicRemeshing_SM(IntPtr meshPtr, int iterations, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_RandomPerturbation_SM(IntPtr meshPtr, double perturbation_max_size);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_SmoothMesh_SM(IntPtr meshPtr, double featureAngle, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EEK_SmoothShape_SM(IntPtr meshPtr, double timeStep, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EEK_SplitLongEdges_SM(IntPtr meshPtr, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EEK_TriangulateFace_SM(IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EEK_TriangulateFaces_SM(IntPtr meshPtr, int[] faces, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingMeshingKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingMeshingKernel_EIK : MeshProcessingMeshingKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingMeshingKernel Instance = new MeshProcessingMeshingKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingMeshing_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingMeshing_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override IntPtr Extrude_PH(IntPtr meshPtr, Vector3d dir)\n        {\n            return MeshProcessingMeshing_EIK_Extrude_PH(meshPtr, dir);\n        }\n\n        internal override Index2 Fair_PH(IntPtr meshPtr, int index, int k_ring)\n        {\n            return MeshProcessingMeshing_EIK_Fair_PH(meshPtr, index, k_ring);\n        }\n\n        internal override Index2 Refine_PH(IntPtr meshPtr, double density_control_factor)\n        {\n            return MeshProcessingMeshing_EIK_Refine_PH(meshPtr, density_control_factor);\n        }\n\n        internal override int IsotropicRemeshing_PH(IntPtr meshPtr, int iterations, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EIK_IsotropicRemeshing_PH(meshPtr, iterations, target_edge_length);\n        }\n\n        internal override void RandomPerturbation_PH(IntPtr meshPtr, double perturbation_max_size)\n        {\n            MeshProcessingMeshing_EIK_RandomPerturbation_PH(meshPtr, perturbation_max_size);\n        }\n\n        internal override void SmoothMesh_PH(IntPtr meshPtr, double featureAngle, int iterations)\n        {\n            MeshProcessingMeshing_EIK_SmoothMesh_PH(meshPtr, featureAngle, iterations);\n        }\n\n        internal override void SmoothShape_PH(IntPtr meshPtr, double timeStep, int iterations)\n        {\n            MeshProcessingMeshing_EIK_SmoothShape_PH(meshPtr, timeStep, iterations);\n        }\n\n        internal override int SplitLongEdges_PH(IntPtr meshPtr, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EIK_SplitLongEdges_PH(meshPtr, target_edge_length);\n        }\n\n        internal override bool TriangulateFace_PH(IntPtr meshPtr, int index)\n        {\n            return MeshProcessingMeshing_EIK_TriangulateFace_PH(meshPtr, index);\n        }\n\n        internal override bool TriangulateFaces_PH(IntPtr meshPtr, int[] faces, int count)\n        {\n            return MeshProcessingMeshing_EIK_TriangulateFaces_PH(meshPtr, faces, count);\n        }\n\n        //Surface Mesh\n\n        internal override IntPtr Extrude_SM(IntPtr meshPtr, Vector3d dir)\n        {\n            return MeshProcessingMeshing_EIK_Extrude_SM(meshPtr, dir);\n        }\n\n        internal override Index2 Fair_SM(IntPtr meshPtr, int index, int k_ring)\n        {\n            return MeshProcessingMeshing_EIK_Fair_SM(meshPtr, index, k_ring);\n        }\n\n        internal override Index2 Refine_SM(IntPtr meshPtr, double density_control_factor)\n        {\n            return MeshProcessingMeshing_EIK_Refine_SM(meshPtr, density_control_factor);\n        }\n\n        internal override int IsotropicRemeshing_SM(IntPtr meshPtr, int iterations, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EIK_IsotropicRemeshing_SM(meshPtr, iterations, target_edge_length);\n        }\n\n        internal override void RandomPerturbation_SM(IntPtr meshPtr, double perturbation_max_size)\n        {\n            MeshProcessingMeshing_EIK_RandomPerturbation_SM(meshPtr, perturbation_max_size);\n        }\n\n        internal override void SmoothMesh_SM(IntPtr meshPtr, double featureAngle, int iterations)\n        {\n            MeshProcessingMeshing_EIK_SmoothMesh_SM(meshPtr, featureAngle, iterations);\n        }\n\n        internal override void SmoothShape_SM(IntPtr meshPtr, double timeStep, int iterations)\n        {\n            MeshProcessingMeshing_EIK_SmoothShape_SM(meshPtr, timeStep, iterations);\n        }\n\n        internal override int SplitLongEdges_SM(IntPtr meshPtr, double target_edge_length)\n        {\n            return MeshProcessingMeshing_EIK_SplitLongEdges_SM(meshPtr, target_edge_length);\n        }\n\n        internal override bool TriangulateFace_SM(IntPtr meshPtr, int index)\n        {\n            return MeshProcessingMeshing_EIK_TriangulateFace_SM(meshPtr, index);\n        }\n\n        internal override bool TriangulateFaces_SM(IntPtr meshPtr, int[] faces, int count)\n        {\n            return MeshProcessingMeshing_EIK_TriangulateFaces_SM(meshPtr, faces, count);\n        }\n\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EIK_Extrude_PH(IntPtr meshPtr, Vector3d dir);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EIK_Fair_PH(IntPtr meshPtr, int index, int k_ring);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EIK_Refine_PH(IntPtr meshPtr, double density_control_factor);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EIK_IsotropicRemeshing_PH(IntPtr meshPtr, int iterations, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_RandomPerturbation_PH(IntPtr meshPtr, double perturbation_max_size);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_SmoothMesh_PH(IntPtr meshPtr, double featureAngle, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_SmoothShape_PH(IntPtr meshPtr, double timeStep, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EIK_SplitLongEdges_PH(IntPtr meshPtr, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EIK_TriangulateFace_PH(IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EIK_TriangulateFaces_PH(IntPtr meshPtr, int[] faces, int count);\n\n        //SurfaceMesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingMeshing_EIK_Extrude_SM(IntPtr meshPtr, Vector3d dir);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EIK_Fair_SM(IntPtr meshPtr, int index, int k_ring);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern Index2 MeshProcessingMeshing_EIK_Refine_SM(IntPtr meshPtr, double density_control_factor);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EIK_IsotropicRemeshing_SM(IntPtr meshPtr, int iterations, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_RandomPerturbation_SM(IntPtr meshPtr, double perturbation_max_size);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_SmoothMesh_SM(IntPtr meshPtr, double featureAngle, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingMeshing_EIK_SmoothShape_SM(IntPtr meshPtr, double timeStep, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingMeshing_EIK_SplitLongEdges_SM(IntPtr meshPtr, double target_edge_length);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EIK_TriangulateFace_SM(IntPtr meshPtr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingMeshing_EIK_TriangulateFaces_SM(IntPtr meshPtr, int[] faces, int count);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingOrientation.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n\n    public enum ORIENTATE\n    {\n        ORIENT,\n        ORIENTATE_TO_BOUND_A_VOLUME,\n        REVERSE_FACE_ORIENTATIONS\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingOrientation<K> : MeshProcessingOrientation where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingOrientation<K> Instance = new MeshProcessingOrientation<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingOrientation() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingOrientation(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingOrientation<{0}>: ]\", Kernel.Name);\n        }\n\n        /// <summary>\n        /// Indicates if mesh bounds a volume.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public bool DoesBoundAVolume(Polyhedron3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            return Kernel.DoesBoundAVolume_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Indicates if mesh bounds a volume.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public bool DoesBoundAVolume(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            return Kernel.DoesBoundAVolume_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Tests whether a closed triangle mesh has a positive orientation.\n        /// A closed triangle mesh is considered to have a positive orientation\n        /// if the normal vectors to all its faces point outside the domain bounded \n        /// by the triangle mesh.The normal vector to each face is chosen pointing\n        /// on the side of the face where its sequence of vertices is seen counterclockwise.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public bool IsOutwardOriented(Polyhedron3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            return Kernel.IsOutwardOriented_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Tests whether a closed triangle mesh has a positive orientation.\n        /// A closed triangle mesh is considered to have a positive orientation\n        /// if the normal vectors to all its faces point outside the domain bounded \n        /// by the triangle mesh.The normal vector to each face is chosen pointing\n        /// on the side of the face where its sequence of vertices is seen counterclockwise.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public bool IsOutwardOriented(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            return Kernel.IsOutwardOriented_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"orientate\">The orientation method.</param>\n        /// <param name=\"mesh\">A valid closed triangle mesh.</param>\n        public void Orient(ORIENTATE orientate, Polyhedron3<K> mesh)\n        {\n            switch (orientate)\n            {\n                case ORIENTATE.ORIENT:\n                    Orient(mesh);\n                    break;\n                case ORIENTATE.ORIENTATE_TO_BOUND_A_VOLUME:\n                    OrientToBoundAVolume(mesh);\n                    break;\n                case ORIENTATE.REVERSE_FACE_ORIENTATIONS:\n                    ReverseFaceOrientations(mesh);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Orient the faces in the mesh.\n        /// </summary>\n        /// <param name=\"orientate\">The orientation method.</param>\n        /// <param name=\"mesh\">A valid closed triangle mesh.</param>\n        public void Orient(ORIENTATE orientate, SurfaceMesh3<K> mesh)\n        {\n            switch (orientate)\n            {\n                case ORIENTATE.ORIENT:\n                    Orient(mesh);\n                    break;\n                case ORIENTATE.ORIENTATE_TO_BOUND_A_VOLUME:\n                    OrientToBoundAVolume(mesh);\n                    break;\n                case ORIENTATE.REVERSE_FACE_ORIENTATIONS:\n                    ReverseFaceOrientations(mesh);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public void Orient(Polyhedron3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            Kernel.Orient_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Makes each connected component of a closed triangulated surface mesh inward or outward oriented.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public void Orient(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            Kernel.Orient_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Orients the connected components of tm to make it bound a volume.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public void OrientToBoundAVolume(Polyhedron3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            Kernel.OrientToBoundAVolume_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Orients the connected components of tm to make it bound a volume.\n        /// </summary>\n        /// <param name=\"mesh\">A closed triangle mesh.</param>\n        public void OrientToBoundAVolume(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidClosedTriangleException(mesh);\n            Kernel.OrientToBoundAVolume_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Reverses for each face the order of the vertices along the face boundary.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        public void ReverseFaceOrientations(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            Kernel.ReverseFaceOrientations_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Reverses for each face the order of the vertices along the face boundary.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        public void ReverseFaceOrientations(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            Kernel.ReverseFaceOrientations_SM(mesh.Ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingOrientation : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingOrientation()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingOrientation(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingOrientationKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingOrientation(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingOrientationKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingOrientationKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingOrientationKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingOrientationKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        //Polyhedron \n        internal abstract bool DoesBoundAVolume_PH(IntPtr polyPtr);\n\n        internal abstract bool IsOutwardOriented_PH(IntPtr polyPtr);\n\n        internal abstract void Orient_PH(IntPtr polyPtr);\n\n        internal abstract void OrientToBoundAVolume_PH(IntPtr polyPtr);\n\n        internal abstract void ReverseFaceOrientations_PH(IntPtr polyPtr);\n\n        //Surface Mesh \n        internal abstract bool DoesBoundAVolume_SM(IntPtr polyPtr);\n\n        internal abstract bool IsOutwardOriented_SM(IntPtr polyPtr);\n\n        internal abstract void Orient_SM(IntPtr polyPtr);\n\n        internal abstract void OrientToBoundAVolume_SM(IntPtr polyPtr);\n\n        internal abstract void ReverseFaceOrientations_SM(IntPtr polyPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingOrientationKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingOrientationKernel_EEK : MeshProcessingOrientationKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingOrientationKernel Instance = new MeshProcessingOrientationKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingOrientation_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingOrientation_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override bool DoesBoundAVolume_PH(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EEK_DoesBoundAVolume_PH(polyPtr);\n        }\n\n        internal override bool IsOutwardOriented_PH(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EEK_IsOutwardOriented_PH(polyPtr);\n        }\n\n        internal override void Orient_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_Orient_PH(polyPtr);\n        }\n\n        internal override void OrientToBoundAVolume_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_OrientToBoundAVolume_PH(polyPtr);\n        }\n\n        internal override void ReverseFaceOrientations_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_ReverseFaceOrientations_PH(polyPtr);\n        }\n\n        //Surface Mesh\n\n        internal override bool DoesBoundAVolume_SM(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EEK_DoesBoundAVolume_SM(polyPtr);\n        }\n\n        internal override bool IsOutwardOriented_SM(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EEK_IsOutwardOriented_SM(polyPtr);\n        }\n\n        internal override void Orient_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_Orient_SM(polyPtr);\n        }\n\n        internal override void OrientToBoundAVolume_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_OrientToBoundAVolume_SM(polyPtr);\n        }\n\n        internal override void ReverseFaceOrientations_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EEK_ReverseFaceOrientations_SM(polyPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingOrientation_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EEK_DoesBoundAVolume_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EEK_IsOutwardOriented_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_Orient_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_OrientToBoundAVolume_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_ReverseFaceOrientations_PH(IntPtr polyPtr);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EEK_DoesBoundAVolume_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EEK_IsOutwardOriented_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_Orient_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_OrientToBoundAVolume_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EEK_ReverseFaceOrientations_SM(IntPtr polyPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingOrientationKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingOrientationKernel_EIK : MeshProcessingOrientationKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingOrientationKernel Instance = new MeshProcessingOrientationKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingOrientation_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingOrientation_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override bool DoesBoundAVolume_PH(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EIK_DoesBoundAVolume_PH(polyPtr);\n        }\n\n        internal override bool IsOutwardOriented_PH(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EIK_IsOutwardOriented_PH(polyPtr);\n        }\n\n        internal override void Orient_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_Orient_PH(polyPtr);\n        }\n\n        internal override void OrientToBoundAVolume_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_OrientToBoundAVolume_PH(polyPtr);\n        }\n\n        internal override void ReverseFaceOrientations_PH(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_ReverseFaceOrientations_PH(polyPtr);\n        }\n\n        //Surface Mesh\n\n        internal override bool DoesBoundAVolume_SM(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EIK_DoesBoundAVolume_SM(polyPtr);\n        }\n\n        internal override bool IsOutwardOriented_SM(IntPtr polyPtr)\n        {\n            return MeshProcessingOrientation_EIK_IsOutwardOriented_SM(polyPtr);\n        }\n\n        internal override void Orient_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_Orient_SM(polyPtr);\n        }\n\n        internal override void OrientToBoundAVolume_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_OrientToBoundAVolume_SM(polyPtr);\n        }\n\n        internal override void ReverseFaceOrientations_SM(IntPtr polyPtr)\n        {\n            MeshProcessingOrientation_EIK_ReverseFaceOrientations_SM(polyPtr);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingOrientation_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EIK_DoesBoundAVolume_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EIK_IsOutwardOriented_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_Orient_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_OrientToBoundAVolume_PH(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_ReverseFaceOrientations_PH(IntPtr polyPtr);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EIK_DoesBoundAVolume_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool MeshProcessingOrientation_EIK_IsOutwardOriented_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_Orient_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_OrientToBoundAVolume_SM(IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingOrientation_EIK_ReverseFaceOrientations_SM(IntPtr polyPtr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingRepair.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingRepair<K> : MeshProcessingRepair where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingRepair<K> Instance = new MeshProcessingRepair<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingRepair() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingRepair(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingRepair<{0}>: ]\", Kernel.Name);\n        }\n\n        /*\n        /// <summary>\n        /// Find the number of degenerate edges in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of degenerate edges in the mesh.</returns>\n        public int DegenerateEdgeCount(Polyhedron3<K> mesh)\n        {\n            return Kernel.DegenerateEdgeCount_PM(mesh.Ptr);\n        }\n        */\n\n        /// <summary>\n        /// Find the number of degenerate edges in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of degenerate edges in the mesh.</returns>\n        public int DegenerateEdgeCount(SurfaceMesh3<K> mesh)\n        {\n            return Kernel.DegenerateEdgeCount_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the number of degenerate faces in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <returns>The number of degenerate faces in the mesh.</returns>\n        public int DegenerateTriangleCount(Polyhedron3<K> mesh)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.DegenerateTriangleCount_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Find the number of degenerate faces in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <returns>The number of degenerate faces in the mesh.</returns>\n        public int DegenerateTriangleCount(SurfaceMesh3<K> mesh)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.DegenerateTriangleCount_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Checks whether a triangle face is needle.\n        /// A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n        /// <returns>The number of needle triangles.</returns>\n        public int NeedleTriangleCount(Polyhedron3<K> mesh, double threshold)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.NeedleTriangleCount_PH(mesh.Ptr, threshold);\n        }\n\n        /// <summary>\n        /// Checks whether a triangle face is needle.\n        /// A triangle is said to be a needle if its longest edge is much longer than its shortest edge.\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <param name=\"threshold\">A bound on the ratio of the longest edge length and the shortest edge length.</param>\n        /// <returns>The number of needle triangles.</returns>\n        public int NeedleTriangleCount(SurfaceMesh3<K> mesh, double threshold)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.NeedleTriangleCount_SM(mesh.Ptr, threshold);\n        }\n\n        /// <summary>\n        /// Collects the non-manifold vertices (if any) present in the mesh.\n        /// A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n        /// for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n        /// the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <returns>The non manifold vertex count.</returns>\n        public int NonManifoldVertexCount(Polyhedron3<K> mesh)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.NonManifoldVertexCount_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Collects the non-manifold vertices (if any) present in the mesh.\n        /// A non-manifold vertex v is returned via one incident halfedge h such that target(h, pm) = v \n        /// for all the umbrellas that v appears in (an umbrella being the set of faces incident to all \n        /// the halfedges reachable by walking around v using hnext = prev(opposite(h, pm), pm), starting from h).\n        /// </summary>\n        /// <param name=\"mesh\">A triangle polygon mesh.</param>\n        /// <returns>The non manifold vertex count.</returns>\n        public int NonManifoldVertexCount(SurfaceMesh3<K> mesh)\n        {\n            //CheckIsValidTriangleException(mesh);\n            return Kernel.NonManifoldVertexCount_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Cleans a given polygon soup through various repairing operations.\n        ///\n        /// More precisely, this function carries out the following tasks, in the same order as they are listed:\n        ///\n        /// merging of duplicate points.\n        /// simplification of polygons to remove geometrically identical consecutive vertices;\n        /// splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n        /// The splitting process results in multiple non-pinched polygons;\n        /// removal of invalid polygons, that is polygons with fewer than 2 vertices;\n        /// removal of duplicate polygons.\n        /// removal of isolated points.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        public void RepairPolygonSoup(Polyhedron3<K> mesh)\n        {\n            mesh.SetIsUpdatedToFalse();\n            Kernel.RepairPolygonSoup_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Cleans a given polygon soup through various repairing operations.\n        ///\n        /// More precisely, this function carries out the following tasks, in the same order as they are listed:\n        ///\n        /// merging of duplicate points.\n        /// simplification of polygons to remove geometrically identical consecutive vertices;\n        /// splitting of \"pinched\" polygons, that is polygons in which a geometric position appears more than once.\n        /// The splitting process results in multiple non-pinched polygons;\n        /// removal of invalid polygons, that is polygons with fewer than 2 vertices;\n        /// removal of duplicate polygons.\n        /// removal of isolated points.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        public void RepairPolygonSoup(SurfaceMesh3<K> mesh)\n        {\n            mesh.SetIsUpdatedToFalse();\n            Kernel.RepairPolygonSoup_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n        /// Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n        /// target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of stiched boundaries.</returns>\n        public int StitchBoundaryCycles(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.StitchBoundaryCycles_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// stitches together, whenever possible, two halfedges belonging to the same boundary cycle.\n        /// Two border halfedges h1 and h2 can be stitched if the points associated to the source and\n        /// target vertices of h1 are the same as those of the target and source vertices of h2, respectively.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of stiched boundaries.</returns>\n        public int StitchBoundaryCycles(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.StitchBoundaryCycles_SM(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Stitches together border halfedges in a polygon mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of stiched borders.</returns>\n        public int StitchBorders(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.StitchBorders_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Stitches together border halfedges in a polygon mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of stiched borders.</returns>\n        public int StitchBorders(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.StitchBorders_SM(mesh.Ptr);\n        }\n\n        /*\n\n        /// <summary>\n        /// Merges the duplicated vertices of the edges boundary cycle.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <param name=\"index\">The index of a half edge in the boundary.</param>\n        /// <returns></returns>\n        public int MergeDuplicatedVerticesInBoundaryCycle(Polyhedron3<K> mesh, int index)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.MergeDuplicatedVerticesInBoundaryCycle_PH(mesh.Ptr, index);\n        }\n\n        /// <summary>\n        /// Merges the duplicated vertices of the edges boundary cycle.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <param name=\"index\">The index of a half edge in the boundary.</param>\n        /// <returns></returns>\n        public int MergeDuplicatedVerticesInBoundaryCycle(SurfaceMesh3<K> mesh, int index)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.MergeDuplicatedVerticesInBoundaryCycle_SM(mesh.Ptr, index);\n        }\n\n        /// <summary>\n        /// Extracts boundary cycles and merges the duplicated vertices of each cycle.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of vertices that were merged.</returns>\n        public int MergeDuplicatedVerticesInBoundaryCycles(Polyhedron3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.MergeDuplicatedVerticesInBoundaryCycles_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Extracts boundary cycles and merges the duplicated vertices of each cycle.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of vertices that were merged.</returns>\n        public int MergeDuplicatedVerticesInBoundaryCycles(SurfaceMesh3<K> mesh)\n        {\n            CheckIsValidException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.MergeDuplicatedVerticesInBoundaryCycles_SM(mesh.Ptr);\n        }\n\n        */\n\n        /// <summary>\n        /// Removes the isolated vertices from any polygon mesh.\n        /// A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of vertices that were removed.</returns>\n        public int RemoveIsolatedVertices(Polyhedron3<K> mesh)\n        {\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.RemoveIsolatedVertices_PH(mesh.Ptr);\n        }\n\n        /// <summary>\n        /// Removes the isolated vertices from any polygon mesh.\n        /// A vertex is considered isolated if it is not incident to any simplex of higher dimension.\n        /// </summary>\n        /// <param name=\"mesh\">The polygon mesh.</param>\n        /// <returns>The number of vertices that were removed.</returns>\n        public int RemoveIsolatedVertices(SurfaceMesh3<K> mesh)\n        {\n            mesh.SetIsUpdatedToFalse();\n            return Kernel.RemoveIsolatedVertices_SM(mesh.Ptr);\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingRepair : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingRepair()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingRepair(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingRepairKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingRepair(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingRepairKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingRepairKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingRepairKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingRepairKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n\t\t//Polyhedron\n\n\t\tinternal abstract int DegenerateEdgeCount_PH(IntPtr ptr);\n\n\t\tinternal abstract int DegenerateTriangleCount_PH(IntPtr ptr);\n\n\t\tinternal abstract int NeedleTriangleCount_PH(IntPtr ptr, double threshold);\n\n\t\tinternal abstract int NonManifoldVertexCount_PH(IntPtr ptr);\n\n\t\tinternal abstract void RepairPolygonSoup_PH(IntPtr ptr);\n\n\t\tinternal abstract int StitchBoundaryCycles_PH(IntPtr ptr);\n\n\t\tinternal abstract int StitchBorders_PH(IntPtr ptr);\n\n\t\tinternal abstract int MergeDuplicatedVerticesInBoundaryCycle_PH(IntPtr ptr, int index);\n\n\t\tinternal abstract int MergeDuplicatedVerticesInBoundaryCycles_PH(IntPtr ptr);\n\n\t\tinternal abstract int RemoveIsolatedVertices_PH(IntPtr ptr);\n\n\t\t//SurfaceMesh\n\n\t\tinternal abstract int DegenerateEdgeCount_SM(IntPtr ptr);\n\n\t\tinternal abstract int DegenerateTriangleCount_SM(IntPtr ptr);\n\n\t\tinternal abstract int NeedleTriangleCount_SM(IntPtr ptr, double threshold);\n\n\t\tinternal abstract int NonManifoldVertexCount_SM(IntPtr ptr);\n\n\t\tinternal abstract void RepairPolygonSoup_SM(IntPtr ptr);\n\n\t\tinternal abstract int StitchBoundaryCycles_SM(IntPtr ptr);\n\n\t\tinternal abstract int StitchBorders_SM(IntPtr ptr);\n\n\t\tinternal abstract int MergeDuplicatedVerticesInBoundaryCycle_SM(IntPtr ptr, int index);\n\n\t\tinternal abstract int MergeDuplicatedVerticesInBoundaryCycles_SM(IntPtr ptr);\n\n\t\tinternal abstract int RemoveIsolatedVertices_SM(IntPtr ptr);\n\t}\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingRepairKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingRepairKernel_EEK : MeshProcessingRepairKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingRepairKernel Instance = new MeshProcessingRepairKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingRepair_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingRepair_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int DegenerateEdgeCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_DegenerateEdgeCount_PH(ptr);\n        }\n\n        internal override int DegenerateTriangleCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_DegenerateTriangleCount_PH(ptr);\n        }\n\n        internal override int NeedleTriangleCount_PH(IntPtr ptr, double threshold)\n        {\n            return MeshProcessingRepair_EEK_NeedleTriangleCount_PH(ptr, threshold);\n        }\n\n        internal override int NonManifoldVertexCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_NonManifoldVertexCount_PH(ptr);\n        }\n\n        internal override void RepairPolygonSoup_PH(IntPtr ptr)\n        {\n            MeshProcessingRepair_EEK_RepairPolygonSoup_PH(ptr);\n        }\n\n        internal override int StitchBoundaryCycles_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_StitchBoundaryCycles_PH(ptr);\n        }\n\n        internal override int StitchBorders_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_StitchBorders_PH(ptr);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycle_PH(IntPtr ptr, int index)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycle_PH(ptr, index);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycles_PH(IntPtr ptr)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycles_PH(ptr);\n        }\n\n        internal override int RemoveIsolatedVertices_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_RemoveIsolatedVertices_PH(ptr);\n        }\n\n        //SurfaceMesh\n\n        internal override int DegenerateEdgeCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_DegenerateEdgeCount_SM(ptr);\n        }\n\n        internal override int DegenerateTriangleCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_DegenerateTriangleCount_SM(ptr);\n        }\n\n        internal override int NeedleTriangleCount_SM(IntPtr ptr, double threshold)\n        {\n            return MeshProcessingRepair_EEK_NeedleTriangleCount_SM(ptr, threshold);\n        }\n\n        internal override int NonManifoldVertexCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_NonManifoldVertexCount_SM(ptr);\n        }\n\n        internal override void RepairPolygonSoup_SM(IntPtr ptr)\n        {\n            MeshProcessingRepair_EEK_RepairPolygonSoup_SM(ptr);\n        }\n\n        internal override int StitchBoundaryCycles_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_StitchBoundaryCycles_SM(ptr);\n        }\n\n        internal override int StitchBorders_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_StitchBorders_SM(ptr);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycle_SM(IntPtr ptr, int index)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycle_SM(ptr, index);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycles_SM(IntPtr ptr)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycles_SM(ptr);\n        }\n\n        internal override int RemoveIsolatedVertices_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EEK_RemoveIsolatedVertices_SM(ptr);\n        }\n\n\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingRepair_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_DegenerateEdgeCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_DegenerateTriangleCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_NeedleTriangleCount_PH(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_NonManifoldVertexCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EEK_RepairPolygonSoup_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_StitchBoundaryCycles_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_StitchBorders_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_PH(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_RemoveIsolatedVertices_PH(IntPtr ptr);\n\n        //SurfaceMesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_DegenerateEdgeCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_DegenerateTriangleCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_NeedleTriangleCount_SM(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_NonManifoldVertexCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EEK_RepairPolygonSoup_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_StitchBoundaryCycles_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_StitchBorders_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_SM(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EEK_RemoveIsolatedVertices_SM(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingRepairKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingRepairKernel_EIK : MeshProcessingRepairKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingRepairKernel Instance = new MeshProcessingRepairKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingRepair_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingRepair_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override int DegenerateEdgeCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_DegenerateEdgeCount_PH(ptr);\n        }\n\n        internal override int DegenerateTriangleCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_DegenerateTriangleCount_PH(ptr);\n        }\n\n        internal override int NeedleTriangleCount_PH(IntPtr ptr, double threshold)\n        {\n            return MeshProcessingRepair_EIK_NeedleTriangleCount_PH(ptr, threshold);\n        }\n\n        internal override int NonManifoldVertexCount_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_NonManifoldVertexCount_PH(ptr);\n        }\n\n        internal override void RepairPolygonSoup_PH(IntPtr ptr)\n        {\n            MeshProcessingRepair_EIK_RepairPolygonSoup_PH(ptr);\n        }\n\n        internal override int StitchBoundaryCycles_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_StitchBoundaryCycles_PH(ptr);\n        }\n\n        internal override int StitchBorders_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_StitchBorders_PH(ptr);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycle_PH(IntPtr ptr, int index)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycle_PH(ptr, index);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycles_PH(IntPtr ptr)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycles_PH(ptr);\n        }\n\n        internal override int RemoveIsolatedVertices_PH(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_RemoveIsolatedVertices_PH(ptr);\n        }\n\n        //SurfaceMesh\n\n        internal override int DegenerateEdgeCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_DegenerateEdgeCount_SM(ptr);\n        }\n\n        internal override int DegenerateTriangleCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_DegenerateTriangleCount_SM(ptr);\n        }\n\n        internal override int NeedleTriangleCount_SM(IntPtr ptr, double threshold)\n        {\n            return MeshProcessingRepair_EIK_NeedleTriangleCount_SM(ptr, threshold);\n        }\n\n        internal override int NonManifoldVertexCount_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_NonManifoldVertexCount_SM(ptr);\n        }\n\n        internal override void RepairPolygonSoup_SM(IntPtr ptr)\n        {\n            MeshProcessingRepair_EIK_RepairPolygonSoup_SM(ptr);\n        }\n\n        internal override int StitchBoundaryCycles_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_StitchBoundaryCycles_SM(ptr);\n        }\n\n        internal override int StitchBorders_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_StitchBorders_SM(ptr);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycle_SM(IntPtr ptr, int index)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycle_SM(ptr, index);\n        }\n\n        internal override int MergeDuplicatedVerticesInBoundaryCycles_SM(IntPtr ptr)\n        {\n            return MergeDuplicatedVerticesInBoundaryCycles_SM(ptr);\n        }\n\n        internal override int RemoveIsolatedVertices_SM(IntPtr ptr)\n        {\n            return MeshProcessingRepair_EIK_RemoveIsolatedVertices_SM(ptr);\n        }\n\n\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingRepair_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_DegenerateEdgeCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_DegenerateTriangleCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_NeedleTriangleCount_PH(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_NonManifoldVertexCount_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EIK_RepairPolygonSoup_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_StitchBoundaryCycles_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_StitchBorders_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_PH(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_PH(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_RemoveIsolatedVertices_PH(IntPtr ptr);\n\n        //SurfaceMesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_DegenerateEdgeCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_DegenerateTriangleCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_NeedleTriangleCount_SM(IntPtr ptr, double threshold);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_NonManifoldVertexCount_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingRepair_EIK_RepairPolygonSoup_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_StitchBoundaryCycles_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_StitchBorders_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_SM(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_SM(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingRepair_EIK_RemoveIsolatedVertices_SM(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingSlicer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Polylines;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class MeshProcessingSlicer<K> : MeshProcessingSlicer where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly MeshProcessingSlicer<K> Instance = new MeshProcessingSlicer<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public MeshProcessingSlicer() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingSlicer(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[MeshProcessingSlicer<{0}>: ]\", Kernel.Name);\n        }\n        \n        /// <summary>\n        /// Find the line formed from the intersection of the plane and the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh. Is not modified.</param>\n        /// <param name=\"plane\">The plane.</param>\n        /// <param name=\"results\">The polylines from the intersection.</param>\n        public void Slice(Polyhedron3<K> mesh, Plane3d plane, List<Polyline3<K>> results)\n        {\n            int count = Kernel.Slice_PH(Ptr, mesh.Ptr, plane, true);\n            GetLines(count, results);\n        }\n\n        /// <summary>\n        /// Find the line formed from the intersection of the plane and the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh. Is not modified.</param>\n        /// <param name=\"plane\">The plane.</param>\n        /// <param name=\"results\">The polylines from the intersection.</param>\n        public void Slice(SurfaceMesh3<K> mesh, Plane3d plane, List<Polyline3<K>> results)\n        {\n            int count = Kernel.Slice_SM(Ptr, mesh.Ptr, plane, true);\n            GetLines(count, results);\n        }\n\n        /// <summary>\n        /// Find the lines formed by slicing the mesh from the start\n        /// point to the end point creating a plane at each increment.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh. Is not modified.</param>\n        /// <param name=\"start\">The point to start from.</param>\n        /// <param name=\"end\">The point to end at.</param>\n        /// <param name=\"increment\">Amount to increment each plane.</param>\n        /// <param name=\"results\">he polylines from the intersection.</param>\n        public void Slice(Polyhedron3<K> mesh, Point3d start, Point3d end, double increment, List<Polyline3<K>> results)\n        {\n            int count = Kernel.IncrementalSlice_PH(Ptr, mesh.Ptr, start, end, increment);\n            GetLines(count, results);\n        }\n\n        /// <summary>\n        /// Find the lines formed by slicing the mesh from the start\n        /// point to the end point creating a plane at each increment.\n        /// </summary>\n        /// <param name=\"mesh\">The mesh. Is not modified.</param>\n        /// <param name=\"start\">The point to start from.</param>\n        /// <param name=\"end\">The point to end at.</param>\n        /// <param name=\"increment\">Amount to increment each plane.</param>\n        /// <param name=\"results\">he polylines from the intersection.</param>\n        public void Slice(SurfaceMesh3<K> mesh, Point3d start, Point3d end, double increment, List<Polyline3<K>> results)\n        {\n            int count = Kernel.IncrementalSlice_SM(Ptr, mesh.Ptr, start, end, increment);\n            GetLines(count, results);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"count\"></param>\n        /// <param name=\"results\"></param>\n        private void GetLines(int count, List<Polyline3<K>> results)\n        {\n            if (count == 0) return;\n\n            var ptrs = new IntPtr[count];\n            Kernel.GetLines(Ptr, ptrs, count);\n\n            for (int i = 0; i < count; i++)\n            {\n                var line = new Polyline3<K>(ptrs[i]);\n                results.Add(line);\n            }\n        }\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class MeshProcessingSlicer : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private MeshProcessingSlicer()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal MeshProcessingSlicer(CGALKernel kernel)\n        {\n            Kernel = kernel.MeshProcessingSlicerKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal MeshProcessingSlicer(CGALKernel kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel.MeshProcessingSlicerKernel;\n            Ptr = ptr;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        internal MeshProcessingSlicerKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingSlicerKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class MeshProcessingSlicerKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void GetLines(IntPtr slicerPtr, IntPtr[] lines, int count);\n\n        //Polyhedron\n\n        internal abstract int Slice_PH(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        internal abstract int IncrementalSlice_PH(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n\n        //SUrfaceMesh\n\n        internal abstract int Slice_SM(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        internal abstract int IncrementalSlice_SM(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingSlicerKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingSlicerKernel_EEK : MeshProcessingSlicerKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly MeshProcessingSlicerKernel Instance = new MeshProcessingSlicerKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingSlicer_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingSlicer_EEK_Release(ptr);\n        }\n\n        internal override void GetLines(IntPtr slicerPtr, IntPtr[] lines, int count)\n        {\n            MeshProcessingSlicer_EEK_GetLines(slicerPtr, lines, count);\n        }\n\n        //Polyhedron\n        internal override int Slice_PH(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree)\n        {\n            return MeshProcessingSlicer_EEK_Slice_PH(slicerPtr, meshPtr, plane, useTree);\n        }\n\n        internal override int IncrementalSlice_PH(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment)\n        {\n            return MeshProcessingSlicer_EEK_IncrementalSlice_PH(slicerPtr, meshPtr, start, end, increment);\n        }\n\n        //Surface Mesh\n        internal override int Slice_SM(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree)\n        {\n            return MeshProcessingSlicer_EEK_Slice_SM(slicerPtr, meshPtr, plane, useTree);\n        }\n\n        internal override int IncrementalSlice_SM(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment)\n        {\n            return MeshProcessingSlicer_EEK_IncrementalSlice_SM(slicerPtr, meshPtr, start, end, increment);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingSlicer_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingSlicer_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingSlicer_EEK_GetLines(IntPtr slicerPtr, IntPtr[] lines, int count);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EEK_Slice_PH(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EEK_IncrementalSlice_PH(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n\n        //SurfaceMesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EEK_Slice_SM(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EEK_IncrementalSlice_SM(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/MeshProcessingSlicerKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Processing\n{\n    internal class MeshProcessingSlicerKernel_EIK : MeshProcessingSlicerKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly MeshProcessingSlicerKernel Instance = new MeshProcessingSlicerKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return MeshProcessingSlicer_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            MeshProcessingSlicer_EIK_Release(ptr);\n        }\n\n        internal override void GetLines(IntPtr slicerPtr, IntPtr[] lines, int count)\n        {\n            MeshProcessingSlicer_EIK_GetLines(slicerPtr, lines, count);\n        }\n\n        //Polyhedron\n        internal override int Slice_PH(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree)\n        {\n            return MeshProcessingSlicer_EIK_Slice_PH(slicerPtr, meshPtr, plane, useTree);\n        }\n\n        internal override int IncrementalSlice_PH(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment)\n        {\n            return MeshProcessingSlicer_EIK_IncrementalSlice_PH(slicerPtr, meshPtr, start, end, increment);\n        }\n\n        //Surface Mesh\n        internal override int Slice_SM(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree)\n        {\n            return MeshProcessingSlicer_EIK_Slice_SM(slicerPtr, meshPtr, plane, useTree);\n        }\n\n        internal override int IncrementalSlice_SM(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment)\n        {\n            return MeshProcessingSlicer_EIK_IncrementalSlice_SM(slicerPtr, meshPtr, start, end, increment);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr MeshProcessingSlicer_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingSlicer_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void MeshProcessingSlicer_EIK_GetLines(IntPtr slicerPtr, IntPtr[] lines, int count);\n\n        //Polyhedron\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EIK_Slice_PH(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EIK_IncrementalSlice_PH(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n\n        //SurfaceMesh\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EIK_Slice_SM(IntPtr slicerPtr, IntPtr meshPtr, Plane3d plane, bool useTree);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int MeshProcessingSlicer_EIK_IncrementalSlice_SM(IntPtr slicerPtr, IntPtr meshPtr, Point3d start, Point3d end, double increment);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSimplification.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNet.Polyhedra;\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class SurfaceSimplification<K> : SurfaceSimplification where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly SurfaceSimplification<K> Instance = new SurfaceSimplification<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public SurfaceSimplification() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[SurfaceSimplification<{0}>: ]\", Kernel.Name);\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class SurfaceSimplification : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private SurfaceSimplification()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal SurfaceSimplification(CGALKernel kernel)\n        {\n            Kernel = kernel.SurfaceSimplificationKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private SurfaceSimplificationKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Simplify the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        public void Simplify(Polyhedron3 mesh, double stop_ratio)\n        {\n            stop_ratio = MathUtil.Clamp01(stop_ratio);\n            if (stop_ratio == 0) return;\n\n            CheckIsValidTriangleException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            Kernel.Simplify_PH(mesh.Ptr, stop_ratio);\n        }\n\n        /// <summary>\n        /// Simplify the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"stop_ratio\">A percentage 0-1 of edges to remove.</param>\n        public void Simplify(SurfaceMesh3 mesh, double stop_ratio)\n        {\n            stop_ratio = MathUtil.Clamp01(stop_ratio);\n            if (stop_ratio == 0) return;\n\n            CheckIsValidTriangleException(mesh);\n            mesh.SetIsUpdatedToFalse();\n            Kernel.Simplify_SM(mesh.Ptr, stop_ratio);\n        }\n\n        /// <summary>\n        /// Release the unmanaged resourses.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSimplificationKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class SurfaceSimplificationKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void Simplify_PH(IntPtr meshPtr, double stop_ratio);\n\n        internal abstract void Simplify_SM(IntPtr meshPtr, double stop_ratio);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSimplificationKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class SurfaceSimplificationKernel_EIK : SurfaceSimplificationKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly SurfaceSimplificationKernel Instance = new SurfaceSimplificationKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return SurfaceSimplification_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SurfaceSimplification_EIK_Release(ptr);\n        }\n\n        internal override void Simplify_PH(IntPtr meshPtr, double stop_ratio)\n        {\n            SurfaceSimplification_EIK_Simplify_PH(meshPtr, stop_ratio);    \n        }\n\n        internal override void Simplify_SM(IntPtr meshPtr, double stop_ratio)\n        {\n            SurfaceSimplification_EIK_Simplify_SM(meshPtr, stop_ratio);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceSimplification_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSimplification_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSimplification_EIK_Simplify_PH(IntPtr meshPtr, double stop_ratio);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSimplification_EIK_Simplify_SM(IntPtr meshPtr, double stop_ratio);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSubdivision.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Processing\n{\n    /// <summary>\n    /// \n    /// </summary>\n    public enum SUBDIVISION_METHOD\n    {\n        CATMULL_CLARK,\n        LOOP,\n        SQRT3\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    /// <typeparam name=\"K\"></typeparam>\n    public sealed class SubdivisionSurface<K> : SubdivisionSurface where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        public static readonly SubdivisionSurface<K> Instance = new SubdivisionSurface<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public SubdivisionSurface() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[SubdivisionSurface<{0}>: ]\", Kernel.Name);\n        }\n\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide(SUBDIVISION_METHOD method, Polyhedron3<K> mesh, int iterations)\n        {\n            switch (method)\n            {\n                case SUBDIVISION_METHOD.CATMULL_CLARK:\n                    Subdivide_CatmullClark(mesh, iterations);\n                    break;\n                case SUBDIVISION_METHOD.LOOP:\n                    Subdivide_Loop(mesh, iterations);\n                    break;\n                case SUBDIVISION_METHOD.SQRT3:\n                    Subdivide_Sqrt3(mesh, iterations);\n                    break;\n                default:\n                    Subdivide_Sqrt3(mesh, iterations);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <param name=\"mesh\">A valid mesh. Must be a triangle mesh for loop or sqrt3.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide(SUBDIVISION_METHOD method, SurfaceMesh3<K> mesh, int iterations)\n        {\n            switch (method)\n            {\n                case SUBDIVISION_METHOD.CATMULL_CLARK:\n                    Subdivide_CatmullClark(mesh, iterations);\n                    break;\n                case SUBDIVISION_METHOD.LOOP:\n                    Subdivide_Loop(mesh, iterations);\n                    break;\n                case SUBDIVISION_METHOD.SQRT3:\n                    Subdivide_Sqrt3(mesh, iterations);\n                    break;\n                default:\n                    Subdivide_Sqrt3(mesh, iterations);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_CatmullClark(Polyhedron3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidException(mesh);\n            Kernel.Subdive_CatmullClark_PH(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_CatmullClark(SurfaceMesh3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidException(mesh);\n            Kernel.Subdive_CatmullClark_SM(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_Loop(Polyhedron3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidTriangleException(mesh);\n            Kernel.Subdive_Loop_PH(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_Loop(SurfaceMesh3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidTriangleException(mesh);\n            Kernel.Subdive_Loop_SM(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_DoSabin(SurfaceMesh3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidTriangleException(mesh);\n            Kernel.Subdive_DoSabin_SM(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_Sqrt3(Polyhedron3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidTriangleException(mesh);\n            Kernel.Subdive_Sqrt3_PH(mesh.Ptr, iterations);\n        }\n\n        /// <summary>\n        /// Subdive each face in the mesh.\n        /// </summary>\n        /// <param name=\"mesh\">A valid triangle mesh.</param>\n        /// <param name=\"iterations\">The number of subdivision iterations.</param>\n        public void Subdivide_Sqrt3(SurfaceMesh3<K> mesh, int iterations)\n        {\n            if (iterations <= 0) return;\n            CheckIsValidTriangleException(mesh);\n            Kernel.Subdive_Sqrt3_SM(mesh.Ptr, iterations);\n        }\n\n    }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public abstract class SubdivisionSurface : PolyhedraAlgorithm\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private SubdivisionSurface()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal SubdivisionSurface(CGALKernel kernel)\n        {\n            Kernel = kernel.SurfaceSubdivisionKernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        protected private SurfaceSubdivisionKernel Kernel { get; private set; }\n\n        /// <summary>\n        /// Release the unmanaged resourses.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSubdivisionKernel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Processing\n{\n    internal abstract class SurfaceSubdivisionKernel : CGALObjectKernel\n    {\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        //Polyhedron\n\n        internal abstract void Subdive_CatmullClark_PH(IntPtr polyPtr, int iterations);\n\n        internal abstract void Subdive_Loop_PH(IntPtr polyPtr, int iterations);\n\n        internal abstract void Subdive_Sqrt3_PH(IntPtr polyPtr, int iterations);\n\n        //Surface Mesh\n\n        internal abstract void Subdive_CatmullClark_SM(IntPtr polyPtr, int iterations);\n\n        internal abstract void Subdive_DoSabin_SM(IntPtr polyPtr, int iterations);\n\n        internal abstract void Subdive_Loop_SM(IntPtr polyPtr, int iterations);\n\n        internal abstract void Subdive_Sqrt3_SM(IntPtr polyPtr, int iterations);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSubdivisionKernel_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class SurfaceSubdivisionKernel_EEK : SurfaceSubdivisionKernel\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly SurfaceSubdivisionKernel Instance = new SurfaceSubdivisionKernel_EEK();\n\n        internal override IntPtr Create()\n        {\n            return SurfaceSubdivision_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SurfaceSubdivision_EEK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override void Subdive_CatmullClark_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_CatmullClark_PH(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Loop_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_Loop_PH(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Sqrt3_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_Sqrt3_PH(polyPtr, iterations);\n        }\n\n        //Surface Mesh\n\n        internal override void Subdive_CatmullClark_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_CatmullClark_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_DoSabin_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_DoSabin_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Loop_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_Loop_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Sqrt3_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EEK_Subdive_Sqrt3_SM(polyPtr, iterations);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceSubdivision_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_CatmullClark_PH(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_Loop_PH(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_Sqrt3_PH(IntPtr polyPtr, int iterations);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_CatmullClark_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_DoSabin_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_Loop_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EEK_Subdive_Sqrt3_SM(IntPtr polyPtr, int iterations);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Processing/SurfaceSubdivisionKernel_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nnamespace CGALDotNet.Processing\n{\n    internal class SurfaceSubdivisionKernel_EIK : SurfaceSubdivisionKernel\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly SurfaceSubdivisionKernel Instance = new SurfaceSubdivisionKernel_EIK();\n\n        internal override IntPtr Create()\n        {\n            return SurfaceSubdivision_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            SurfaceSubdivision_EIK_Release(ptr);\n        }\n\n        //Polyhedron\n\n        internal override void Subdive_CatmullClark_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_CatmullClark_PH(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Loop_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_Loop_PH(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Sqrt3_PH(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_Sqrt3_PH(polyPtr, iterations);\n        }\n\n        //Surface Mesh\n\n        internal override void Subdive_CatmullClark_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_CatmullClark_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_DoSabin_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_DoSabin_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Loop_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_Loop_SM(polyPtr, iterations);\n        }\n\n        internal override void Subdive_Sqrt3_SM(IntPtr polyPtr, int iterations)\n        {\n            SurfaceSubdivision_EIK_Subdive_Sqrt3_SM(polyPtr, iterations);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr SurfaceSubdivision_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Release(IntPtr ptr);\n\n        //Polyhedron\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_CatmullClark_PH(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_Loop_PH(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_Sqrt3_PH(IntPtr polyPtr, int iterations);\n\n        //Surface Mesh\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_CatmullClark_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_DoSabin_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_Loop_SM(IntPtr polyPtr, int iterations);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void SurfaceSubdivision_EIK_Subdive_Sqrt3_SM(IntPtr polyPtr, int iterations);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"CGALDotNet\": {\n      \"commandName\": \"Project\",\n      \"nativeDebugging\": true\n    }\n  }\n}"
  },
  {
    "path": "CGALDotNet/Triangulations/BaseTriangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n\n    public enum TRIANGULATION2\n    {\n        TRIANGULATION,\n        DELAUNAY,\n        CONSTRAINED,\n        CONSTRAINED_DELAUNAY\n    }\n\n    /// <summary>\n    /// Base triangulation class for Triangulation, DelaunayTriangulation,\n    /// ConstrainedTriangulation and ConstrainedDelaunayTriangulation.\n    /// </summary>\n    public abstract class BaseTriangulation2 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private BaseTriangulation2()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal BaseTriangulation2(BaseTriangulationKernel2 kernel)\n        {\n            Kernel = kernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal BaseTriangulation2(BaseTriangulationKernel2 kernel, Point2d[] points)\n        {\n            Kernel = kernel;\n            Ptr = Kernel.Create();\n            Insert(points, points.Length);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal BaseTriangulation2(BaseTriangulationKernel2 kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel;\n        }\n\n        /// <summary>\n        /// The triangulations kernel.\n        /// </summary>\n        protected private BaseTriangulationKernel2 Kernel { get; private set; }\n\n        /// <summary>\n        /// The number of verices in the triangulation.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// The number of triangles in the triangulation.\n        /// </summary>\n        public int TriangleCount => Kernel.FaceCount(Ptr);\n\n        /// <summary>\n        /// The number of indices need to represent the\n        /// triangulation (number of triangles * 3).\n        /// </summary>\n        public int IndiceCount => TriangleCount * 3;\n\n        /// <summary>\n        /// A number that will change if the unmanaged \n        /// triangulation model changes.\n        /// </summary>\n        public int BuildStamp => Kernel.BuildStamp(Ptr);\n\n        /// <summary>\n        /// Clear the triangulation.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// Is this a valid triangulation.\n        /// </summary>\n        /// <param name=\"level\"></param>\n        /// <returns>True if valid.</returns>\n        public bool IsValid(int level = 0)\n        {\n            return Kernel.IsValid(Ptr, level);\n        }\n\n        /// <summary>\n        /// Force the face and vertex indices to be set.\n        /// </summary>\n        public void ForceSetIndices()\n        {\n            Kernel.SetIndices(Ptr);\n        }\n\n        /// <summary>\n        /// Inserts point p in the triangulation.\n        ///If point coincides with an already existing vertex the triangulation remains unchanged.\n        ///If point is on an edge, the two incident faces are split in two.\n        ///If point is strictly inside a face of the triangulation, the face is split in three.\n        ///If point is strictly outside the convex hull, p is linked to all visible points on the \n        ///convex hull to form the new triangulation.\n        /// </summary>\n        /// <param name=\"point\">The point to insert.</param>\n        public void Insert(Point2d point)\n        {\n            Kernel.InsertPoint(Ptr, point);\n        }\n\n        /// <summary>\n        /// Inserts points into the triangulation.\n        ///If point coincides with an already existing vertex the triangulation remains unchanged.\n        ///If point is on an edge, the two incident faces are split in two.\n        ///If point is strictly inside a face of the triangulation, the face is split in three.\n        ///If point is strictly outside the convex hull, p is linked to all visible points on the \n        ///convex hull to form the new triangulation.\n        /// </summary>\n        /// <param name=\"points\">The points to insert.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void Insert(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.InsertPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get a array of all the points in the triangulation.\n        /// </summary>\n        /// <param name=\"points\">The point array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetPoints(Point2d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get a array of the triangle indices.\n        /// </summary>\n        /// <param name=\"indices\"></param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetIndices(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            Kernel.GetIndices(Ptr, indices, count);\n        }\n\n        /// <summary>\n        /// Get the vertices point.\n        /// </summary>\n        /// <param name=\"index\">The vertex index.</param>\n        /// <param name=\"point\">The vertices point.</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool GetPoint(int index, out Point2d point)\n        {\n            TriVertex2 vertex;\n            if(Kernel.GetVertex(Ptr, index, out vertex))\n            {\n                point = vertex.Point;\n                return true;\n            }\n            else\n            {\n                point = new Point2d();\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Get the point.\n        /// </summary>\n        /// <param name=\"index\">The points index.</param>\n        /// <returns>The point</returns>\n        /// <exception cref=\"ArgumentException\">If point with the index not found.</exception>\n        public Point2d GetPoint(int index)\n        {\n            if (GetPoint(index, out Point2d point))\n                return point;\n            else\n                throw new ArgumentException(\"Cound not get point \" + index);\n        }\n\n        /// <summary>\n        /// Get a vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertex index.</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool GetVertex(int index, out TriVertex2 vertex)\n        {\n            return Kernel.GetVertex(Ptr, index, out vertex);\n        }\n\n        /// <summary>\n        /// Get the vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertexs index.</param>\n        /// <returns>The vertexs</returns>\n        /// <exception cref=\"ArgumentException\">If vertex with the index not found.</exception>\n        public TriVertex2 GetVertex(int index)\n        {\n            if (GetVertex(index, out TriVertex2 vertex))\n                return vertex;\n            else\n                throw new ArgumentException(\"Cound not get vertex \" + index);\n        }\n\n        /// <summary>\n        /// Get a array of all the vertices.\n        /// </summary>\n        /// <param name=\"vertices\">The vertex array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetVertices(TriVertex2[] vertices, int count)\n        {\n            ErrorUtil.CheckArray(vertices, count);\n            Kernel.GetVertices(Ptr, vertices, count);\n        }\n\n        /// <summary>\n        /// Get a triangule face.\n        /// </summary>\n        /// <param name=\"index\">The faces index</param>\n        /// <param name=\"face\">The face</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetFace(int index, out TriFace2 face)\n        {\n            return Kernel.GetFace(Ptr, index, out face);\n        }\n\n        /// <summary>\n        /// Get the face.\n        /// </summary>\n        /// <param name=\"index\">The faces index.</param>\n        /// <returns>The Faces</returns>\n        /// <exception cref=\"ArgumentException\">If face with the index not found.</exception>\n        public TriFace2 GetFace(int index)\n        {\n            if (GetFace(index, out TriFace2 face))\n                return face;\n            else\n                throw new ArgumentException(\"Cound not get face \" + index);\n        }\n\n        /// <summary>\n        /// Get a array of all the triangle faces.\n        /// </summary>\n        /// <param name=\"faces\">A array of faces.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetFaces(TriFace2[] faces, int count)\n        {\n            ErrorUtil.CheckArray(faces, count);\n            Kernel.GetFaces(Ptr, faces, count);\n        }\n\n        /// <summary>\n        /// Get the segment between the face and a neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index</param>\n        /// <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n        /// <param name=\"segment\">The segment.</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetSegment(int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return Kernel.GetSegment(Ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        /// <summary>\n        /// Get the segment between the face and a neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index</param>\n        /// <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n        /// <returns>The segment</returns>\n        /// <exception cref=\"ArgumentException\">If segment with the index not found.</exception>\n        public Segment2d GetSegment(int faceIndex, int neighbourIndex)\n        {\n            if (GetSegment(faceIndex, neighbourIndex, out Segment2d tri))\n                return tri;\n            else\n                throw new ArgumentException(\"Cound not get seg at face index \" + faceIndex);\n        }\n\n        /// <summary>\n        /// Get a faces triangle.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index</param>\n        /// <param name=\"triangle\">The triangle</param>\n        /// <returns>True if the face was found</returns>\n        public bool GetTriangle(int faceIndex, out Triangle2d triangle)\n        {\n            return Kernel.GetTriangle(Ptr, faceIndex, out triangle);\n        }\n\n        /// <summary>\n        /// Get the triangle.\n        /// </summary>\n        /// <param name=\"index\">The triangles index.</param>\n        /// <returns>The triangle</returns>\n        /// <exception cref=\"ArgumentException\">If triangle with the index not found.</exception>\n        public Triangle2d GetTriangle(int index)\n        {\n            if (GetTriangle(index, out Triangle2d tri))\n                return tri;\n            else\n                throw new ArgumentException(\"Cound not get tri \" + index);\n        }\n\n        /// <summary>\n        /// Get a array of all the triangles.\n        /// </summary>\n        /// <param name=\"triangles\">A array of triangules.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetTriangles(Triangle2d[] triangles, int count)\n        {\n            ErrorUtil.CheckArray(triangles, count);\n            Kernel.GetTriangles(Ptr, triangles, count);\n        }\n\n        /// <summary>\n        /// Get a faces circumcenter.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index</param>\n        /// <param name=\"circumcenter\">The circumcenter. A circle\n        /// that passes through all three of the triangules vertices.</param>\n        /// <returns>True if the face was found.</returns>\n        public bool GetCircumcenter(int faceIndex, out Point2d circumcenter)\n        {\n            return Kernel.GetCircumcenter(Ptr, faceIndex, out circumcenter);\n        }\n\n        /// <summary>\n        /// Get the circumcenter.\n        /// </summary>\n        /// <param name=\"index\">The circumcenters index.</param>\n        /// <returns>The circumcenter</returns>\n        /// <exception cref=\"ArgumentException\">If circumcenter with the index not found.</exception>\n        public Point2d GetCircumcenter(int index)\n        {\n            if (GetCircumcenter(index, out Point2d cir))\n                return cir;\n            else\n                throw new ArgumentException(\"Cound not get circumcenter \" + index);\n        }\n\n        /// <summary>\n        /// Get a array of all the circumcenters.\n        /// </summary>\n        /// <param name=\"circumcenters\">A array of circumcenters.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetCircumcenters(Point2d[] circumcenters, int count)\n        {\n            ErrorUtil.CheckArray(circumcenters, count);\n            Kernel.GetCircumcenters(Ptr, circumcenters, count);\n        }\n\n        /// <summary>\n        /// Get the index of the faces neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index.</param>\n        /// <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n        /// <returns>The index of the neighbour face in the triangulation. \n        /// -1 if there is no neighbour face at this index.</returns>\n        public int NeighbourIndex(int faceIndex, int neighbourIndex)\n        {\n            if (neighbourIndex < 0 || neighbourIndex > 2)\n                return -1;\n\n            return Kernel.NeighbourIndex(Ptr, faceIndex, neighbourIndex);\n        }\n\n        /// <summary>\n        /// Locate the face the point hits.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"face\">The face the point has hit.</param>\n        /// <returns>True if the point hit a face.</returns>\n        public bool LocateFace(Point2d point, out TriFace2 face)\n        {\n            return Kernel.LocateFace(Ptr, point, out face);\n        }\n\n        /// <summary>\n        /// Locate the closest vertex to point.\n        /// </summary>\n        /// <param name=\"point\">The point</param>\n        /// <param name=\"radius\">The distance the point must be within to count as hitting the vertex.</param>\n        /// <param name=\"vertex\">The closest vertex.</param>\n        /// <returns>True if point hit a face and found a vertex.</returns>\n        public bool LocateVertex(Point2d point, double radius, out TriVertex2 vertex)\n        {\n            //Locate the face the point hit.\n            vertex = new TriVertex2();\n            if (Kernel.LocateFace(Ptr, point, out TriFace2 face))\n            {\n                //Find the closest vertex in the face to the point.\n                double min = double.PositiveInfinity;\n                TriVertex2 closest = new TriVertex2();\n\n                for (int i = 0; i < 3; i++)\n                {\n                    int v = face.GetVertexIndex(i);\n                    if (v == -1) continue;\n\n                    //If vertex found find its distance to point.\n                    if(GetVertex(v, out vertex))\n                    {\n                        var sqdist = Point2d.SqrDistance(vertex.Point, point);\n                        if(sqdist < min)\n                        {\n                            min = sqdist;\n                            closest = vertex;\n                        }\n                    }\n                }\n\n                //Face had no valid vertices.\n                //Should not happen but check anyway.\n                if (min == double.PositiveInfinity || min > radius * radius)\n                    return false;\n                else\n                {\n                    vertex = closest;\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Locate the closest  edge and segment to point.\n        /// </summary>\n        /// <param name=\"point\">The point</param>\n        /// <param name=\"radius\">The distance the point must be within to count as hitting the edge.</param>\n        /// <param name=\"edge\">The closest edge.</param>\n        /// <returns>True if the point hit a face and found a edge.</returns>\n        public bool LocateEdge(Point2d point, double radius, out TriEdge2 edge)\n        {\n            //Locate the face the point hit.\n            edge = new TriEdge2();\n \n            if (Kernel.LocateFace(Ptr, point, out TriFace2 face))\n            {\n                //Find the closest edge to the point in the face.\n                double min = double.PositiveInfinity;\n                TriEdge2 closest = new TriEdge2();\n\n                for (int i = 0; i < 3; i++)\n                {\n                    int v1 = face.GetVertexIndex(i+0);\n                    int v2 = face.GetVertexIndex(i+1);\n                    if (v1 == -1 || v2 == -1) continue;\n\n                    if (GetVertex(v1, out TriVertex2 vertex1) &&\n                        GetVertex(v2, out TriVertex2 vertex2))\n                    {\n                        var p1 = vertex1.Point;\n                        var p2 = vertex2.Point;\n\n                        var seg = new Segment2d(p1, p2);\n                        var sqdist = seg.SqrDistance(point);\n\n                        if (sqdist < min)\n                        {\n                            min = sqdist;\n\n                            int neighboutIndex = MathUtil.Wrap(i - 1, 3);\n                            closest = new TriEdge2(face.Index, neighboutIndex);\n                            closest.Segment = new Segment2d(p1, p2);\n                        }\n                    }\n                }\n\n                //Face had no valid vertices.\n                //Should not happen but check anyway.\n                if (min == double.PositiveInfinity || min > radius * radius)\n                    return false;\n                else\n                {\n                    edge = closest;\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Remove the vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <returns>True if removed.</returns>\n        public bool RemoveVertex(int index)\n        {\n            return Kernel.RemoveVertex(Ptr, index);\n        }\n\n        /// <summary>\n        /// Flip a edge between the face and a neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index</param>\n        /// <param name=\"neighbourIndex\">The neighbour (0-2) index in the face.</param>\n        /// <returns>True if the edge was flipped.</returns>\n        public bool FlipEdge(int faceIndex, int neighbourIndex)\n        {\n            if (neighbourIndex < 0 || neighbourIndex > 2)\n                return false;\n\n            return Kernel.FlipEdge(Ptr, faceIndex, neighbourIndex);\n        }\n\n        /// <summary>\n        /// Translate the triangulation.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point2d translation)\n        {\n            Kernel.Transform(Ptr, translation, 0, 1);\n        }\n\n        /// <summary>\n        /// Rotate the triangulation.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate in radians.</param>\n        public void Rotate(Radian rotation)\n        {\n            Kernel.Transform(Ptr, Point2d.Zero, rotation.angle, 1);\n        }\n\n        /// <summary>\n        /// Scale the triangulation.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(double scale)\n        {\n            Kernel.Transform(Ptr, Point2d.Zero, 0, scale);\n        }\n\n        /// <summary>\n        /// Transform the triangulation with a TRS matrix.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point2d translation, Radian rotation, double scale)\n        {\n            Kernel.Transform(Ptr, translation, rotation.angle, scale);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/BaseTriangulation3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n\n    public enum TRIANGULATION3\n    {\n        TRIANGULATION,\n        DELAUNAY\n    }\n\n    /// <summary>\n    /// Base triangulation class for Triangulation, DelaunayTriangulation \n    /// and ConstrainedTriangulation.\n    /// </summary>\n    public abstract class BaseTriangulation3 : CGALObject\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        private BaseTriangulation3()\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal BaseTriangulation3(BaseTriangulationKernel3 kernel, Point3d[] points)\n        {\n            Kernel = kernel;\n            Ptr = Kernel.Create();\n            Insert(points, points.Length);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal BaseTriangulation3(BaseTriangulationKernel3 kernel)\n        {\n            Kernel = kernel;\n            Ptr = Kernel.Create();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal BaseTriangulation3(BaseTriangulationKernel3 kernel, IntPtr ptr) : base(ptr)\n        {\n            Kernel = kernel;\n        }\n\n        /// <summary>\n        /// The triangulations kernel.\n        /// </summary>\n        protected private BaseTriangulationKernel3 Kernel { get; private set; }\n\n        /// <summary>\n        /// Returns the buildStamp.\n        /// The build stamp will change if \n        /// the triangulation model has changed\n        /// </summary>\n        public int BuildStamp => Kernel.BuildStamp(Ptr);\n\n        /// <summary>\n        /// Returns the dimension of the affine hull.\n        /// </summary>\n        public int Dimension => Kernel.Dimension(Ptr);\n\n        /// <summary>\n        /// Returns the number of vertices.\n        /// </summary>\n        public int VertexCount => Kernel.VertexCount(Ptr);\n\n        /// <summary>\n        /// Returns the number of finite vertices.\n        /// </summary>\n        public int FiniteVertexCount => Kernel.FiniteVertexCount(Ptr);\n\n        /// <summary>\n        /// Returns the number of cells or 0 if Dimension less than 3.\n        /// </summary>\n        public int TetrahedronCount => Kernel.CellCount(Ptr);\n\n        /// <summary>\n        /// The number of finite cells.\n        /// Returns 0 if Dimension less than 3.\n        /// </summary>\n        public int FiniteTetrahedronCount => Kernel.FiniteCellCount(Ptr);\n\n        /// <summary>\n        /// The number of edges.\n        /// Returns 0 if Dimension less than 1.\n        /// </summary>\n        public int EdgeCount => Kernel.EdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of finite edges.\n        /// Returns 0 if Dimension less than 1.\n        /// </summary>\n        public int FiniteEdgeCount => Kernel.FiniteEdgeCount(Ptr);\n\n        /// <summary>\n        /// The number of facets.\n        /// Returns 0 if Dimension less than 2.\n        /// </summary>\n        public int TriangleCount => Kernel.FacetCount(Ptr);\n\n        /// <summary>\n        /// The number of facets.\n        /// Returns 0 if Dimension less than 2.\n        /// </summary>\n        public int FiniteTriangleCount =>  Kernel.FiniteFacetCount(Ptr);\n\n        /// <summary>\n        /// The number of indices needed for the finite tetrahedrons.\n        /// </summary>\n        public int TetrahdronIndiceCount => FiniteTetrahedronCount * 4;\n\n        /// <summary>\n        /// Clear the triangulation.\n        /// </summary>\n        public void Clear()\n        {\n            Kernel.Clear(Ptr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public bool IsValid()\n        {\n            return Kernel.IsValid(Ptr, false);\n        }\n\n        /// <summary>\n        /// Inserts the point p in the triangulation.\n        /// If point p coincides with an already existing vertex the triangulation remains unchanged.\n        /// If point p lies in the convex hull of the points, it is added naturally: \n        /// if it lies inside a cell, the cell is split into four cells, if it lies \n        /// on a facet, the two incident cells are split into three cells, if it lies\n        /// on an edge, all the cells incident to this edge are split into two cells.\n        /// If point p is strictly outside the convex hull but in the affine hull, p \n        /// is linked to all visible points on the convex hull to form the new triangulation.\n        /// If point p is outside the affine hull of the points, p is linked to all the points,\n        /// and the dimension of the triangulation is incremented. All the points now belong to \n        /// the boundary of the convex hull, so, the infinite vertex is linked to all the points \n        /// to triangulate the new infinite face.\n        /// </summary>\n        /// <param name=\"point\">The point to insert</param>\n        public void Insert(Point3d point)\n        {\n            Kernel.InsertPoint(Ptr, point);\n        }\n\n        /// <summary>\n        /// Insert all the points in the array.\n        /// </summary>\n        /// <param name=\"points\">The points to insert.</param>\n        /// <param name=\"count\">The arrays length</param>\n        public void Insert(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.InsertPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Insert a vertex into a cell.\n        /// </summary>\n        /// <param name=\"index\">The cells index.</param>\n        /// <param name=\"point\">The point to insert.</param>\n        public void InsertInCell(int index, Point3d point)\n        {\n            Kernel.InsertInCell(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// If the point query lies inside the convex hull of the points, the cell that contains the query in its interior is returned.\n        /// If query lies on a facet, an edge or on a vertex, one of the cells having query on its boundary is returned.\n        /// If the point query lies outside the convex hull of the points, an infinite cell with vertices { p,q,r,∞} is\n        /// returned such that the tetrahedron(p, q, r, query) is positively oriented(the rest of the triangulation lies\n        /// on the other side of facet (p, q, r)).\n        /// Note that locate works even in degenerate dimensions: in dimension 2 (resp. 1, 0) the Cell_handle returned\n        /// is the one that represents the facet(resp.edge, vertex) containing the query point.\n        /// The optional argument start is used as a starting place for the search.\n        /// The optional argument could_lock_zone is used by the concurrency-safe version of the triangulation.When the\n        /// pointer is not null, the locate will try to lock all the cells along the walk. If it succeeds,\n        /// could_lock_zone is true, otherwise it is false. In any case, the locked cells are not unlocked by locate,\n        /// leaving this choice to the user. \n        /// </summary>\n        /// <param name=\"point\">The point to query</param>\n        /// <param name=\"cell\">The cell thats closest to point.</param>\n        /// <returns>The closest cell to point.</returns>\n        public bool Locate(Point3d point, out TriCell3 cell)\n        {\n            int index = Kernel.Locate(Ptr, point);\n            if(index != CGALGlobal.NULL_INDEX)\n            {\n                if(GetCell(index, out cell))\n                {\n                    return true;\n                }\n                else\n                {\n                    cell = new TriCell3();\n                    return false;\n                }\n            }\n            else\n            {\n                cell = new TriCell3();\n                return false;\n            }\n            \n        }\n\n        /// <summary>\n        /// Get the centroids of each cell.\n        /// </summary>\n        /// <param name=\"circumcenters\">The array of points</param>\n        /// <param name=\"count\">The array of points length</param>\n        public void GetCircumcenters(Point3d[] circumcenters, int count)\n        {\n            ErrorUtil.CheckArray(circumcenters, count);\n            Kernel.GetCircumcenters(Ptr, circumcenters, count);\n        }\n\n        /// <summary>\n        /// Get all the points in the triangulation.\n        /// </summary>\n        /// <param name=\"points\">The array to copy into.</param>\n        /// <param name=\"count\">The arrays length.</param>\n        public void GetPoints(Point3d[] points, int count)\n        {\n            ErrorUtil.CheckArray(points, count);\n            Kernel.GetPoints(Ptr, points, count);\n        }\n\n        /// <summary>\n        /// Get all the points in the triangulation.\n        /// </summary>\n        /// <param name=\"points\">The array to copy into.</param>\n        public void GetPoints(List<Point3d> points)\n        {\n            int count = VertexCount;\n            var array = new Point3d[count];    \n            GetPoints(array, array.Length);\n            points.AddRange(array);\n        }\n\n        /// <summary>\n        /// Get the triangulation vertices.\n        /// </summary>\n        /// <param name=\"vertices\">The vertex array.</param>\n        /// <param name=\"count\">The vertex array length.</param>\n        public void GetVertices(TriVertex3[] vertices, int count)\n        {\n            ErrorUtil.CheckArray(vertices, count);\n            Kernel.GetVertices(Ptr, vertices, count);\n        }\n\n        /// <summary>\n        /// Get a triangulation vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index</param>\n        /// <param name=\"vertex\">The vertex.</param>\n        /// <returns></returns>\n        public bool GetVertex(int index, out TriVertex3 vertex)\n        {\n            return Kernel.GetVertex(Ptr, index, out vertex); \n        }\n\n        /// <summary>\n        /// Get the triangulation vertices.\n        /// </summary>\n        /// <param name=\"cells\">The vertex array.</param>\n        /// <param name=\"count\">The vertex array length.</param>\n        public void GetCells(TriCell3[] cells, int count)\n        {\n            ErrorUtil.CheckArray(cells, count);\n            Kernel.GetCells(Ptr, cells, count);\n        }\n\n        /// <summary>\n        /// Get a triangulation vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index</param>\n        /// <param name=\"cell\">The vertex.</param>\n        /// <returns></returns>\n        public bool GetCell(int index, out TriCell3 cell)\n        {\n            return Kernel.GetCell(Ptr, index, out cell);\n        }\n\n        /// <summary>\n        /// Get the indices of the cells edges in the triangulation.\n        /// </summary>\n        /// <param name=\"indices\">The indices array.</param>\n        /// <param name=\"count\">The indices array length.</param>\n        public void GetSegmentIndices(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            Kernel.GetSegmentIndices(Ptr, indices, count);\n        }\n\n        public void GetSegments(Segment3d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            Kernel.GetSegments(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get the indices of the cells triangles in the triangulation.\n        /// </summary>\n        /// <param name=\"indices\">The indices array.</param>\n        /// <param name=\"count\">The indices array length.</param>\n        public void GetTriangleIndices(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            Kernel.GetTriangleIndices(Ptr, indices, count);\n        }\n\n        public void GetTriangles(Triangle3d[] triangles, int count)\n        {\n            ErrorUtil.CheckArray(triangles, count);\n            Kernel.GetTriangles(Ptr, triangles, count);\n        }\n\n        /// <summary>\n        /// Get the indices of the tetrahedron cells in the triangulation.\n        /// </summary>\n        /// <param name=\"indices\">The indices array.</param>\n        /// <param name=\"count\">The indices array length.</param>\n        public void GetTetrahedronIndices(int[] indices, int count)\n        {\n            ErrorUtil.CheckArray(indices, count);\n            Kernel.GetTetrahedraIndices(Ptr, indices, count);\n        }\n\n        public void GetTetrahedrons(Tetrahedron3d[] tetrahedrons, int count)\n        {\n            ErrorUtil.CheckArray(tetrahedrons, count);\n            Kernel.GetTetrahedrons(Ptr, tetrahedrons, count);\n        }\n\n        /// <summary>\n        /// Translate each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        public void Translate(Point3d translation)\n        {\n            var m = Matrix4x4d.Translate(translation);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Rotate each point in the mesh.\n        /// </summary>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        public void Rotate(Quaternion3d rotation)\n        {\n            var m = rotation.ToMatrix4x4d();\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Scale each point in the mesh.\n        /// </summary>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Scale(Point3d scale)\n        {\n            var m = Matrix4x4d.Scale(scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// Transform each point in the mesh.\n        /// </summary>\n        /// <param name=\"translation\">The amount to translate.</param>\n        /// <param name=\"rotation\">The amount to rotate.</param>\n        /// <param name=\"scale\">The amount to scale.</param>\n        public void Transform(Point3d translation, Quaternion3d rotation, Point3d scale)\n        {\n            var m = Matrix4x4d.TranslateRotateScale(translation, rotation, scale);\n            Kernel.Transform(Ptr, m);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n        }\n\n        /// <summary>\n        /// Release any unmanaged resources.\n        /// </summary>\n        protected override void ReleasePtr()\n        {\n            Kernel.Release(Ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/BaseTriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class BaseTriangulationKernel2 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract IntPtr Copy(IntPtr ptr);\n\n        internal abstract void SetIndices(IntPtr ptr);\n\n        internal abstract int BuildStamp(IntPtr ptr);\n\n        internal abstract bool IsValid(IntPtr ptr, int level);\n\n        internal abstract int VertexCount(IntPtr ptr);\n\n        internal abstract int FaceCount(IntPtr ptr);\n\n        internal abstract void InsertPoint(IntPtr ptr, Point2d point);\n\n        internal abstract void InsertPoints(IntPtr ptr, Point2d[] points, int count);\n\n        internal abstract void InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        internal abstract void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        internal abstract void GetPoints(IntPtr ptr, Point2d[] points, int count);\n\n        internal abstract void GetIndices(IntPtr ptr, int[] indices, int count);\n\n        internal abstract bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex);\n\n        internal abstract void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count);\n\n        internal abstract bool GetFace(IntPtr ptr, int index, out TriFace2 face);\n\n        internal abstract void GetFaces(IntPtr ptr, TriFace2[] faces, int count);\n\n        internal abstract bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment);\n\n        internal abstract bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle);\n\n        internal abstract void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count);\n\n        internal abstract bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter);\n\n        internal abstract void GetCircumcenters(IntPtr ptr, Point2d[] circumcenters, int count);\n\n        internal abstract int NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        internal abstract bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face);\n\n        internal abstract bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex);\n\n        internal abstract bool RemoveVertex(IntPtr ptr, int index);\n\n        internal abstract bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        internal abstract void Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/BaseTriangulationKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class BaseTriangulationKernel3 : CGALObjectKernel\n    {\n\n        internal abstract IntPtr Create();\n\n        internal abstract void Release(IntPtr ptr);\n\n        internal abstract void Clear(IntPtr ptr);\n\n        internal abstract IntPtr Copy(IntPtr ptr);\n\n        internal abstract int BuildStamp(IntPtr ptr);\n\n        internal abstract int Dimension(IntPtr ptr);\n\n        internal abstract bool IsValid(IntPtr ptr, bool verbose);\n\n        internal abstract int VertexCount(IntPtr ptr);\n\n        internal abstract int FiniteVertexCount(IntPtr ptr);\n\n        internal abstract int CellCount(IntPtr ptr);\n\n        internal abstract int FiniteCellCount(IntPtr ptr);\n\n        internal abstract int EdgeCount(IntPtr ptr);\n\n        internal abstract int FiniteEdgeCount(IntPtr ptr);\n\n        internal abstract int FacetCount(IntPtr ptr);\n\n        internal abstract int FiniteFacetCount(IntPtr ptr);\n\n        internal abstract void InsertPoint(IntPtr ptr, Point3d point);\n\n\t    internal abstract void InsertPoints(IntPtr ptr, Point3d[] points, int count);\n\n        internal abstract void InsertInCell(IntPtr ptr, int index, Point3d point);\n\n        internal abstract int Locate(IntPtr ptr, Point3d point);\n\n        internal abstract void GetCircumcenters(IntPtr ptr, Point3d[] Circumcenters, int count);\n\n        internal abstract void GetPoints(IntPtr ptr, Point3d[] points, int count);\n\n        internal abstract void GetVertices(IntPtr ptr, TriVertex3[] vertices, int count);\n\n        internal abstract bool GetVertex(IntPtr ptr, int index, out TriVertex3 vertex);\n\n        internal abstract void GetCells(IntPtr ptr, TriCell3[] cells, int count);\n\n        internal abstract bool GetCell(IntPtr ptr, int index, out TriCell3 cell);\n\n        internal abstract void GetSegmentIndices(IntPtr ptr, int[] indices, int count);\n\n        internal abstract void GetTriangleIndices(IntPtr ptr, int[] indices, int count);\n\n        internal abstract void GetTetrahedraIndices(IntPtr ptr, int[] indices, int count);\n\n        internal abstract void GetSegments(IntPtr ptr, Segment3d[] indices, int count);\n\n        internal abstract void GetTriangles(IntPtr ptr, Triangle3d[] indices, int count);\n\n        internal abstract void GetTetrahedrons(IntPtr ptr, Tetrahedron3d[] indices, int count);\n\n        internal abstract void Transform(IntPtr ptr, Matrix4x4d matrix);\n    }\n}"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedDelaunayTriangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Hulls;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// The generic constrained triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel</typeparam>\n    public sealed class ConstrainedDelaunayTriangulation2<K> : ConstrainedDelaunayTriangulation2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance of the triangulation.\n        /// </summary>\n        public static readonly ConstrainedDelaunayTriangulation2<K> Instance = new ConstrainedDelaunayTriangulation2<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public ConstrainedDelaunayTriangulation2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        public ConstrainedDelaunayTriangulation2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal ConstrainedDelaunayTriangulation2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[ConstrainedDelaunayTriangulation2<{0}>: VertexCount={1}, FaceCount={2}]\",\n                Kernel.Name, VertexCount, TriangleCount);\n        }\n\n        /// <summary>\n        /// A deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public ConstrainedDelaunayTriangulation2<K> Copy()\n        {\n            return new ConstrainedDelaunayTriangulation2<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polygon2<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 3)\n                throw new InvalidOperationException(\"Trianglution must have at lest 3 points to compute the hull.\");\n\n            var points = ArrayCache.Point2dArray(count);\n            GetPoints(points, count);\n\n            var hull = ConvexHull2<K>.Instance;\n            return hull.CreateHull(points, count);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract triangulation class.\n    /// </summary>\n    public abstract class ConstrainedDelaunayTriangulation2 : BaseTriangulation2\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal ConstrainedDelaunayTriangulation2(CGALKernel kernel)\n            : base(kernel.ConstrainedDelaunayTriangulationKernel2)\n        {\n            TriangulationKernel = Kernel as ConstrainedDelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal ConstrainedDelaunayTriangulation2(CGALKernel kernel, Point2d[] points)\n            : base(kernel.ConstrainedDelaunayTriangulationKernel2, points)\n        {\n            TriangulationKernel = Kernel as ConstrainedDelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal ConstrainedDelaunayTriangulation2(CGALKernel kernel, IntPtr ptr)\n            : base(kernel.ConstrainedDelaunayTriangulationKernel2, ptr)\n        {\n            TriangulationKernel = Kernel as ConstrainedDelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the constrained triangulation.\n        /// </summary>\n        protected private ConstrainedDelaunayTriangulationKernel2 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// The number of constrainted edges in the triangulation.\n        /// </summary>\n        public int ConstrainedEdgeCount => TriangulationKernel.ConstrainedEdgesCount(Ptr);\n\n        /// <summary>\n        /// Move the vertex.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"vertex\">The moved vertex</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool MoveVertex(int index, Point2d point, out TriVertex2 vertex)\n        {\n            return TriangulationKernel.MoveVertex(Ptr, index, point, true, out vertex);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        public void Insert(Polygon2 polygon)\n        {\n            TriangulationKernel.InsertPolygon(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\"></param>\n        public void Insert(PolygonWithHoles2 pwh)\n        {\n            TriangulationKernel.InsertPolygonWithHoles(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to insert.</param>\n        public void InsertConstraint(Polygon2 polygon)\n        {\n            TriangulationKernel.InsertPolygonConstraint(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\">The polygon to insert.</param>\n        public void InsertConstraint(PolygonWithHoles2 pwh)\n        {\n            TriangulationKernel.InsertPolygonWithHolesConstraint(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Get the number of constrainted edges incident to this vertex.\n        /// </summary>\n        /// <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n        /// <returns>The number of constrainted edges to the vertex.</returns>\n        public int IncidentConstraintCount(int vertIndex)\n        {\n            return TriangulationKernel.IncidentConstraintCount(Ptr, vertIndex);\n        }\n\n        /// <summary>\n        /// Does this vertex have a constrainted edge.\n        /// </summary>\n        /// <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n        /// <returns>Does this vertex have a constrainted edge.</returns>\n        public bool HasIncidentConstraint(int vertIndex)\n        {\n            return TriangulationKernel.HasIncidentConstraints(Ptr, vertIndex);\n        }\n\n        /// <summary>\n        /// Add a segment as a constraint.\n        /// </summary>\n        /// <param name=\"segment\">The segment to add.</param>\n        public void InsertConstraint(Segment2d segment)\n        {\n            InsertConstraint(segment.A, segment.B);\n        }\n\n        /// <summary>\n        /// Add the two points as a segment constraint.\n        /// </summary>\n        /// <param name=\"a\">The segments point a.</param>\n        /// <param name=\"b\">The segments point b.</param>\n        public void InsertConstraint(Point2d a, Point2d b)\n        {\n            TriangulationKernel.InsertSegmentConstraintFromPoints(Ptr, a, b);\n        }\n\n        /// <summary>\n        /// Add a list of segments as constraint to the triangulation.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The length of the segment array.</param>\n        public void InsertConstraints(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            TriangulationKernel.InsertSegmentConstraints(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get a array of all the constraint edges in the triangulation.\n        /// </summary>\n        /// <param name=\"constraints\">The edge array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetConstraints(TriEdge2[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetConstraints(Ptr, constraints, count);\n        }\n\n        /// <summary>\n        /// Get a array of all the constraint segments in the triangulation.\n        /// </summary>\n        /// <param name=\"constraints\">The segment array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetConstraints(Segment2d[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetConstraints(Ptr, constraints, count);\n        }\n\n        /// <summary>\n        /// Get the constraints incident to the vertex.\n        /// </summary>\n        /// <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        /// <param name=\"constraints\">The array of edges.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetIncidentConstraints(int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetIncidentConstraints(Ptr, vertexIndex, constraints, count);\n        }\n\n        /// <summary>\n        /// Remove a constraint between a face and its neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index in the triangultion.</param>\n        /// <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        public void RemoveConstraint(int faceIndex, int neighbourIndex)\n        {\n            if (neighbourIndex < 0 || neighbourIndex > 2)\n                return;\n\n            TriangulationKernel.RemoveConstraint(Ptr, faceIndex, neighbourIndex);\n        }\n\n        /// <summary>\n        /// Remove all constraints incident to a vertex.\n        /// </summary>\n        /// <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        public void RemoveIncidentConstraints(int vertexIndex)\n        {\n            TriangulationKernel.RemoveIncidentConstraints(Ptr, vertexIndex);\n        }\n\n        /// <summary>\n        /// Get the triangle indices for domain in the triangultion.\n        /// Used to triangulate polygons.\n        /// </summary>\n        /// <param name=\"indices\">The indices.</param>\n        internal void GetConstrainedDomainIndices(List<int> indices)\n        {\n            int count = IndiceCount;\n            if (count == 0) return;\n\n            int[] tmp = new int[count];\n            count = TriangulationKernel.MarkDomains(Ptr, tmp, tmp.Length);\n\n            for (int i = 0; i < count; i++)\n                indices.Add(tmp[i]); ;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"IndiceCount = \" + IndiceCount);\n            builder.AppendLine(\"Constrained edges = \" + ConstrainedEdgeCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedDelaunayTriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class ConstrainedDelaunayTriangulationKernel2 : BaseTriangulationKernel2\n    {\n\n        internal abstract int ConstrainedEdgesCount(IntPtr ptr);\n\n        internal abstract bool HasIncidentConstraints(IntPtr ptr, int index);\n\n        internal abstract int IncidentConstraintCount(IntPtr ptr, int index);\n\n        internal abstract void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        internal abstract void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        internal abstract void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        internal abstract void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        internal abstract void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count);\n\n        internal abstract void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count);\n\n        internal abstract void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count);\n\n        internal abstract void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        internal abstract void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        internal abstract int MarkDomains(IntPtr ptr, int[] indices, int count);\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedDelaunayTriangulationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class ConstrainedDelaunayTriangulationKernel2_EEK : ConstrainedDelaunayTriangulationKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly ConstrainedDelaunayTriangulationKernel2 Instance = new ConstrainedDelaunayTriangulationKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Constrained only.\n\n        internal override int ConstrainedEdgesCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_ConstrainedEdgesCount(ptr);\n        }\n\n        internal override bool HasIncidentConstraints(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_HasIncidentConstraints(ptr, index);\n        }\n\n        internal override int IncidentConstraintCount(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_IncidentConstraintCount(ptr, index);\n        }\n\n        internal override void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromPoints(ptr, a, b);\n        }\n\n        internal override void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromVertices(ptr, vertIndex1, vertIndex2);\n        }\n\n        internal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraints(ptr, segments, count);\n        }\n\n        internal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPolygonConstraint(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetEdgeConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetSegmentConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_GetIncidentConstraints(ptr, vertexIndex, constraints, count);\n        }\n\n        internal override void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_RemoveConstraint(ptr, faceIndex, neighbourIndex);\n        }\n\n        internal override void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_RemoveIncidentConstraints(ptr, vertexIndex);\n        }\n\n        internal override int MarkDomains(IntPtr ptr, int[] indices, int count)\n        {\n            return ConstrainedDelaunayTriangulation2_EEK_MarkDomains(ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            ConstrainedDelaunayTriangulation2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedDelaunayTriangulation2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedDelaunayTriangulation2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Constrained only.\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_ConstrainedEdgesCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EEK_HasIncidentConstraints(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_IncidentConstraintCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetEdgeConstraints(IntPtr ptr, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetSegmentConstraints(IntPtr ptr, [Out] Segment2d[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_GetIncidentConstraints(IntPtr ptr, int vertexIndex, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_GetPolygonIndices(IntPtr ptrTri, IntPtr polyPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_GetPolygonWithHolesIndices(IntPtr ptrTri, IntPtr pwhPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EEK_MarkDomains(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedDelaunayTriangulationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class ConstrainedDelaunayTriangulationKernel2_EIK : ConstrainedDelaunayTriangulationKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly ConstrainedDelaunayTriangulationKernel2 Instance = new ConstrainedDelaunayTriangulationKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Constrained only.\n\n        internal override int ConstrainedEdgesCount(IntPtr ptr)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_ConstrainedEdgesCount(ptr);\n        }\n\n        internal override bool HasIncidentConstraints(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_HasIncidentConstraints(ptr, index);\n        }\n\n        internal override int IncidentConstraintCount(IntPtr ptr, int index)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_IncidentConstraintCount(ptr, index);\n        }\n\n        internal override void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromPoints(ptr, a, b);\n        }\n\n        internal override void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromVertices(ptr, vertIndex1, vertIndex2);\n        }\n\n        internal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraints(ptr, segments, count);\n        }\n\n        internal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPolygonConstraint(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetEdgeConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetSegmentConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_GetIncidentConstraints(ptr, vertexIndex, constraints, count);\n        }\n\n        internal override void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_RemoveConstraint(ptr, faceIndex, neighbourIndex);\n        }\n\n        internal override void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_RemoveIncidentConstraints(ptr, vertexIndex);\n        }\n\n        internal override int MarkDomains(IntPtr ptr, int[] indices, int count)\n        {\n            return ConstrainedDelaunayTriangulation2_EIK_MarkDomains(ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            ConstrainedDelaunayTriangulation2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedDelaunayTriangulation2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedDelaunayTriangulation2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Constrained only.\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_ConstrainedEdgesCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedDelaunayTriangulation2_EIK_HasIncidentConstraints(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_IncidentConstraintCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetEdgeConstraints(IntPtr ptr, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetSegmentConstraints(IntPtr ptr, [Out] Segment2d[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_GetIncidentConstraints(IntPtr ptr, int vertexIndex, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_GetPolygonIndices(IntPtr ptrTri, IntPtr polyPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_GetPolygonWithHolesIndices(IntPtr ptrTri, IntPtr pwhPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedDelaunayTriangulation2_EIK_MarkDomains(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedDelaunayTriangulation2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedTriangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Hulls;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// The generic constrained triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kernel</typeparam>\n    public sealed class ConstrainedTriangulation2<K> : ConstrainedTriangulation2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance of the triangulation.\n        /// </summary>\n        public static readonly ConstrainedTriangulation2<K> Instance = new ConstrainedTriangulation2<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public ConstrainedTriangulation2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        public ConstrainedTriangulation2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal ConstrainedTriangulation2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[ConstrainedTriangulation2<{0}>: VertexCount={1}, FaceCount={2}]\",\n                Kernel.Name, VertexCount, TriangleCount);\n        }\n\n        /// <summary>\n        /// A deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public ConstrainedTriangulation2<K> Copy()\n        {\n            return new ConstrainedTriangulation2<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polygon2<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 3)\n                throw new InvalidOperationException(\"Trianglution must have at lest 3 points to compute the hull.\");\n\n            var points = ArrayCache.Point2dArray(count);\n            GetPoints(points, count);\n\n            var hull = ConvexHull2<K>.Instance;\n            return hull.CreateHull(points, count);\n        }\n\n    }\n\n    /// <summary>\n    /// The abstract triangulation class.\n    /// </summary>\n    public abstract class ConstrainedTriangulation2 : BaseTriangulation2\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal ConstrainedTriangulation2(CGALKernel kernel) \n            : base(kernel.ConstrainedTriangulationKernel2)\n        {\n            TriangulationKernel = Kernel as ConstrainedTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal ConstrainedTriangulation2(CGALKernel kernel, Point2d[] points)\n            : base(kernel.ConstrainedTriangulationKernel2, points)\n        {\n            TriangulationKernel = Kernel as ConstrainedTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal ConstrainedTriangulation2(CGALKernel kernel, IntPtr ptr) \n            : base(kernel.ConstrainedTriangulationKernel2, ptr)\n        {\n            TriangulationKernel = Kernel as ConstrainedTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the constrained triangulation.\n        /// </summary>\n        protected private ConstrainedTriangulationKernel2 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// The number of constrainted edges in the triangulation.\n        /// </summary>\n        public int ConstrainedEdgeCount => TriangulationKernel.ConstrainedEdgesCount(Ptr);\n\n        /// <summary>\n        /// Move the vertex.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"vertex\">The moved vertex</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool MoveVertex(int index, Point2d point, out TriVertex2 vertex)\n        {\n            return TriangulationKernel.MoveVertex(Ptr, index, point, true, out vertex);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\"></param>\n        public void Insert(Polygon2 polygon)\n        {\n            TriangulationKernel.InsertPolygon(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retain the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\"></param>\n        public void Insert(PolygonWithHoles2 pwh)\n        {\n            TriangulationKernel.InsertPolygonWithHoles(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to insert.</param>\n        public void InsertConstraint(Polygon2 polygon)\n        {\n            TriangulationKernel.InsertPolygonConstraint(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points and the edges as constraints into the triangulation.\n        /// Will retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\">The polygon to insert.</param>\n        public void InsertConstraint(PolygonWithHoles2 pwh)\n        {\n            TriangulationKernel.InsertPolygonWithHolesConstraint(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Get the number of constrainted edges incident to this vertex.\n        /// </summary>\n        /// <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n        /// <returns>The number of constrainted edges to the vertex.</returns>\n        public int IncidentConstraintCount(int vertIndex)\n        {\n            return TriangulationKernel.IncidentConstraintCount(Ptr, vertIndex);\n        }\n\n        /// <summary>\n        /// Does this vertex have a constrainted edge.\n        /// </summary>\n        /// <param name=\"vertIndex\">The vertex index in the triagulation.</param>\n        /// <returns>Does this vertex have a constrainted edge.</returns>\n        public bool HasIncidentConstraint(int vertIndex)\n        {\n            return TriangulationKernel.HasIncidentConstraints(Ptr, vertIndex);\n        }\n\n        /// <summary>\n        /// Add a segment as a constraint.\n        /// </summary>\n        /// <param name=\"segment\">The segment to add.</param>\n        public void InsertConstraint(Segment2d segment)\n        {\n            InsertConstraint(segment.A, segment.B);\n        }\n\n        /// <summary>\n        /// Add the two points as a segment constraint.\n        /// </summary>\n        /// <param name=\"a\">The segments point a.</param>\n        /// <param name=\"b\">The segments point b.</param>\n        public void InsertConstraint(Point2d a, Point2d b)\n        {\n            TriangulationKernel.InsertSegmentConstraintFromPoints(Ptr, a, b);\n        }\n\n        /// <summary>\n        /// Add a list of segments as constraint to the triangulation.\n        /// </summary>\n        /// <param name=\"segments\">The segment array.</param>\n        /// <param name=\"count\">The length of the segment array.</param>\n        public void InsertConstraints(Segment2d[] segments, int count)\n        {\n            ErrorUtil.CheckArray(segments, count);\n            TriangulationKernel.InsertSegmentConstraints(Ptr, segments, count);\n        }\n\n        /// <summary>\n        /// Get a array of all the constraint edges in the triangulation.\n        /// </summary>\n        /// <param name=\"constraints\">The edge array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetConstraints(TriEdge2[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetConstraints(Ptr, constraints, count);\n        }\n\n        /// <summary>\n        /// Get a array of all the constraint segments in the triangulation.\n        /// </summary>\n        /// <param name=\"constraints\">The segment array.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetConstraints(Segment2d[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetConstraints(Ptr, constraints, count);\n        }\n\n        /// <summary>\n        /// Get the constraints incident to the vertex.\n        /// </summary>\n        /// <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        /// <param name=\"constraints\">The array of edges.</param>\n        /// <param name=\"count\">The ararys length.</param>\n        public void GetIncidentConstraints(int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ErrorUtil.CheckArray(constraints, count);\n            TriangulationKernel.GetIncidentConstraints(Ptr, vertexIndex, constraints, count);\n        }\n\n        /// <summary>\n        /// Remove a constraint between a face and its neighbour.\n        /// </summary>\n        /// <param name=\"faceIndex\">The faces index in the triangultion.</param>\n        /// <param name=\"neighbourIndex\">The neighbours index in the faces neighbour array between 0-2.</param>\n        public void RemoveConstraint(int faceIndex, int neighbourIndex)\n        {\n            if (neighbourIndex < 0 || neighbourIndex > 2)\n                return;\n\n            TriangulationKernel.RemoveConstraint(Ptr, faceIndex, neighbourIndex);\n        }\n\n        /// <summary>\n        /// Remove all constraints incident to a vertex.\n        /// </summary>\n        /// <param name=\"vertexIndex\">The vertex index in the triangulation.</param>\n        public void RemoveIncidentConstraints(int vertexIndex)\n        {\n            TriangulationKernel.RemoveIncidentConstraints(Ptr, vertexIndex);\n        }\n\n        /// <summary>\n        /// Get the triangle indices for domain in the triangultion.\n        /// Used to triangulate polygons.\n        /// </summary>\n        /// <param name=\"indices\">The indices.</param>\n        internal void GetConstrainedDomainIndices(List<int> indices)\n        {\n            int count = IndiceCount;\n            if (count == 0) return;\n\n            int[] tmp = new int[count];\n            count = TriangulationKernel.MarkDomains(Ptr, tmp, tmp.Length);\n\n            for (int i = 0; i < count; i++)\n                indices.Add(tmp[i]);;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"IndiceCount = \" + IndiceCount);\n            builder.AppendLine(\"Constrained edges = \" + ConstrainedEdgeCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedTriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class ConstrainedTriangulationKernel2 : BaseTriangulationKernel2\n    {\n\n        internal abstract int ConstrainedEdgesCount(IntPtr ptr);\n\n        internal abstract bool HasIncidentConstraints(IntPtr ptr, int index);\n\n        internal abstract int IncidentConstraintCount(IntPtr ptr, int index);\n\n        internal abstract void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        internal abstract void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        internal abstract void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        internal abstract void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        internal abstract void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count);\n\n        internal abstract void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count);\n\n        internal abstract void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count);\n\n        internal abstract void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        internal abstract void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        internal abstract int MarkDomains(IntPtr ptr, int[] indices, int count);\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedTriangulationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class ConstrainedTriangulationKernel2_EEK : ConstrainedTriangulationKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly ConstrainedTriangulationKernel2 Instance = new ConstrainedTriangulationKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return ConstrainedTriangulation2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EEK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EEK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EEK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return ConstrainedTriangulation2_EEK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EEK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EEK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            ConstrainedTriangulation2_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedTriangulation2_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedTriangulation2_EEK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedTriangulation2_EEK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return ConstrainedTriangulation2_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return ConstrainedTriangulation2_EEK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return ConstrainedTriangulation2_EEK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return ConstrainedTriangulation2_EEK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return ConstrainedTriangulation2_EEK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return ConstrainedTriangulation2_EEK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return ConstrainedTriangulation2_EEK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return ConstrainedTriangulation2_EEK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EEK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return ConstrainedTriangulation2_EEK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Constrained only.\n\n        internal override int ConstrainedEdgesCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EEK_ConstrainedEdgesCount(ptr);\n        }\n\n        internal override bool HasIncidentConstraints(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EEK_HasIncidentConstraints(ptr, index);\n        }\n\n        internal override int IncidentConstraintCount(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EEK_IncidentConstraintCount(ptr, index);\n        }\n\n        internal override void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b)\n        {\n            ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromPoints(ptr, a, b);\n        }\n\n        internal override void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2)\n        {\n            ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromVertices(ptr, vertIndex1, vertIndex2);\n        }\n\n        internal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            ConstrainedTriangulation2_EEK_InsertSegmentConstraints(ptr, segments, count);\n        }\n\n        internal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedTriangulation2_EEK_InsertPolygonConstraint(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedTriangulation2_EEK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetEdgeConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetSegmentConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EEK_GetIncidentConstraints(ptr, vertexIndex, constraints, count);\n        }\n\n        internal override void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex)\n        {\n            ConstrainedTriangulation2_EEK_RemoveConstraint(ptr, faceIndex, neighbourIndex);\n        }\n\n        internal override void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex)\n        {\n            ConstrainedTriangulation2_EEK_RemoveIncidentConstraints(ptr, vertexIndex);\n        }\n\n        internal override int MarkDomains(IntPtr ptr, int[] indices, int count)\n        {\n            return ConstrainedTriangulation2_EEK_MarkDomains(ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            ConstrainedTriangulation2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedTriangulation2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedTriangulation2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices,  int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Constrained only.\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_ConstrainedEdgesCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EEK_HasIncidentConstraints(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_IncidentConstraintCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertSegmentConstraints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetEdgeConstraints(IntPtr ptr, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetSegmentConstraints(IntPtr ptr, [Out] Segment2d[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_GetIncidentConstraints(IntPtr ptr, int vertexIndex, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_GetPolygonIndices(IntPtr ptrTri, IntPtr polyPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_GetPolygonWithHolesIndices(IntPtr ptrTri, IntPtr pwhPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EEK_MarkDomains(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/ConstrainedTriangulationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class ConstrainedTriangulationKernel2_EIK : ConstrainedTriangulationKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly ConstrainedTriangulationKernel2 Instance = new ConstrainedTriangulationKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return ConstrainedTriangulation2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EIK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EIK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EIK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            ConstrainedTriangulation2_EIK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EIK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return ConstrainedTriangulation2_EIK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EIK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EIK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            ConstrainedTriangulation2_EIK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedTriangulation2_EIK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedTriangulation2_EIK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedTriangulation2_EIK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return ConstrainedTriangulation2_EIK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return ConstrainedTriangulation2_EIK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return ConstrainedTriangulation2_EIK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return ConstrainedTriangulation2_EIK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return ConstrainedTriangulation2_EIK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return ConstrainedTriangulation2_EIK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return ConstrainedTriangulation2_EIK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return ConstrainedTriangulation2_EIK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EIK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return ConstrainedTriangulation2_EIK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Constrained only.\n\n        internal override int ConstrainedEdgesCount(IntPtr ptr)\n        {\n            return ConstrainedTriangulation2_EIK_ConstrainedEdgesCount(ptr);\n        }\n\n        internal override bool HasIncidentConstraints(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EIK_HasIncidentConstraints(ptr, index);\n        }\n\n        internal override int IncidentConstraintCount(IntPtr ptr, int index)\n        {\n            return ConstrainedTriangulation2_EIK_IncidentConstraintCount(ptr, index);\n        }\n\n        internal override void InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b)\n        {\n            ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromPoints(ptr, a, b);\n        }\n\n        internal override void InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2)\n        {\n            ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromVertices(ptr, vertIndex1, vertIndex2);\n        }\n\n        internal override void InsertSegmentConstraints(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            ConstrainedTriangulation2_EIK_InsertSegmentConstraints(ptr, segments, count);\n        }\n\n        internal override void InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr)\n        {\n            ConstrainedTriangulation2_EIK_InsertPolygonConstraint(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            ConstrainedTriangulation2_EIK_InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, TriEdge2[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetEdgeConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetConstraints(IntPtr ptr, Segment2d[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetSegmentConstraints(ptr, constraints, count);\n        }\n\n        internal override void GetIncidentConstraints(IntPtr ptr, int vertexIndex, TriEdge2[] constraints, int count)\n        {\n            ConstrainedTriangulation2_EIK_GetIncidentConstraints(ptr, vertexIndex, constraints, count);\n        }\n\n        internal override void RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex)\n        {\n            ConstrainedTriangulation2_EIK_RemoveConstraint(ptr, faceIndex, neighbourIndex);\n        }\n\n        internal override void RemoveIncidentConstraints(IntPtr ptr, int vertexIndex)\n        {\n            ConstrainedTriangulation2_EIK_RemoveIncidentConstraints(ptr, vertexIndex);\n        }\n\n        internal override int MarkDomains(IntPtr ptr, int[] indices, int count)\n        {\n            return ConstrainedTriangulation2_EIK_MarkDomains(ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            ConstrainedTriangulation2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedTriangulation2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr ConstrainedTriangulation2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Constrained only.\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_ConstrainedEdgesCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool ConstrainedTriangulation2_EIK_HasIncidentConstraints(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_IncidentConstraintCount(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromPoints(IntPtr ptr, Point2d a, Point2d b);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromVertices(IntPtr ptr, int vertIndex1, int vertIndex2);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertSegmentConstraints(IntPtr ptr, [In] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPolygonConstraint(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_InsertPolygonWithHolesConstraint(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetEdgeConstraints(IntPtr ptr, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetSegmentConstraints(IntPtr ptr, [Out] Segment2d[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_GetIncidentConstraints(IntPtr ptr, int vertexIndex, [Out] TriEdge2[] constraints, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_RemoveConstraint(IntPtr ptr, int faceIndex, int neighbourIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_RemoveIncidentConstraints(IntPtr ptr, int vertexIndex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_GetPolygonIndices(IntPtr ptrTri, IntPtr polyPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_GetPolygonWithHolesIndices(IntPtr ptrTri, IntPtr pwhPtr, [Out] int[] indices, int count, ORIENTATION orientation);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int ConstrainedTriangulation2_EIK_MarkDomains(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void ConstrainedTriangulation2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Hulls;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// The generic delaunay triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kerne</typeparam>\n    public sealed class DelaunayTriangulation2<K> : DelaunayTriangulation2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// A static instance of the delaunay triangulation.\n        /// </summary>\n        public static readonly DelaunayTriangulation2<K> Instance = new DelaunayTriangulation2<K>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        public DelaunayTriangulation2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"points\"></param>\n        public DelaunayTriangulation2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"ptr\"></param>\n        internal DelaunayTriangulation2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[DelaunayTriangulation2<{0}>: VertexCount={1}, FaceCount={2}]\",\n                Kernel.Name, VertexCount, TriangleCount);\n        }\n\n        /// <summary>\n        /// A deep copy of the triangulation.\n        /// </summary>\n        /// <returns></returns>\n        public DelaunayTriangulation2<K> Copy()\n        {\n            return new DelaunayTriangulation2<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to insert.</param>\n        public void Insert(Polygon2<K> polygon)\n        {\n            if (polygon == null)\n                return;\n\n            Kernel.InsertPolygon(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the polygons points into the triangulation.\n        /// May not retatin the poylgons edges.\n        /// </summary>\n        /// <param name=\"pwh\">The polygon to insert.</param>\n        public void Insert(PolygonWithHoles2<K> pwh)\n        {\n            if (pwh == null)\n                return;\n\n            Kernel.InsertPolygonWithHoles(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polygon2<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 3)\n                throw new InvalidOperationException(\"Trianglution must have at lest 3 points to compute the hull.\");\n\n            var points = ArrayCache.Point2dArray(count);\n            GetPoints(points, count);\n\n            var hull = ConvexHull2<K>.Instance;\n            return hull.CreateHull(points, count);\n        }\n\n    }\n\n    /// <summary>\n    /// The anstract base class for the delaunay triangulation.\n    /// </summary>\n    public abstract class DelaunayTriangulation2 : BaseTriangulation2\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal DelaunayTriangulation2(CGALKernel kernel) \n            : base(kernel.DelaunayTriangulationKernel2)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal DelaunayTriangulation2(CGALKernel kernel, Point2d[] points) \n            : base(kernel.DelaunayTriangulationKernel2, points)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal DelaunayTriangulation2(CGALKernel kernel, IntPtr ptr) \n            : base(kernel.DelaunayTriangulationKernel2, ptr)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel2;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the delaunay triangulation.\n        /// </summary>\n        protected private DelaunayTriangulationKernel2 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// Move the vertex.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n        /// the triangulation is modified such that the new position of vertex same as point.</param>\n        /// <param name=\"vertex\">The moved vertex</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool MoveVertex(int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return TriangulationKernel.MoveVertex(Ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        /// <summary>\n        /// If the dual voronoi diagram of the triangulation is taken\n        /// How many segments and rays would be produced.\n        /// </summary>\n        /// <param name=\"numSegments\">The number of segments.</param>\n        /// <param name=\"numRays\">The number of rays.</param>\n        public void GetVoronoCount(out int numSegments, out int numRays)\n        {\n            TriangulationKernel.VoronoiCount(Ptr, out numSegments, out numRays);\n        }\n\n        /// <summary>\n        /// Get a array of the voronoi's segments.\n        /// </summary>\n        /// <returns>A array of the voronoi's segments.</returns>\n        public Segment2d[] GetVoronoiSegments()\n        {\n            TriangulationKernel.VoronoiCount(Ptr, out int numSegments, out int numRays);\n            var segments = new Segment2d[numSegments];\n            TriangulationKernel.GetVoronoiSegments(Ptr, segments, segments.Length);\n            return segments;\n        }\n\n        /// <summary>\n        /// Get a array of the voronois rays.\n        /// These are the segment at edge of triangulation that \n        /// a end point can not be determined.\n        /// </summary>\n        /// <returns>A array of the voronoi's rays.</returns>\n        public Ray2d[] GetVoronoiRays()\n        {\n            TriangulationKernel.VoronoiCount(Ptr, out int numSegments, out int numRays);\n            var rays = new Ray2d[numRays];\n            TriangulationKernel.GetVoronoiRays(Ptr, rays, rays.Length);\n            return rays;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"IndiceCount = \" + IndiceCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulation3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Extensions;\nusing CGALDotNet.Meshing;\nusing CGALDotNet.Hulls;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// Generic triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kerel.</typeparam>\n    public sealed class DelaunayTriangulation3<K> : DelaunayTriangulation3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of a triangulation.\n        /// </summary>\n        public static readonly DelaunayTriangulation3<K> Instance = new DelaunayTriangulation3<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public DelaunayTriangulation3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct a triangulation from the points.\n        /// </summary>\n        /// <param name=\"points\">The triangulation points.</param>\n        public DelaunayTriangulation3(Point3d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Construct from a existing triangulation.\n        /// </summary>\n        /// <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        internal DelaunayTriangulation3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[DelaunayTriangulation3<{0}>: VertexCount={1}, TetrahedronCount={2}, TriangleCount={3}]\",\n                Kernel.Name, VertexCount, FiniteTetrahedronCount, FiniteTriangleCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public DelaunayTriangulation3<K> Copy()\n        {\n            return new DelaunayTriangulation3<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Refine the triangulation.\n        /// </summary>\n        /// <param name=\"targetEdgeLength\">The target edge lengths.</param>\n        /// <param name=\"iterations\">The number of iterations.</param>\n        public void Refine(double targetEdgeLength, int iterations = 1)\n        {\n            int count = VertexCount;\n            var points = ArrayCache.Point3dArray(count);\n            GetPoints(points, count);\n\n            var tet = TetrahedralRemeshing<K>.Instance;\n            count = tet.Remesh(targetEdgeLength, iterations, points, count);\n\n            if (count > 0)\n            {\n                points = ArrayCache.Point3dArray(count);\n                tet.GetPoints(points, count);\n\n                Clear();\n                Insert(points, points.Length);\n            }\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polyhedron3<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 4)\n                throw new InvalidOperationException(\"Trianglution must have at least 4 points to compute the hull.\");\n\n            var points = new Point3d[count];\n            GetPoints(points, count);\n\n            points = points.RemoveNonFinite().ToArray();\n\n            var hull = ConvexHull3<K>.Instance;\n            return hull.CreateHullAsPolyhedron(points, points.Length);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract base class for the triagulation.\n    /// </summary>\n    public abstract class DelaunayTriangulation3 : BaseTriangulation3\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal DelaunayTriangulation3(CGALKernel kernel)\n            : base(kernel.TriangulationKernel3)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel3;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal DelaunayTriangulation3(CGALKernel kernel, Point3d[] points)\n            : base(kernel.TriangulationKernel3, points)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel3;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal DelaunayTriangulation3(CGALKernel kernel, IntPtr ptr)\n            : base(kernel.TriangulationKernel3, ptr)\n        {\n            TriangulationKernel = Kernel as DelaunayTriangulationKernel3;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the triangulation.\n        /// </summary>\n        protected private DelaunayTriangulationKernel3 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// Move a vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertices index.</param>\n        /// <param name=\"point\">The point to move to.</param>\n        /// <param name=\"ifNoCollision\">Should the vertex only be moved if there is no coliision.</param>\n        /// <returns>If the vertex was moved.</returns>\n        public bool Move(int index, Point3d point, bool ifNoCollision = true)\n        {\n            return TriangulationKernel.Move(Ptr, index, point, ifNoCollision);\n        }\n\n        /// <summary>\n        /// Find the index of the nearest vertex to the point.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The index of the nearest vertex to the point.</returns>\n        public int NearestVertex(Point3d point)\n        {\n            return TriangulationKernel.NearestVertex(Ptr, point);\n        }\n\n        /// <summary>\n        /// Find the index of the nearest vertex to the point.\n        /// Presumes poimt is in a cell.\n        /// </summary>\n        /// <param name=\"index\">The cells index.</param>\n        /// <param name=\"point\">The point.</param>\n        /// <returns>The index of the nearest vertex to the point.</returns>\n        public int NearestVertexInCell(int index, Point3d point)\n        {\n            return TriangulationKernel.NearestVertexInCell(Ptr, index, point);\n        }\n\n        /// <summary>\n        /// Remobe a vertex.\n        /// </summary>\n        /// <param name=\"index\">The vertex index.</param>\n        /// <returns>True if vertex was removed.</returns>\n        public bool RemoveVertex(int index)\n        {\n            return TriangulationKernel.RemoveVertex(Ptr, index);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"Dimension = \" + Dimension);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"FiniteVertexCount = \" + FiniteVertexCount);\n            builder.AppendLine(\"TetrahedronCount = \" + TetrahedronCount);\n            builder.AppendLine(\"FiniteTetrahedronCount = \" + FiniteTetrahedronCount);\n            builder.AppendLine(\"EdgeCount = \" + EdgeCount);\n            builder.AppendLine(\"FiniteEdgeCount = \" + FiniteEdgeCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"FiniteTriangleCount = \" + FiniteTriangleCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class DelaunayTriangulationKernel2 : BaseTriangulationKernel2\n    {\n\n        internal abstract int VoronoiSegmentCount(IntPtr ptr);\n\n        internal abstract int VoronoiRayCount(IntPtr ptr);\n\n        internal abstract void GetVoronoiSegments(IntPtr ptr, Segment2d[] segments, int count);\n\n        internal abstract void GetVoronoiRays(IntPtr ptr, Ray2d[] rays, int count);\n\n        internal abstract void VoronoiCount(IntPtr ptr, out int numSegments, out int numRays);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class DelaunayTriangulationKernel2_EEK : DelaunayTriangulationKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly DelaunayTriangulationKernel2 Instance = new DelaunayTriangulationKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return DelaunayTriangulation2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EEK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return DelaunayTriangulation2_EEK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            DelaunayTriangulation2_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            DelaunayTriangulation2_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            DelaunayTriangulation2_EEK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            DelaunayTriangulation2_EEK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            DelaunayTriangulation2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            DelaunayTriangulation2_EEK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return DelaunayTriangulation2_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            DelaunayTriangulation2_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return DelaunayTriangulation2_EEK_GetFace(ptr, index, out face);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return DelaunayTriangulation2_EEK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return DelaunayTriangulation2_EEK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            DelaunayTriangulation2_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return DelaunayTriangulation2_EEK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters,int count)\n        {\n            DelaunayTriangulation2_EEK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            DelaunayTriangulation2_EEK_GetFaces(ptr, faces, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return DelaunayTriangulation2_EEK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return DelaunayTriangulation2_EEK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return DelaunayTriangulation2_EEK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return DelaunayTriangulation2_EEK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return DelaunayTriangulation2_EEK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Delaunay only\n\n        internal override int VoronoiSegmentCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_VoronoiSegmentCount(ptr);\n        }\n\n        internal override int VoronoiRayCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EEK_VoronoiRayCount(ptr);\n        }\n\n        internal override void GetVoronoiSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            DelaunayTriangulation2_EEK_GetVoronoiSegments(ptr, segments, count);\n        }\n\n        internal override void GetVoronoiRays(IntPtr ptr, Ray2d[] rays, int count)\n        {\n            DelaunayTriangulation2_EEK_GetVoronoiRays(ptr, rays, count);\n        }\n\n        internal override void VoronoiCount(IntPtr ptr, out int numSegments, out int numRays)\n        {\n            DelaunayTriangulation2_EEK_VoronoiCount(ptr, out numSegments, out numRays);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            DelaunayTriangulation2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EEK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Delaunay only\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_VoronoiSegmentCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EEK_VoronoiRayCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetVoronoiSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_GetVoronoiRays(IntPtr ptr, [Out] Ray2d[] rays, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_VoronoiCount(IntPtr ptr, [Out] out int numSegments, [Out] out int numRays);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class DelaunayTriangulationKernel2_EIK : DelaunayTriangulationKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly DelaunayTriangulationKernel2 Instance = new DelaunayTriangulationKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return DelaunayTriangulation2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EIK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EIK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            DelaunayTriangulation2_EIK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return DelaunayTriangulation2_EIK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            DelaunayTriangulation2_EIK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            DelaunayTriangulation2_EIK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            DelaunayTriangulation2_EIK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            DelaunayTriangulation2_EIK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            DelaunayTriangulation2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            DelaunayTriangulation2_EIK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return DelaunayTriangulation2_EIK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            DelaunayTriangulation2_EIK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return DelaunayTriangulation2_EIK_GetFace(ptr, index, out face);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return DelaunayTriangulation2_EIK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return DelaunayTriangulation2_EIK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            DelaunayTriangulation2_EIK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return DelaunayTriangulation2_EIK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            DelaunayTriangulation2_EIK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            DelaunayTriangulation2_EIK_GetFaces(ptr, faces, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return DelaunayTriangulation2_EIK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return DelaunayTriangulation2_EIK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return DelaunayTriangulation2_EIK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return DelaunayTriangulation2_EIK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return DelaunayTriangulation2_EIK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        //Delaunay only\n\n        internal override int VoronoiSegmentCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_VoronoiSegmentCount(ptr);\n        }\n\n        internal override int VoronoiRayCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation2_EIK_VoronoiRayCount(ptr);\n        }\n\n        internal override void GetVoronoiSegments(IntPtr ptr, Segment2d[] segments, int count)\n        {\n            DelaunayTriangulation2_EIK_GetVoronoiSegments(ptr, segments, count);\n        }\n\n        internal override void GetVoronoiRays(IntPtr ptr, Ray2d[] rays, int count)\n        {\n            DelaunayTriangulation2_EIK_GetVoronoiRays(ptr, rays, count);\n        }\n\n        internal override void VoronoiCount(IntPtr ptr, out int numSegments, out int numRays)\n        {\n            DelaunayTriangulation2_EIK_VoronoiCount(ptr, out numSegments, out numRays);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            DelaunayTriangulation2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation2_EIK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        //Delaunay only\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_VoronoiSegmentCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation2_EIK_VoronoiRayCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetVoronoiSegments(IntPtr ptr, [Out] Segment2d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_GetVoronoiRays(IntPtr ptr, [Out] Ray2d[] rays, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_VoronoiCount(IntPtr ptr, [Out] out int numSegments, [Out] out int numRays);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulationKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class DelaunayTriangulationKernel3 : BaseTriangulationKernel3\n    {\n        internal abstract bool Move(IntPtr ptr, int index, Point3d point, bool ifNoCollision);\n\n        internal abstract int NearestVertex(IntPtr ptr, Point3d point);\n\n        internal abstract int NearestVertexInCell(IntPtr ptr, int index, Point3d point);\n\n        internal abstract bool RemoveVertex(IntPtr ptr, int index);\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/DelaunayTriangulationKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class DelaunayTriangulationKernel3_EEK : DelaunayTriangulationKernel3\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly DelaunayTriangulationKernel3 Instance = new DelaunayTriangulationKernel3_EEK();\n\n        internal override IntPtr Create()\n        {\n            return DelaunayTriangulation3_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            DelaunayTriangulation3_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            DelaunayTriangulation3_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_Copy(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_BuildStamp(ptr);\n        }\n\n        internal override int Dimension(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_Dimension(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, bool verbose)\n        {\n            return DelaunayTriangulation3_EEK_IsValid(ptr, verbose);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_VertexCount(ptr);\n        }\n\n        internal override int FiniteVertexCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_FiniteVertexCount(ptr);\n        }\n\n        internal override int CellCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_CellCount(ptr);\n        }\n\n        internal override int FiniteCellCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_FiniteCellCount(ptr);\n        }\n\n        internal override int EdgeCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_EdgeCount(ptr);\n        }\n\n        internal override int FiniteEdgeCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_FiniteEdgeCount(ptr);\n        }\n\n        internal override int FacetCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_FacetCount(ptr);\n        }\n\n        internal override int FiniteFacetCount(IntPtr ptr)\n        {\n            return DelaunayTriangulation3_EEK_FiniteFacetCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point3d point)\n        {\n            DelaunayTriangulation3_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            DelaunayTriangulation3_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertInCell(IntPtr ptr, int index, Point3d point)\n        {\n            DelaunayTriangulation3_EEK_InsertInCell(ptr, index, point);\n        }\n\n        internal override int Locate(IntPtr ptr, Point3d point)\n        {\n            return DelaunayTriangulation3_EEK_Locate(ptr, point);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, Point3d[] Circumcenters, int count)\n        {\n            DelaunayTriangulation3_EEK_GetCircumcenters(ptr, Circumcenters, count);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            DelaunayTriangulation3_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex3[] vertices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex3 vertex)\n        {\n            return DelaunayTriangulation3_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetCells(IntPtr ptr, TriCell3[] cells, int count)\n        {\n            DelaunayTriangulation3_EEK_GetCells(ptr, cells, count);\n        }\n\n        internal override bool GetCell(IntPtr ptr, int index, out TriCell3 cell)\n        {\n            return DelaunayTriangulation3_EEK_GetCell(ptr, index, out cell);\n        }\n\n        internal override void GetSegmentIndices(IntPtr ptr, int[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetSegmentIndices(ptr, indices, count);\n        }\n\n        internal override void GetTriangleIndices(IntPtr ptr, int[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetTriangleIndices(ptr, indices, count);\n        }\n\n        internal override void GetTetrahedraIndices(IntPtr ptr, int[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetTetrahedraIndices(ptr, indices, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetSegments(ptr, indices, count);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle3d[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetTriangles(ptr, indices, count);\n        }\n\n        internal override void GetTetrahedrons(IntPtr ptr, Tetrahedron3d[] indices, int count)\n        {\n            DelaunayTriangulation3_EEK_GetTetrahedrons(ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            DelaunayTriangulation3_EEK_Transform(ptr, matrix);\n        }\n\n        internal override bool Move(IntPtr ptr, int index, Point3d point, bool ifNoCollision)\n        {\n            return DelaunayTriangulation3_EEK_Move(ptr, index, point, ifNoCollision);\n        }\n\n        internal override int NearestVertex(IntPtr ptr, Point3d point)\n        {\n            return DelaunayTriangulation3_EEK_NearestVertex(ptr, point);\n        }\n\n        internal override int NearestVertexInCell(IntPtr ptr, int index, Point3d point)\n        {\n            return NearestVertexInCell(ptr, index, point);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return DelaunayTriangulation3_EEK_RemoveVertex (ptr, index);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation3_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr DelaunayTriangulation3_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_Dimension(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation3_EEK_IsValid(IntPtr ptr, bool verbose);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_FiniteVertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_CellCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_FiniteCellCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_EdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_FiniteEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_FacetCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_FiniteFacetCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_InsertPoint(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_InsertPoints(IntPtr ptr, Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_InsertInCell(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_Locate(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetCircumcenters(IntPtr ptr, [Out] Point3d[] Circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetVertices(IntPtr ptr, [Out] TriVertex3[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation3_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex3 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetCells(IntPtr ptr, [Out] TriCell3[] cells, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation3_EEK_GetCell(IntPtr ptr, int index, out TriCell3 cell);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetSegmentIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetTriangleIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetTetrahedraIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_GetTetrahedrons(IntPtr ptr, [Out] Tetrahedron3d[] Tetrahedrons, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void DelaunayTriangulation3_EEK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation3_EEK_Move(IntPtr ptr, int index, Point3d point, bool ifNoCollision);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_NearestVertex(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int DelaunayTriangulation3_EEK_NearestVertexInCell(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool DelaunayTriangulation3_EEK_RemoveVertex(IntPtr ptr, int index);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriCell3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// From Index to HalfEdgeIndex must match layout\n    /// of the unmanaged TriFace2 in the TriFace2 header file.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\n    public unsafe struct TriCell3 : IEquatable<TriCell3>\n    {\n        /// <summary>\n        /// Is this the infinite cell.\n        /// </summary>\n        public bool IsInfinite;\n\n        /// <summary>\n        /// The cells index in the triangulation.\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// The cells 4 vertices.\n        /// </summary>\n        private fixed int VertexIndices[4];\n\n        /// <summary>\n        /// The cells 4 neighbor cells.\n        /// </summary>\n        private fixed int NeighborIndices[4];\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[TriCell2: Index={0}, IsInfinite={1}, Vertex0={2}, Vertex1={3}, Vertex2={4}, Vertex3={5}]\",\n                Index, IsInfinite, VertexIndices[0], VertexIndices[1], VertexIndices[2], VertexIndices[3]);\n        }\n\n        /// <summary>\n        /// Are the two cells equal.\n        /// </summary>\n        /// <param name=\"f1\">The first cell.</param>\n        /// <param name=\"f2\">The second cell.</param>\n        /// <returns>True if the cells are equal.</returns>\n        public static bool operator ==(TriCell3 f1, TriCell3 f2)\n        {\n            return f1.Index == f2.Index && f1.IsInfinite == f2.IsInfinite \n                && VerticesEqual(f1, f2) && NeighborEqual(f1, f2);\n        }\n\n        /// <summary>\n        /// Are the two cells not equal.\n        /// </summary>\n        /// <param name=\"f1\">The first cell.</param>\n        /// <param name=\"f2\">The second cell.</param>\n        /// <returns>True if the cells are not equal.</returns>\n        public static bool operator !=(TriCell3 f1, TriCell3 f2)\n        {\n            return f1.Index != f2.Index || f1.IsInfinite != f2.IsInfinite\n                    || !VerticesEqual(f1, f2) || !NeighborEqual(f1, f2);\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\">The other object.</param>\n        /// <returns>True if the objects are equal.</returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is TriCell3)) return false;\n            TriCell3 v = (TriCell3)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these cells equal.\n        /// </summary>\n        /// <param name=\"cell\">The other cell.</param>\n        /// <returns>True if the cells are equal.</returns>\n        public bool Equals(TriCell3 cell)\n        {\n            return this == cell;\n        }\n\n        /// <summary>\n        /// The cells hash code.\n        /// </summary>\n        /// <returns>The cells hash code.</returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ IsInfinite.GetHashCode();\n\n                for(int i = 0; i < 4; i++)\n                    hash = (hash * MathUtil.HASH_PRIME_2) ^ VertexIndices[i].GetHashCode();\n\n                for (int i = 0; i < 4; i++)\n                    hash = (hash * MathUtil.HASH_PRIME_2) ^ NeighborIndices[i].GetHashCode();\n\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Get a vertex index.\n        /// </summary>\n        /// <param name=\"i\">The vertices index 0-3.</param>\n        /// <returns>The vertices index in the triangulation.</returns>\n        public int GetVertexIndex(int i)\n        {\n            if (i < 0 || i >= 4)\n                throw new ArgumentOutOfRangeException(i + \"out of range.\");\n\n            return VertexIndices[i];\n        }\n\n        /// <summary>\n        /// Get a neighbor cell index.\n        /// </summary>\n        /// <param name=\"i\">The neighbor cell index 0-3.</param>\n        /// <returns>A neighbor cell index in the triangulation.</returns>\n        public int GetNeighborIndex(int i)\n        {\n            if (i < 0 || i >= 4)\n                throw new ArgumentOutOfRangeException(i + \"out of range.\");\n\n            return NeighborIndices[i];\n        }\n\n        /// <summary>\n        /// Enumerate the vertices of the cell.\n        /// </summary>\n        /// <param name=\"tri\">The triangle the vertices below too.</param>\n        /// <returns>The cell vertices.</returns>\n        public IEnumerable<TriVertex3> EnumerateVertices(BaseTriangulation3 tri)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                if (tri.GetVertex(i, out TriVertex3 v))\n                {\n                    yield return v;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enumerate the vertices of the cell.\n        /// </summary>\n        /// <param name=\"vertices\">The vertices array.</param>\n        /// <returns>The cell vertices.</returns>\n        public IEnumerable<TriVertex3> EnumerateVertices(TriVertex3[] vertices)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                int index = GetVertexIndex(i);\n\n                if (index != CGALGlobal.NULL_INDEX)\n                {\n                    yield return vertices[index];\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enumerate the vertices of the cell.\n        /// </summary>\n        /// <param name=\"tri\">The triangle the vertices below too.</param>\n        /// <returns>The cell vertices.</returns>\n        public IEnumerable<TriCell3> EnumerateNeighbors(BaseTriangulation3 tri)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                if (tri.GetCell(i, out TriCell3 c))\n                {\n                    yield return c;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enumerate the neighbors of the cell.\n        /// </summary>\n        /// <param name=\"cells\">The cell array.</param>\n        /// <returns>The cell neighbors.</returns>\n        public IEnumerable<TriCell3> EnumerateNeighbors(TriCell3[] cells)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                int index = GetNeighborIndex(i);\n\n                if (index != CGALGlobal.NULL_INDEX)\n                {\n                    yield return cells[index];\n                }\n            }\n        }\n\n        /// <summary>\n        /// Are the two vertex arrays equal.\n        /// </summary>\n        /// <param name=\"c1\"></param>\n        /// <param name=\"c2\"></param>\n        /// <returns></returns>\n        public static bool VerticesEqual(TriCell3 c1, TriCell3 c2)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                if (c1.VertexIndices[i] != c2.VertexIndices[i]) \n                    return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Are the two neighbor arrays equal.\n        /// </summary>\n        /// <param name=\"c1\"></param>\n        /// <param name=\"c2\"></param>\n        /// <returns></returns>\n        public static bool NeighborEqual(TriCell3 c1, TriCell3 c2)\n        {\n            for (int i = 0; i < 4; i++)\n            {\n                if (c1.NeighborIndices[i] != c2.NeighborIndices[i])\n                    return false;\n            }\n\n            return true;\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriEdge2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// From Index to TwinIndex must match layout\n    /// of the unmanaged TriEdge2 in the TriEdge2 header file.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\n    public struct TriEdge2 : IEquatable<TriEdge2>\n    {\n        /// <summary>\n        /// The edges face index in the triangulation.\n        /// </summary>\n        public int FaceIndex;\n\n        /// <summary>\n        /// The neighbours index in the face array betwen 0 and 2.\n        /// </summary>\n        public int NeighbourIndex;\n\n        /// <summary>\n        /// The edges segment.\n        /// </summary>\n        public Segment2d Segment;\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"faceIndex\">The face index in the triangulation</param>\n        /// <param name=\"neighbourIndex\">The neighbours index in the face array betwen 0 and 2.</param>\n        public TriEdge2(int faceIndex, int neighbourIndex)\n        {\n            FaceIndex = faceIndex;\n            NeighbourIndex = neighbourIndex;\n            Segment = new Segment2d();\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"[TriEdge2:  FaceIndex={0}, NeighbourIndex={1}]\", \n                FaceIndex, NeighbourIndex);\n        }\n\n        /// <summary>\n        /// Are the two edges equal.\n        /// </summary>\n        /// <param name=\"e1\">The first edge.</param>\n        /// <param name=\"e2\">The second edge.</param>\n        /// <returns>True if the edges are equal.</returns>\n        public static bool operator ==(TriEdge2 e1, TriEdge2 e2)\n        {\n            return e1.FaceIndex == e2.FaceIndex && e1.NeighbourIndex == e2.NeighbourIndex;\n        }\n\n        /// <summary>\n        /// Are the two edges not equal.\n        /// </summary>\n        /// <param name=\"e1\">The first edge.</param>\n        /// <param name=\"e2\">The second edge.</param>\n        /// <returns>True if the edges are not equal.</returns>\n        public static bool operator !=(TriEdge2 e1, TriEdge2 e2)\n        {\n            return e1.FaceIndex != e2.FaceIndex || e1.NeighbourIndex != e2.NeighbourIndex;\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\">The other object.</param>\n        /// <returns>True if the objects are equal.</returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is TriEdge2)) return false;\n            TriEdge2 v = (TriEdge2)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these edges equal.\n        /// </summary>\n        /// <param name=\"edge\">The other edge.</param>\n        /// <returns>True if the edges are equal.</returns>\n        public bool Equals(TriEdge2 edge)\n        {\n            return this == edge;\n        }\n\n        /// <summary>\n        /// The edges hash code.\n        /// </summary>\n        /// <returns>The edges hash code.</returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ FaceIndex.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ NeighbourIndex.GetHashCode();\n                return hash;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriFace2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// From Index to HalfEdgeIndex must match layout\n    /// of the unmanaged TriFace2 in the TriFace2 header file.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\n    public unsafe struct TriFace2 : IEquatable<TriFace2>\n    {\n        /// <summary>\n        /// Is this the infinite face.\n        /// </summary>\n        public bool IsInfinite;\n\n        /// <summary>\n        /// The faces index in the triangulation.\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// The faces 3 vertices.\n        /// </summary>\n        private fixed int VertexIndex[3];\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[TriFace2: Index={0}, IsInfinite={1}, Vertex0={2}, Vertex1={3}, Vertex2={4}]\",\n                Index, IsInfinite, VertexIndex[0], VertexIndex[1], VertexIndex[2]);\n        }\n\n        /// <summary>\n        /// Are the two faces equal.\n        /// </summary>\n        /// <param name=\"f1\">The first face.</param>\n        /// <param name=\"f2\">The second face.</param>\n        /// <returns>True if the faces are equal.</returns>\n        public static bool operator ==(TriFace2 f1, TriFace2 f2)\n        {\n            return f1.Index == f2.Index && f1.IsInfinite == f2.IsInfinite\n                && f1.VertexIndex[0] == f2.VertexIndex[0] && f1.VertexIndex[1] == f2.VertexIndex[1]\n                && f1.VertexIndex[2] == f2.VertexIndex[2];\n        }\n\n        /// <summary>\n        /// Are the two faces not equal.\n        /// </summary>\n        /// <param name=\"f1\">The first face.</param>\n        /// <param name=\"f2\">The second face.</param>\n        /// <returns>True if the faces are not equal.</returns>\n        public static bool operator !=(TriFace2 f1, TriFace2 f2)\n        {\n            return f1.Index != f2.Index || f1.IsInfinite != f2.IsInfinite\n                 || f1.VertexIndex[0] != f2.VertexIndex[0] || f1.VertexIndex[1] != f2.VertexIndex[1]\n                 || f1.VertexIndex[2] != f2.VertexIndex[2];\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\">The other object.</param>\n        /// <returns>True if the objects are equal.</returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is TriFace2)) return false;\n            TriFace2 v = (TriFace2)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these faces equal.\n        /// </summary>\n        /// <param name=\"face\">The other face.</param>\n        /// <returns>True if the faces are equal.</returns>\n        public bool Equals(TriFace2 face)\n        {\n            return this == face;\n        }\n\n        /// <summary>\n        /// The faces hash code.\n        /// </summary>\n        /// <returns>The faces hash code.</returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ IsInfinite.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ VertexIndex[0].GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ VertexIndex[1].GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ VertexIndex[2].GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Get a vertex index and wrap around array.\n        /// </summary>\n        /// <param name=\"i\">The vertices index wrapped to 0-2.</param>\n        /// <returns>The vertices index in the triangulation.</returns>\n        public int GetVertexIndex(int i)\n        {\n            i = MathUtil.Wrap(i, 3);\n            return VertexIndex[i];\n        }\n\n        /// <summary>\n        /// Enumerate the vertices of the face.\n        /// </summary>\n        /// <param name=\"tri\">The triangle the vertices below too.</param>\n        /// <returns>The face vertices.</returns>\n        public IEnumerable<TriVertex2> EnumerateVertices(BaseTriangulation2 tri)\n        {\n            for(int i = 0; i < 3; i++)\n            {\n                if(tri.GetVertex(i, out TriVertex2 v))\n                {\n                    yield return v;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enumerate the vertices of the face.\n        /// </summary>\n        /// <param name=\"vertices\">The vertices array.</param>\n        /// <returns>The face vertices.</returns>\n        public IEnumerable<TriVertex2> EnumerateVertices(TriVertex2[] vertices)\n        {\n            for (int i = 0; i < 3; i++)\n            {\n                int index = GetVertexIndex(i);\n\n                if (index != CGALGlobal.NULL_INDEX)\n                {\n                    yield return vertices[index];\n                }\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriVertex2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// From Point to HalfEdgeIndex must match layout\n    /// of the unmanaged TriVertex2 in the TriVertex2 header file.\n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\n    public struct TriVertex2 : IEquatable<TriVertex2>\n    {\n        /// <summary>\n        /// The vertices point.\n        /// </summary>\n        public Point2d Point;\n\n        /// <summary>\n        /// Is this a infinite vertex.\n        /// </summary>\n        public bool IsInfinite;\n\n        /// <summary>\n        /// The number of egdes connected to the vertex.\n        /// </summary>\n        public int Degree;\n\n        /// <summary>\n        /// The vertices index in the triangulation.\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// The one of the vertexs the vertex is connected to.\n        /// </summary>\n        public int FaceIndex;\n\n        public override string ToString()\n        {\n            return string.Format(\"[TriVertex2: Index={0}, Point={1}, IsInfinite={2}, Degree={3}, Face={4}]\", \n                Index, Point, IsInfinite, Degree, FaceIndex);\n        }\n\n        /// <summary>\n        /// Are the two vertexs equal.\n        /// </summary>\n        /// <param name=\"v1\">The first vertex.</param>\n        /// <param name=\"v2\">The second vertex.</param>\n        /// <returns>True if the vertexs are equal.</returns>\n        public static bool operator ==(TriVertex2 v1, TriVertex2 v2)\n        {\n            return v1.Index == v2.Index && v1.IsInfinite == v2.IsInfinite\n                && v1.Degree == v2.Degree && v1.FaceIndex == v2.FaceIndex\n                && v1.Point == v2.Point;\n        }\n\n        /// <summary>\n        /// Are the two vertexs not equal.\n        /// </summary>\n        /// <param name=\"v1\">The first vertex.</param>\n        /// <param name=\"v2\">The second vertex.</param>\n        /// <returns>True if the vertexs are not equal.</returns>\n        public static bool operator !=(TriVertex2 v1, TriVertex2 v2)\n        {\n            return v1.Index != v2.Index || v1.IsInfinite != v2.IsInfinite\n                    || v1.Degree != v2.Degree || v1.FaceIndex != v2.FaceIndex\n                    || v1.Point != v2.Point;\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\">The other object.</param>\n        /// <returns>True if the objects are equal.</returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is TriVertex2)) return false;\n            TriVertex2 v = (TriVertex2)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these vertexs equal.\n        /// </summary>\n        /// <param name=\"vertex\">The other vertex.</param>\n        /// <returns>True if the vertexs are equal.</returns>\n        public bool Equals(TriVertex2 vertex)\n        {\n            return this == vertex;\n        }\n\n        /// <summary>\n        /// The vertexs hash code.\n        /// </summary>\n        /// <returns>The vertexs hash code.</returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ IsInfinite.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ FaceIndex.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Degree.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Point.GetHashCode();\n                return hash;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriVertex3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// \n    /// </summary>\n    [StructLayout(LayoutKind.Sequential)]\n    public struct TriVertex3 : IEquatable<TriVertex3>\n    {\n        /// <summary>\n        /// The vertices point.\n        /// </summary>\n        public Point3d Point;\n\n        /// <summary>\n        /// Is this a infinte vertex.\n        /// </summary>\n        public bool IsInfinite;\n\n        /// <summary>\n        /// The vertices degree is the \n        /// number of edges connecting to it.\n        /// </summary>\n        public int Degree;\n\n        /// <summary>\n        /// The vertices index in the triangulation.\n        /// </summary>\n        public int Index;\n\n        /// <summary>\n        /// The one of the cells the vertex is connected to.\n        /// </summary>\n        public int CellIndex;\n\n        public override string ToString()\n        {\n            return string.Format(\"[TriVertex3: Index={0}, Point={1}, IsInfinite={2}, Degree={3}, CellIndex={4}]\",\n                Index, Point, IsInfinite, Degree, CellIndex);\n        }\n\n        /// <summary>\n        /// Are the two vertices equal.\n        /// </summary>\n        /// <param name=\"v1\">The first vertex.</param>\n        /// <param name=\"v2\">The second vertex.</param>\n        /// <returns>True if the vertexs are equal.</returns>\n        public static bool operator ==(TriVertex3 v1, TriVertex3 v2)\n        {\n            return v1.Index == v2.Index\n                 && v1.IsInfinite == v2.IsInfinite\n                 && v1.Degree == v2.Degree\n                 && v1.CellIndex == v2.CellIndex\n                 && v1.Point == v2.Point;\n        }\n\n        /// <summary>\n        /// Are the two vertices not equal.\n        /// </summary>\n        /// <param name=\"v1\">The first vertex.</param>\n        /// <param name=\"v2\">The second vertex.</param>\n        /// <returns>True if the vertexs are not equal.</returns>\n        public static bool operator !=(TriVertex3 v1, TriVertex3 v2)\n        {\n            return v1.Index != v2.Index\n                       || v1.IsInfinite != v2.IsInfinite\n                       || v1.Degree != v2.Degree\n                       || v1.CellIndex != v2.CellIndex\n                       || v1.Point != v2.Point;\n        }\n\n        /// <summary>\n        /// Are these objects equal.\n        /// </summary>\n        /// <param name=\"obj\">The other object.</param>\n        /// <returns>True if the objects are equal.</returns>\n        public override bool Equals(object obj)\n        {\n            if (!(obj is TriVertex3)) return false;\n            TriVertex3 v = (TriVertex3)obj;\n            return this == v;\n        }\n\n        /// <summary>\n        /// Are these vertexs equal.\n        /// </summary>\n        /// <param name=\"vertex\">The other vertex.</param>\n        /// <returns>True if the vertexs are equal.</returns>\n        public bool Equals(TriVertex3 vertex)\n        {\n            return this == vertex;\n        }\n\n        /// <summary>\n        /// The vertexs hash code.\n        /// </summary>\n        /// <returns>The vertexs hash code.</returns>\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = (int)MathUtil.HASH_PRIME_1;\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ IsInfinite.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Degree.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Index.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ CellIndex.GetHashCode();\n                hash = (hash * MathUtil.HASH_PRIME_2) ^ Point.GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Enumerate around all the other vertices in this vertexs cell.\n        /// </summary>\n        /// <param name=\"tri\">The triangulation the vertex belongs to.</param>\n        /// <returns>All the other vertices in this vertexs cell</returns>\n        public IEnumerable<TriVertex3> EnumerateVertices(BaseTriangulation3 tri)\n        {\n            if (tri.GetCell(CellIndex, out TriCell3 c))\n            {\n                for (int i = 0; i < 4; i++)\n                {\n                    int index = c.GetVertexIndex(i);\n                    if (index != Index && tri.GetVertex(index, out TriVertex3 v))\n                    {\n                        yield return v;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enumerate around all the other vertices in this vertexs cell.\n        /// </summary>\n        /// <param name=\"vertices\">A array of the other vertices in the triangulation.</param>\n        /// <param name=\"cells\">A array of the other cells in the triangulation.</param>\n        /// <returns>All the other vertices in this vertexs cell</returns>\n        public IEnumerable<TriVertex3> EnumerateVertices(TriVertex3[] vertices, TriCell3[] cells)\n        {\n            if (CellIndex == CGALGlobal.NULL_INDEX)\n                yield break;\n\n            var c = cells[CellIndex];\n\n            for (int i = 0; i < 4; i++)\n            {\n                int index = c.GetVertexIndex(i);\n\n                if (index == CGALGlobal.NULL_INDEX || index == Index)\n                    continue;\n\n                yield return vertices[index];\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/Triangulation2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Hulls;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// Generic triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kerel.</typeparam>\n    public sealed class Triangulation2<K> : Triangulation2 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of a triangulation.\n        /// </summary>\n        public static readonly Triangulation2<K> Instance = new Triangulation2<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Triangulation2() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct a triangulation from the points.\n        /// </summary>\n        /// <param name=\"points\">The triangulation points.</param>\n        public Triangulation2(Point2d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Construct from a existing triangulation.\n        /// </summary>\n        /// <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        internal Triangulation2(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Triangulation2<{0}>: VertexCount={1}, TriangleCount={2}]\",\n                Kernel.Name, VertexCount, TriangleCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Triangulation2<K> Copy()\n        {\n            return new Triangulation2<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Insert the points of the polygon into the triagulation.\n        /// May no have the same edges as polygon.\n        /// </summary>\n        /// <param name=\"polygon\">The polygon to insert/</param>\n        public void InsertPolygon(Polygon2<K> polygon)\n        {\n            if (polygon == null) \n                return;\n\n            Kernel.InsertPolygon(Ptr, polygon.Ptr);\n        }\n\n        /// <summary>\n        /// Insert the points of the polygon into the triagulation.\n        /// May no have the same edges as polygon.\n        /// </summary>\n        /// <param name=\"pwh\">The polygon to insert/</param>\n        public void InsertPolygon(PolygonWithHoles2<K> pwh)\n        {\n            if (pwh == null)\n                return;\n\n            Kernel.InsertPolygonWithHoles(Ptr, pwh.Ptr);\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polygon2<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 3)\n                throw new InvalidOperationException(\"Trianglution must have at least 3 points to compute the hull.\");\n\n            var points = ArrayCache.Point2dArray(count);\n            GetPoints(points, count);\n\n            var hull = ConvexHull2<K>.Instance;\n            return hull.CreateHull(points, count);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract base class for the triagulation.\n    /// </summary>\n    public abstract class Triangulation2 : BaseTriangulation2\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal Triangulation2(CGALKernel kernel) \n            : base(kernel.TriangulationKernel2)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal Triangulation2(CGALKernel kernel, Point2d[] points)\n            : base(kernel.TriangulationKernel2, points)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel2;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Triangulation2(CGALKernel kernel, IntPtr ptr) \n            : base(kernel.TriangulationKernel2, ptr)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel2;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the triangulation.\n        /// </summary>\n        protected private TriangulationKernel2 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// Move the vertex.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"point\"></param>\n        /// <param name=\"ifNoCollision\">If there is not already another vertex placed on the point, \n        /// the triangulation is modified such that the new position of vertex same as point.</param>\n        /// <param name=\"vertex\">The moved vertex</param>\n        /// <returns>True if the vertex was found.</returns>\n        public bool MoveVertex(int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return TriangulationKernel.MoveVertex(Ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"BuildStamp = \" + BuildStamp);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"IndiceCount = \" + IndiceCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/Triangulation3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Extensions;\n\nusing CGALDotNet.Meshing;\nusing CGALDotNet.Hulls;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNet.Triangulations\n{\n    /// <summary>\n    /// Generic triangulation class.\n    /// </summary>\n    /// <typeparam name=\"K\">The kerel.</typeparam>\n    public sealed class Triangulation3<K> : Triangulation3 where K : CGALKernel, new()\n    {\n        /// <summary>\n        /// Static instance of a triangulation.\n        /// </summary>\n        public static readonly Triangulation3<K> Instance = new Triangulation3<K>();\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Triangulation3() : base(new K())\n        {\n\n        }\n\n        /// <summary>\n        /// Construct a triangulation from the points.\n        /// </summary>\n        /// <param name=\"points\">The triangulation points.</param>\n        public Triangulation3(Point3d[] points) : base(new K(), points)\n        {\n\n        }\n\n        /// <summary>\n        /// Construct from a existing triangulation.\n        /// </summary>\n        /// <param name=\"ptr\">A pointer to the unmanaged object.</param>\n        internal Triangulation3(IntPtr ptr) : base(new K(), ptr)\n        {\n\n        }\n\n        /// <summary>\n        /// The triangulation as a string.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Triangulation3<{0}>: VertexCount={1}, TetrahedronCount={2}, TriangleCount={3}]\",\n                Kernel.Name, VertexCount, FiniteTetrahedronCount, FiniteTriangleCount);\n        }\n\n        /// <summary>\n        /// Create a deep copy of the triangulation.\n        /// </summary>\n        /// <returns>The deep copy.</returns>\n        public Triangulation3<K> Copy()\n        {\n            return new Triangulation3<K>(Kernel.Copy(Ptr));\n        }\n\n        /// <summary>\n        /// Refine the triangulation.\n        /// </summary>\n        /// <param name=\"targetEdgeLength\">The target edge lengths.</param>\n        /// <param name=\"iterations\">The number of iterations.</param>\n        public void Refine(double targetEdgeLength, int iterations = 1)\n        {\n            int count = VertexCount;\n            var points = ArrayCache.Point3dArray(count);\n            GetPoints(points, count);\n\n            var tet = TetrahedralRemeshing<K>.Instance;\n            count = tet.Remesh(targetEdgeLength, iterations, points, count);\n\n            if (count > 0)\n            {\n                points = ArrayCache.Point3dArray(count);\n                tet.GetPoints(points, count);\n\n                Clear();\n                Insert(points, points.Length);\n            }\n        }\n\n        /// <summary>\n        /// Compute the convex of the triagulation.\n        /// </summary>\n        /// <returns>The convex hull polygon.</returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public Polyhedron3<K> ComputeHull()\n        {\n            int count = VertexCount;\n            if (count < 4)\n                throw new InvalidOperationException(\"Trianglution must have at least 4 points to compute the hull.\");\n\n            var points = new Point3d[count];\n            GetPoints(points, count);\n\n            points = points.RemoveNonFinite().ToArray();\n\n            var hull = ConvexHull3<K>.Instance;\n            return hull.CreateHullAsPolyhedron(points, points.Length);\n        }\n\n    }\n\n    /// <summary>\n    /// Abstract base class for the triagulation.\n    /// </summary>\n    public abstract class Triangulation3 : BaseTriangulation3\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        internal Triangulation3(CGALKernel kernel)\n            : base(kernel.TriangulationKernel3)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel3;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"points\"></param>\n        internal Triangulation3(CGALKernel kernel, Point3d[] points)\n            : base(kernel.TriangulationKernel3, points)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel3;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"kernel\"></param>\n        /// <param name=\"ptr\"></param>\n        internal Triangulation3(CGALKernel kernel, IntPtr ptr)\n            : base(kernel.TriangulationKernel3, ptr)\n        {\n            TriangulationKernel = Kernel as TriangulationKernel3;\n        }\n\n        /// <summary>\n        /// The kernel with the functions unique to the triangulation.\n        /// </summary>\n        protected private TriangulationKernel3 TriangulationKernel { get; private set; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public override void Print(StringBuilder builder)\n        {\n            builder.AppendLine(ToString());\n            builder.AppendLine(\"IsValid = \" + IsValid());\n            builder.AppendLine(\"Dimension = \" + Dimension);\n            builder.AppendLine(\"VertexCount = \" + VertexCount);\n            builder.AppendLine(\"FiniteVertexCount = \" + FiniteVertexCount);\n            builder.AppendLine(\"TetrahedronCount = \" + TetrahedronCount);\n            builder.AppendLine(\"FiniteTetrahedronCount = \" + FiniteTetrahedronCount);\n            builder.AppendLine(\"EdgeCount = \" + EdgeCount);\n            builder.AppendLine(\"FiniteEdgeCount = \" + FiniteEdgeCount);\n            builder.AppendLine(\"TriangleCount = \" + TriangleCount);\n            builder.AppendLine(\"FiniteTriangleCount = \" + FiniteTriangleCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriangulationKernel2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class TriangulationKernel2 : BaseTriangulationKernel2 \n    {\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriangulationKernel2_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class TriangulationKernel2_EEK : TriangulationKernel2\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly TriangulationKernel2 Instance = new TriangulationKernel2_EEK();\n\n        internal override IntPtr Create()\n        {\n            return Triangulation2_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Triangulation2_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Triangulation2_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Triangulation2_EEK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            Triangulation2_EEK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return Triangulation2_EEK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return Triangulation2_EEK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return Triangulation2_EEK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return Triangulation2_EEK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            Triangulation2_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Triangulation2_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            Triangulation2_EEK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            Triangulation2_EEK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Triangulation2_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            Triangulation2_EEK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return Triangulation2_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            Triangulation2_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return Triangulation2_EEK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            Triangulation2_EEK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return Triangulation2_EEK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return Triangulation2_EEK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            Triangulation2_EEK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return Triangulation2_EEK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            Triangulation2_EEK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return Triangulation2_EEK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return Triangulation2_EEK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return Triangulation2_EEK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return Triangulation2_EEK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return Triangulation2_EEK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Triangulation2_EEK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation2_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation2_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EEK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EEK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EEK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_MakeGabriel(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_Optimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EEK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriangulationKernel2_EIK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class TriangulationKernel2_EIK : TriangulationKernel2\n    {\n        internal override string Name => \"EIK\";\n\n        internal static readonly TriangulationKernel2 Instance = new TriangulationKernel2_EIK();\n\n        internal override IntPtr Create()\n        {\n            return Triangulation2_EIK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Triangulation2_EIK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Triangulation2_EIK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Triangulation2_EIK_Copy(ptr);\n        }\n\n        internal override void SetIndices(IntPtr ptr)\n        {\n            Triangulation2_EIK_SetIndices(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return Triangulation2_EIK_BuildStamp(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, int level)\n        {\n            return Triangulation2_EIK_IsValid(ptr, level);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return Triangulation2_EIK_VertexCount(ptr);\n        }\n\n        internal override int FaceCount(IntPtr ptr)\n        {\n            return Triangulation2_EIK_FaceCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point2d point)\n        {\n            Triangulation2_EIK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Triangulation2_EIK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertPolygon(IntPtr triPtr, IntPtr polyPtr)\n        {\n            Triangulation2_EIK_InsertPolygon(triPtr, polyPtr);\n        }\n\n        internal override void InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr)\n        {\n            Triangulation2_EIK_InsertPolygonWithHoles(triPtr, pwhPtr);\n        }\n\n        internal override void GetPoints(IntPtr ptr, Point2d[] points, int count)\n        {\n            Triangulation2_EIK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetIndices(IntPtr ptr, int[] indices, int count)\n        {\n            Triangulation2_EIK_GetIndices(ptr, indices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex2 vertex)\n        {\n            return Triangulation2_EIK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex2[] vertices, int count)\n        {\n            Triangulation2_EIK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetFace(IntPtr ptr, int index, out TriFace2 face)\n        {\n            return Triangulation2_EIK_GetFace(ptr, index, out face);\n        }\n\n        internal override void GetFaces(IntPtr ptr, TriFace2[] faces, int count)\n        {\n            Triangulation2_EIK_GetFaces(ptr, faces, count);\n        }\n\n        internal override bool GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, out Segment2d segment)\n        {\n            return Triangulation2_EIK_GetSegment(ptr, faceIndex, neighbourIndex, out segment);\n        }\n\n        internal override bool GetTriangle(IntPtr ptr, int faceIndex, out Triangle2d triangle)\n        {\n            return Triangulation2_EIK_GetTriangle(ptr, faceIndex, out triangle);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle2d[] triangles, int count)\n        {\n            Triangulation2_EIK_GetTriangles(ptr, triangles, count);\n        }\n\n        internal override bool GetCircumcenter(IntPtr ptr, int faceIndex, out Point2d circumcenter)\n        {\n            return Triangulation2_EIK_GetCircumcenter(ptr, faceIndex, out circumcenter);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count)\n        {\n            Triangulation2_EIK_GetCircumcenters(ptr, circumcenters, count);\n        }\n\n        internal override int NeighbourIndex(IntPtr ptr, int faceIndex, int index)\n        {\n            return Triangulation2_EIK_NeighbourIndex(ptr, faceIndex, index);\n        }\n\n        internal override bool LocateFace(IntPtr ptr, Point2d point, out TriFace2 face)\n        {\n            return Triangulation2_EIK_LocateFace(ptr, point, out face);\n        }\n\n        internal override bool MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, out TriVertex2 vertex)\n        {\n            return Triangulation2_EIK_MoveVertex(ptr, index, point, ifNoCollision, out vertex);\n        }\n\n        internal override bool RemoveVertex(IntPtr ptr, int index)\n        {\n            return Triangulation2_EIK_RemoveVertex(ptr, index);\n        }\n\n        internal override bool FlipEdge(IntPtr ptr, int faceIndex, int neighbour)\n        {\n            return Triangulation2_EIK_FlipEdge(ptr, faceIndex, neighbour);\n        }\n\n        internal override void Transform(IntPtr ptr, Point2d translation, double rotation, double scale)\n        {\n            Triangulation2_EIK_Transform(ptr, translation, rotation, scale);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation2_EIK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation2_EIK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_SetIndices(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EIK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_IsValid(IntPtr ptr, int level);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EIK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EIK_FaceCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_InsertPoint(IntPtr ptr, Point2d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_InsertPoints(IntPtr ptr, [In] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_InsertPolygon(IntPtr triPtr, IntPtr polyPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_InsertPolygonWithHoles(IntPtr triPtr, IntPtr pwhPtr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetPoints(IntPtr ptr, [Out] Point2d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetVertices(IntPtr ptr, [Out] TriVertex2[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_GetFace(IntPtr ptr, int index, [Out] out TriFace2 triFace);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetFaces(IntPtr ptr, [Out] TriFace2[] faces, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_GetSegment(IntPtr ptr, int faceIndex, int neighbourIndex, [Out] out Segment2d segment);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_GetTriangle(IntPtr ptr, int faceIndex, [Out] out Triangle2d triangle);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetTriangles(IntPtr ptr, [Out] Triangle2d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_GetCircumcenter(IntPtr ptr, int faceIndex, [Out] out Point2d circumcenter);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_GetCircumcenters(IntPtr ptr, [Out] Point2d[] circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation2_EIK_NeighbourIndex(IntPtr ptr, int faceIndex, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_LocateFace(IntPtr ptr, Point2d point, [Out] out TriFace2 face);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_MoveVertex(IntPtr ptr, int index, Point2d point, bool ifNoCollision, [Out] out TriVertex2 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_RemoveVertex(IntPtr ptr, int index);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation2_EIK_FlipEdge(IntPtr ptr, int faceIndex, int neighbour);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_MakeGabriel(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_Optimize(IntPtr ptr, int iterations, double angleBounds, double lengthBounds);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation2_EIK_Transform(IntPtr ptr, Point2d translation, double rotation, double scale);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriangulationKernel3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal abstract class TriangulationKernel3 : BaseTriangulationKernel3\n    {\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Triangulations/TriangulationKernel3_EEK.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet.Triangulations\n{\n    internal class TriangulationKernel3_EEK : TriangulationKernel3\n    {\n        internal override string Name => \"EEK\";\n\n        internal static readonly TriangulationKernel3 Instance = new TriangulationKernel3_EEK();\n\n        internal override IntPtr Create()\n        {\n            return Triangulation3_EEK_Create();\n        }\n\n        internal override void Release(IntPtr ptr)\n        {\n            Triangulation3_EEK_Release(ptr);\n        }\n\n        internal override void Clear(IntPtr ptr)\n        {\n            Triangulation3_EEK_Clear(ptr);\n        }\n\n        internal override IntPtr Copy(IntPtr ptr)\n        {\n            return Triangulation3_EEK_Copy(ptr);\n        }\n\n        internal override int BuildStamp(IntPtr ptr)\n        {\n            return Triangulation3_EEK_BuildStamp(ptr);\n        }\n\n        internal override int Dimension(IntPtr ptr)\n        {\n            return Triangulation3_EEK_Dimension(ptr);\n        }\n\n        internal override bool IsValid(IntPtr ptr, bool verbose)\n        {\n            return Triangulation3_EEK_IsValid(ptr, verbose);\n        }\n\n        internal override int VertexCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_VertexCount(ptr);\n        }\n\n        internal override int FiniteVertexCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_FiniteVertexCount(ptr);\n        }\n\n        internal override int CellCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_CellCount(ptr);\n        }\n\n        internal override int FiniteCellCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_FiniteCellCount(ptr);\n        }\n\n        internal override int EdgeCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_EdgeCount(ptr);\n        }\n\n        internal override int FiniteEdgeCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_FiniteEdgeCount(ptr);\n        }\n\n        internal override int FacetCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_FacetCount(ptr);\n        }\n\n        internal override int FiniteFacetCount(IntPtr ptr)\n        {\n            return Triangulation3_EEK_FiniteFacetCount(ptr);\n        }\n\n        internal override void InsertPoint(IntPtr ptr, Point3d point)\n        {\n            Triangulation3_EEK_InsertPoint(ptr, point);\n        }\n\n        internal override void InsertPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Triangulation3_EEK_InsertPoints(ptr, points, count);\n        }\n\n        internal override void InsertInCell(IntPtr ptr, int index, Point3d point)\n        {\n            Triangulation3_EEK_InsertInCell(ptr, index, point);\n        }\n\n        internal override int Locate(IntPtr ptr, Point3d point)\n        {\n            return Triangulation3_EEK_Locate(ptr, point);\n        }\n\n        internal override void GetCircumcenters(IntPtr ptr, Point3d[] Circumcenters, int count)\n        {\n            Triangulation3_EEK_GetCircumcenters(ptr, Circumcenters, count); \n        }\n\n        internal override void GetPoints(IntPtr ptr, Point3d[] points, int count)\n        {\n            Triangulation3_EEK_GetPoints(ptr, points, count);\n        }\n\n        internal override void GetVertices(IntPtr ptr, TriVertex3[] vertices, int count)\n        {\n            Triangulation3_EEK_GetVertices(ptr, vertices, count);\n        }\n\n        internal override bool GetVertex(IntPtr ptr, int index, out TriVertex3 vertex)\n        {\n            return Triangulation3_EEK_GetVertex(ptr, index, out vertex);\n        }\n\n        internal override void GetCells(IntPtr ptr, TriCell3[] cells, int count)\n        {\n            Triangulation3_EEK_GetCells(ptr, cells, count); \n        }\n\n        internal override bool GetCell(IntPtr ptr, int index, out TriCell3 cell)\n        {\n            return Triangulation3_EEK_GetCell(ptr, index, out cell);    \n        }\n\n        internal override void GetSegmentIndices(IntPtr ptr, int[] indices, int count)\n        {\n            Triangulation3_EEK_GetSegmentIndices(ptr, indices, count);\n        }\n\n        internal override void GetTriangleIndices(IntPtr ptr, int[] indices, int count)\n        {\n            Triangulation3_EEK_GetTriangleIndices(ptr, indices, count);\n        }\n\n        internal override void GetTetrahedraIndices(IntPtr ptr, int[] indices, int count)\n        {\n            Triangulation3_EEK_GetTetrahedraIndices(ptr, indices, count);\n        }\n\n        internal override void GetSegments(IntPtr ptr, Segment3d[] indices, int count)\n        {\n            Triangulation3_EEK_GetSegments(ptr, indices, count);\n        }\n\n        internal override void GetTriangles(IntPtr ptr, Triangle3d[] indices, int count)\n        {\n            Triangulation3_EEK_GetTriangles(ptr, indices, count);\n        }\n\n        internal override void GetTetrahedrons(IntPtr ptr, Tetrahedron3d[] indices, int count)\n        {\n            Triangulation3_EEK_GetTetrahedrons (ptr, indices, count);\n        }\n\n        internal override void Transform(IntPtr ptr, Matrix4x4d matrix)\n        {\n            Triangulation3_EEK_Transform(ptr, matrix);\n        }\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation3_EEK_Create();\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_Release(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_Clear(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern IntPtr Triangulation3_EEK_Copy(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_BuildStamp(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_Dimension(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation3_EEK_IsValid(IntPtr ptr, bool verbose);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_VertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_FiniteVertexCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_CellCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_FiniteCellCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_EdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_FiniteEdgeCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_FacetCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_FiniteFacetCount(IntPtr ptr);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_InsertPoint(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_InsertPoints(IntPtr ptr, Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_InsertInCell(IntPtr ptr, int index, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern int Triangulation3_EEK_Locate(IntPtr ptr, Point3d point);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetCircumcenters(IntPtr ptr, [Out] Point3d[] Circumcenters, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetPoints(IntPtr ptr, [Out] Point3d[] points, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetVertices(IntPtr ptr, [Out] TriVertex3[] vertices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation3_EEK_GetVertex(IntPtr ptr, int index, [Out] out TriVertex3 vertex);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetCells(IntPtr ptr, [Out] TriCell3[] cells, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern bool Triangulation3_EEK_GetCell(IntPtr ptr, int index, out TriCell3 cell);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetSegmentIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetTriangleIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetTetrahedraIndices(IntPtr ptr, [Out] int[] indices, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetSegments(IntPtr ptr, [Out] Segment3d[] segments, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetTriangles(IntPtr ptr, [Out] Triangle3d[] triangles, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_GetTetrahedrons(IntPtr ptr, [Out] Tetrahedron3d[] Tetrahedrons, int count);\n\n        [DllImport(DLL_NAME, CallingConvention = CDECL)]\n        private static extern void Triangulation3_EEK_Transform(IntPtr ptr, Matrix4x4d matrix);\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Util/ArrayCache.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNet\n{\n    /// <summary>\n    /// Cache to reuse arrays.\n    /// Thread safe?\n    /// </summary>\n    public class ArrayCache\n    {\n        [ThreadStatic]\n        public static bool Disable = false;\n\n        [ThreadStatic]\n        private static Point2d[] m_points2d;\n\n        [ThreadStatic]\n        private static Segment2d[] m_segments2d;\n\n        [ThreadStatic]\n        private static Point3d[] m_points3d;\n\n        [ThreadStatic]\n        private static HPoint3d[] m_hpoints3d;\n\n        [ThreadStatic]\n        private static int[] m_int1, m_int2;\n\n        public void Clear()\n        {\n            m_points2d = null;\n            m_segments2d = null;\n            m_points3d = null;\n            m_hpoints3d = null;\n            m_int1 = null;\n            m_int2 = null;\n        }\n\n        /// <summary>\n        /// Returns a array of Point2d objects that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of Point2d objects that is at least the size of count.</returns>\n        public static Point2d[] Point2dArray(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_points2d, count))\n                m_points2d = new Point2d[count];\n\n            if(clear)\n                Array.Clear(m_points3d, 0, m_points3d.Length);\n\n            return m_points2d;\n        }\n\n        /// <summary>\n        /// Returns a array of Segment2d objects that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of Segment2d objects that is at least the size of count.</returns>\n        public static Segment2d[] Segment2dArray(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_segments2d, count))\n                m_segments2d = new Segment2d[count];\n\n            if (clear)\n                Array.Clear(m_segments2d, 0, m_segments2d.Length);\n\n            return m_segments2d;\n        }\n\n        /// <summary>\n        /// Returns a array of Point3d objects that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of Point3d objects that is at least the size of count.</returns>\n        public static Point3d[] Point3dArray(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_points3d, count))\n                m_points3d = new Point3d[count];\n\n            if (clear)\n                Array.Clear(m_points3d, 0, m_points3d.Length);\n\n            return m_points3d;\n        }\n\n        /// <summary>\n        /// Returns a array of HPoint3d objects that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of HPoint3d objects that is at least the size of count.</returns>\n        public static HPoint3d[] HPoint3dArray(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_hpoints3d, count))\n                m_hpoints3d = new HPoint3d[count];\n\n            if (clear)\n                Array.Clear(m_hpoints3d, 0, m_hpoints3d.Length);\n\n            return m_hpoints3d;\n        }\n\n        /// <summary>\n        /// Returns a array of ints that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of ints that is at least the size of count.</returns>\n        public static int[] IntArray1(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_int1, count))\n                m_int1 = new int[count];\n\n            if (clear)\n                Array.Clear(m_int1, 0, m_int1.Length);\n\n            return m_int1;\n        }\n\n        /// <summary>\n        /// Returns a array of ints that is at least the size of count.\n        /// </summary>\n        /// <param name=\"count\">The minimum size of the array.</param>\n        /// <param name=\"clear\">Should the array be cleared first.</param>\n        /// <returns>Returns a array of ints that is at least the size of count.</returns>\n        public static int[] IntArray2(int count, bool clear = false)\n        {\n            if (MakeNewArray(m_int2, count))\n                m_int2 = new int[count];\n\n            if (clear)\n                Array.Clear(m_int2, 0, m_int2.Length);\n\n            return m_int2;\n        }\n\n        /// <summary>\n        /// Should a new array be created.\n        /// </summary>\n        /// <param name=\"arr\">The current array.</param>\n        /// <param name=\"count\">The required new array size.</param>\n        /// <returns>Creates a new array if disabled, the current one is null or to small.</returns>\n        private static bool MakeNewArray(Array arr, int count)\n        {\n            return (Disable || arr == null || arr.Length < count);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNet/Util/CGALEnums.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace CGALDotNet\n{\n    public enum CGAL_KERNEL\n    {\n        EIK = 0,\n        EEK = 1,\n        EEK_SQRT2 = 2,\n        EEK_KTH_ROOT = 3,\n        EEK_ROOT_OF = 4\n    }\n\n    public enum CGAL_KERNEL_LONG\n    {\n        EXACT_PREDICATES_INEXACT_CONSTRUCTION = 0,\n        EXACT_PREDICATES_EXACT_CONSTRUCTION = 1,\n        EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_SQRT2 = 2,\n        EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_KTH_ROOT = 3,\n        EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_ROOT_OF = 4\n    }\n\n    public static class CGALEnum\n    {\n        public static BOUNDED_SIDE Opposite(BOUNDED_SIDE e) => (BOUNDED_SIDE)(-(int)e);\n\n        public static COMPARISON_RESULT Opposite(COMPARISON_RESULT e) => (COMPARISON_RESULT)(-(int)e);\n\n        public static SIGN Opposite(SIGN e) => (SIGN)(-(int)e);\n\n        public static CLOCK_DIR Opposite(CLOCK_DIR e) => (CLOCK_DIR)(-(int)e);\n\n        public static ORIENTATION Opposite(ORIENTATION e) => (ORIENTATION)(-(int)e);\n\n        public static ORIENTED_SIDE Opposite(ORIENTED_SIDE e) => (ORIENTED_SIDE)(-(int)e);\n\n        public static bool SameOrientation(ORIENTATION e1, ORIENTED_SIDE e2) => e1 == (ORIENTATION)e2;\n\n        public static bool OppositeOrientation(ORIENTATION e1, ORIENTED_SIDE e2) => Opposite(e1) == (ORIENTATION)e2;\n\n        public static T Next<T>(this T src)\n        {\n            T[] Arr = (T[])Enum.GetValues(src.GetType());\n            int j = Array.IndexOf<T>(Arr, src) + 1;\n            return (Arr.Length == j) ? Arr[0] : Arr[j];\n        }\n\n        public static int Count<T>()\n        {\n            return Enum.GetValues(typeof(T)).Length;\n        }\n\n        public static CGAL_KERNEL ToKernelEnum(string k)\n        {\n            switch (k)\n            {\n                case \"EIK\":\n                    return CGAL_KERNEL.EIK;\n\n                case \"EEK\":\n                    return CGAL_KERNEL.EEK;\n\n                case \"EEK_SQRT2\":\n                    return CGAL_KERNEL.EEK_SQRT2;\n\n                case \"EEK_KTH_ROOT\":\n                    return CGAL_KERNEL.EEK_KTH_ROOT;\n\n                case \"EEK_ROOT_OF\":\n                    return CGAL_KERNEL.EEK_ROOT_OF;\n\n                default:\n                    throw new Exception(\"Unhandled case.\");\n            }\n        }\n    }\n\n    public enum ANGLE \n    { \n        OBTUSE = -1, \n        RIGHT = 0, \n        ACUTE = 1 \n    }\n\n    public enum BOUNDED_SIDE\n    { \n        ON_UNBOUNDED_SIDE = -1, \n        ON_BOUNDARY = 0, \n        ON_BOUNDED_SIDE = 1,\n        UNDETERMINED = 2\n    }\n\n    public enum COMPARISON_RESULT \n    { \n        SMALLER = -1, \n        EQUAL = 0, \n        LARGER = 1\n    }\n\n    public enum SIGN \n    { \n        NEGATIVE = -1, \n        ZERO = 0, \n        POSITIVE = 1\n    }\n\n    public enum CLOCK_DIR\n    {\n        CLOCKWISE = -1,\n        ZERO = 0,\n        COUNTER_CLOCKWISE = 1\n    }\n\n    public enum ORIENTATION\n    {\n        NEGATIVE = -1,\n        ZERO = 0,\n        POSITIVE = 1\n    }\n\n    public enum ORIENTED_SIDE\n    { \n        ON_NEGATIVE_SIDE = -1, \n        ON_BOUNDARY = 0,\n        ON_POSITIVE_SIDE = 1,\n        UNDETERMINED = 2\n    }\n\n    public enum BOOL_OR_UNDETERMINED\n    {\n        FALSE = 0,\n        TRUE = 1,\n        UNDETERMINED = 2\n    }\n\n    public enum MESH_TYPE\n    {\n        POLYHEDRON,\n        SURFACE_MESH\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNet/Util/ErrorUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace CGALDotNet\n{\n    internal static class ErrorUtil\n    {\n        /// <summary>\n        /// Check a array that is passed to the c++ dll.\n        /// If the array is invalid it will cause a hard crash.\n        /// Array can be null if count is 0;\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"count\"></param>\n        internal static void CheckArray(Array array, int count)\n        {\n            if (array == null && count == 0)\n                return;\n\n            if(array == null)\n                throw new InvalidArrayExeception(\"Array is null.\");\n\n            if (count < 0)\n                throw new InvalidArrayExeception(\"Count must be >= zero.\");\n\n            if (array.Length < count)\n                throw new InvalidArrayExeception(\"Array length is less than count.\");\n        }\n    }\n\n    public class CGALUnmanagedResourcesReleasedExeception : Exception\n    {\n        public CGALUnmanagedResourcesReleasedExeception()\n        {\n        }\n\n        public CGALUnmanagedResourcesReleasedExeception(string message)\n            : base(message)\n        {\n        }\n\n        public CGALUnmanagedResourcesReleasedExeception(string message, Exception inner)\n            : base(message, inner)\n        {\n        }\n    }\n\n    public class CGALUnmanagedResourcesNotReleasedExeception : Exception\n    {\n        public CGALUnmanagedResourcesNotReleasedExeception()\n        {\n        }\n\n        public CGALUnmanagedResourcesNotReleasedExeception(string message)\n            : base(message)\n        {\n        }\n\n        public CGALUnmanagedResourcesNotReleasedExeception(string message, Exception inner)\n            : base(message, inner)\n        {\n        }\n    }\n\n    public class InvalidArrayExeception : Exception\n    {\n        public InvalidArrayExeception()\n        {\n        }\n\n        public InvalidArrayExeception(string message)\n            : base(message)\n        {\n        }\n\n        public InvalidArrayExeception(string message, Exception inner)\n            : base(message, inner)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNet.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31919.166\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"CGALDotNet\", \"CGALDotNet\\CGALDotNet.csproj\", \"{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66} = {14E85AE8-4516-4FD7-A464-69F55CAB9E66}\n\tEndProjectSection\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"CGALDotNetConsole\", \"CGALDotNetConsole\\CGALDotNetConsole.csproj\", \"{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66} = {14E85AE8-4516-4FD7-A464-69F55CAB9E66}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"CGALWrapper\", \"CGALWrapper\\CGALWrapper.vcxproj\", \"{14E85AE8-4516-4FD7-A464-69F55CAB9E66}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{725A109E-7F75-4EDD-A2D9-E8D682B01896}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.editorconfig = .editorconfig\n\tEndProjectSection\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"CGALDotNetTest\", \"CGALDotNetTest\\CGALDotNetTest.csproj\", \"{AA90E589-2EA3-4680-B24D-2C18194DD85E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|x64.Build.0 = Release|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{0E5F9C35-2768-4C7D-8592-E783BE3DCBE2}.Release|x86.Build.0 = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|x64.Build.0 = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{5B091F12-E9FC-4ADB-B8F0-D46A744E3B57}.Release|x86.Build.0 = Release|Any CPU\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Debug|x64.Build.0 = Debug|x64\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Debug|x86.Build.0 = Debug|Win32\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Release|x64.ActiveCfg = Release|x64\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Release|x64.Build.0 = Release|x64\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Release|x86.ActiveCfg = Release|Win32\n\t\t{14E85AE8-4516-4FD7-A464-69F55CAB9E66}.Release|x86.Build.0 = Release|Win32\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{AA90E589-2EA3-4680-B24D-2C18194DD85E}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A7C5E29B-94D2-4C83-B2CE-D61B5D0A7B69}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "CGALDotNetConsole/CGALDotNetConsole.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CGALDotNet\\CGALDotNet.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"CGALDotNetGeometry\">\n      <HintPath>..\\..\\CGALDotNetGeometry\\CGALDotNetGeometry\\bin\\Release\\netcoreapp3.1\\CGALDotNetGeometry.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Properties\\Resources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <Target Name=\"PostBuild\" AfterTargets=\"PostBuildEvent\">\n    <Exec Command=\"xcopy &quot;$(SolutionDir)x64\\$(ConfigurationName)\\CGALWrapper.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\gmp.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\mpfr-6.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y\" />\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "CGALDotNetConsole/Program.cs",
    "content": "﻿using System;\nusing System.Text;\nusing System.Collections.Generic;\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNetGeometry.Extensions;\n\nusing CGALDotNet;\nusing CGALDotNet.Geometry;\nusing CGALDotNet.Polygons;\nusing CGALDotNet.Polylines;\nusing CGALDotNet.Triangulations;\nusing CGALDotNet.Arrangements;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Meshing;\nusing CGALDotNet.Hulls;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\nusing CGALDotNet.Collections;\nusing CGALDotNet.Eigen;\n\nnamespace CGALDotNetConsole\n{\n    public class Program\n    {\n\n\n        static void Main(string[] args)\n        {\n\n\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetConsole/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace CGALDotNetConsole.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"CGALDotNetConsole.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetConsole/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n\t<!-- \n\t\tMicrosoft ResX Schema\n\n\t\tVersion 1.3\n\n\t\tThe primary goals of this format is to allow a simple XML format \n\t\tthat is mostly human readable. The generation and parsing of the \n\t\tvarious data types are done through the TypeConverter classes \n\t\tassociated with the data types.\n\n\t\tExample:\n\n\t\t... ado.net/XML headers & schema ...\n\t\t<resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n\t\t<resheader name=\"version\">1.3</resheader>\n\t\t<resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n\t\t<resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n\t\t<data name=\"Name1\">this is my long string</data>\n\t\t<data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n\t\t<data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n\t\t\t[base64 mime encoded serialized .NET Framework object]\n\t\t</data>\n\t\t<data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n\t\t\t[base64 mime encoded string representing a byte array form of the .NET Framework object]\n\t\t</data>\n\n\t\tThere are any number of \"resheader\" rows that contain simple \n\t\tname/value pairs.\n\n\t\tEach data row contains a name, and value. The row also contains a \n\t\ttype or mimetype. Type corresponds to a .NET class that support \n\t\ttext/value conversion through the TypeConverter architecture. \n\t\tClasses that don't support this are serialized and stored with the \n\t\tmimetype set.\n\n\t\tThe mimetype is used for serialized objects, and tells the \n\t\tResXResourceReader how to depersist the object. This is currently not \n\t\textensible. For a given mimetype the value must be set accordingly:\n\n\t\tNote - application/x-microsoft.net.object.binary.base64 is the format \n\t\tthat the ResXResourceWriter will generate, however the reader can \n\t\tread any of the formats listed below.\n\n\t\tmimetype: application/x-microsoft.net.object.binary.base64\n\t\tvalue   : The object must be serialized with \n\t\t\t: System.Serialization.Formatters.Binary.BinaryFormatter\n\t\t\t: and then encoded with base64 encoding.\n\n\t\tmimetype: application/x-microsoft.net.object.soap.base64\n\t\tvalue   : The object must be serialized with \n\t\t\t: System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n\t\t\t: and then encoded with base64 encoding.\n\n\t\tmimetype: application/x-microsoft.net.object.bytearray.base64\n\t\tvalue   : The object must be serialized into a byte array \n\t\t\t: using a System.ComponentModel.TypeConverter\n\t\t\t: and then encoded with base64 encoding.\n\t-->\n\t\n\t<xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n\t\t<xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n\t\t\t<xsd:complexType>\n\t\t\t\t<xsd:choice maxOccurs=\"unbounded\">\n\t\t\t\t\t<xsd:element name=\"data\">\n\t\t\t\t\t\t<xsd:complexType>\n\t\t\t\t\t\t\t<xsd:sequence>\n\t\t\t\t\t\t\t\t<xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t\t<xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n\t\t\t\t\t\t\t</xsd:sequence>\n\t\t\t\t\t\t\t<xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t<xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n\t\t\t\t\t\t\t<xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n\t\t\t\t\t\t</xsd:complexType>\n\t\t\t\t\t</xsd:element>\n\t\t\t\t\t<xsd:element name=\"resheader\">\n\t\t\t\t\t\t<xsd:complexType>\n\t\t\t\t\t\t\t<xsd:sequence>\n\t\t\t\t\t\t\t\t<xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n\t\t\t\t\t\t\t</xsd:sequence>\n\t\t\t\t\t\t\t<xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n\t\t\t\t\t\t</xsd:complexType>\n\t\t\t\t\t</xsd:element>\n\t\t\t\t</xsd:choice>\n\t\t\t</xsd:complexType>\n\t\t</xsd:element>\n\t</xsd:schema>\n\t<resheader name=\"resmimetype\">\n\t\t<value>text/microsoft-resx</value>\n\t</resheader>\n\t<resheader name=\"version\">\n\t\t<value>1.3</value>\n\t</resheader>\n\t<resheader name=\"reader\">\n\t\t<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n\t</resheader>\n\t<resheader name=\"writer\">\n\t\t<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n\t</resheader>\n</root>"
  },
  {
    "path": "CGALDotNetConsole/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"CGALDotNetConsole\": {\n      \"commandName\": \"Project\",\n      \"nativeDebugging\": true\n    }\n  }\n}"
  },
  {
    "path": "CGALDotNetConsole/Timer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\n\nnamespace CGALDotNetConsole\n{\n    public class Timer\n    {\n\n        public double ElapsedMilliseconds { get; private set; }\n\n        public double ElapsedSeconds { get; private set; }\n\n        public long ElapsedTicks => m_watch.ElapsedTicks;\n\n        public bool IsHighPerformance => Stopwatch.IsHighResolution;\n\n        public bool IsRunning => m_watch.IsRunning;\n\n        public long NanoSecondsPerTick => (1000L * 1000L * 1000L) / Stopwatch.Frequency;\n\n        private Stopwatch m_watch;\n\n        private static Timer s_timer;\n\n        public Timer()\n        {\n            m_watch = new Stopwatch();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return string.Format(\"[Timer: IsHighPerformance={0}, NanoSecondsPerTick={1}, ElapsedTicks={2}, ElapsedSeconds={3}]\",\n                IsHighPerformance, NanoSecondsPerTick, ElapsedTicks, ElapsedSeconds);\n        }\n\n        public void Start()\n        {\n            m_watch.Start();\n        }\n\n        public double Stop()\n        {\n            m_watch.Stop();\n\n            ElapsedMilliseconds = (ElapsedTicks * NanoSecondsPerTick) / 1000000.0;\n            ElapsedSeconds = ElapsedMilliseconds / 1000.0;\n\n            return ElapsedMilliseconds;\n        }\n\n        public void StopAndPrintInMilliSeconds()\n        {\n            Stop();\n            Console.WriteLine(ElapsedMilliseconds + \" ms\");\n        }\n\n        public double Tick()\n        {\n            ElapsedMilliseconds = (ElapsedTicks * NanoSecondsPerTick) / 1000000.0;\n            ElapsedSeconds = ElapsedMilliseconds / 1000.0;\n\n            return ElapsedMilliseconds;\n        }\n\n        public void Reset()\n        {\n            ElapsedMilliseconds = 0.0;\n            ElapsedSeconds = 0.0;\n            m_watch.Reset();\n        }\n\n        public static void StartTimer()\n        {\n            s_timer = new Timer();\n            s_timer.Start();\n        }\n\n        public static double StopTimer()\n        {\n            return s_timer.Stop();\n        }\n\n    }\n}"
  },
  {
    "path": "CGALDotNetTest/AssertX.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\nusing CGALDotNet.Eigen;\n\nnamespace CGALDotNetTest\n{\n    public static class AssertX\n    {\n        public static void AlmostEqual(this double d, double d2, double eps = MathUtil.EPS_64)\n        {\n            Assert.IsTrue(MathUtil.AlmostEqual(d, d2, eps));\n        }\n\n        public static void AlmostEqual(this Point2d p1, Point2d p2, double eps = MathUtil.EPS_64)\n        {\n            Assert.IsTrue(Point2d.AlmostEqual(p1, p2, eps));\n        }\n\n        public static void AlmostEqual(this Point3d p1, Point3d p2, double eps = MathUtil.EPS_64)\n        {\n            Assert.IsTrue(Point3d.AlmostEqual(p1, p2, eps));\n        }\n\n        public static void AlmostEqual(this Vector2d p1, Vector2d p2, double eps = MathUtil.EPS_64)\n        {\n            Assert.IsTrue(Vector2d.AlmostEqual(p1, p2, eps));\n        }\n\n        public static void AlmostEqual(this Vector3d p1, Vector3d p2, double eps = MathUtil.EPS_64)\n        {\n            Assert.IsTrue(Vector3d.AlmostEqual(p1, p2, eps));\n        }\n\n        public static void AlmostEqual(this EigenMatrix m1, EigenMatrix m2, double eps = MathUtil.EPS_64)\n        {\n            Assert.AreEqual(m1.Rows, m2.Rows);\n            Assert.AreEqual(m1.Columns, m2.Columns);\n\n            for (int i = 0; i < m1.Length; i++)\n            {\n                Assert.IsTrue(MathUtil.AlmostEqual(m1[i], m2[i], eps));\n            }\n        }\n\n        public static void AlmostEqual(this EigenColumnVector v1, EigenColumnVector v2, double eps = MathUtil.EPS_64)\n        {\n            Assert.AreEqual(v1.Dimension, v2.Dimension);\n\n            for (int i = 0; i < v1.Dimension; i++)\n            {\n                Assert.IsTrue(MathUtil.AlmostEqual(v1[i], v2[i], eps));\n            }\n        }\n\n        public static void AlmostEqual(this EigenRowVector v1, EigenRowVector v2, double eps = MathUtil.EPS_64)\n        {\n            Assert.AreEqual(v1.Dimension, v2.Dimension);\n\n            for (int i = 0; i < v1.Dimension; i++)\n            {\n                Assert.IsTrue(MathUtil.AlmostEqual(v1[i], v2[i], eps));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/CGALDotNetTest.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.9.4\" />\n    <PackageReference Include=\"MSTest.TestAdapter\" Version=\"2.2.3\" />\n    <PackageReference Include=\"MSTest.TestFramework\" Version=\"2.2.3\" />\n    <PackageReference Include=\"coverlet.collector\" Version=\"3.0.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CGALDotNet\\CGALDotNet.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"CGALDotNetGeometry\">\n      <HintPath>..\\..\\CGALDotNetGeometry\\CGALDotNetGeometry\\bin\\Release\\netcoreapp3.1\\CGALDotNetGeometry.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n  <Target Name=\"PostBuild\" AfterTargets=\"PostBuildEvent\">\n    <Exec Command=\"xcopy &quot;$(SolutionDir)x64\\$(ConfigurationName)\\CGALWrapper.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\gmp.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y&#xD;&#xA;xcopy &quot;C:\\dev\\vcpkg\\installed\\x64-windows\\bin\\mpfr-6.dll&quot; &quot;$(ProjectDir)bin\\$(ConfigurationName)\\netcoreapp3.1&quot; /y\" />\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "CGALDotNetTest/CGALGlobalTest.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNet.Geometry;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\n\nnamespace CGALDotNetTest\n{\n    [TestClass]\n    public class CGALGlobalTest\n    {\n        [TestMethod]\n        public void Angle_Vector2()\n        {\n            var t2 = new Vector2d(1, 1);\n            var u2 = new Vector2d(1, 0);\n            var v2 = new Vector2d(0, 1);\n            var w2 = new Vector2d(-1, 1);\n\n            Assert.AreEqual(CGALGlobal.Angle(t2, u2), ANGLE.ACUTE);\n            Assert.AreEqual(CGALGlobal.Angle(u2, v2), ANGLE.RIGHT);\n            Assert.AreEqual(CGALGlobal.Angle(w2, u2), ANGLE.OBTUSE);\n        }\n\n        [TestMethod]\n        public void Angle_Vector3()\n        {\n            var t3 = new Vector3d(1, 1, 0);\n            var u3 = new Vector3d(1, 0, 0);\n            var v3 = new Vector3d(0, 1, 0);\n            var w3 = new Vector3d(-1, 1, 0);\n\n            Assert.AreEqual(CGALGlobal.Angle(t3, u3), ANGLE.ACUTE);\n            Assert.AreEqual(CGALGlobal.Angle(u3, v3), ANGLE.RIGHT);\n            Assert.AreEqual(CGALGlobal.Angle(w3, u3), ANGLE.OBTUSE);\n\n            Assert.AreEqual(CGALGlobal.Angle(t3.xzy, u3.xzy), ANGLE.ACUTE);\n            Assert.AreEqual(CGALGlobal.Angle(u3.xzy, v3.xzy), ANGLE.RIGHT);\n            Assert.AreEqual(CGALGlobal.Angle(w3.xzy, u3.xzy), ANGLE.OBTUSE);\n        }\n\n        [TestMethod]\n        public void Angle_EIK()\n        {\n            var t2 = new Vector2<EIK>(1, 1);\n            var u2 = new Vector2<EIK>(1, 0);\n            var v2 = new Vector2<EIK>(0, 1);\n            var w2 = new Vector2<EIK>(-1, 1);\n\n            Assert.AreEqual(CGALGlobal.Angle(t2, u2), ANGLE.ACUTE);\n            Assert.AreEqual(CGALGlobal.Angle(u2, v2), ANGLE.RIGHT);\n            Assert.AreEqual(CGALGlobal.Angle(w2, u2), ANGLE.OBTUSE);\n        }\n\n        [TestMethod]\n        public void Angle_EEK()\n        {\n            var t2 = new Vector2<EEK>(1, 1);\n            var u2 = new Vector2<EEK>(1, 0);\n            var v2 = new Vector2<EEK>(0, 1);\n            var w2 = new Vector2<EEK>(-1, 1);\n\n            Assert.AreEqual(CGALGlobal.Angle(t2, u2), ANGLE.ACUTE);\n            Assert.AreEqual(CGALGlobal.Angle(u2, v2), ANGLE.RIGHT);\n            Assert.AreEqual(CGALGlobal.Angle(w2, u2), ANGLE.OBTUSE);\n        }\n\n        [TestMethod]\n        public void ApproxAngle_Vector2()\n        {\n            var t = new Vector3d(1, 1, 0);\n            var u = new Vector3d(1, 0, 0);\n            var v = new Vector3d(0, 1, 0);\n            var w = new Vector3d(-1, 1, 0);\n\n            Assert.AreEqual(CGALGlobal.ApproxAngle(t, u).Rounded(6), 45.0);\n            Assert.AreEqual(CGALGlobal.ApproxAngle(u, v).Rounded(6), 90.0);\n            Assert.AreEqual(CGALGlobal.ApproxAngle(w, u).Rounded(6), 135.0);\n        }\n\n        [TestMethod]\n        public void ApproxAngle_Vector3()\n        {\n            var t = new Vector3d(1, 1, 0);\n            var u = new Vector3d(1, 0, 0);\n            var v = new Vector3d(0, 1, 0);\n            var w = new Vector3d(-1, 1, 0);\n\n            Assert.AreEqual(CGALGlobal.ApproxAngle(t.xzy, u.xzy).Rounded(6), 45.0);\n            Assert.AreEqual(CGALGlobal.ApproxAngle(u.xzy, v.xzy).Rounded(6), 90.0);\n            Assert.AreEqual(CGALGlobal.ApproxAngle(w.xzy, u.xzy).Rounded(6), 135.0);\n        }\n\n        [TestMethod]\n        public void AreOrderedAlongLine_Point2()\n        {\n            var p2 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var r2 = new Point2d(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreOrderedAlongLine(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void AreOrderedAlongLine_EIK()\n        {\n            var p2 = new Point2<EIK>(1, 0);\n            var q2 = new Point2<EIK>(2, 0);\n            var r2 = new Point2<EIK>(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreOrderedAlongLine(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void AreOrderedAlongLine_EEK()\n        {\n            var p2 = new Point2<EEK>(1, 0);\n            var q2 = new Point2<EEK>(2, 0);\n            var r2 = new Point2<EEK>(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreOrderedAlongLine(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void AreStrictlyOrderedAlongLine_Point2()\n        {\n            var p2 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var r2 = new Point2d(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreStrictlyOrderedAlongLine(p2, q2, r2));\n            Assert.IsFalse(CGALGlobal.AreStrictlyOrderedAlongLine(p2, r2, r2));\n        }\n\n        [TestMethod]\n        public void AreStrictlyOrderedAlongLine_EIK()\n        {\n            var p2 = new Point2<EIK>(1, 0);\n            var q2 = new Point2<EIK>(2, 0);\n            var r2 = new Point2<EIK>(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreStrictlyOrderedAlongLine(p2, q2, r2));\n            Assert.IsFalse(CGALGlobal.AreStrictlyOrderedAlongLine(p2, r2, r2));\n        }\n\n        [TestMethod]\n        public void AreStrictlyOrderedAlongLine_EEK()\n        {\n            var p2 = new Point2<EEK>(1, 0);\n            var q2 = new Point2<EEK>(2, 0);\n            var r2 = new Point2<EEK>(3, 0);\n\n            Assert.IsTrue(CGALGlobal.AreStrictlyOrderedAlongLine(p2, q2, r2));\n            Assert.IsFalse(CGALGlobal.AreStrictlyOrderedAlongLine(p2, r2, r2));\n        }\n\n        [TestMethod]\n        public void Colinear_Point2()\n        {\n            var p2 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var r2 = new Point2d(3, 0);\n\n            Assert.IsTrue(CGALGlobal.Collinear(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void Colinear_Point3()\n        {\n            var p3 = new Point3d(1, 0, 0);\n            var q3 = new Point3d(2, 0, 0);\n            var r3 = new Point3d(3, 0, 0);\n\n            Assert.IsTrue(CGALGlobal.Collinear(p3, q3, r3));\n            Assert.IsTrue(CGALGlobal.Collinear(p3.xzy, q3.xzy, r3.xzy));\n        }\n\n        [TestMethod]\n        public void Colinear_EIK()\n        {\n            var p2 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var r2 = new Point2d(3, 0);\n\n            Assert.IsTrue(CGALGlobal.Collinear(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void Colinear_EEK()\n        {\n            var p2 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var r2 = new Point2d(3, 0);\n\n            Assert.IsTrue(CGALGlobal.Collinear(p2, q2, r2));\n        }\n\n        [TestMethod]\n        public void Barycenter_Point2()\n        {\n            var p = new Point2d(0, 0);\n            var q = new Point2d(1, 0);\n            var r = new Point2d(1, 1);\n\n            var bc = CGALGlobal.Barycenter(p, q, r);\n            bc.Round(2);\n\n            Assert.AreEqual(0.67, bc.x);\n            Assert.AreEqual(0.33, bc.y);\n        }\n\n        [TestMethod]\n        public void Barycenter_Point3()\n        {\n            var p = new Point3d(0, 0, 0);\n            var q = new Point3d(1, 0, 0);\n            var r = new Point3d(1, 1, 0);\n\n            var bc = CGALGlobal.Barycenter(p, q, r);\n            bc.Round(2);\n\n            Assert.AreEqual(0.67, bc.x);\n            Assert.AreEqual(0.33, bc.y);\n        }\n\n        [TestMethod]\n        public void Barycenter_EIK()\n        {\n            var p = new Point2<EIK>(0, 0);\n            var q = new Point2<EIK>(1, 0);\n            var r = new Point2<EIK>(1, 1);\n\n            var bc = CGALGlobal.Barycenter(p, q, r);\n            bc.Round(2);\n\n            Assert.AreEqual(0.67, bc.x);\n            Assert.AreEqual(0.33, bc.y);\n        }\n\n        [TestMethod]\n        public void Barycenter_EEK()\n        {\n            var p = new Point2<EEK>(0, 0);\n            var q = new Point2<EEK>(1, 0);\n            var r = new Point2<EEK>(1, 1);\n\n            var bc = CGALGlobal.Barycenter(p, q, r);\n            bc.Round(2);\n\n            Assert.AreEqual(0.67, bc.x);\n            Assert.AreEqual(0.33, bc.y);\n        }\n\n        [TestMethod]\n        public void Bisector_Point2()\n        {\n            var p = new Point3d(1, 0, 0);\n            var q = new Point3d(1, 1, 0);\n\n            Assert.AreEqual(CGALGlobal.Bisector(p, q), new Line2d(0, -2, 0));\n        }\n\n        [TestMethod]\n        public void Bisector_Line2()\n        {\n            var l1 = new Line2d(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2d(new Point2d(0, 1), new Point2d(1, 1));\n\n            Assert.AreEqual(CGALGlobal.Bisector(l1, l2), new Line2d(0, 2, -1));\n        }\n\n        [TestMethod]\n        public void Bisector_EIK()\n        {\n            var l1 = new Line2<EIK>(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2<EIK>(new Point2d(0, 1), new Point2d(1, 1));\n            var bs = CGALGlobal.Bisector(l1, l2);\n\n            Assert.AreEqual(bs.A, 0);\n            Assert.AreEqual(bs.B, 2);\n            Assert.AreEqual(bs.C, -1);\n        }\n\n        [TestMethod]\n        public void Bisector_EEK()\n        {\n            var l1 = new Line2<EEK>(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2<EEK>(new Point2d(0, 1), new Point2d(1, 1));\n\n            var bs = CGALGlobal.Bisector(l1, l2);\n\n            Assert.AreEqual(bs.A, 0);\n            Assert.AreEqual(bs.B, 2);\n            Assert.AreEqual(bs.C, -1);\n        }\n\n        [TestMethod]\n        public void Coplanar_Point3()\n        {\n            var p = new Point3d(1, 0, 0);\n            var q = new Point3d(2, 0, 0);\n            var r = new Point3d(1, 1, 0);\n            var s = new Point3d(2, 1, 0);\n            var t = new Point3d(2, 0, 1);\n\n            Assert.IsTrue(CGALGlobal.Coplanar(p, q, r, s));\n            Assert.IsFalse(CGALGlobal.Coplanar(p, q, r, t));\n            Assert.IsTrue(CGALGlobal.Coplanar(p.xzy, q.xzy, r.xzy, s.xzy));\n            Assert.IsFalse(CGALGlobal.Coplanar(p.xzy, q.xzy, r.xzy, t.xzy));\n        }\n\n        [TestMethod]\n        public void CoplanarOrientation_Point3()\n        {\n            var p = new Point3d(0, 0, 0);\n            var q = new Point3d(1, 0, 0);\n            var r = new Point3d(0, -1, 0);\n            var s = new Point3d(1, -1, 0);\n            var t = new Point3d(0, 0, 1);\n\n            Assert.AreEqual(CGALGlobal.CoplanarOrientation(p, q, r, s), ORIENTATION.POSITIVE);\n            Assert.AreEqual(CGALGlobal.CoplanarOrientation(p, q, r, t), ORIENTATION.ZERO);\n            Assert.AreEqual(CGALGlobal.CoplanarOrientation(p, q, r, t.xzy), ORIENTATION.NEGATIVE);\n        }\n\n        [TestMethod]\n        public void EquidistantLine_Point3()\n        {\n            var p = new Point3d(1, 0, 0);\n            var q = new Point3d(0, 1, 0);\n            var r = new Point3d(0, 0, 1);\n\n            var l1 = CGALGlobal.EquidistantLine(p, q, r);\n            l1.Normalize();\n            l1.Round(2);\n\n            var pos = new Point3d(0.33);\n            var dir = new Vector3d(0.58);\n\n            var l2 = new Line3d(pos, dir);\n            l2.Round(2);\n\n            Assert.AreEqual(l1, l2);\n        }\n\n        [TestMethod]\n        public void OrthogonalVector_Point3()\n        {\n            var p = new Point3d(1, 0, 0);\n            var q = new Point3d(1, 1, 0);\n            var r = new Point3d(0, 1, 0);\n\n            Assert.AreEqual(CGALGlobal.OrthogonalVector(p, q, r), new Vector3d(0,0,1));\n        }\n\n        [TestMethod]\n        public void Parallel_Line2()\n        {\n            var l1 = new Line2d(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2d(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(l1 ,l2));\n        }\n\n        [TestMethod]\n        public void Parallel_EIK_Line2()\n        {\n            var l1 = new Line2<EIK>(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2<EIK>(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(l1, l2));\n        }\n\n        [TestMethod]\n        public void Parallel_EEK_Line2()\n        {\n            var l1 = new Line2<EEK>(new Point2d(0, 0), new Point2d(1, 0));\n            var l2 = new Line2<EEK>(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(l1, l2));\n        }\n\n        [TestMethod]\n        public void Parallel_Ray2()\n        {\n            var r1 = new Ray2d(new Point2d(0, 0), new Vector2d(1, 0));\n            var r2 = new Ray2d(new Point2d(1, 0), new Vector2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(r1, r2));\n        }\n\n        [TestMethod]\n        public void Parallel_EIK_Ray2()\n        {\n            var r1 = new Ray2<EIK>(new Point2d(0, 0), new Vector2d(1, 0));\n            var r2 = new Ray2<EIK>(new Point2d(1, 0), new Vector2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(r1, r2));\n        }\n\n        [TestMethod]\n        public void Parallel_EEK_Ray2()\n        {\n            var r1 = new Ray2<EEK>(new Point2d(0, 0), new Vector2d(1, 0));\n            var r2 = new Ray2<EEK>(new Point2d(1, 0), new Vector2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(r1, r2));\n        }\n\n        [TestMethod]\n        public void Parallel_Segment2()\n        {\n            var s1 = new Segment2d(new Point2d(0, 0), new Point2d(1, 0));\n            var s2 = new Segment2d(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(s1, s2));\n        }\n\n        [TestMethod]\n        public void Parallel_EIK_Segment2()\n        {\n            var s1 = new Segment2<EIK>(new Point2d(0, 0), new Point2d(1, 0));\n            var s2 = new Segment2<EIK>(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(s1, s2));\n        }\n\n        [TestMethod]\n        public void Parallel_EEK_Segment2()\n        {\n            var s1 = new Segment2<EEK>(new Point2d(0, 0), new Point2d(1, 0));\n            var s2 = new Segment2<EEK>(new Point2d(1, 0), new Point2d(1, 0));\n\n            Assert.IsTrue(CGALGlobal.Parallel(s1, s2));\n        }\n\n        [TestMethod]\n        public void LeftTurn_Point2()\n        {\n            var p = new Point2d(0, 0);\n            var q = new Point2d(1, 0);\n            var r = new Point2d(1, 1);\n\n            Assert.IsTrue(CGALGlobal.LeftTurn(p, q, r));\n        }\n\n        [TestMethod]\n        public void LeftTurn_EIK()\n        {\n            var p = new Point2<EIK>(0, 0);\n            var q = new Point2<EIK>(1, 0);\n            var r = new Point2<EIK>(1, 1);\n\n            Assert.IsTrue(CGALGlobal.LeftTurn(p, q, r));\n        }\n\n        [TestMethod]\n        public void LeftTurn_EEK()\n        {\n            var p = new Point2<EEK>(0, 0);\n            var q = new Point2<EEK>(1, 0);\n            var r = new Point2<EEK>(1, 1);\n\n            Assert.IsTrue(CGALGlobal.LeftTurn(p, q, r));\n        }\n\n        [TestMethod]\n        public void RightTurn_Point2()\n        {\n            var p = new Point2d(0, 0);\n            var q = new Point2d(1, 0);\n            var r = new Point2d(1, 1);\n\n            Assert.IsTrue(CGALGlobal.RightTurn(r, q, p));\n        }\n\n        [TestMethod]\n        public void RightTurn_EIK()\n        {\n            var p = new Point2<EIK>(0, 0);\n            var q = new Point2<EIK>(1, 0);\n            var r = new Point2<EIK>(1, 1);\n\n            Assert.IsTrue(CGALGlobal.RightTurn(r, q, p));\n        }\n\n        [TestMethod]\n        public void RightTurn_EEK()\n        {\n            var p = new Point2<EEK>(0, 0);\n            var q = new Point2<EEK>(1, 0);\n            var r = new Point2<EEK>(1, 1);\n\n            //Assert.IsTrue(CGALGlobal.RightTurn(r, q, p));\n        }\n\n        [TestMethod]\n        public void Orientation_Point2()\n        {\n            var p = new Point2d(0, 0);\n            var q1 = new Point2d(1, 0);\n            var q2 = new Point2d(2, 0);\n            var q3 = new Point2d(3, 0);\n            var r = new Point2d(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, q1, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, q1, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q1, q2, q3));\n        }\n\n        [TestMethod]\n        public void Orientation_EIK()\n        {\n            var p = new Point2<EIK>(0, 0);\n            var q1 = new Point2<EIK>(1, 0);\n            var q2 = new Point2<EIK>(2, 0);\n            var q3 = new Point2<EIK>(3, 0);\n            var r = new Point2<EIK>(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, q1, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, q1, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q1, q2, q3));\n        }\n\n        [TestMethod]\n        public void Orientation_EEK()\n        {\n            var p = new Point2<EEK>(0, 0);\n            var q1 = new Point2<EEK>(1, 0);\n            var q2 = new Point2<EEK>(2, 0);\n            var q3 = new Point2<EEK>(3, 0);\n            var r = new Point2<EEK>(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, q1, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, q1, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q1, q2, q3));\n        }\n\n        [TestMethod]\n        public void Orientation_Vector2()\n        {\n            var p = new Vector2d(1, 0);\n            var q = new Vector2d(0, 1);\n            var q2 = new Vector2d(0, 1);\n            var r = new Vector2d(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q, q2));\n        }\n\n        [TestMethod]\n        public void Orientation_EIK_Vector2()\n        {\n            var p = new Vector2<EIK>(1, 0);\n            var q = new Vector2<EIK>(0, 1);\n            var q2 = new Vector2<EIK>(0, 1);\n            var r = new Vector2<EIK>(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q, q2));\n        }\n\n        [TestMethod]\n        public void Orientation_EEK_Vector2()\n        {\n            var p = new Vector2<EEK>(1, 0);\n            var q = new Vector2<EEK>(0, 1);\n            var q2 = new Vector2<EEK>(0, 1);\n            var r = new Vector2<EEK>(1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, CGALGlobal.Orientation(p, r));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, CGALGlobal.Orientation(r, p));\n            Assert.AreEqual(ORIENTATION.ZERO, CGALGlobal.Orientation(q, q2));\n        }\n\n        [TestMethod]\n        public void Orientation_Point3()\n        {\n            var p = new Point3d(0, 0, 0);\n            var q = new Point3d(1, 0, 0);\n            var r = new Point3d(1, 1, 0);\n\n            var v = CGALGlobal.OrthogonalVector(p, q, r);\n\n            Assert.AreEqual(0, v.x);\n            Assert.AreEqual(0, v.y);\n            Assert.AreEqual(1, v.z);\n        }\n\n   \n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Eigen/EigenMatrix_Test.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNet.Eigen;\n\nnamespace CGALDotNetTest.Eigen\n{\n    [TestClass]\n    public class EigenMatrix_Test\n    {\n        [TestMethod]\n        public void Create()\n        {\n            int rows = 2;\n            int cols = 3;\n\n            var m1 = new EigenMatrix(rows, cols);\n\n            var a = new double[rows, cols];\n            var m2 = new EigenMatrix(a);\n\n            var c = new EigenColumnVector[]\n            {\n                new EigenColumnVector(cols),\n                new EigenColumnVector(cols)\n            };\n\n            var m3 = new EigenMatrix(c);\n\n            Assert.AreEqual(rows, m1.Rows);\n            Assert.AreEqual(cols, m1.Columns);\n\n            Assert.AreEqual(rows, m2.Rows);\n            Assert.AreEqual(cols, m2.Columns);\n\n            Assert.AreEqual(rows, m3.Rows);\n            Assert.AreEqual(cols, m3.Columns);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var m = new EigenMatrix(1,1);\n            m.Dispose();\n\n            Assert.IsTrue(m.IsDisposed);\n        }\n\n        [TestMethod]\n        public void RowColumnsLength()\n        {\n            var m = new EigenMatrix(2, 3);\n\n            Assert.AreEqual(2, m.Rows);\n            Assert.AreEqual(3, m.Columns);\n            Assert.AreEqual(2 * 3, m.Length);\n        }\n\n        [TestMethod]\n        public void ArrayAccessors()\n        {\n            var m = new EigenMatrix(2, 3);\n\n            for (int i = 0; i < m.Length; i++)\n                m[i] = i;\n\n            for (int i = 0; i < m.Length; i++)\n                Assert.AreEqual(i, m[i]);\n\n            for (int y = 0; y < m.Columns; y++)\n            {\n                for (int x = 0; x < m.Rows; x++)\n                {\n                    m[x, y] = x + y * m.Rows;\n                }\n            }\n\n            for (int y = 0; y < m.Columns; y++)\n            {\n                for (int x = 0; x < m.Rows; x++)\n                {\n                    int i = x + y * m.Rows;\n                    Assert.AreEqual(i, m[i]);\n                }\n            }\n        }\n\n        [TestMethod]\n        public void ScalarMul()\n        {\n           var m = EigenMatrix.Series(2, 3);\n\n            m = m * 2;\n\n            int i = 0;\n            for (int x = 0; x < m.Rows; x++)\n            {\n                for (int y = 0; y < m.Columns; y++)\n                {\n                    Assert.AreEqual(i * 2, m[x, y]);\n                    i++;\n                }\n            }\n        }\n\n        [TestMethod]\n        public void ScalarDiv()\n        {\n            var m = EigenMatrix.Series(2, 3);\n\n            m = m / 2.0;\n\n            int i = 0;\n            for (int x = 0; x < m.Rows; x++)\n            {\n                for (int y = 0; y < m.Columns; y++)\n                {\n                    Assert.AreEqual(i / 2.0, m[x, y]);\n                    i++;\n                }\n            }\n        }\n\n        [TestMethod]\n        public void VectorMul()\n        {\n            var m = EigenMatrix.Translate(new Point3d(1, 2, 3));\n\n            var v = new EigenColumnVector(0, 0, 0, 1);\n\n            v = m * v;\n\n            Assert.AreEqual(1, v.x);\n            Assert.AreEqual(2, v.y);\n            Assert.AreEqual(3, v.z);\n            Assert.AreEqual(1, v.w);\n        }\n\n        [TestMethod]\n        public void MatrixMul()\n        {\n            var m1 = EigenMatrix.Series(2, 2);\n            var m2 = EigenMatrix.Series(2, 2);\n\n            var m = new EigenMatrix(2, 3, 6, 11);\n\n            AssertX.AlmostEqual(m, m1 * m2);\n        }\n\n        [TestMethod]\n        public void MatrixAdd()\n        {\n            var m1 = EigenMatrix.Series(2, 2);\n            var m2 = EigenMatrix.Series(2, 2);\n\n            var m = new EigenMatrix(0, 2, 4, 6);\n\n            AssertX.AlmostEqual(m, m1 + m2);\n        }\n\n        [TestMethod]\n        public void MatrixSub()\n        {\n            var m1 = EigenMatrix.Series(2, 2);\n            var m2 = EigenMatrix.Series(2, 2);\n\n            var m = new EigenMatrix(0, 0, 0, 0);\n\n            AssertX.AlmostEqual(m, m1 - m2);\n        }\n\n        [TestMethod]\n        public void EigenValues()\n        {\n            var m = new EigenMatrix(1, 2, 2, 3);\n\n            if(m.EigenValues(out EigenColumnVector values))\n            {\n                values.Round(2);\n                AssertX.AlmostEqual(new EigenColumnVector(-0.24, 4.24), values);\n            }\n            else\n            {\n                throw new Exception(\"Failed to find eigen values.\");\n            }\n        }\n\n        [TestMethod]\n        public void EigenVectors()\n        {\n            var m = new EigenMatrix(1, 2, 2, 3);\n\n            if (m.EigenVectors(out EigenMatrix vectors))\n            {\n                vectors.Round(3);\n                AssertX.AlmostEqual(new EigenMatrix(-0.851, -0.526, 0.526, -0.851), vectors);\n            }\n            else\n            {\n                throw new Exception(\"Failed to find eigen values.\");\n            }\n        }\n\n        [TestMethod]\n        public void EigenValuesVectors()\n        {\n            var m = new EigenMatrix(1, 2, 2, 3);\n\n            if (m.EigenValuesAndVectors(out EigenColumnVector values, out EigenMatrix vectors))\n            {\n                values.Round(2);\n                AssertX.AlmostEqual(new EigenColumnVector(-0.24, 4.24), values);\n\n                vectors.Round(3);\n                AssertX.AlmostEqual(new EigenMatrix(-0.851, -0.526, 0.526, -0.851), vectors);\n            }\n            else\n            {\n                throw new Exception(\"Failed to find eigen values and vectors.\");\n            }\n        }\n\n        [TestMethod]\n        public void ColPivHouseholderQr()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.ColPivHouseholderQr(b1);\n            x1.Round(2);\n\n            var x2 = A.ColPivHouseholderQr(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        /*\n        [TestMethod]\n        public void PartialPivLu()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.PartialPivLu(b1);\n            x1.Round(2);\n\n            var x2 = A.PartialPivLu(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n        */\n\n        [TestMethod]\n        public void FullPivLu()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.FullPivLu(b1);\n            x1.Round(2);\n\n            var x2 = A.FullPivLu(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        [TestMethod]\n        public void HouseholderQr()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.HouseholderQr(b1);\n            x1.Round(2);\n\n            var x2 = A.HouseholderQr(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        /*\n        [TestMethod]\n        public void LLT()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.LLT(b1);\n            x1.Round(2);\n\n            var x2 = A.LLT(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        [TestMethod]\n        public void LDLT()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.LDLT(b1);\n            x1.Round(2);\n\n            var x2 = A.LDLT(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n        */\n\n        [TestMethod]\n        public void BdcSvd()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.BdcSvd(b1);\n            x1.Round(2);\n\n            var x2 = A.BdcSvd(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        [TestMethod]\n        public void JacobiSvd()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.JacobiSvd(b1);\n            x1.Round(2);\n\n            var x2 = A.JacobiSvd(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        [TestMethod]\n        public void FullPivHouseholderQR()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.FullPivHouseholderQR(b1);\n            x1.Round(2);\n\n            var x2 = A.FullPivHouseholderQR(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n        [TestMethod]\n        public void CompleteOrthogonalDecomposition()\n        {\n            var A = new EigenMatrix(3, 3);\n            A.SetRow(0, 1, 2, 3);\n            A.SetRow(1, 4, 5, 6);\n            A.SetRow(2, 7, 8, 10);\n\n            var b1 = new EigenColumnVector(3, 3, 4);\n\n            var b2 = new EigenMatrix(3, 1);\n            b2.SetColumn(0, 3, 3, 4);\n\n            var x1 = A.CompleteOrthogonalDecomposition(b1);\n            x1.Round(2);\n\n            var x2 = A.CompleteOrthogonalDecomposition(b2);\n            x2.Round(2);\n\n            var x = new EigenColumnVector(-2, 1, 1);\n\n            AssertX.AlmostEqual(x, x1);\n            AssertX.AlmostEqual(x, x1);\n        }\n\n    }\n}"
  },
  {
    "path": "CGALDotNetTest/Geometry/Box2_EEK_Test.cs",
    "content": "﻿using CGALDotNet;\nusing CGALDotNet.Geometry;\nusing CGALDotNetGeometry.Numerics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Box2_EEK_Test\n    {\n        [TestMethod]\n        public void CreateBox()\n        {\n            var min = new Point2d(-1, -2);\n            var max = new Point2d(1, 2);\n            var box = new Box2<EEK>(min, max);\n\n            Assert.AreEqual(new Point2d(-1, -2), box.Min);\n            Assert.AreEqual(new Point2d(1, 2), box.Max);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var box = new Box2<EEK>(-1, -1);\n            box.Dispose();\n\n            Assert.IsTrue(box.IsDisposed);\n        }\n\n        [TestMethod]\n        public void GetMinMax()\n        {\n            var min = new Point2d(-1, -3);\n            var max = new Point2d(1, 3);\n\n            var box = new Box2<EEK>(min, max);\n\n            Assert.AreEqual(min, box.Min);\n            Assert.AreEqual(max, box.Max);\n        }\n\n        [TestMethod]\n        public void SetMinMax()\n        {\n            var min = new Point2d(-1, -3);\n            var max = new Point2d(1, 3);\n\n            var box = new Box2<EEK>(min, max);\n\n            box.Min = new Point2d(0, 1);\n            box.Max = new Point2d(2, 4);\n\n            Assert.AreEqual(new Point2d(0, 1), box.Min);\n            Assert.AreEqual(new Point2d(2, 4), box.Max);\n        }\n\n        [TestMethod]\n        public void Area()\n        {\n            var box = new Box2<EEK>(-1, 1);\n\n            Assert.AreEqual(4, box.Area);\n        }\n\n        [TestMethod]\n        public void BoundedSide()\n        {\n            var p1 = new Point2d(-2, -2);\n            var p2 = new Point2d(-1, 0);\n            var p3 = new Point2d(0, 0);\n\n            var box = new Box2<EEK>(-1, 1);\n\n            Assert.AreEqual(BOUNDED_SIDE.ON_UNBOUNDED_SIDE, box.BoundedSide(p1));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDARY, box.BoundedSide(p2));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDED_SIDE, box.BoundedSide(p3));\n        }\n\n        [TestMethod]\n        public void ContainsPoint()\n        {\n            var p1 = new Point2d(-2, -2);\n            var p2 = new Point2d(-1, 0);\n            var p3 = new Point2d(0, 0);\n\n            var box = new Box2<EEK>(-1, 1);\n\n            Assert.IsFalse(box.ContainsPoint(p1));\n            Assert.IsTrue(box.ContainsPoint(p2));\n            Assert.IsTrue(box.ContainsPoint(p2, true));\n            Assert.IsTrue(box.ContainsPoint(p3));\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n            var box = new Box2<EEK>(0, 0);\n            Assert.IsTrue(box.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n            var box = new Box2<EEK>(-1, 1);\n            box.Translate(new Point2d(1, 1));\n\n            Assert.AreEqual(new Point2d(0, 0), box.Min);\n            Assert.AreEqual(new Point2d(2, 2), box.Max);\n\n            box = new Box2<EEK>(-1, 1);\n            box.Scale(2);\n\n            Assert.AreEqual(new Point2d(-2, -2), box.Min);\n            Assert.AreEqual(new Point2d(2, 2), box.Max);\n\n            box = new Box2<EEK>(-1, 1);\n            box.Rotate(new Degree(90));\n            box.Round(2);\n\n            Assert.AreEqual(new Point2d(-1, -1), box.Min);\n            Assert.AreEqual(new Point2d(1, 1), box.Max);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var box = new Box2<EEK>(-1, 1);\n            var box2 = box.Copy();\n\n            Assert.AreNotEqual(box.Ptr, box2.Ptr);\n            Assert.AreEqual(new Point2d(-1, -1), box2.Min);\n            Assert.AreEqual(new Point2d(1, 1), box2.Max);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var box1 = new Box2<EEK>(-1, 1);\n            var box2 = box1.Convert<EIK>();\n\n            Assert.AreNotEqual(box1.Ptr, box2.Ptr);\n            Assert.AreEqual(new Point2d(-1, -1), box2.Min);\n            Assert.AreEqual(new Point2d(1, 1), box2.Max);\n            Assert.AreEqual(\"EIK\", box2.KernelName);\n        }\n\n        [TestMethod]\n        public void Shape()\n        {\n            var box = new Box2<EEK>(-1, 1);\n            var shape = box.Shape;\n\n            Assert.AreEqual(new Point2d(-1, -1), shape.Min);\n            Assert.AreEqual(new Point2d(1, 1), shape.Max);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new Point2d(0.1);\n            var p2 = new Point2d(0.01);\n            var p3 = new Point2d(0.001);\n            var p4 = new Point2d(0.0001);\n            var p5 = new Point2d(0.00001);\n            var p6 = new Point2d(0.000001);\n            var p7 = new Point2d(0.0000001);\n            var p8 = new Point2d(0.00000001);\n\n            var box1 = new Box2<EEK>(p1, p1);\n            var box2 = new Box2<EEK>(p2, p2);\n            var box3 = new Box2<EEK>(p3, p3);\n            var box4 = new Box2<EEK>(p4, p4);\n            var box5 = new Box2<EEK>(p5, p5);\n            var box6 = new Box2<EEK>(p6, p6);\n            var box7 = new Box2<EEK>(p7, p7);\n            var box8 = new Box2<EEK>(p8, p8);\n\n            box1.Round(1);\n            box2.Round(2);\n            box3.Round(3);\n            box4.Round(4);\n            box5.Round(5);\n            box6.Round(6);\n            box7.Round(7);\n            box8.Round(8);\n\n            AssertX.AlmostEqual(0.1, box1.Min.x);\n            AssertX.AlmostEqual(0.01, box2.Min.x);\n            AssertX.AlmostEqual(0.001, box3.Min.x);\n            AssertX.AlmostEqual(0.0001, box4.Min.x);\n            AssertX.AlmostEqual(0.00001, box5.Min.x);\n            AssertX.AlmostEqual(0.000001, box6.Min.x);\n            AssertX.AlmostEqual(0.0000001, box7.Min.x);\n            AssertX.AlmostEqual(0.00000001, box8.Min.x);\n        }\n    }\n}"
  },
  {
    "path": "CGALDotNetTest/Geometry/Box2_EIK_Test.cs",
    "content": "﻿using CGALDotNet;\nusing CGALDotNet.Geometry;\nusing CGALDotNetGeometry.Numerics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Box2_EIK_Test\n    {\n        [TestMethod]\n        public void CreateBox()\n        {\n            var min = new Point2d(-1, -2);\n            var max = new Point2d(1, 2);\n            var box = new Box2<EIK>(min, max);\n\n            Assert.AreEqual(new Point2d(-1, -2), box.Min);\n            Assert.AreEqual(new Point2d(1, 2), box.Max);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var box = new Box2<EIK>(-1, -1);\n            box.Dispose();\n\n            Assert.IsTrue(box.IsDisposed);\n        }\n\n        [TestMethod]\n        public void GetMinMax()\n        {\n            var min = new Point2d(-1, -3);\n            var max = new Point2d(1, 3);\n\n            var box = new Box2<EIK>(min, max);\n\n            Assert.AreEqual(min, box.Min);\n            Assert.AreEqual(max, box.Max);\n        }\n\n        [TestMethod]\n        public void SetMinMax()\n        {\n            var min = new Point2d(-1, -3);\n            var max = new Point2d(1, 3);\n\n            var box = new Box2<EIK>(min, max);\n\n            box.Min = new Point2d(0, 1);\n            box.Max = new Point2d(2, 4);\n\n            Assert.AreEqual(new Point2d(0, 1), box.Min);\n            Assert.AreEqual(new Point2d(2, 4), box.Max);\n        }\n\n        [TestMethod]\n        public void Area()\n        {\n            var box = new Box2<EIK>(-1, 1);\n\n            Assert.AreEqual(4, box.Area);\n        }\n\n        [TestMethod]\n        public void BoundedSide()\n        {\n            var p1 = new Point2d(-2, -2);\n            var p2 = new Point2d(-1, 0);\n            var p3 = new Point2d(0, 0);\n\n            var box = new Box2<EIK>(-1, 1);\n\n            Assert.AreEqual(BOUNDED_SIDE.ON_UNBOUNDED_SIDE, box.BoundedSide(p1));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDARY, box.BoundedSide(p2));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDED_SIDE, box.BoundedSide(p3));\n        }\n\n        [TestMethod]\n        public void ContainsPoint()\n        {\n            var p1 = new Point2d(-2, -2);\n            var p2 = new Point2d(-1, 0);\n            var p3 = new Point2d(0, 0);\n\n            var box = new Box2<EIK>(-1, 1);\n\n            Assert.IsFalse(box.ContainsPoint(p1));\n            Assert.IsTrue(box.ContainsPoint(p2));\n            Assert.IsTrue(box.ContainsPoint(p2, true));\n            Assert.IsTrue(box.ContainsPoint(p3));\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n            var box = new Box2<EIK>(0, 0);\n            Assert.IsTrue(box.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n            var box = new Box2<EIK>(-1, 1);\n            box.Translate(new Point2d(1, 1));\n\n            Assert.AreEqual(new Point2d(0, 0), box.Min);\n            Assert.AreEqual(new Point2d(2, 2), box.Max);\n\n            box = new Box2<EIK>(-1, 1);\n            box.Scale(2);\n\n            Assert.AreEqual(new Point2d(-2, -2), box.Min);\n            Assert.AreEqual(new Point2d(2, 2), box.Max);\n\n            box = new Box2<EIK>(-1, 1);\n            box.Rotate(new Degree(90));\n            box.Round(2);\n\n            Assert.AreEqual(new Point2d(-1, -1), box.Min);\n            Assert.AreEqual(new Point2d(1, 1), box.Max);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var box = new Box2<EIK>(-1, 1);\n            var box2 = box.Copy();\n\n            Assert.AreNotEqual(box.Ptr, box2.Ptr);\n            Assert.AreEqual(new Point2d(-1, -1), box2.Min);\n            Assert.AreEqual(new Point2d(1, 1), box2.Max);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var box1 = new Box2<EIK>(-1, 1);\n            var box2 = box1.Convert<EEK>();\n\n            Assert.AreNotEqual(box1.Ptr, box2.Ptr);\n            Assert.AreEqual(new Point2d(-1, -1), box2.Min);\n            Assert.AreEqual(new Point2d(1, 1), box2.Max);\n            Assert.AreEqual(\"EEK\", box2.KernelName);\n        }\n\n        [TestMethod]\n        public void Shape()\n        {\n            var box = new Box2<EIK>(-1, 1);\n            var shape = box.Shape;\n\n            Assert.AreEqual(new Point2d(-1, -1), shape.Min);\n            Assert.AreEqual(new Point2d(1, 1), shape.Max);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new Point2d(0.1);\n            var p2 = new Point2d(0.01);\n            var p3 = new Point2d(0.001);\n            var p4 = new Point2d(0.0001);\n            var p5 = new Point2d(0.00001);\n            var p6 = new Point2d(0.000001);\n            var p7 = new Point2d(0.0000001);\n            var p8 = new Point2d(0.00000001);\n\n            var box1 = new Box2<EIK>(p1, p1);\n            var box2 = new Box2<EIK>(p2, p2);\n            var box3 = new Box2<EIK>(p3, p3);\n            var box4 = new Box2<EIK>(p4, p4);\n            var box5 = new Box2<EIK>(p5, p5);\n            var box6 = new Box2<EIK>(p6, p6);\n            var box7 = new Box2<EIK>(p7, p7);\n            var box8 = new Box2<EIK>(p8, p8);\n\n            box1.Round(1);\n            box2.Round(2);\n            box3.Round(3);\n            box4.Round(4);\n            box5.Round(5);\n            box6.Round(6);\n            box7.Round(7);\n            box8.Round(8);\n\n            AssertX.AlmostEqual(0.1, box1.Min.x);\n            AssertX.AlmostEqual(0.01, box2.Min.x);\n            AssertX.AlmostEqual(0.001, box3.Min.x);\n            AssertX.AlmostEqual(0.0001, box4.Min.x);\n            AssertX.AlmostEqual(0.00001, box5.Min.x);\n            AssertX.AlmostEqual(0.000001, box6.Min.x);\n            AssertX.AlmostEqual(0.0000001, box7.Min.x);\n            AssertX.AlmostEqual(0.00000001, box8.Min.x);\n        }\n    }\n}"
  },
  {
    "path": "CGALDotNetTest/Geometry/HPoint2_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class HPoint2_EEK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint()\n        {\n            var p = new HPoint2<EEK>(1, 2, 1);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void SetXY()\n        {\n            var p = new HPoint2<EEK>(1, 2, 1);\n\n            p.x = 3;\n            p.y = 4;\n            //p.w = 2;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n            //AssertX.AlmostEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var p = new HPoint2<EEK>(0, 0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp()\n        {\n            var p = new HPoint2<EEK>(-1, 4, 1);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Clamp01()\n        {\n            var p = new HPoint2<EEK>(-0.1, 3.2, 2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new HPoint2<EEK>(0.1);\n            var p2 = new HPoint2<EEK>(0.01);\n            var p3 = new HPoint2<EEK>(0.001);\n            var p4 = new HPoint2<EEK>(0.0001);\n            var p5 = new HPoint2<EEK>(0.00001);\n            var p6 = new HPoint2<EEK>(0.000001);\n            var p7 = new HPoint2<EEK>(0.0000001);\n            var p8 = new HPoint2<EEK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.y);\n            AssertX.AlmostEqual(0.001, p3.y);\n            AssertX.AlmostEqual(0.0001, p4.y);\n            AssertX.AlmostEqual(0.00001, p5.y);\n            AssertX.AlmostEqual(0.000001, p6.y);\n            AssertX.AlmostEqual(0.0000001, p7.y);\n            AssertX.AlmostEqual(0.00000001, p8.y);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var p = new HPoint2<EEK>(3, 4, 1);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n            //Assert.AreEqual(1, p2.w);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var p1 = new HPoint2<EEK>(1, 2);\n            var p2 = p1.Convert<EEK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EEK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/HPoint2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class HPoint2_EIK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint()\n        {\n            var p = new HPoint2<EIK>(1, 2, 1);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void SetXY()\n        {\n            var p = new HPoint2<EIK>(1, 2, 1);\n\n            p.x = 3;\n            p.y = 4;\n            //p.w = 2;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n            //AssertX.AlmostEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var p = new HPoint2<EIK>(0, 0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp()\n        {\n            var p = new HPoint2<EIK>(-1, 4, 1);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Clamp01()\n        {\n            var p = new HPoint2<EIK>(-0.1, 3.2, 2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n            //Assert.AreEqual(1, p.w);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new HPoint2<EIK>(0.1);\n            var p2 = new HPoint2<EIK>(0.01);\n            var p3 = new HPoint2<EIK>(0.001);\n            var p4 = new HPoint2<EIK>(0.0001);\n            var p5 = new HPoint2<EIK>(0.00001);\n            var p6 = new HPoint2<EIK>(0.000001);\n            var p7 = new HPoint2<EIK>(0.0000001);\n            var p8 = new HPoint2<EIK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.y);\n            AssertX.AlmostEqual(0.001, p3.y);\n            AssertX.AlmostEqual(0.0001, p4.y);\n            AssertX.AlmostEqual(0.00001, p5.y);\n            AssertX.AlmostEqual(0.000001, p6.y);\n            AssertX.AlmostEqual(0.0000001, p7.y);\n            AssertX.AlmostEqual(0.00000001, p8.y);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var p = new HPoint2<EIK>(3, 4, 1);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n            //Assert.AreEqual(1, p2.w);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var p1 = new HPoint2<EIK>(1, 2);\n            var p2 = p1.Convert<EEK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EEK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Line2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Line2_EIK_Test\n    {\n        [TestMethod]\n        public void Create()\n        {\n\n        }\n\n        [TestMethod]\n        public void CreateFromPoints()\n        {\n\n        }\n\n        [TestMethod]\n        public void CreateFromPointVector()\n        {\n\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n\n        }\n\n        [TestMethod]\n        public void Set()\n        {\n\n        }\n\n        [TestMethod]\n        public void Get()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsHorizontal()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsVertical()\n        {\n\n        }\n\n        [TestMethod]\n        public void HasOn()\n        {\n\n        }\n\n        [TestMethod]\n        public void HasOnNegativeSide()\n        {\n\n        }\n\n        [TestMethod]\n        public void HasOnPositiveSide()\n        {\n\n        }\n\n        [TestMethod]\n        public void Opposite()\n        {\n\n        }\n\n        [TestMethod]\n        public void Perpendicular()\n        {\n\n        }\n\n        [TestMethod]\n        public void X_On_Y()\n        {\n\n        }\n\n        [TestMethod]\n        public void Y_On_X()\n        {\n\n        }\n\n        [TestMethod]\n        public void Vector()\n        {\n\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Point2_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class Point2_EEK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint_EEK()\n        {\n            var p = new Point2<EEK>(1, 2);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n        }\n\n        [TestMethod]\n        public void SetXY_EEK()\n        {\n            var p = new Point2<EEK>(1, 2);\n\n            p.x = 3;\n            p.y = 4;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n        }\n\n        [TestMethod]\n        public void Release_EEK()\n        {\n            var p = new Point2<EEK>(0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp_EEK()\n        {\n            var p = new Point2<EEK>(-1, 4);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n        }\n\n        [TestMethod]\n        public void Clamp01_EEK()\n        {\n            var p = new Point2<EEK>(-0.1, 3.2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n        }\n\n        [TestMethod]\n        public void Round_EEK()\n        {\n            var p1 = new Point2<EEK>(0.1);\n            var p2 = new Point2<EEK>(0.01);\n            var p3 = new Point2<EEK>(0.001);\n            var p4 = new Point2<EEK>(0.0001);\n            var p5 = new Point2<EEK>(0.00001);\n            var p6 = new Point2<EEK>(0.000001);\n            var p7 = new Point2<EEK>(0.0000001);\n            var p8 = new Point2<EEK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.x);\n            AssertX.AlmostEqual(0.001, p3.x);\n            AssertX.AlmostEqual(0.0001, p4.x);\n            AssertX.AlmostEqual(0.00001, p5.x);\n            AssertX.AlmostEqual(0.000001, p6.x);\n            AssertX.AlmostEqual(0.0000001, p7.x);\n            AssertX.AlmostEqual(0.00000001, p8.x);\n        }\n\n        [TestMethod]\n        public void Copy_EEK()\n        {\n            var p = new Point2<EEK>(3, 4);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n        }\n\n        [TestMethod]\n        public void Convert_EEK()\n        {\n            var p1 = new Point2<EEK>(1, 2);\n            var p2 = p1.Convert<EEK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EEK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Point2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class Point2_EIK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint_EIK()\n        {\n            var p = new Point2<EIK>(1, 2);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n        }\n\n        [TestMethod]\n        public void SetXY_EIK()\n        {\n            var p = new Point2<EIK>(1, 2);\n\n            p.x = 3;\n            p.y = 4;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n        }\n\n        [TestMethod]\n        public void Release_EIK()\n        {\n            var p = new Point2<EIK>(0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp_EIK()\n        {\n            var p = new Point2<EIK>(-1, 4);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n        }\n\n        [TestMethod]\n        public void Clamp01_EIK()\n        {\n            var p = new Point2<EIK>(-0.1, 3.2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n        }\n\n        [TestMethod]\n        public void Round_EIK()\n        {\n            var p1 = new Point2<EIK>(0.1);\n            var p2 = new Point2<EIK>(0.01);\n            var p3 = new Point2<EIK>(0.001);\n            var p4 = new Point2<EIK>(0.0001);\n            var p5 = new Point2<EIK>(0.00001);\n            var p6 = new Point2<EIK>(0.000001);\n            var p7 = new Point2<EIK>(0.0000001);\n            var p8 = new Point2<EIK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.x);\n            AssertX.AlmostEqual(0.001, p3.x);\n            AssertX.AlmostEqual(0.0001, p4.x);\n            AssertX.AlmostEqual(0.00001, p5.x);\n            AssertX.AlmostEqual(0.000001, p6.x);\n            AssertX.AlmostEqual(0.0000001, p7.x);\n            AssertX.AlmostEqual(0.00000001, p8.x);\n        }\n\n        [TestMethod]\n        public void Copy_EIK()\n        {\n            var p = new Point2<EIK>(3, 4);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n        }\n\n        [TestMethod]\n        public void Convert_EIK()\n        {\n            var p1 = new Point2<EIK>(1,2);\n            var p2 = p1.Convert<EEK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EEK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Ray2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Ray2_EIK_Test\n    {\n        [TestMethod]\n        public void Create()\n        {\n\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsHorizontal()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsVertical()\n        {\n\n        }\n\n        [TestMethod]\n        public void HasOn()\n        {\n\n        }\n\n        [TestMethod]\n        public void Source()\n        {\n\n        }\n\n        [TestMethod]\n        public void Vector()\n        {\n\n        }\n\n        [TestMethod]\n        public void Opposite()\n        {\n\n        }\n\n        [TestMethod]\n        public void Line()\n        {\n\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Segment2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Segment2_EIK_Test\n    {\n        [TestMethod]\n        public void Create()\n        {\n\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n\n        }\n\n        [TestMethod]\n        public void Get()\n        {\n\n        }\n\n        [TestMethod]\n        public void Set()\n        {\n\n        }\n\n        [TestMethod]\n        public void Min()\n        {\n\n        }\n\n        [TestMethod]\n        public void Max()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsHorizontal()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsVertical()\n        {\n\n        }\n\n        [TestMethod]\n        public void HasOn()\n        {\n\n        }\n\n        [TestMethod]\n        public void Vector()\n        {\n\n        }\n\n        [TestMethod]\n        public void Line()\n        {\n\n        }\n\n        [TestMethod]\n        public void SqrLength()\n        {\n\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Triangle2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n    [TestClass]\n    public class Triangle2_EIK_Test\n    {\n        [TestMethod]\n        public void Create()\n        {\n\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n\n        }\n\n        [TestMethod]\n        public void Get()\n        {\n\n        }\n\n        [TestMethod]\n        public void Set()\n        {\n\n        }\n\n        [TestMethod]\n        public void Area()\n        {\n\n        }\n\n        [TestMethod]\n        public void BoundedSide()\n        {\n\n        }\n\n        [TestMethod]\n        public void OrientedSide()\n        {\n\n        }\n\n        [TestMethod]\n        public void Orientation()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsDegenerate()\n        {\n\n        }\n\n        [TestMethod]\n        public void Transform()\n        {\n\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Vector2_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class Vector2_EEK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint()\n        {\n            var p = new Vector2<EEK>(1, 2);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n        }\n\n        [TestMethod]\n        public void SetXY()\n        {\n            var p = new Vector2<EEK>(1, 2);\n\n            p.x = 3;\n            p.y = 4;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var p = new Vector2<EEK>(0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp()\n        {\n            var p = new Vector2<EEK>(-1, 4);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n        }\n\n        [TestMethod]\n        public void Clamp01()\n        {\n            var p = new Vector2<EEK>(-0.1, 3.2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new Vector2<EEK>(0.1);\n            var p2 = new Vector2<EEK>(0.01);\n            var p3 = new Vector2<EEK>(0.001);\n            var p4 = new Vector2<EEK>(0.0001);\n            var p5 = new Vector2<EEK>(0.00001);\n            var p6 = new Vector2<EEK>(0.000001);\n            var p7 = new Vector2<EEK>(0.0000001);\n            var p8 = new Vector2<EEK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.y);\n            AssertX.AlmostEqual(0.001, p3.y);\n            AssertX.AlmostEqual(0.0001, p4.y);\n            AssertX.AlmostEqual(0.00001, p5.y);\n            AssertX.AlmostEqual(0.000001, p6.y);\n            AssertX.AlmostEqual(0.0000001, p7.y);\n            AssertX.AlmostEqual(0.00000001, p8.y);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var p = new Vector2<EEK>(3, 4);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n        }\n\n        [TestMethod]\n        public void SqrMagnitude()\n        {\n            var p1 = new Vector2<EEK>(4, 0);\n            var p2 = new Vector2<EEK>(0, 2);\n\n            var sqlen1 = p1.SqrMagnitude;\n            var sqlen2 = p2.SqrMagnitude;\n\n            AssertX.AlmostEqual(16, sqlen1);\n            AssertX.AlmostEqual(4, sqlen2);\n        }\n\n        [TestMethod]\n        public void Magnitude()\n        {\n            var p1 = new Vector2<EEK>(4, 0);\n            var p2 = new Vector2<EEK>(0, 2);\n\n            var len1 = p1.Magnitude;\n            var len2 = p2.Magnitude;\n\n            AssertX.AlmostEqual(4, len1);\n            AssertX.AlmostEqual(2, len2);\n        }\n\n        [TestMethod]\n        public void Normalize()\n        {\n            var p1 = new Vector2<EEK>(4, 0);\n            var p2 = new Vector2<EEK>(0, 2);\n\n            p1.Normalize();\n            p2.Normalize();\n\n            AssertX.AlmostEqual(1, p1.Magnitude);\n            AssertX.AlmostEqual(1, p2.Magnitude);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var p1 = new Vector2<EEK>(1, 2);\n            var p2 = p1.Convert<EIK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EIK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Geometry/Vector2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Geometry;\n\nnamespace CGALDotNetTest.Geometry\n{\n\n    [TestClass]\n    public class Vector2_EIK_Test\n    {\n\n        [TestMethod]\n        public void CreatePoint()\n        {\n            var p = new Vector2<EIK>(1, 2);\n\n            Assert.AreEqual(1, p.x);\n            Assert.AreEqual(2, p.y);\n        }\n\n        [TestMethod]\n        public void SetXY()\n        {\n            var p = new Vector2<EIK>(1, 2);\n\n            p.x = 3;\n            p.y = 4;\n\n            AssertX.AlmostEqual(3, p.x);\n            AssertX.AlmostEqual(4, p.y);\n        }\n\n        [TestMethod]\n        public void Release()\n        {\n            var p = new Vector2<EIK>(0, 0);\n            p.Dispose();\n\n            Assert.IsTrue(p.IsDisposed);\n        }\n\n        [TestMethod]\n        public void Clamp()\n        {\n            var p = new Vector2<EIK>(-1, 4);\n\n            p.Clamp(0, 3);\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(3, p.y);\n        }\n\n        [TestMethod]\n        public void Clamp01()\n        {\n            var p = new Vector2<EIK>(-0.1, 3.2);\n\n            p.Clamp01();\n\n            Assert.AreEqual(0, p.x);\n            Assert.AreEqual(1, p.y);\n        }\n\n        [TestMethod]\n        public void Round()\n        {\n            var p1 = new Vector2<EIK>(0.1);\n            var p2 = new Vector2<EIK>(0.01);\n            var p3 = new Vector2<EIK>(0.001);\n            var p4 = new Vector2<EIK>(0.0001);\n            var p5 = new Vector2<EIK>(0.00001);\n            var p6 = new Vector2<EIK>(0.000001);\n            var p7 = new Vector2<EIK>(0.0000001);\n            var p8 = new Vector2<EIK>(0.00000001);\n\n            p1.Round(1);\n            p2.Round(2);\n            p3.Round(3);\n            p4.Round(4);\n            p5.Round(5);\n            p6.Round(6);\n            p7.Round(7);\n            p8.Round(8);\n\n            AssertX.AlmostEqual(0.1, p1.x);\n            AssertX.AlmostEqual(0.01, p2.y);\n            AssertX.AlmostEqual(0.001, p3.y);\n            AssertX.AlmostEqual(0.0001, p4.y);\n            AssertX.AlmostEqual(0.00001, p5.y);\n            AssertX.AlmostEqual(0.000001, p6.y);\n            AssertX.AlmostEqual(0.0000001, p7.y);\n            AssertX.AlmostEqual(0.00000001, p8.y);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var p = new Vector2<EIK>(3, 4);\n            var p2 = p.Copy();\n\n            Assert.AreNotEqual(p.Ptr, p2.Ptr);\n            Assert.AreEqual(3, p2.x);\n            Assert.AreEqual(4, p2.y);\n        }\n\n        [TestMethod]\n        public void SqrMagnitude()\n        {\n            var p1 = new Vector2<EIK>(4, 0);\n            var p2 = new Vector2<EIK>(0, 2);\n\n            var sqlen1 = p1.SqrMagnitude;\n            var sqlen2 = p2.SqrMagnitude;\n\n            AssertX.AlmostEqual(16, sqlen1);\n            AssertX.AlmostEqual(4, sqlen2);\n        }\n\n        [TestMethod]\n        public void Magnitude()\n        {\n            var p1 = new Vector2<EIK>(4, 0);\n            var p2 = new Vector2<EIK>(0, 2);\n\n            var len1 = p1.Magnitude;\n            var len2 = p2.Magnitude;\n\n            AssertX.AlmostEqual(4, len1);\n            AssertX.AlmostEqual(2, len2);\n        }\n\n        [TestMethod]\n        public void Normalize()\n        {\n            var p1 = new Vector2<EIK>(4, 0);\n            var p2 = new Vector2<EIK>(0, 2);\n\n            p1.Normalize();\n            p2.Normalize();\n\n            AssertX.AlmostEqual(1, p1.Magnitude);\n            AssertX.AlmostEqual(1, p2.Magnitude);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var p1 = new Vector2<EIK>(1, 2);\n            var p2 = p1.Convert<EEK>();\n\n            Assert.AreNotEqual(p1.Ptr, p2.Ptr);\n            Assert.AreEqual(1, p2.x);\n            Assert.AreEqual(2, p2.y);\n            Assert.AreEqual(\"EEK\", p2.KernelName);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polygons/Polygon2_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNetTest.Polygons\n{\n\n    [TestClass]\n    public class Polygon2_EEK_Test\n    {\n\n        [TestMethod]\n        public void CreatePolygon()\n        {\n            var poly = new Polygon2<EEK>();\n\n            Assert.AreEqual(0, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void ReleasePolygon()\n        {\n            var poly = new Polygon2<EEK>();\n            poly.Dispose();\n\n            Assert.IsTrue(poly.IsDisposed);\n        }\n\n        [TestMethod]\n        public void CreateSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(5, 0),\n                new Point2d(5, 5),\n                new Point2d(0, 5)\n            };\n\n            var poly = new Polygon2<EEK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n            Assert.IsTrue(poly.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void CreateConcavePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0,0),\n                new Point2d(5.1,0),\n                new Point2d(1,1),\n                new Point2d(0.5,6)\n            };\n\n            var poly = new Polygon2<EEK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n            Assert.IsFalse(poly.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void CreateNonSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(8, 4),\n                new Point2d(8, 0),\n                new Point2d(0, 4),\n            };\n\n            var poly = new Polygon2<EEK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.ZERO);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.ZERO);\n\n        }\n\n        [TestMethod]\n        public void ArrayAcessor()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(new Point2d(-1, -1), poly[0]);\n\n            poly[0] = new Point2d(-2, -2);\n            Assert.AreEqual(new Point2d(-2, -2), poly[0]);\n        }\n\n        [TestMethod]\n        public void Clear()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(4, poly.Count);\n\n            poly.Clear();\n            Assert.AreEqual(0, poly.Count);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n            var copy = poly.Copy();\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(4, copy.Count);\n\n            for (int i = 0; i < poly.Count; i++)\n                Assert.AreEqual(poly[i], copy[i]);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n            var poly2 = poly.Convert<EIK>();\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(4, poly2.Count);\n            Assert.AreEqual(\"EIK\", poly2.KernelName);\n\n            for (int i = 0; i < poly.Count; i++)\n                AssertX.AlmostEqual(poly[i], poly2[i]);\n        }\n\n        [TestMethod]\n        public void GetPoint()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPoint(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPoint(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPoint(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPoint(3));\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointClamped(-1));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointClamped(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPointClamped(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPointClamped(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointClamped(3));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointClamped(4));\n\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointWrapped(-1));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointWrapped(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPointWrapped(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPointWrapped(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointWrapped(3));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointWrapped(4));\n        }\n\n        [TestMethod]\n        public void GetPoints()\n        {\n            var expected = new Point2d[]\n            {\n                new Point2d(-1, -1),\n                new Point2d(1, -1),\n                new Point2d(1, 1),\n                new Point2d(-1, 1)\n            };\n\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            var points = new Point2d[4];\n            poly.GetPoints(points, points.Length);\n\n            CollectionAssert.AreEqual(expected, points);\n        }\n\n        [TestMethod]\n        public void GetSegments()\n        {\n            var p0 = new Point2d(-1, -1);\n            var p1 = new Point2d(1, -1);\n            var p2 = new Point2d(1, 1);\n            var p3 = new Point2d(-1, 1);\n\n            var expected = new Segment2d[]\n            {\n                new Segment2d(p0, p1),\n                new Segment2d(p1, p2),\n                new Segment2d(p2, p3),\n                new Segment2d(p3, p0)\n            };\n\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            var segments = new Segment2d[4];\n            poly.GetSegments(segments, segments.Length);\n\n            CollectionAssert.AreEqual(expected, segments);\n        }\n\n        [TestMethod]\n        public void SetPoint()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            var p0 = new Point2d(2, 3);\n            var p3 = new Point2d(4, 5);\n\n            poly.SetPoint(0, p0);\n            poly.SetPoint(3, p3);\n\n            Assert.AreEqual(p0, poly.GetPoint(0));\n            Assert.AreEqual(p3, poly.GetPoint(3));\n        }\n\n        [TestMethod]\n        public void SetPoints()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            var expected = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(4, -2),\n                new Point2d(4, 2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2)\n            };\n\n            poly.SetPoints(expected, expected.Length);\n\n            var points = new Point2d[6];\n            poly.GetPoints(points, points.Length);\n\n            CollectionAssert.AreEqual(expected, points);\n        }\n\n        [TestMethod]\n        public void Reverse()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.Orientation);\n            Assert.AreEqual(CLOCK_DIR.COUNTER_CLOCKWISE, poly.ClockDir);\n            Assert.AreEqual(4.0, poly.FindSignedArea());\n\n            poly.Reverse();\n\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.Orientation);\n            Assert.AreEqual(CLOCK_DIR.CLOCKWISE, poly.ClockDir);\n            Assert.AreEqual(-4.0, poly.FindSignedArea());\n        }\n\n        [TestMethod]\n        public void FindBoudingBox()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            var box = poly.FindBoundingBox();\n\n            box.Round(2);\n\n            Assert.AreEqual(new Point2d(-1, -1), box.Min);\n            Assert.AreEqual(new Point2d(1, 1), box.Max);\n            Assert.AreEqual(2, box.Width);\n            Assert.AreEqual(2, box.Height);\n        }\n\n        [TestMethod]\n        public void FindIfSimple()\n        {\n            var poly = new Polygon2<EEK>();\n            var box = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.IsFalse(poly.FindIfSimple());\n            Assert.IsTrue(box.FindIfSimple());\n        }\n\n        [TestMethod]\n        public void FindIfConvex()\n        {\n            var poly = new Polygon2<EEK>();\n            var box = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.IsFalse(poly.FindIfConvex());\n            Assert.IsTrue(box.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void FindIfOrientation()\n        {\n            var poly = new Polygon2<EEK>();\n            var box = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(ORIENTATION.ZERO, poly.FindOrientation());\n            Assert.AreEqual(ORIENTATION.POSITIVE, box.FindOrientation());\n\n            box.Reverse();\n            Assert.AreEqual(ORIENTATION.NEGATIVE, box.FindOrientation());\n        }\n\n        [TestMethod]\n        public void OrientatedSide()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.AreEqual(ORIENTED_SIDE.ON_POSITIVE_SIDE, poly.OrientedSide(p1));\n            Assert.AreEqual(ORIENTED_SIDE.ON_NEGATIVE_SIDE, poly.OrientedSide(p2));\n            Assert.AreEqual(ORIENTED_SIDE.ON_BOUNDARY, poly.OrientedSide(p3));\n        }\n\n        [TestMethod]\n        public void BoundedSide()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDED_SIDE, poly.BoundedSide(p1));\n            Assert.AreEqual(BOUNDED_SIDE.ON_UNBOUNDED_SIDE, poly.BoundedSide(p2));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDARY, poly.BoundedSide(p3));\n        }\n\n        [TestMethod]\n        public void SignedArea()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(4.0, poly.FindSignedArea());\n            Assert.AreEqual(4.0, poly.FindArea());\n\n            poly.Reverse();\n            Assert.AreEqual(-4.0, poly.FindSignedArea());\n        }\n\n        [TestMethod]\n        public void ContainsPoint()\n        {\n            var poly = PolygonFactory<EEK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.IsTrue(poly.ContainsPoint(p1));\n            Assert.IsFalse(poly.ContainsPoint(p2));\n            Assert.IsTrue(poly.ContainsPoint(p3));\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polygons/Polygon2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNetTest.Polygons\n{\n\n    [TestClass]\n    public class Polygon2_EIK_Test\n    {\n\n        [TestMethod]\n        public void CreatePolygon()\n        {\n            var poly = new Polygon2<EIK>();\n\n            Assert.AreEqual(0, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void ReleasePolygon()\n        {\n            var poly = new Polygon2<EIK>();\n            poly.Dispose();\n\n            Assert.IsTrue(poly.IsDisposed);\n        }\n\n        [TestMethod]\n        public void CreateSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(5, 0),\n                new Point2d(5, 5),\n                new Point2d(0, 5)\n            };\n\n            var poly = new Polygon2<EIK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n            Assert.IsTrue(poly.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void CreateConcavePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0,0),\n                new Point2d(5.1,0),\n                new Point2d(1,1),\n                new Point2d(0.5,6)\n            };\n\n            var poly = new Polygon2<EIK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n            Assert.IsFalse(poly.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void CreateNonSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(8, 4),\n                new Point2d(8, 0),\n                new Point2d(0, 4),\n            };\n\n            var poly = new Polygon2<EIK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.ZERO);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.ZERO);\n\n        }\n\n        [TestMethod]\n        public void ArrayAcessor()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(new Point2d(-1, -1), poly[0]);\n\n            poly[0] = new Point2d(-2, -2);\n            Assert.AreEqual(new Point2d(-2, -2), poly[0]);\n        }\n\n        [TestMethod]\n        public void Clear()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(4, poly.Count);\n\n            poly.Clear();\n            Assert.AreEqual(0, poly.Count);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n            var copy = poly.Copy();\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(4, copy.Count);\n\n            for (int i = 0; i < poly.Count; i++)\n                Assert.AreEqual(poly[i], copy[i]);\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n            var poly2 = poly.Convert<EEK>();\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(4, poly2.Count);\n            Assert.AreEqual(\"EEK\", poly2.KernelName);\n\n            for (int i = 0; i < poly.Count; i++)\n                AssertX.AlmostEqual(poly[i], poly2[i]);\n        }\n\n        [TestMethod]\n        public void GetPoint()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPoint(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPoint(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPoint(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPoint(3));\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointClamped(-1));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointClamped(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPointClamped(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPointClamped(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointClamped(3));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointClamped(4));\n\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointWrapped(-1));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointWrapped(0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPointWrapped(1));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPointWrapped(2));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPointWrapped(3));\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPointWrapped(4));\n        }\n\n        [TestMethod]\n        public void GetPoints()\n        {\n            var expected = new Point2d[]\n            {\n                new Point2d(-1, -1),\n                new Point2d(1, -1),\n                new Point2d(1, 1),\n                new Point2d(-1, 1)\n            };\n\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            var points = new Point2d[4];\n            poly.GetPoints(points, points.Length);\n\n            CollectionAssert.AreEqual(expected, points);\n        }\n\n        [TestMethod]\n        public void GetSegments()\n        {\n            var p0 = new Point2d(-1, -1);\n            var p1 = new Point2d(1, -1);\n            var p2 = new Point2d(1, 1);\n            var p3 = new Point2d(-1, 1);\n\n            var expected = new Segment2d[]\n            {\n                new Segment2d(p0, p1),\n                new Segment2d(p1, p2),\n                new Segment2d(p2, p3),\n                new Segment2d(p3, p0)\n            };\n\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            var segments = new Segment2d[4];\n            poly.GetSegments(segments, segments.Length);\n\n            CollectionAssert.AreEqual(expected, segments);\n        }\n\n        [TestMethod]\n        public void SetPoint()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            var p0 = new Point2d(2, 3);\n            var p3 = new Point2d(4, 5);\n\n            poly.SetPoint(0, p0);\n            poly.SetPoint(3, p3);\n\n            Assert.AreEqual(p0, poly.GetPoint(0));\n            Assert.AreEqual(p3, poly.GetPoint(3));\n        }\n\n        [TestMethod]\n        public void SetPoints()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            var expected = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(4, -2),\n                new Point2d(4, 2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2)\n            };\n\n            poly.SetPoints(expected, expected.Length);\n\n            var points = new Point2d[6];\n            poly.GetPoints(points, points.Length);\n\n            CollectionAssert.AreEqual(expected, points);\n        }\n\n        [TestMethod]\n        public void Reverse()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.Orientation);\n            Assert.AreEqual(CLOCK_DIR.COUNTER_CLOCKWISE, poly.ClockDir);\n            Assert.AreEqual(4.0, poly.FindSignedArea());\n\n            poly.Reverse();\n\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.Orientation);\n            Assert.AreEqual(CLOCK_DIR.CLOCKWISE, poly.ClockDir);\n            Assert.AreEqual(-4.0, poly.FindSignedArea());\n        }\n\n        [TestMethod]\n        public void FindBoudingBox()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            var box = poly.FindBoundingBox();\n\n            box.Round(2);\n\n            Assert.AreEqual(new Point2d(-1, -1), box.Min);\n            Assert.AreEqual(new Point2d(1, 1), box.Max);\n            Assert.AreEqual(2, box.Width);\n            Assert.AreEqual(2, box.Height);\n        }\n\n        [TestMethod]\n        public void FindIfSimple()\n        {\n            var poly = new Polygon2<EIK>();\n            var box = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.IsFalse(poly.FindIfSimple());\n            Assert.IsTrue(box.FindIfSimple());\n        }\n\n        [TestMethod]\n        public void FindIfConvex()\n        {\n            var poly = new Polygon2<EIK>();\n            var box = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.IsFalse(poly.FindIfConvex());\n            Assert.IsTrue(box.FindIfConvex());\n        }\n\n        [TestMethod]\n        public void FindIfOrientation()\n        {\n            var poly = new Polygon2<EIK>();\n            var box = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(ORIENTATION.ZERO, poly.FindOrientation());\n            Assert.AreEqual(ORIENTATION.POSITIVE, box.FindOrientation());\n\n            box.Reverse();\n            Assert.AreEqual(ORIENTATION.NEGATIVE, box.FindOrientation());\n        }\n\n        [TestMethod]\n        public void OrientatedSide()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.AreEqual(ORIENTED_SIDE.ON_POSITIVE_SIDE, poly.OrientedSide(p1));\n            Assert.AreEqual(ORIENTED_SIDE.ON_NEGATIVE_SIDE, poly.OrientedSide(p2));\n            Assert.AreEqual(ORIENTED_SIDE.ON_BOUNDARY, poly.OrientedSide(p3));\n        }\n\n        [TestMethod]\n        public void BoundedSide()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDED_SIDE, poly.BoundedSide(p1));\n            Assert.AreEqual(BOUNDED_SIDE.ON_UNBOUNDED_SIDE, poly.BoundedSide(p2));\n            Assert.AreEqual(BOUNDED_SIDE.ON_BOUNDARY, poly.BoundedSide(p3));\n        }\n\n        [TestMethod]\n        public void SignedArea()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n\n            Assert.AreEqual(4.0, poly.FindSignedArea());\n            Assert.AreEqual(4.0, poly.FindArea());\n\n            poly.Reverse();\n            Assert.AreEqual(-4.0, poly.FindSignedArea());\n        }\n\n        [TestMethod]\n        public void ContainsPoint()\n        {\n            var poly = PolygonFactory<EIK>.CreateBox(-1, 1);\n            var p1 = new Point2d(0, 0);\n            var p2 = new Point2d(2, 2);\n            var p3 = new Point2d(1, 1);\n\n            Assert.IsTrue(poly.ContainsPoint(p1));\n            Assert.IsFalse(poly.ContainsPoint(p2));\n            Assert.IsTrue(poly.ContainsPoint(p3));\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polygons/PolygonWithHoles2_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Text;\nusing System.Diagnostics;\nusing System.Collections.Generic;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNetTest.Polygons\n{\n    [TestClass]\n    public class PolygonWithHoles2_EEK_Test\n    {\n\n\n        [TestMethod]\n        public void CreatePolygon()\n        {\n            var poly = new PolygonWithHoles2<EEK>();\n\n            Assert.AreEqual(0, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void ReleasePolygon()\n        {\n            var poly = new PolygonWithHoles2<EEK>();\n            poly.Dispose();\n\n            Assert.IsTrue(poly.IsDisposed);\n        }\n\n        [TestMethod]\n        public void CreateSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(5, 0),\n                new Point2d(5, 5),\n                new Point2d(0, 5)\n            };\n\n            var poly = new PolygonWithHoles2<EEK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsFalse(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n        }\n\n        [TestMethod]\n        public void CreateConcavePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0,0),\n                new Point2d(5.1,0),\n                new Point2d(1,1),\n                new Point2d(0.5,6)\n            };\n\n            var poly = new PolygonWithHoles2<EEK>(points);\n\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsFalse(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n        }\n\n        [TestMethod]\n        public void CreateNonSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(8, 4),\n                new Point2d(8, 0),\n                new Point2d(0, 4),\n            };\n\n            var poly = new PolygonWithHoles2<EEK>(points);\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.ZERO);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.ZERO);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var poly1 = PolygonFactory<EEK>.CreateDounut(5, 4, 8);\n            var poly2 = poly1.Copy();\n\n            Assert.AreEqual(poly1.Count, poly2.Count);\n            Assert.AreEqual(poly1.HoleCount, poly2.HoleCount);\n\n            for (int i = 0; i < poly1.Count; i++)\n            {\n                var p1 = poly1.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                var p2 = poly2.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                AssertX.AlmostEqual(p1, p2, 0);\n            }\n\n            for (int i = 0; i < poly1.HoleCount; i++)\n            {\n                var hole1 = poly1.GetHole(i);\n                var hole2 = poly2.GetHole(i);\n\n                for (int j = 0; j < hole1.Count; j++)\n                {\n                    var p1 = hole1.GetPoint(j);\n                    var p2 = hole2.GetPoint(j);\n                    AssertX.AlmostEqual(p1, p2, 0);\n                }\n            }\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var poly1 = PolygonFactory<EEK>.CreateDounut(5, 4, 8);\n            var poly2 = poly1.Convert<EIK>();\n\n            Assert.AreEqual(poly1.Count, poly2.Count);\n            Assert.AreEqual(poly1.HoleCount, poly2.HoleCount);\n            Assert.AreEqual(\"EIK\", poly2.KernelName);\n\n            for (int i = 0; i < poly1.Count; i++)\n            {\n                var p1 = poly1.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                var p2 = poly2.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                AssertX.AlmostEqual(p1, p2);\n            }\n\n            for (int i = 0; i < poly1.HoleCount; i++)\n            {\n                var hole1 = poly1.GetHole(i);\n                var hole2 = poly2.GetHole(i);\n\n                for (int j = 0; j < hole1.Count; j++)\n                {\n                    var p1 = hole1.GetPoint(j);\n                    var p2 = hole2.GetPoint(j);\n                    AssertX.AlmostEqual(p1, p2);\n                }\n            }\n        }\n\n        [TestMethod]\n        public void Clear()\n        {\n            var poly = PolygonFactory<EEK>.CreateDounut(2, 1, 4);\n\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.Clear();\n\n            Assert.IsTrue(poly.IsUnbounded);\n            Assert.AreEqual(0, poly.Count);\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void ClearHoles()\n        {\n            var poly = PolygonFactory<EEK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.ClearHoles();\n\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void PointCount()\n        {\n            var poly = PolygonFactory<EEK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(4, poly.PointCount(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(4, poly.PointCount(POLYGON_ELEMENT.HOLE, 0));\n        }\n\n        [TestMethod]\n        public void Remove()\n        {\n            var poly = PolygonFactory<EEK>.CreateDounut(2, 1, 4);\n\n            Assert.IsTrue(!poly.IsUnbounded);\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.Remove(POLYGON_ELEMENT.BOUNDARY);\n            poly.Remove(POLYGON_ELEMENT.HOLE, 0);\n\n            Assert.IsTrue(poly.IsUnbounded);\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void Reverse()\n        {\n            var poly = PolygonFactory<EEK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.FindOrientation(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.FindOrientation(POLYGON_ELEMENT.HOLE, 0));\n\n            poly.Reverse(POLYGON_ELEMENT.BOUNDARY);\n            poly.Reverse(POLYGON_ELEMENT.HOLE, 0);\n\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.FindOrientation(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.FindOrientation(POLYGON_ELEMENT.HOLE, 0));\n        }\n\n        [TestMethod]\n        public void GetPoint()\n        {\n            var outer = PolygonFactory<EEK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EEK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EEK>(outer);\n            poly.AddHole(inner);\n\n            Assert.AreEqual(new Point2d(-2, -2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 0));\n            Assert.AreEqual(new Point2d(2, -2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 1));\n            Assert.AreEqual(new Point2d(2, 2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 2));\n            Assert.AreEqual(new Point2d(-2, 2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 3));\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 0, 0));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 1, 0));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 2, 0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 3, 0));\n        }\n\n        [TestMethod]\n        public void GetPoints()\n        {\n            var outer = PolygonFactory<EEK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EEK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EEK>(outer);\n            poly.AddHole(inner);\n\n            var boundary = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2)\n            };\n\n            var hole = new Point2d[]\n            {\n                new Point2d(-1, -1),\n                new Point2d(-1, 1),\n                new Point2d(1, 1),\n                new Point2d(1, -1)\n            };\n\n            int count = poly.PointCount(POLYGON_ELEMENT.BOUNDARY);\n            var tmp = new Point2d[count];\n\n            poly.GetPoints(POLYGON_ELEMENT.BOUNDARY, tmp, tmp.Length);\n\n            CollectionAssert.AreEqual(boundary, tmp);\n\n            count = poly.PointCount(POLYGON_ELEMENT.HOLE, 0);\n            tmp = new Point2d[count];\n\n            poly.GetPoints(POLYGON_ELEMENT.HOLE, tmp, tmp.Length, 0);\n\n            CollectionAssert.AreEqual(hole, tmp);\n        }\n\n        [TestMethod]\n        public void GetAllPoints()\n        {\n            var outer = PolygonFactory<EEK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EEK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EEK>(outer);\n            poly.AddHole(inner);\n\n            var points = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2),\n \n                new Point2d(-1, -1),\n                new Point2d(-1, 1),\n                new Point2d(1, 1),\n                new Point2d(1, -1)\n            };\n\n            var tmp = new List<Point2d>();\n            poly.GetAllPoints(tmp);\n\n            CollectionAssert.AreEqual(points, tmp);\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polygons/PolygonWithHoles2_EIK_Test.cs",
    "content": "﻿using System;\nusing System.Text;\nusing System.Diagnostics;\nusing System.Collections.Generic;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polygons;\n\nnamespace CGALDotNetTest.Polygons\n{\n    [TestClass]\n    public class PolygonWithHoles2_EIK_Test\n    {\n\n\n        [TestMethod]\n        public void CreatePolygon()\n        {\n            var poly = new PolygonWithHoles2<EIK>();\n\n            Assert.AreEqual(0, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n        }\n\n        [TestMethod]\n        public void ReleasePolygon()\n        {\n            var poly = new PolygonWithHoles2<EIK>();\n            poly.Dispose();\n\n            Assert.IsTrue(poly.IsDisposed);\n        }\n\n        [TestMethod]\n        public void CreateSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(5, 0),\n                new Point2d(5, 5),\n                new Point2d(0, 5)\n            };\n\n            var poly = new PolygonWithHoles2<EIK>(points);\n\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsFalse(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n        }\n\n        [TestMethod]\n        public void CreateConcavePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0,0),\n                new Point2d(5.1,0),\n                new Point2d(1,1),\n                new Point2d(0.5,6)\n            };\n\n            var poly = new PolygonWithHoles2<EIK>(points);\n\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsTrue(poly.IsSimple);\n            Assert.IsTrue(poly.IsCounterClockWise);\n            Assert.IsFalse(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);\n        }\n\n        [TestMethod]\n        public void CreateNonSimplePolygon()\n        {\n            var points = new Point2d[]\n            {\n                new Point2d(0, 0),\n                new Point2d(8, 4),\n                new Point2d(8, 0),\n                new Point2d(0, 4),\n            };\n\n            var poly = new PolygonWithHoles2<EIK>(points);\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.IsFalse(poly.IsSimple);\n            Assert.IsTrue(poly.IsDegenerate);\n            Assert.IsTrue(poly.Orientation == ORIENTATION.ZERO);\n            Assert.IsTrue(poly.ClockDir == CLOCK_DIR.ZERO);\n        }\n\n        [TestMethod]\n        public void Copy()\n        {\n            var poly1 = PolygonFactory<EIK>.CreateDounut(5, 4, 8);\n            var poly2 = poly1.Copy();\n\n            Assert.AreEqual(poly1.Count, poly2.Count);\n            Assert.AreEqual(poly1.HoleCount, poly2.HoleCount);\n\n            for (int i = 0; i < poly1.Count; i++)\n            {\n                var p1 = poly1.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                var p2 = poly2.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                AssertX.AlmostEqual(p1, p2, 0);\n            }\n\n            for (int i = 0; i < poly1.HoleCount; i++)\n            {\n                var hole1 = poly1.GetHole(i);\n                var hole2 = poly2.GetHole(i);\n\n                for (int j = 0; j < hole1.Count; j++)\n                {\n                    var p1 = hole1.GetPoint(j);\n                    var p2 = hole2.GetPoint(j);\n                    AssertX.AlmostEqual(p1, p2, 0);\n                }\n            }\n        }\n\n        [TestMethod]\n        public void Convert()\n        {\n            var poly1 = PolygonFactory<EIK>.CreateDounut(5, 4, 8);\n            var poly2 = poly1.Convert<EEK>();\n\n            Assert.AreEqual(poly1.Count, poly2.Count);\n            Assert.AreEqual(poly1.HoleCount, poly2.HoleCount);\n            Assert.AreEqual(\"EEK\", poly2.KernelName);\n\n            for (int i = 0; i < poly1.Count; i++)\n            {\n                var p1 = poly1.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                var p2 = poly2.GetPoint(POLYGON_ELEMENT.BOUNDARY, i);\n                AssertX.AlmostEqual(p1, p2);\n            }\n\n            for (int i = 0; i < poly1.HoleCount; i++)\n            {\n                var hole1 = poly1.GetHole(i);\n                var hole2 = poly2.GetHole(i);\n\n                for (int j = 0; j < hole1.Count; j++)\n                {\n                    var p1 = hole1.GetPoint(j);\n                    var p2 = hole2.GetPoint(j);\n                    AssertX.AlmostEqual(p1, p2);\n                }\n            }\n        }\n\n        [TestMethod]\n        public void Clear()\n        {\n            var poly = PolygonFactory<EIK>.CreateDounut(2, 1, 4);\n\n            Assert.IsFalse(poly.IsUnbounded);\n            Assert.AreEqual(4, poly.Count);\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.Clear();\n\n            Assert.IsTrue(poly.IsUnbounded);\n            Assert.AreEqual(0, poly.Count);\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void ClearHoles()\n        {\n            var poly = PolygonFactory<EIK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.ClearHoles();\n\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void PointCount()\n        {\n            var poly = PolygonFactory<EIK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(4, poly.PointCount(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(4, poly.PointCount(POLYGON_ELEMENT.HOLE, 0));\n        }\n\n        [TestMethod]\n        public void Remove()\n        {\n            var poly = PolygonFactory<EIK>.CreateDounut(2, 1, 4);\n\n            Assert.IsTrue(!poly.IsUnbounded);\n            Assert.AreEqual(1, poly.HoleCount);\n\n            poly.Remove(POLYGON_ELEMENT.BOUNDARY);\n            poly.Remove(POLYGON_ELEMENT.HOLE, 0);\n\n            Assert.IsTrue(poly.IsUnbounded);\n            Assert.AreEqual(0, poly.HoleCount);\n        }\n\n        [TestMethod]\n        public void Reverse()\n        {\n            var poly = PolygonFactory<EIK>.CreateDounut(2, 1, 4);\n\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.FindOrientation(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.FindOrientation(POLYGON_ELEMENT.HOLE, 0));\n\n            poly.Reverse(POLYGON_ELEMENT.BOUNDARY);\n            poly.Reverse(POLYGON_ELEMENT.HOLE, 0);\n\n            Assert.AreEqual(ORIENTATION.NEGATIVE, poly.FindOrientation(POLYGON_ELEMENT.BOUNDARY));\n            Assert.AreEqual(ORIENTATION.POSITIVE, poly.FindOrientation(POLYGON_ELEMENT.HOLE, 0));\n        }\n\n        [TestMethod]\n        public void GetPoint()\n        {\n            var outer = PolygonFactory<EIK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EIK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EIK>(outer);\n            poly.AddHole(inner);\n\n            Assert.AreEqual(new Point2d(-2, -2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 0));\n            Assert.AreEqual(new Point2d(2, -2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 1));\n            Assert.AreEqual(new Point2d(2, 2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 2));\n            Assert.AreEqual(new Point2d(-2, 2), poly.GetPoint(POLYGON_ELEMENT.BOUNDARY, 3));\n\n            Assert.AreEqual(new Point2d(-1, -1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 0, 0));\n            Assert.AreEqual(new Point2d(-1, 1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 1, 0));\n            Assert.AreEqual(new Point2d(1, 1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 2, 0));\n            Assert.AreEqual(new Point2d(1, -1), poly.GetPoint(POLYGON_ELEMENT.HOLE, 3, 0));\n        }\n\n        [TestMethod]\n        public void GetPoints()\n        {\n            var outer = PolygonFactory<EIK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EIK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EIK>(outer);\n            poly.AddHole(inner);\n\n            var boundary = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2)\n            };\n\n            var hole = new Point2d[]\n            {\n                new Point2d(-1, -1),\n                new Point2d(-1, 1),\n                new Point2d(1, 1),\n                new Point2d(1, -1)\n            };\n\n            int count = poly.PointCount(POLYGON_ELEMENT.BOUNDARY);\n            var tmp = new Point2d[count];\n\n            poly.GetPoints(POLYGON_ELEMENT.BOUNDARY, tmp, tmp.Length);\n\n            CollectionAssert.AreEqual(boundary, tmp);\n\n            count = poly.PointCount(POLYGON_ELEMENT.HOLE, 0);\n            tmp = new Point2d[count];\n\n            poly.GetPoints(POLYGON_ELEMENT.HOLE, tmp, tmp.Length, 0);\n\n            CollectionAssert.AreEqual(hole, tmp);\n        }\n\n        [TestMethod]\n        public void GetAllPoints()\n        {\n            var outer = PolygonFactory<EIK>.CreateBox(-2, 2);\n            var inner = PolygonFactory<EIK>.CreateBox(-1, 1);\n            inner.Reverse();\n\n            var poly = new PolygonWithHoles2<EIK>(outer);\n            poly.AddHole(inner);\n\n            var points = new Point2d[]\n            {\n                new Point2d(-2, -2),\n                new Point2d(2, -2),\n                new Point2d(2, 2),\n                new Point2d(-2, 2),\n\n                new Point2d(-1, -1),\n                new Point2d(-1, 1),\n                new Point2d(1, 1),\n                new Point2d(1, -1)\n            };\n\n            var tmp = new List<Point2d>();\n            poly.GetAllPoints(tmp);\n\n            CollectionAssert.AreEqual(points, tmp);\n\n        }\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polyhedra/Polyhedron3_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNetTest.Polyhedra\n{\n\n\n    [TestClass]\n    public class Polyhedron3_EEK_Test\n    {\n\n        Point3d[] cube_points = new Point3d[]\n        {\n            new Point3d(-0.5, -0.5, -0.5),\n            new Point3d(0.5, -0.5, -0.5),\n            new Point3d(0.5, 0.5, -0.5),\n            new Point3d(-0.5, 0.5, -0.5),\n            new Point3d(-0.5, 0.5, 0.5),\n            new Point3d(0.5, 0.5, 0.5),\n            new Point3d(0.5, -0.5, 0.5),\n            new Point3d(-0.5, -0.5, 0.5)\n        };\n\n        [TestMethod]\n        public void CreatePolyhedron()\n        {\n            var poly = new Polyhedron3<EEK>();\n\n            Assert.AreEqual(0, poly.VertexCount);\n            Assert.IsTrue(poly.IsValid);\n        }\n\n        [TestMethod]\n        public void ReleasePolyhedron()\n        {\n            var poly = new Polyhedron3<EEK>();\n            poly.Dispose();\n\n            Assert.IsTrue(poly.IsDisposed);\n        }\n\n        [TestMethod]\n        public void VertexCount()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.AreEqual(8, poly.VertexCount);\n        }\n\n        [TestMethod]\n        public void FaceCount()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.AreEqual(6, poly.FaceCount);\n        }\n\n        [TestMethod]\n        public void HalfedgeCount()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.AreEqual(24, poly.HalfedgeCount);\n        }\n\n        public void BorderEdgeCount()\n        {\n\n        }\n\n\n        public void BorderHalfEdgeCount()\n        {\n\n        }\n\n        [TestMethod]\n        public void IsValid()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.IsTrue(poly.IsValid);\n        }\n\n        [TestMethod]\n        public void IsClosed()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.IsTrue(poly.IsClosed);\n        }\n\n        [TestMethod]\n        public void IsTriangle()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, false);\n            Assert.IsTrue(poly.IsTriangle);\n        }\n\n        [TestMethod]\n        public void IsQuad()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            Assert.IsTrue(poly.IsQuad);\n        }\n\n        [TestMethod]\n        public void Clear()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n            poly.Clear();\n            Assert.AreEqual(0, poly.VertexCount);\n        }\n\n        public void CreateMesh()\n        {\n   \n        }\n\n        public void CreateTriangleMesh()\n        {\n\n        }\n\n        public void CreateQuadMesh()\n        {\n\n        }\n\n        public void CreateTriangleQuadMesh()\n        {\n\n        }\n\n        public void CreatePolygonalMesh()\n        {\n\n        }\n\n        public void CreatePolygonMesh()\n        {\n\n        }\n\n        public void GetIndices()\n        {\n\n        }\n\n        public void GetTriangleIndices()\n        {\n\n        }\n\n\n        public void GetQuadIndices()\n        {\n\n        }\n\n        public void GetTriangleQuadIndices()\n        {\n    \n        }\n\n        public void GetPolygonalIndices()\n        {\n\n        }\n\n        public void GetDualPolygonalIndices()\n        {\n        }\n\n        [TestMethod]\n        public void GetPoint()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n\n            for(int i = 0; i < poly.VertexCount; i++)\n            {\n                Assert.AreEqual(cube_points[i], poly.GetPoint(i));\n            }\n\n        }\n\n        [TestMethod]\n        public void GetPoints()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n\n            var points = new Point3d[poly.VertexCount];\n            poly.GetPoints(points, points.Length);\n\n            for (int i = 0; i < poly.VertexCount; i++)\n            {\n                Assert.AreEqual(cube_points[i], points[i]);\n            }\n\n        }\n\n        [TestMethod]\n        public void SetPoint()\n        {\n            var poly = PolyhedronFactory<EEK>.CreateCube(1, true);\n\n            var p0 = new Point3d(1, 2, 3);\n            var p3 = new Point3d(-1, -2, -3);\n   \n            poly.SetPoint(0, p0);\n            poly.SetPoint(3, p3);\n\n            Assert.AreEqual(p0, poly.GetPoint(0));\n            Assert.AreEqual(p3, poly.GetPoint(3));\n        }\n\n        [TestMethod]\n        public void SetPoints()\n        {\n            var poly = new Polyhedron3<EEK>();\n            poly.SetPoints(cube_points, cube_points.Length);\n\n            for (int i = 0; i < poly.VertexCount; i++)\n            {\n                Assert.AreEqual(cube_points[i], poly.GetPoint(i));\n            }\n        }\n\n        public void GetSegment()\n        {\n    \n        }\n\n        public void GetSegments()\n        {\n\n        }\n\n        public void GetTriangle()\n        {\n         \n        }\n\n        public void GetTriangles()\n        {\n\n        }\n\n        public void GetVertex()\n        {\n           \n        }\n\n        public void GetVertices()\n        {\n\n        }\n\n        public void GetFace()\n        {\n            \n        }\n\n        public void GetFaces()\n        {\n\n        }\n\n   \n        public void GetHalfedge()\n        {\n   \n        }\n\n        public void GetHalfedges()\n        {\n\n        }\n\n        public void GetPolygonalCount()\n        {\n          \n        }\n\n        public void GetDualPolygonalCount()\n        {\n           \n        }\n\n        public void GetCentroids()\n        {\n\n        }\n\n        public void GetVertexNormals()\n        {\n\n        }\n\n        public void GetFaceNormals()\n        {\n\n        }\n\n        public void Transform()\n        {\n\n        }\n\n        public void Triangulate()\n        {\n\n        }\n\n\n        public void BoundedSide()\n        {\n\n        }\n\n        public void ContainsPoint()\n        {\n   \n        }\n\n        public void LocateFace()\n        {\n\n        }\n\n        public void LocateVertex()\n        {\n\n        }\n\n        public void LocateHalfedge()\n        {\n \n        }\n\n        public void DoesSelfIntersect()\n        {\n     \n        }\n\n        public void FindIfValid()\n        {\n            \n        }\n\n        public void FindBoundingBox()\n        {\n            \n        }\n\n \n        public void FindArea()\n        {\n\n        }\n\n \n        public void FindCentroid()\n        {\n\n        }\n\n        public void FindVolume()\n        {\n\n        }\n\n        public void FindIfClosed()\n        {\n\n        }\n\n        public void FindIfTriangleMesh()\n        {\n\n        }\n\n        public void FindIfQuadMesh()\n        {\n      \n        }\n\n        public void ToArray()\n        {\n\n        }\n\n        public void ToList()\n        {\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Polyhedra/SurfaceMesh3_EEK_Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\n\nnamespace CGALDotNetTest.Polyhedra\n{\n    [TestClass]\n    public class SurfaceMesh3_EEK_Test\n    {\n        /*\n        public int VertexCount();\n\n        public int HalfedgeCount();\n\n        public int EdgeCount();\n\n        public int FaceCount();\n\n        public int BorderEdgeCount();\n\n        public int BuildStamp();\n\n        public int RemovedVertexCount();\n\n        public int RemovedHalfedgeCount();\n\n        public int RemovedEdgeCount();\n\n        public int RemovedFaceCount();\n\n        public bool IsValid()\n        {\n\n        }\n\n        public bool IsClosed()\n        {\n\n        }\n\n        public bool IsTriangle()\n        {\n\n        }\n\n        public bool IsQuad()\n        {\n\n        }\n\n        public void Clear()\n        {\n\n        }\n\n        public int AddVertex(Point3d point)\n        {\n\n        }\n\n\n        public int AddEdge(int v0, int v1)\n        {\n\n        }\n        public int AddTriangle(int v0, int v1, int v2)\n        {\n\n        }\n        public int AddQuad(int v0, int v1, int v2, int v3)\n        {\n\n        }\n\n        public int AddPentagon(int v0, int v1, int v2, int v3, int v4)\n        {\n\n        }\n\n        public int AddHexagon(int v0, int v1, int v2, int v3, int v4, int v5)\n        {\n\n        }\n\n        public int AddPolygon(int[] indices, int count)\n        {\n\n        }\n\n        public bool HasGarbage => Kernel.HasGarbage(Ptr);\n\n        public void CollectGarbage()\n        {\n\n        }\n\n        public Point3d GetPoint(int index)\n        {\n\n        }\n\n        public void GetPoints(Point3d[] points, int count)\n        {\n\n        }\n\n        public void SetPoint(int index, Point3d point)\n        {\n\n        }\n\n\n        public void SetPoints(Point3d[] points, int count)\n        {\n\n        }\n\n        public bool GetSegment(int index, out Segment3d segment)\n        {\n\n        }\n\n        public void GetSegments(Segment3d[] segments, int count)\n        {\n\n        }\n\n        public bool GetTriangle(int index, out Triangle3d triangle)\n        {\n   \n        }\n\n        public void GetTriangles(Triangle3d[] triangles, int count)\n        {\n\n        }\n\n        public bool GetVertex(int index, out MeshVertex3 vertex)\n        {\n\n        }\n\n        public void GetVertices(MeshVertex3[] vertices, int count)\n        {\n\n        }\n\n        public bool GetFace(int index, out MeshFace3 face)\n        {\n\n        }\n\n        public void GetFaces(MeshFace3[] faces, int count)\n        {\n\n        }\n\n        public bool GetHalfedge(int index, out MeshHalfedge3 halfedge)\n        {\n\n        }\n\n        public void GetHalfedges(MeshHalfedge3[] halfedges, int count)\n        {\n\n        }\n\n        public int VertexDegree(int vertex)\n        {\n\n        }\n\n        public int FaceDegree(int face)\n        {\n\n        }\n\n        public bool VertexIsIsolated(int vertex)\n        {\n\n        }\n\n        public bool VertexIsBorder(int vertex, bool check_all_incident_halfedges = true)\n\n        }\n\n        public bool EdgeIsBorder(int edge)\n\n        }\n\n        public int NextHalfedge(int halfedge)\n        {\n\n        }\n\n        public int PreviousHalfedge(int halfedge)\n        {\n\n        }\n\n        public int OppositeHalfedge(int halfedge)\n        {\n\n        }\n\n        public int SourceVertex(int halfedge)\n        {\n\n        }\n\n        public int TargetVertex(int halfedge)\n        {\n\n        }\n\n        public bool RemoveVertex(int vertex)\n        {\n\n        }\n\n        public bool RemoveEdge(int edge)\n        {\n\n        }\n\n        public bool RemoveFace(int face)\n        {\n\n        }\n\n        public bool IsVertexRemoved(int index)\n        {\n\n        }\n\n        public bool IsFaceRemoved(int index)\n        {\n\n        }\n\n        public bool IsHalfedgeRemoved(int index)\n        {\n\n        }\n\n        public bool IsEdgeRemoved(int index)\n        {\n\n        }\n\n        public bool IsVertexValid(int vertex)\n        {\n    \n        }\n\n        public bool IsEdgeValid(int edge)\n        {\n   \n        }\n\n        public bool IsHalfedgeValid(int halfedge)\n        {\n\n        }\n\n        public bool IsFaceValid(int face)\n        {\n\n        }\n\n        public void Transform(Point3d translation, Quaternion3d rotation, Point3d scale)\n        {\n\n        }\n\n        public void CreateMesh(Point3d[] points, int[] triangles, int[] quads = null)\n        {\n\n        }\n\n        public void CreateTriangleMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n\n        }\n\n        public void CreateQuadMesh(Point3d[] points, int pointCount, int[] indices, int indexCount)\n        {\n\n        }\n\n        public void CreateTriangleQuadMesh(Point3d[] points, int pointsCount, int[] triangles, int triangleCount, int[] quads, int quadsCount)\n        {\n\n        }\n\n        public void CreatePolygonalMesh(Point3d[] points, int pointsCount, PolygonalIndices indices)\n        {\n\n        }\n\n        public void CreatePolygonMesh(Point2d[] points, int count, bool xz)\n        {\n\n        }\n\n        public void GetIndices(int[] triangles, int[] quads = null)\n        {\n\n        }\n\n        public void GetTriangleIndices(int[] triangles, int trianglesCount)\n        {\n\n        }\n\n        public void GetQuadIndices(int[] quads, int quadsCount)\n        {\n\n        }\n\n        public void GetTriangleQuadIndices(int[] triangles, int trianglesCount, int[] quads, int quadsCount)\n        {\n\n        }\n\n        public PolygonalIndices GetPolygonalIndices()\n        {\n\n        }\n\n        public bool IsVertexBorder(int index, bool check_all_incident_halfedges)\n        {\n          \n        }\n\n        public bool IsHalfedgeBorder(int index)\n        {\n           \n        }\n\n        public bool IsEdgeBorder(int index)\n        {\n          \n        }\n\n        public PolygonalCount GetPolygonalCount()\n        {\n          \n        }\n\n        public Box3d FindBoundingBox()\n        {\n\n        }\n\n        public void Triangulate()\n        {\n\n        }\n\n        public BOOL_OR_UNDETERMINED DoesSelfIntersect()\n        {\n\n        }\n\n        public BOUNDED_SIDE BoundedSide(Point3d point)\n        {\n\n        }\n\n        public bool ContainsPoint(Point3d point, bool includeBoundary = true)\n        {\n\n        }\n\n        public abstract MeshHitResult LocateFace(Ray3d ray);\n\n        public abstract MeshHitResult ClosestFace(Point3d point);\n\n        public bool LocateFace(Ray3d ray, out MeshFace3 face)\n        {\n\n        }\n\n        public bool LocateVertex(Ray3d ray, double radius, out MeshVertex3 vertex)\n        {\n\n        }\n\n        public bool LocateHalfedge(Ray3d ray, double radius, out MeshHalfedge3 edge)\n        {\n \n        }\n\n        public BOOL_OR_UNDETERMINED DoIntersect(SurfaceMesh3 mesh, bool test_bounded_sides = true)\n        {\n\n        }\n\n\n        public void ComputeVertexNormals()\n        {\n\n        }\n\n\n        public void ComputeFaceNormals()\n        {\n\n        }\n\n        public void GetVertexNormals(Vector3d[] normals, int count)\n        {\n\n        }\n\n        public void GetFaceNormals(Vector3d[] normals, int count)\n        {\n\n        }\n\n        public Point3d[] ToArray()\n        {\n\n        }\n\n        public List<Point3d> ToList()\n        {\n\n        }\n\n\n        protected override void ReleasePtr()\n        {\n\n        }\n        */\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingConnectionsPolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNetGeometry.Extensions;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingConnectionsPolyhedronTest\n    {\n\n        private MeshProcessingConnections<EEK> Processor => MeshProcessingConnections<EEK>.Instance;\n\n        private Polyhedron3<EEK> testMesh;\n\n        private Polyhedron3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    var cube1 = SurfaceMeshFactory<EEK>.CreateCube();\n                    cube1.Translate(new Point3d(-1, 0, 0));\n\n                    var cube2 = SurfaceMeshFactory<EEK>.CreateCube(1, true);\n                    cube2.Translate(new Point3d(1, 0, 0));\n\n                    cube1.Join(cube2);\n\n                    testMesh = cube1.ToPolyhedronMesh();\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        /*\n        [TestMethod]\n        public void UnconnectedComponents()\n        {\n            Assert.AreEqual(2, Processor.UnconnectedComponents(TestMesh));\n        }\n        */\n\n        [TestMethod]\n        public void ConnectedFaces()\n        {\n            var faces = new List<int>();\n            Processor.ConnectedFaces(TestMesh, 0, faces);\n            Assert.AreEqual(12, faces.Count);\n            Assert.IsFalse(faces.HasNullIndex());\n        }\n\n        [TestMethod]\n        public void SplitUnconnectedComponents()\n        {\n            var faces = new List<Polyhedron3<EEK>>();\n            Processor.SplitUnconnectedComponents(TestMesh, faces);\n            Assert.AreEqual(2, faces.Count);\n        }\n\n        [TestMethod]\n        public void KeepLargeComponents()\n        {\n            int removed = Processor.KeepLargeComponents(TestMesh, 12);\n            Assert.AreEqual(1, removed);\n        }\n\n        [TestMethod]\n        public void KeepLargestComponents()\n        {\n            int removed = Processor.KeepLargestComponents(TestMesh, 1);\n            Assert.AreEqual(1, removed);\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingConnectionsSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNetGeometry.Extensions;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingConnectionsSurfaceMeshTest\n    {\n\n        private MeshProcessingConnections<EEK> Processor => MeshProcessingConnections<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> testMesh;\n\n        private SurfaceMesh3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    var cube1 = SurfaceMeshFactory<EEK>.CreateCube();\n                    cube1.Translate(new Point3d(-1, 0, 0));\n\n                    var cube2 = SurfaceMeshFactory<EEK>.CreateCube(1, true);\n                    cube2.Translate(new Point3d(1, 0, 0));\n\n                    cube1.Join(cube2);\n\n                    testMesh = cube1;\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void UnconnectedComponents()\n        {\n            Assert.AreEqual(2, Processor.UnconnectedComponents(TestMesh));\n        }\n\n        [TestMethod]\n        public void ConnectedFaces()\n        {\n            var faces = new List<int>();\n            Processor.ConnectedFaces(TestMesh, 0, faces);\n            Assert.AreEqual(12, faces.Count);\n            Assert.IsFalse(faces.HasNullIndex());\n        }\n\n        [TestMethod]\n        public void SplitUnconnectedComponents()\n        {\n            var faces = new List<SurfaceMesh3<EEK>>();\n            Processor.SplitUnconnectedComponents(TestMesh, faces);\n            Assert.AreEqual(2, faces.Count);\n        }\n\n        [TestMethod]\n        public void KeepLargeComponents()\n        {\n            int removed = Processor.KeepLargeComponents(TestMesh, 12);\n            Assert.AreEqual(1, removed);\n        }\n\n        [TestMethod]\n        public void KeepLargestComponents()\n        {\n            int removed = Processor.KeepLargestComponents(TestMesh, 1);\n            Assert.AreEqual(1, removed);\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingFeaturesPolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Extensions;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingFeaturesPolyhedronTest\n    {\n\n        private MeshProcessingFeatures<EEK> Processor => MeshProcessingFeatures<EEK>.Instance;\n\n        private Polyhedron3<EEK> testMesh;\n\n        private Polyhedron3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = PolyhedronFactory<EEK>.CreateCube(1, true);\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void DetectSharpEdges()\n        {\n            var featureEdges = new List<int>();\n            var angle = new Degree(90);\n            Processor.DetectSharpEdges(TestMesh, angle, featureEdges);\n\n            Assert.AreEqual(12, featureEdges.Count);\n            Assert.IsFalse(featureEdges.HasNullIndex());\n        }\n\n        /*\n        [TestMethod]\n        public void SharpEdgesSegmentation()\n        {\n            var featureEdges = new List<int>();\n            var featurePatches = new List<List<int>>();\n            var angle = new Degree(90);\n            Processor.SharpEdgesSegmentation(TestMesh, angle, featureEdges, featurePatches);\n\n            Assert.AreEqual(12, featureEdges.Count);\n            Assert.AreEqual(5, featurePatches.Count);\n            Assert.IsFalse(featureEdges.HasNullIndex());\n\n            foreach (var patch in featurePatches)\n                Assert.IsFalse(patch.HasNullIndex());\n\n        }\n        */\n\n        [TestMethod]\n        public void EdgeLengthMinMaxAvg()\n        {\n            var mesh = TestMesh;\n            mesh.Scale(new Point3d(2, 0.5, 1));\n\n            var minmax = Processor.EdgeLengthMinMaxAvg(mesh);\n\n            Assert.AreEqual(0.5, minmax.Min);\n            Assert.AreEqual(2, minmax.Max);\n            Assert.AreEqual(1.17, Math.Round(minmax.Average, 2));\n        }\n\n        [TestMethod]\n        public void FaceAreaMinMaxAvg()\n        {\n            var mesh = TestMesh;\n            mesh.Scale(new Point3d(2, 0.5, 1));\n\n            var minmax = Processor.FaceAreaMinMaxAvg(mesh);\n\n            Assert.AreEqual(0.25, minmax.Min);\n            Assert.AreEqual(1, minmax.Max);\n            Assert.AreEqual(0.58, Math.Round(minmax.Average, 2));\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingFeaturesSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNetGeometry.Extensions;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\n\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingFeaturesSurfaceMeshTest\n    {\n\n        private MeshProcessingFeatures<EEK> Processor => MeshProcessingFeatures<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> testMesh;\n\n        private SurfaceMesh3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = SurfaceMeshFactory<EEK>.CreateCube(1, true);\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void DetectSharpEdges()\n        {\n            var featureEdges = new List<int>();\n            var angle = new Degree(90);\n            Processor.DetectSharpEdges(TestMesh, angle, featureEdges);\n\n            Assert.AreEqual(12, featureEdges.Count);\n            Assert.IsFalse(featureEdges.HasNullIndex());\n        }\n\n        [TestMethod]\n        public void SharpEdgesSegmentation()\n        {\n            var featureEdges = new List<int>();\n            var featurePatches = new List<List<int>>();\n            var angle = new Degree(90);\n            Processor.SharpEdgesSegmentation(TestMesh, angle, featureEdges, featurePatches);\n\n            Assert.AreEqual(12, featureEdges.Count);\n            Assert.AreEqual(5, featurePatches.Count);\n            Assert.IsFalse(featureEdges.HasNullIndex());\n\n            foreach(var patch in featurePatches)    \n                Assert.IsFalse(patch.HasNullIndex());\n\n        }\n\n        [TestMethod]\n        public void EdgeLengthMinMaxAvg()\n        {\n            var mesh = TestMesh;\n            mesh.Scale(new Point3d(2, 0.5, 1));\n\n            var minmax = Processor.EdgeLengthMinMaxAvg(mesh);\n\n            Assert.AreEqual(0.5, minmax.Min);\n            Assert.AreEqual(2, minmax.Max);\n            Assert.AreEqual(1.17, Math.Round(minmax.Average, 2));\n        }\n\n        [TestMethod]\n        public void FaceAreaMinMaxAvg()\n        {\n            var mesh = TestMesh;\n            mesh.Scale(new Point3d(2, 0.5, 1));\n\n            var minmax = Processor.FaceAreaMinMaxAvg(mesh);\n\n            Console.WriteLine(minmax);\n\n            Assert.AreEqual(0.25, minmax.Min);\n            Assert.AreEqual(1, minmax.Max);\n            Assert.AreEqual(0.58, Math.Round(minmax.Average, 2));\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingLocatePolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingLocatePolyhedronTest\n    {\n\n        private MeshProcessingLocate<EEK> Processor => MeshProcessingLocate<EEK>.Instance;\n\n        private Polyhedron3<EEK> testMesh;\n\n        private Polyhedron3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = PolyhedronFactory<EEK>.CreateCube();\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void RandomLocationOnMesh()\n        {\n            var point = Processor.RandomLocationOnMesh(TestMesh);\n        }\n\n        [TestMethod]\n        public void LocateFace()\n        {\n            var ray = new Ray3d(new Point3d(2, 0, 0), new Vector3d(-1, 0 ,0));\n\n            var result = Processor.LocateFace(TestMesh, ray);\n            Assert.AreEqual(4, result.Face);\n            Assert.AreEqual(new Point3d(0.5, 0, 0), result.Point);\n            Assert.AreEqual(new Point3d(0.5, 0, 0.5), result.Coord);\n        }\n\n        [TestMethod]\n        public void ClosestFace()\n        {\n            var point = new Point3d(2, 0, 0);\n\n            var result = Processor.ClosestFace(TestMesh, point);\n            Assert.AreEqual(4, result.Face);\n            Assert.AreEqual(new Point3d(0.5, 0, 0), result.Point);\n            Assert.AreEqual(new Point3d(0.5, 0, 0.5), result.Coord);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingLocateSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingLocateSurfaceMeshTest\n    {\n\n        private MeshProcessingLocate<EEK> Processor => MeshProcessingLocate<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> testMesh;\n\n        private SurfaceMesh3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = SurfaceMeshFactory<EEK>.CreateCube();\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void RandomLocationOnMesh()\n        {\n            var point = Processor.RandomLocationOnMesh(TestMesh);\n        }\n\n        [TestMethod]\n        public void LocateFace()\n        {\n            var ray = new Ray3d(new Point3d(2, 0, 0), new Vector3d(-1, 0, 0));\n\n            var result = Processor.LocateFace(TestMesh, ray);\n            Assert.AreEqual(4, result.Face);\n            Assert.AreEqual(new Point3d(0.5, 0, 0), result.Point);\n            Assert.AreEqual(new Point3d(0.5, 0, 0.5), result.Coord);\n        }\n\n        [TestMethod]\n        public void ClosestFace()\n        {\n            var point = new Point3d(2, 0, 0);\n\n            var result = Processor.ClosestFace(TestMesh, point);\n            Assert.AreEqual(4, result.Face);\n            Assert.AreEqual(new Point3d(0.5, 0, 0), result.Point);\n            Assert.AreEqual(new Point3d(0.5, 0, 0.5), result.Coord);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingMeshingPolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingMeshingPolyhedronTest\n    {\n\n        private MeshProcessingMeshing<EEK> Processor => MeshProcessingMeshing<EEK>.Instance;\n\n        private Polyhedron3<EEK> testMesh;\n\n        private Polyhedron3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = PolyhedronFactory<EEK>.CreateCube(1, true);\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void Extrude()\n        {\n            var extured = Processor.Extrude(TestMesh, new Vector3d(0, 1, 0));\n        }\n\n        [TestMethod]\n        public void Fair()\n        {\n            var success = Processor.Fair(TestMesh, 0, 1);\n            Assert.IsTrue(success);\n        }\n\n        [TestMethod]\n        public void Refine()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            double factor = 5;\n            int new_verts = Processor.Refine(mesh, factor);\n        }\n\n        [TestMethod]\n        public void IsotropicRemeshing()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            int new_verts = Processor.IsotropicRemeshing(mesh, 0.1, 2);\n        }\n\n        [TestMethod]\n        public void RandomPerturbation()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            Processor.RandomPerturbation(mesh, 0.1);\n        }\n\n        /*\n        [TestMethod]\n        public void SmoothByAngle()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            var featureAngle = new Degree(120);\n            Processor.SmoothMeshByAngle(mesh, featureAngle, 1);\n        }\n        */\n\n        /*\n        [TestMethod]\n        public void SmoothShape()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            double time_step = 0.001;\n            Processor.SmoothShape(mesh, time_step, 1);\n\n            Console.WriteLine(\"Vertices = \" + mesh.VertexCount);\n            mesh.PrintVertices();\n        }\n        */\n\n        [TestMethod]\n        public void SplitLongEdges()\n        {\n            var mesh = TestMesh;\n            int new_edges = Processor.SplitLongEdges(mesh, 0.1);\n        }\n\n        [TestMethod]\n        public void TriangulateFace()\n        {\n            var mesh = TestMesh;\n            bool success = Processor.TriangulateFace(mesh, 0);\n\n            Assert.IsTrue(success);\n            Assert.AreEqual(7, mesh.FaceCount);\n        }\n\n        [TestMethod]\n        public void TriangulateFaces()\n        {\n            var mesh = TestMesh;\n            bool success = Processor.TriangulateFaces(mesh, new int[] { 0, 1 }, 2);\n\n            Assert.IsTrue(success);\n            Assert.AreEqual(8, mesh.FaceCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingMeshingSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingMeshingSurfaceMeshTest\n    {\n\n        private MeshProcessingMeshing<EEK> Processor => MeshProcessingMeshing<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> testMesh;\n\n        private SurfaceMesh3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = SurfaceMeshFactory<EEK>.CreateCube(1, true);\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void Extrude()\n        {\n            var extured = Processor.Extrude(TestMesh, new Vector3d(0, 1, 0));\n        }\n\n        /*\n        [TestMethod]\n        public void Fair()\n        {\n            var success = Processor.Fair(TestMesh, 0, 1);\n            Assert.IsTrue(success);\n        }\n        */\n\n        [TestMethod]\n        public void Refine()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n \n            double factor = 5;\n            int new_verts = Processor.Refine(mesh, factor);\n        }\n\n        [TestMethod]\n        public void IsotropicRemeshing()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            int new_verts = Processor.IsotropicRemeshing(mesh, 0.1, 2);\n        }\n\n        [TestMethod]\n        public void RandomPerturbation()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            Processor.RandomPerturbation(mesh, 0.1);\n        }\n\n        [TestMethod]\n        public void SmoothByAngle()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            var featureAngle = new Degree(120);\n            Processor.SmoothMeshByAngle(mesh, featureAngle, 1);  \n        }\n\n        /*\n        [TestMethod]\n        public void SmoothShape()\n        {\n            var mesh = TestMesh;\n            mesh.Triangulate();\n\n            double time_step = 0.001;\n            Processor.SmoothShape(mesh, time_step, 1);\n\n            Console.WriteLine(\"Vertices = \" + mesh.VertexCount);\n            mesh.PrintVertices();\n        }\n        */\n\n        [TestMethod]\n        public void SplitLongEdges()\n        {\n            var mesh = TestMesh;\n            int new_edges = Processor.SplitLongEdges(mesh, 0.1);\n        }\n\n        [TestMethod]\n        public void TriangulateFace()\n        {\n            var mesh = TestMesh;\n            bool success = Processor.TriangulateFace(mesh, 0);\n\n            Assert.IsTrue(success);\n            Assert.AreEqual(7, mesh.FaceCount);\n        }\n\n        [TestMethod]\n        public void TriangulateFaces()\n        {\n            var mesh = TestMesh;\n            bool success = Processor.TriangulateFaces(mesh, new int[] {0, 1}, 2);\n\n            Assert.IsTrue(success);\n            Assert.AreEqual(8, mesh.FaceCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingOrientationPolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingOrientationPolyhedronTest\n    {\n\n        private MeshProcessingOrientation<EEK> Processor => MeshProcessingOrientation<EEK>.Instance;\n\n        private Polyhedron3<EEK> testMesh;\n\n        private Polyhedron3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = PolyhedronFactory<EEK>.CreateCube();\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void DoesBoundAVolume()\n        {\n            Assert.IsTrue(Processor.DoesBoundAVolume(TestMesh));\n        }\n\n        [TestMethod]\n        public void IsOutwardOriented()\n        {\n            Assert.IsTrue(Processor.IsOutwardOriented(TestMesh));\n        }\n\n        [TestMethod]\n        public void Orient()\n        {\n            Processor.Orient(TestMesh);\n        }\n\n        [TestMethod]\n        public void OrientToBoundAVolume()\n        {\n            Processor.OrientToBoundAVolume(TestMesh);\n\n        }\n\n        [TestMethod]\n        public void ReverseFaceOrientations()\n        {\n            Processor.ReverseFaceOrientations(TestMesh);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingOrientationSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingOrientationSurfaceMeshTest\n    {\n\n        private MeshProcessingOrientation<EEK> Processor => MeshProcessingOrientation<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> testMesh;\n\n        private SurfaceMesh3<EEK> TestMesh\n        {\n            get\n            {\n                if (testMesh == null)\n                {\n                    testMesh = SurfaceMeshFactory<EEK>.CreateCube();\n                }\n\n                return testMesh.Copy();\n            }\n        }\n\n        [TestMethod]\n        public void DoesBoundAVolume()\n        {\n            Assert.IsTrue(Processor.DoesBoundAVolume(TestMesh));\n        }\n\n        [TestMethod]\n        public void IsOutwardOriented()\n        {\n            Assert.IsTrue(Processor.IsOutwardOriented(TestMesh));\n        }\n\n        [TestMethod]\n        public void Orient()\n        {\n            Processor.Orient(TestMesh);\n        }\n\n        [TestMethod]\n        public void OrientToBoundAVolume()\n        {\n            Processor.OrientToBoundAVolume(TestMesh);\n\n        }\n\n        [TestMethod]\n        public void ReverseFaceOrientations()\n        {\n            Processor.ReverseFaceOrientations(TestMesh);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingRepairPolyhedronTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingRepairPolyhedronTest\n    {\n\n        private MeshProcessingRepair<EEK> Processor => MeshProcessingRepair<EEK>.Instance;\n\n        private Polyhedron3<EEK> TriangleSoup\n        {\n            get\n            {\n                var points = new Point3d[]\n                {\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0),\n\n                new Point3d(0,0,0),\n                new Point3d(0,1,0),\n                new Point3d(1,1,0),\n                };\n\n                var indices = new int[]\n                {\n                    0, 1, 2,\n                    3, 5, 4\n                };\n\n                return new Polyhedron3<EEK>(points, indices);\n            }\n        }\n\n        /*\n        [TestMethod]\n        public void DegenerateEdgeCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new Polyhedron3<EEK>(points, indices);\n            int count = Processor.DegenerateEdgeCount(mesh);\n            Assert.AreEqual(1, count);\n        }\n        */\n\n        [TestMethod]\n        public void DegenerateTriangleCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new Polyhedron3<EEK>(points, indices);\n            int count = Processor.DegenerateTriangleCount(mesh);\n            Assert.AreEqual(1, count);\n        }\n\n        [TestMethod]\n        public void NeedleTriangleCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0.01,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new Polyhedron3<EEK>(points, indices);\n            int count = Processor.NeedleTriangleCount(mesh, 0.1);\n            Assert.AreEqual(1, count);\n        }\n\n        /*\n        [TestMethod]\n        public void NonManifoldVertexCount()\n        {\n            var mesh = new Polyhedron3<EEK>(points, indices);\n            int count = Processor.NonManifoldVertexCount(mesh);\n        }\n        */\n\n        [TestMethod]\n        public void RepairPolygonSoup()\n        {\n            var mesh = TriangleSoup;\n            Processor.RepairPolygonSoup(mesh);\n\n            Assert.AreEqual(4, mesh.VertexCount);\n            Assert.AreEqual(10, mesh.HalfedgeCount);\n            Assert.AreEqual(2, mesh.FaceCount);\n        }\n\n        [TestMethod]\n        public void StitchBoundaryCycles()\n        {\n            var mesh = TriangleSoup;\n            Processor.StitchBoundaryCycles(mesh);\n            //mesh.Print();\n        }\n\n        [TestMethod]\n        public void StitchBorders()\n        {\n            var mesh = TriangleSoup;\n            Processor.StitchBorders(mesh);\n            Assert.AreEqual(4, mesh.VertexCount);\n            Assert.AreEqual(10, mesh.HalfedgeCount);\n            Assert.AreEqual(2, mesh.FaceCount);\n        }\n\n        /*\n        [TestMethod]\n        public void MergeDuplicatedVerticesInBoundaryCycle()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2, 3\n            };\n\n            var mesh = new Polyhedron3<EEK>();\n            mesh.CreateTriangleQuadMesh(points, points.Length, null, 0, indices, indices.Length);\n\n            mesh.Print();\n            Processor.MergeDuplicatedVerticesInBoundaryCycle(mesh, 0);\n            mesh.Print();\n        }\n\n        [TestMethod]\n        public void MergeDuplicatedVerticesInBoundaryCycles()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2, 3\n            };\n\n            var mesh = new Polyhedron3<EEK>();\n            mesh.CreateTriangleQuadMesh(points, points.Length, null, 0, indices, indices.Length);\n\n            mesh.Print();\n            Processor.MergeDuplicatedVerticesInBoundaryCycles(mesh);\n            mesh.Print();\n        }\n        */\n\n        [TestMethod]\n        public void RemoveIsolatedVertices()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0),\n\n                new Point3d(0,0,0),\n                new Point3d(10,0,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2\n            };\n\n            var mesh = new Polyhedron3<EEK>(points, indices);\n\n            Assert.AreEqual(5, mesh.VertexCount);\n            Processor.RemoveIsolatedVertices(mesh);\n            Assert.AreEqual(3, mesh.VertexCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALDotNetTest/Processing/MeshProcessingRepairSurfaceMeshTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\n\nusing CGALDotNet;\nusing CGALDotNetGeometry.Numerics;\nusing CGALDotNetGeometry.Shapes;\nusing CGALDotNet.Polyhedra;\nusing CGALDotNet.Processing;\nusing CGALDotNet.Extensions;\n\nnamespace CGALDotNetTest.Processing\n{\n\n    [TestClass]\n    public class MeshProcessingRepairSurfaceMeshTest\n    {\n\n        private MeshProcessingRepair<EEK> Processor => MeshProcessingRepair<EEK>.Instance;\n\n        private SurfaceMesh3<EEK> TriangleSoup\n        {\n            get\n            {\n                var points = new Point3d[]\n                {\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0),\n\n                new Point3d(0,0,0),\n                new Point3d(0,1,0),\n                new Point3d(1,1,0),\n                };\n\n                var indices = new int[]\n                {\n                    0, 1, 2,\n                    3, 5, 4\n                };\n\n                return new SurfaceMesh3<EEK>(points, indices);\n            }\n        }\n\n        [TestMethod]\n        public void DegenerateEdgeCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new SurfaceMesh3<EEK>(points, indices);\n            int count = Processor.DegenerateEdgeCount(mesh);\n            Assert.AreEqual(1, count);\n        }\n\n        [TestMethod]\n        public void DegenerateTriangleCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new SurfaceMesh3<EEK>(points, indices);\n            int count = Processor.DegenerateTriangleCount(mesh);\n            Assert.AreEqual(1, count);\n        }\n\n        [TestMethod]\n        public void NeedleTriangleCount()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0.01,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                0, 1, 2,\n            };\n\n            var mesh = new SurfaceMesh3<EEK>(points, indices);\n            int count = Processor.NeedleTriangleCount(mesh, 0.1);\n            Assert.AreEqual(1, count);\n        }\n\n        /*\n        [TestMethod]\n        public void NonManifoldVertexCount()\n        {\n            var mesh = new SurfaceMesh3<EEK>(points, indices);\n            int count = Processor.NonManifoldVertexCount(mesh);\n        }\n        */\n\n        [TestMethod]\n        public void RepairPolygonSoup()\n        {\n            var mesh = TriangleSoup;\n            Processor.RepairPolygonSoup(mesh);\n\n            Assert.AreEqual(4, mesh.VertexCount);\n            Assert.AreEqual(10, mesh.HalfedgeCount);\n            Assert.AreEqual(2, mesh.FaceCount);\n        }\n\n        [TestMethod]\n        public void StitchBoundaryCycles()\n        {\n            var mesh = TriangleSoup;\n            Processor.StitchBoundaryCycles(mesh);\n            //mesh.Print();\n        }\n\n        [TestMethod]\n        public void StitchBorders()\n        {\n            var mesh = TriangleSoup;\n            Processor.StitchBorders(mesh);\n            Assert.AreEqual(4, mesh.VertexCount);\n            Assert.AreEqual(10, mesh.HalfedgeCount);\n            Assert.AreEqual(2, mesh.FaceCount);\n        }\n\n        /*\n        [TestMethod]\n        public void MergeDuplicatedVerticesInBoundaryCycle()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2, 3\n            };\n\n            var mesh = new SurfaceMesh3<EEK>();\n            mesh.CreateTriangleQuadMesh(points, points.Length, null, 0, indices, indices.Length);\n\n            mesh.Print();\n            Processor.MergeDuplicatedVerticesInBoundaryCycle(mesh, 0);\n            mesh.Print();\n        }\n\n        [TestMethod]\n        public void MergeDuplicatedVerticesInBoundaryCycles()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2, 3\n            };\n\n            var mesh = new SurfaceMesh3<EEK>();\n            mesh.CreateTriangleQuadMesh(points, points.Length, null, 0, indices, indices.Length);\n\n            mesh.Print();\n            Processor.MergeDuplicatedVerticesInBoundaryCycles(mesh);\n            mesh.Print();\n        }\n        */\n\n        [TestMethod]\n        public void RemoveIsolatedVertices()\n        {\n            var points = new Point3d[]\n            {\n                new Point3d(0,0,0),\n                new Point3d(1,0,0),\n                new Point3d(1,1,0),\n\n                new Point3d(0,0,0),\n                new Point3d(10,0,0)\n            };\n\n            var indices = new int[]\n            {\n                    0, 1, 2\n            };\n\n            var mesh = new SurfaceMesh3<EEK>(points, indices);\n\n            Assert.AreEqual(5, mesh.VertexCount);\n            Processor.RemoveIsolatedVertices(mesh);\n            Assert.AreEqual(3, mesh.VertexCount);\n        }\n\n    }\n}\n"
  },
  {
    "path": "CGALWrapper/Arrangments/ArrFace2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"CGAL/Point_2.h\"\n\nstruct ArrFace2\n{\n\tBOOL IsFictitious;\n\tBOOL IsUnbounded;\n\tBOOL HasOuterEdges;\n\tint HoleCount;\n\tint Index;\n\tint HalfEdgeIndex;\n\n\tstatic ArrFace2 NullFace()\n\t{\n\t\tArrFace2 f;\n\t\tf.IsFictitious = false;\n\t\tf.IsUnbounded = false;\n\t\tf.HoleCount = NULL_INDEX;\n\t\tf.Index = NULL_INDEX;\n\t\tf.HalfEdgeIndex = NULL_INDEX;\n\t\treturn f;\n\t}\n\n\ttemplate<class FACE>\n\tstatic ArrFace2 FromFace(FACE face)\n\t{\n\t\tArrFace2 f;\n\t\tf.IsFictitious = face->is_fictitious();\n\t\tf.IsUnbounded = face->is_unbounded();\n\t\tf.HasOuterEdges = face->has_outer_ccb();\n\t\tf.HoleCount = (int)face->number_of_holes();\n\t\tf.Index = face->data();\n\n\t\tif (face->has_outer_ccb())\n\t\t{\n\t\t\tauto first = face->outer_ccb();\n\t\t\tf.HalfEdgeIndex = first->data();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tf.HalfEdgeIndex = -1;\n\t\t}\n\n\t\treturn f;\t\n\t}\n};\n"
  },
  {
    "path": "CGALWrapper/Arrangments/ArrHalfEdge2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nstruct ArrHalfEdge2\n{\n\tBOOL IsFictitious;\n\tint Index;\n\tint SourceIndex;\n\tint TargetIndex;\n\tint FaceIndex;\n\tint NextIndex;\n\tint PreviousIndex;\n\tint TwinIndex;\n\n\tstatic ArrHalfEdge2 NullEdge()\n\t{\n\t\tArrHalfEdge2 e;\n\t\te.IsFictitious = false;\n\t\te.Index = NULL_INDEX;\n\t\te.SourceIndex = NULL_INDEX;\n\t\te.TargetIndex = NULL_INDEX;\n\t\te.FaceIndex = NULL_INDEX;\n\t\te.NextIndex = NULL_INDEX;\n\t\te.PreviousIndex = NULL_INDEX;\n\t\te.TwinIndex = NULL_INDEX;\n\t\treturn e;\n\t}\n\n\ttemplate<class EDGE>\n\tstatic ArrHalfEdge2 FromHalfEdge(EDGE edge)\n\t{\n\t\tArrHalfEdge2 e;\n\t\te.IsFictitious = edge->is_fictitious();\n\t\te.Index = edge->data();\n\t\te.SourceIndex = edge->source()->data();\n\t\te.TargetIndex = edge->target()->data();\n\t\te.FaceIndex = edge->face()->data();\n\t\te.NextIndex = edge->next()->data();\n\t\te.PreviousIndex = edge->prev()->data();\n\t\te.TwinIndex = edge->twin()->data();\n\n\t\treturn e;\n\t}\n};\n"
  },
  {
    "path": "CGALWrapper/Arrangments/ArrMultiLocator.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Arr_point_location_result.h>\n#include <CGAL/Arr_batched_point_location.h>\n#include <CGAL/Arr_naive_point_location.h>\n#include <CGAL/Arr_walk_along_line_point_location.h>\n#include <CGAL/Arr_landmarks_point_location.h>\n#include <CGAL/Arr_trapezoid_ric_point_location.h>\n\nenum class ARR_LOCATOR : int\n{\n\tNONE,\n\tNAIVE,\n\tWALK,\n\tLANDMARKS,\n\tTRAPEZOID\n};\n\ntemplate<class K, class Arrangement>\nclass ArrMultiLocator\n{\n\npublic:\n\n\ttypedef CGAL::Arr_point_location_result<Arrangement> Locator_Result;\n\ttypedef typename Locator_Result::Type Locator_Result_Type;\n\n\ttypedef CGAL::Arr_naive_point_location<Arrangement> Naive_Locator;\n\ttypedef CGAL::Arr_walk_along_line_point_location<Arrangement> Walk_Locator;\n\ttypedef CGAL::Arr_landmarks_point_location<Arrangement> Landmarks_Locator;\n\ttypedef CGAL::Arr_trapezoid_ric_point_location<Arrangement> Trapezoid_Locator;\n\nprivate:\n\n\tARR_LOCATOR current_locator_type;\n\n\tNaive_Locator* naive_locator;\n\n\tWalk_Locator* walk_locator;\n\n\tLandmarks_Locator* landmark_locator;\n\n\tTrapezoid_Locator* trapezoid_locator;\n\npublic:\n\n\tArrMultiLocator()\n\t{\n\t\tcurrent_locator_type = ARR_LOCATOR::NONE;\n\t\tnaive_locator = nullptr;\n\t\twalk_locator = nullptr;\n\t\tlandmark_locator = nullptr;\n\t\ttrapezoid_locator = nullptr;\n\t}\n\n\t~ArrMultiLocator()\n\t{\n\t\tReleaseLocator();\n\t}\n\n\tvoid CreateLocator(ARR_LOCATOR type, Arrangement& arr)\n\t{\n\t\tif (current_locator_type == type)\n\t\t\treturn;\n\n\t\tReleaseLocator();\n\t\tcurrent_locator_type = type;\n\n\t\tswitch (type)\n\t\t{\n\t\tcase ARR_LOCATOR::NAIVE:\n\t\t\tnaive_locator = new Naive_Locator();\n\t\t\tnaive_locator->attach(arr);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\twalk_locator = new Walk_Locator();\n\t\t\twalk_locator->attach(arr);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::LANDMARKS:\n\t\t\tlandmark_locator = new Landmarks_Locator();\n\t\t\tlandmark_locator->attach(arr);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\ttrapezoid_locator = new Trapezoid_Locator();\n\t\t\ttrapezoid_locator->attach(arr);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid ReleaseLocator()\n\t{\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::NAIVE:\n\t\t\tnaive_locator->detach();\n\t\t\tdelete naive_locator;\n\t\t\tnaive_locator = nullptr;\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\twalk_locator->detach();\n\t\t\tdelete walk_locator;\n\t\t\twalk_locator = nullptr;\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::LANDMARKS:\n\t\t\tlandmark_locator->detach();\n\t\t\tdelete landmark_locator;\n\t\t\tlandmark_locator = nullptr;\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\ttrapezoid_locator->detach();\n\t\t\tdelete trapezoid_locator;\n\t\t\ttrapezoid_locator = nullptr;\n\t\t\tbreak;\n\t\t}\n\n\t\tcurrent_locator_type = ARR_LOCATOR::NONE;\n\t}\n\n\tLocator_Result_Type Locate(const Arrangement& arr, Point2d point)\n\t{\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::NAIVE:\n\t\t\treturn naive_locator->locate(point.ToCGAL<K>());\n\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\treturn walk_locator->locate(point.ToCGAL<K>());\n\n\t\tcase ARR_LOCATOR::LANDMARKS:\n\t\t\treturn landmark_locator->locate(point.ToCGAL<K>());\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\treturn trapezoid_locator->locate(point.ToCGAL<K>());\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\treturn locator.locate(point.ToCGAL<K>());\n\t\t}\n\t}\n\n\tLocator_Result_Type RayShootUp(const Arrangement& arr, Point2d point)\n\t{\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\treturn walk_locator->ray_shoot_up(point.ToCGAL<K>());\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\treturn trapezoid_locator->ray_shoot_up(point.ToCGAL<K>());\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\treturn locator.ray_shoot_up(point.ToCGAL<K>());\n\t\t}\n\t}\n\n\tLocator_Result_Type RayShootDown(const Arrangement& arr, Point2d point)\n\t{\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\treturn walk_locator->ray_shoot_down(point.ToCGAL<K>());\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\treturn trapezoid_locator->ray_shoot_down(point.ToCGAL<K>());\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\treturn locator.ray_shoot_down(point.ToCGAL<K>());\n\t\t}\n\t}\n\n\ttemplate<class SEGMENT>\n\tBOOL Intersects(Arrangement& arr, Segment2d segment)\n\t{\n\t\tauto seg = segment.ToCGAL<K, SEGMENT>();\n\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\treturn do_intersect(arr, seg, *walk_locator);\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\treturn do_intersect(arr, seg, *trapezoid_locator);\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\treturn do_intersect(arr, seg, locator);\n\t\t}\n\t}\n\n\tvoid InsertPoint(Arrangement& arr, Point2d point)\n\t{\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\tinsert_point(arr, point.ToCGAL<K>(), *walk_locator);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\tinsert_point(arr, point.ToCGAL<K>(), *trapezoid_locator);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\tinsert_point(arr, point.ToCGAL<K>(), locator);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\ttemplate<class SEGMENT>\n\tvoid InsertSegment(Arrangement& arr, Segment2d segment)\n\t{\n\t\tauto seg = segment.ToCGAL<K, SEGMENT>();\n\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\tinsert(arr, seg, *walk_locator);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\tinsert(arr, seg, *trapezoid_locator);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\tinsert(arr, seg, locator);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\ttemplate<class SEGMENT>\n\tvoid InsertNonIntersectingSegment(Arrangement& arr, Segment2d segment)\n\t{\n\t\tauto seg = segment.ToCGAL<K, SEGMENT>();\n\n\t\tswitch (current_locator_type)\n\t\t{\n\t\tcase ARR_LOCATOR::WALK:\n\t\t\tinsert_non_intersecting_curve(arr, seg, *walk_locator);\n\t\t\tbreak;\n\n\t\tcase ARR_LOCATOR::TRAPEZOID:\n\t\t\tinsert_non_intersecting_curve(arr, seg, *trapezoid_locator);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tWalk_Locator locator;\n\t\t\tlocator.attach(arr);\n\t\t\tinsert_non_intersecting_curve(arr, seg, locator);\n\t\t\tbreak;\n\t\t}\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Arrangments/ArrVertex2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"CGAL/Point_2.h\"\n\nstruct ArrVertex2\n{\n\tPoint2d Point;\n\tint Degree;\n\tBOOL IsIsolated;\n\tint Index;\n\tint FaceIndex;\n\tint HalfEdgeIndex;\n\n\tstatic ArrVertex2 NullVertex()\n\t{\n\t\tArrVertex2 v;\n\t\tv.Point = { 0, 0 };\n\t\tv.Degree = 0;\n\t\tv.IsIsolated = false;\n\t\tv.Index = NULL_INDEX;\n\t\tv.FaceIndex = NULL_INDEX;\n\t\tv.HalfEdgeIndex = NULL_INDEX;\n\t\treturn v;\n\t}\n\n\ttemplate<class K, class VERT>\n\tstatic ArrVertex2 FromVertex(VERT vert)\n\t{\n\t\tArrVertex2 v;\n\t\t\n\t\tv.Index = vert->data();\n\t\tv.Point = Point2d::FromCGAL<K>(vert->point());\n\t\tv.Degree = (int)vert->degree();\n\t\tv.IsIsolated = vert->is_isolated();\n\n\t\tif (vert->is_isolated())\n\t\t{\n\t\t\tv.FaceIndex = vert->face()->data();\n\t\t\tv.HalfEdgeIndex = -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv.FaceIndex = -1;\n\t\t\tauto first = vert->incident_halfedges();\n\t\t\tv.HalfEdgeIndex = first->data();\n\t\t}\n\n\t\treturn v;\n\t}\n};\n"
  },
  {
    "path": "CGALWrapper/Arrangments/Arrangement2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"ArrMultiLocator.h\"\n#include \"ArrangementMap.h\"\n\n#include \"ArrVertex2.h\"\n#include \"ArrHalfEdge2.h\"\n#include \"ArrFace2.h\"\n\n#include <vector>\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Arr_segment_traits_2.h>\n#include <CGAL/Arrangement_2.h>\n#include <CGAL/Arr_extended_dcel.h>\n#include <CGAL/Arr_batched_point_location.h>\n#include <CGAL/Arr_overlay_2.h>\n\nenum class ARR_ELEMENT_HIT : int\n{\n\tNONE,\n\tVERTEX,\n\tHALF_EDGE,\n\tFACE\n};\n\nstruct ArrQuery\n{\n\tARR_ELEMENT_HIT Element;\n\tint Index;\n};\n\ntemplate<class K>\nclass Arrangement2\n{\n\npublic:\n\n\ttypedef CGAL::Arr_segment_traits_2<EEK> Traits_2;\n\ttypedef Traits_2::Point_2 Point_2;\n\ttypedef Traits_2::X_monotone_curve_2 Segment_2;\n\ttypedef CGAL::Arr_extended_dcel<Traits_2, int, int, int> Dcel;\n\ttypedef CGAL::Arrangement_2<Traits_2, Dcel> Arrangement_2;\n\ttypedef ArrMultiLocator<K, Arrangement_2> Locator;\n\ttypedef typename Locator::Walk_Locator Walk_Locator;\n\n\ttypedef typename Locator::Locator_Result_Type Locator_Result_Type;\n\ttypedef std::pair<Point_2, Locator_Result_Type> Batch_Query_Result;\n\n\ttypedef typename Arrangement_2::Vertex_const_handle Vertex_const;\n\ttypedef typename Arrangement_2::Halfedge_const_handle Halfedge_const;\n\ttypedef typename Arrangement_2::Face_const_handle Face_const;\n\n\ttypedef typename Arrangement_2::Vertex_handle Vertex;\n\ttypedef typename Arrangement_2::Halfedge_handle Halfedge;\n\ttypedef typename Arrangement_2::Face_handle Face;\n\n\ttypedef typename Arrangement_2::Halfedge_around_vertex_const_circulator Vertex_const_circulator;\n\n\ttypedef typename Arrangement_2::Halfedge_around_vertex_circulator Vertex_circulator;\n\nprivate:\n\n\tArrangement_2 model;\n\n\tLocator locator;\n\n\tArrangementMap<K, Vertex, Face, Halfedge> map;\n\npublic:\n\n\tArrangement2()\n\t{\n\t\n\t}\n\n\t~Arrangement2()\n\t{\n\n\t}\n\n\tinline static Arrangement2* NewArrangement2()\n\t{\n\t\treturn new Arrangement2();\n\t}\n\n\tinline static void DeleteArrangement2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Arrangement2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Arrangement2* CastToArrangement(void* ptr)\n\t{\n\t\treturn static_cast<Arrangement2*>(ptr);\n\t}\n\n\tstatic BOOL IsValid(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn arr->model.is_valid();\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->model.clear();\n\t\tarr->map.ClearMaps();\n\t}\n\n\tstatic BOOL IsEmpty(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn arr->model.is_empty();\n\t}\n\n\tstatic int BuildStamp(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn arr->map.BuildStamp();\n\t}\n\n\tstatic void Assign(void* ptr, void* ptrOther)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tauto other = CastToArrangement(ptrOther);\n\t\tarr->model.assign(other->model);\n\t}\n\n\tstatic void* Overlay(void* ptr, void* ptrOther)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tauto other = CastToArrangement(ptrOther);\n\t\tauto result = new Arrangement2();\n\t\toverlay(arr->model, other->model, result->model);\n\t\treturn result;\n\t}\n\n\tstatic int VertexCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_vertices();\n\t}\n\n\tstatic int VerticesAtInfinityCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_vertices_at_infinity();\n\t}\n\n\tstatic int IsolatedVerticesCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_isolated_vertices();\n\t}\n\n\tstatic int HalfEdgeCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_halfedges();\n\t}\n\n\tstatic int FaceCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_faces();\n\t}\n\n\tstatic int EdgeCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_edges();\n\t}\n\n\tstatic int UnboundedFaceCount(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn (int)arr->model.number_of_unbounded_faces();\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tint i = 0;\n\n\t\tfor (auto iter = arr->model.vertices_begin(); iter != arr->model.vertices_end(); ++iter, ++i)\n\t\t{\n\t\t\tpoints[i] = Point2d::FromCGAL<K>(iter->point());\n\t\t}\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tint i = 0;\n\n\t\tfor (auto iter = arr->model.edges_begin(); iter != arr->model.edges_end(); ++iter, ++i)\n\t\t{\n\t\t\tauto a = iter->curve().source();\n\t\t\tauto b = iter->curve().target();\n\n\t\t\tsegments[i] = Segment2d::FromCGAL<K>(a, b);\n\t\t}\n\t}\n\n\tstatic void GetVertices(void* ptr, ArrVertex2* vertices, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tint i = 0;\n\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tfor (auto vert = arr->model.vertices_begin(); vert != arr->model.vertices_end(); ++vert, ++i)\n\t\t{\n\t\t\tvertices[i] = ArrVertex2::FromVertex<K>(vert);\n\t\t}\n\t}\n\n\tstatic BOOL GetVertex(void* ptr, int index, ArrVertex2& arrVert)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto vert = arr->map.FindVertex(arr->model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tarrVert = ArrVertex2::FromVertex<K>(*vert);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tarrVert = ArrVertex2::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetHalfEdges(void* ptr, ArrHalfEdge2* edges, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tint i = 0;\n\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tfor (auto edge = arr->model.halfedges_begin(); edge != arr->model.halfedges_end(); ++edge, ++i)\n\t\t{\n\t\t\tedges[i] = ArrHalfEdge2::FromHalfEdge(edge);\n\t\t}\n\t}\n\n\tstatic BOOL GetHalfEdge(void* ptr, int index, ArrHalfEdge2& arrEdge)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto edge = arr->map.FindEdge(arr->model, index);\n\t\tif (edge != nullptr)\n\t\t{\n\t\t\tarrEdge = ArrHalfEdge2::FromHalfEdge(*edge);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tarrEdge = ArrHalfEdge2::NullEdge();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetFaces(void* ptr, ArrFace2* faces, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tint i = 0;\n\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tfor (auto face = arr->model.faces_begin(); face != arr->model.faces_end(); ++face)\n\t\t{\n\t\t\tif (!face->is_unbounded())\n\t\t\t\tfaces[i++] = ArrFace2::FromFace(face);\n\t\t}\n\t}\n\n\tstatic BOOL GetFace(void* ptr, int index, ArrFace2& arrFace)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto face = arr->map.FindFace(arr->model, index);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tif (!(*face)->is_unbounded())\n\t\t\t{\n\t\t\t\tarrFace = ArrFace2::FromFace(*face);\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tarrFace = ArrFace2::NullFace();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tarrFace = ArrFace2::NullFace();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic int GetFaceHoleCount(void* ptr, int index)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto face = arr->map.FindFace(arr->model, index);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\treturn CountHoles(*face);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn NULL_INDEX;\n\t\t}\n\t}\n\n\tstatic int GetHoleVertexCount(void* ptr, int faceIndex, int holeIndex)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto face = arr->map.FindFace(arr->model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\treturn CountHoleVertices(*face, holeIndex);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn NULL_INDEX;\n\t\t}\n\t}\n\n\tstatic void CreateLocator(void* ptr, ARR_LOCATOR type)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->locator.CreateLocator(type, arr->model);\n\t}\n\n\tstatic void ReleaseLocator(void* ptr)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->locator.ReleaseLocator();\n\t}\n\n\tstatic BOOL PointQuery(void* ptr, Point2d point, ArrQuery& result)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto q = arr->locator.Locate(arr->model, point);\n\t\treturn HandleQuery(arr, q, result);\n\t}\n\n\tstatic BOOL BatchedPointQuery(void* ptr, Point2d* p, ArrQuery* r, int count)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tauto list = ToList(p, count);\n\t\tstd::vector<Batch_Query_Result> results;\n\n\t\tlocate(arr->model, list.begin(), list.end(), std::back_inserter(results));\n\n\t\tBOOL hit = FALSE;\n\t\tint i = 0;\n\n\t\tfor (auto it = results.begin(); it != results.end(); ++it, ++i) \n\t\t{\n\t\t\tif (HandleQuery(arr, it->second, r[i]))\n\t\t\t\thit = TRUE;\n\t\t}\n\n\t\treturn hit;\n\t}\n\n\tstatic BOOL RayQuery(void* ptr, Point2d point, BOOL up, ArrQuery& result)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->map.SetIndices(arr->model);\n\n\t\tif (up)\n\t\t{\n\t\t\tauto q = arr->locator.RayShootUp(arr->model, point);\n\t\t\treturn HandleQuery(arr, q, result);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto q = arr->locator.RayShootDown(arr->model, point);\n\t\t\treturn HandleQuery(arr, q, result);\n\t\t}\n\t}\n\n\tstatic BOOL IntersectsSegment(void* ptr, Segment2d segment)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\treturn arr->locator.Intersects<Segment_2>(arr->model, segment);\n\t}\n\n\tstatic void InsertPoint(void* ptr, Point2d point)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tarr->locator.InsertPoint(arr->model, point);\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic void InsertPolygon(void* ptr, void* polyPtr, BOOL nonItersecting)\n\t{\n\t\tauto arr = CastToArrangement(ptr);;\n\t\tauto polygon = Polygon2<EEK>::CastToPolygon2(polyPtr);\n\n\t\tint count = (int)polygon->container().size();\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tint i0 = i;\n\t\t\tint i1 = i + 1;\n\n\t\t\tif (i == count - 1)\n\t\t\t\ti1 = 0;\n\n\t\t\tauto a = polygon->vertex(i0);\n\t\t\tauto b = polygon->vertex(i1);\n\n\t\t\tauto segment = Segment2d::FromCGAL(a, b);\n\n\t\t\tif (segment.a == segment.b) continue;\n\n\t\t\tif (nonItersecting)\n\t\t\t\tarr->locator.InsertNonIntersectingSegment<Segment_2>(arr->model, segment);\n\t\t\telse\n\t\t\t\tarr->locator.InsertSegment<Segment_2>(arr->model, segment);\n\t\t}\n\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic void InsertPolygon(Arrangement2* arr, Polygon2<K>* polygon, BOOL nonItersecting)\n\t{\n\t\tint count = (int)polygon->container().size();\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tint i0 = i;\n\t\t\tint i1 = i + 1;\n\n\t\t\tif (i == count - 1)\n\t\t\t\ti1 = 0;\n\n\t\t\tauto a = polygon->vertex(i0);\n\t\t\tauto b = polygon->vertex(i1);\n\n\t\t\tauto segment = Segment2d::FromCGAL(a, b);\n\n\t\t\tif (segment.a == segment.b) continue;\n\n\t\t\tif (nonItersecting)\n\t\t\t\tarr->locator.InsertNonIntersectingSegment<Segment_2>(arr->model, segment);\n\t\t\telse\n\t\t\t\tarr->locator.InsertSegment<Segment_2>(arr->model, segment);\n\t\t}\n\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic void InsertPolygonWithHoles(void* ptr, void* pwhPtr, BOOL nonItersecting)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tInsertPolygon(&arr, &pwh->outer_boundary(), nonItersecting);\n\t\t\t\n\t\tfor (auto& hole : pwh->holes())\n\t\t\tInsertPolygon(&arr, &hole, nonItersecting);\n\t\t\t\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic void InsertSegment(void* ptr, Segment2d segment, BOOL nonItersecting)\n\t{\n\t\tif (segment.a == segment.b) return;\n\n\t\tauto arr = CastToArrangement(ptr);\n\n\t\tif(nonItersecting)\n\t\t\tarr->locator.InsertNonIntersectingSegment<Segment_2>(arr->model, segment);\n\t\telse\n\t\t\tarr->locator.InsertSegment<Segment_2>(arr->model, segment);\n\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic void InsertSegments(void* ptr, Segment2d* segments, int count, BOOL nonItersecting)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tif (segments[i].a == segments[i].b) continue;\n\n\t\t\tif (nonItersecting)\n\t\t\t\tarr->locator.InsertNonIntersectingSegment<Segment_2>(arr->model, segments[i]);\n\t\t\telse\n\t\t\t\tarr->locator.InsertSegment<Segment_2>(arr->model, segments[i]);\n\t\t}\n\n\t\tarr->map.OnModelChanged();\n\t}\n\n\tstatic BOOL RemoveVertex(void* ptr, int index)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\t\t\n\t\tauto v = arr->map.FindVertex(arr->model, index);\n\t\tif (v != nullptr)\n\t\t{\n\t\t\tif (remove_vertex(arr->model, *v))\n\t\t\t{\n\t\t\t\tarr->map.OnModelChanged();\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\tstatic BOOL RemoveVertex(void* ptr, Point2d point)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\n\t\tauto q = arr->locator.Locate(arr->model, point);\n\n\t\tconst Vertex_const* vert;\n\t\tif (vert = boost::get<Vertex_const>(&q))\n\t\t{\n\t\t\tauto v = arr->model.non_const_handle(*vert);\n\t\t\tif (remove_vertex(arr->model, v))\n\t\t\t{\n\t\t\t\tarr->map.OnModelChanged();\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\tstatic BOOL RemoveEdge(void* ptr, int index)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\n\t\tauto e = arr->map.FindEdge(arr->model, index);\n\t\tif (e != nullptr)\n\t\t{\n\t\t\tremove_edge(arr->model, *e);\n\t\t\tarr->map.OnModelChanged();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\treturn FALSE;\n\t}\n\n\tstatic BOOL RemoveEdge(void* ptr, Segment2d segment)\n\t{\n\t\tauto arr = CastToArrangement(ptr);\n\n\t\tauto q1 = arr->locator.Locate(arr->model, segment.a);\n\n\t\tconst Vertex_const* vert1;\n\t\tif (vert1 = boost::get<Vertex_const>(&q1))\n\t\t{\n\t\t\tif ((*vert1)->is_isolated())\n\t\t\t\treturn FALSE;\n\n\t\t\tauto q2 = arr->locator.Locate(arr->model, segment.b);\n\n\t\t\tconst Vertex_const* vert2;\n\t\t\tif (vert2 = boost::get<Vertex_const>(&q2))\n\t\t\t{\n\t\t\t\tif ((*vert2)->is_isolated())\n\t\t\t\t\treturn FALSE;\n\n\t\t\t\tauto first = (*vert1)->incident_halfedges();\n\t\t\t\tauto curr = first;\n\t\t\t\tauto next = first;\n\n\t\t\t\tdo \n\t\t\t\t{\n\t\t\t\t\t++next;\n\t\t\t\t\tif ((next->source() == (*vert2) || next->target() == (*vert2)))\n\t\t\t\t\t{\n\t\t\t\t\t\tauto e = arr->model.non_const_handle(next);\n\t\t\t\t\t\tremove_edge(arr->model, e);\n\t\t\t\t\t\tarr->map.OnModelChanged();\n\t\t\t\t\t\treturn TRUE;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\twhile (++curr != first);\n\n\t\t\t}\n\n\t\t}\n\t\t\n\t\treturn FALSE;\n\t}\n\nprivate:\n\n\tstatic BOOL HandleQuery(Arrangement2* arr, Locator_Result_Type query, ArrQuery& result)\n\t{\n\t\tconst Vertex_const* vert;\n\t\tconst Halfedge_const* edge;\n\t\tconst Face_const* face;\n\n\t\tif (face = boost::get<Face_const>(&query))\n\t\t{\n\t\t\tarr->map.SetIndices(arr->model);\n\t\t\tresult.Element = ARR_ELEMENT_HIT::FACE;\n\t\t\tresult.Index = (*face)->data();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\telse if (edge = boost::get<Halfedge_const>(&query))\n\t\t{\n\t\t\tarr->map.SetIndices(arr->model);\n\t\t\tresult.Element = ARR_ELEMENT_HIT::HALF_EDGE;\n\t\t\tresult.Index = (*edge)->data();\n\t\t\treturn TRUE;\n\t\t}\n\n\t\telse if (vert = boost::get<Vertex_const>(&query))\n\t\t{\n\t\t\tarr->map.SetIndices(arr->model);\n\t\t\tresult.Element = ARR_ELEMENT_HIT::VERTEX;\n\t\t\tresult.Index = (*vert)->data();\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.Element = ARR_ELEMENT_HIT::NONE;\n\t\t\tresult.Index = -1;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic std::vector<Point_2> ToList(Point2d* points, int count)\n\t{\n\t\tauto list = std::vector<Point_2>(count);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist.push_back(points[i].ToCGAL<K>());\n\n\t\treturn list;\n\t}\n\n\tstatic int CountHoles(Face face)\n\t{\n\t\tint count = 0;\n\t\tfor (auto hole = face->holes_begin(); hole != face->holes_end(); ++hole)\n\t\t{\n\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int CountHoleVertices(Face face, int index)\n\t{\n\t\tint holeCount = 0;\n\t\tfor (auto hole = face->holes_begin(); hole != face->holes_end(); ++hole)\n\t\t{\n\t\t\tif (holeCount == index)\n\t\t\t{\n\t\t\t\tauto curr = (*hole)->next();\n\t\t\t\tauto first = curr;\n\n\t\t\t\tint vertCount = 0;\n\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tvertCount++;\n\t\t\t\t\tcurr = curr->next();\n\t\t\t\t} while (curr != first);\n\n\t\t\t\treturn vertCount;\n\t\t\t}\n\n\t\t\tholeCount++;\n\t\t}\n\n\t\treturn NULL_INDEX;\n\t}\n\t\n};\n\n"
  },
  {
    "path": "CGALWrapper/Arrangments/Arrangement2_EEK.cpp",
    "content": "\n#include \"Arrangement2_EEK.h\"\n#include \"Arrangement2.h\"\n\n#include <CGAL/Arr_segment_traits_2.h>\n#include <CGAL/Arrangement_2.h>\n\nvoid* Arrangement2_EEK_Create()\n{\n\treturn Arrangement2<EEK>::NewArrangement2();\n}\n\nvoid Arrangement2_EEK_Release(void* ptr)\n{\n\tArrangement2<EEK>::DeleteArrangement2(ptr);\n}\n\nBOOL Arrangement2_EEK_IsValid(void* ptr)\n{\n\treturn Arrangement2<EEK>::IsValid(ptr);\n}\n\nvoid Arrangement2_EEK_Clear(void* ptr)\n{\n\treturn Arrangement2<EEK>::Clear(ptr);\n}\n\nBOOL Arrangement2_EEK_IsEmpty(void* ptr)\n{\n\treturn Arrangement2<EEK>::IsEmpty(ptr);\n}\n\nint Arrangement2_EEK_BuildStamp(void* ptr)\n{\n\treturn Arrangement2<EEK>::BuildStamp(ptr);\n}\n\nvoid Arrangement2_EEK_Assign(void* ptr, void* ptrOther)\n{\n\tArrangement2<EEK>::Assign(ptr, ptrOther);\n}\n\nvoid* Arrangement2_EEK_Overlay(void* ptr, void* ptrOther)\n{\n\treturn Arrangement2<EEK>::Overlay(ptr, ptrOther);\n}\n\nint Arrangement2_EEK_VertexCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::VertexCount(ptr);\n}\n\nint Arrangement2_EEK_IsolatedVerticesCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::IsolatedVerticesCount(ptr);\n}\n\nint Arrangement2_EEK_VerticesAtInfinityCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::VerticesAtInfinityCount(ptr);\n}\n\nint Arrangement2_EEK_HalfEdgeCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::HalfEdgeCount(ptr);\n}\n\nint Arrangement2_EEK_FaceCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::FaceCount(ptr);\n}\n\nint Arrangement2_EEK_EdgeCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::EdgeCount(ptr);\n}\n\nint Arrangement2_EEK_UnboundedFaceCount(void* ptr)\n{\n\treturn Arrangement2<EEK>::UnboundedFaceCount(ptr);\n}\n\nvoid Arrangement2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tArrangement2<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid Arrangement2_EEK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tArrangement2<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid Arrangement2_EEK_GetVertices(void* ptr, ArrVertex2* vertices, int count)\n{\n\tArrangement2<EEK>::GetVertices(ptr, vertices, count);\n}\n\nBOOL Arrangement2_EEK_GetVertex(void* ptr, int index, ArrVertex2& arrVertex)\n{\n\treturn Arrangement2<EEK>::GetVertex(ptr, index, arrVertex);\n}\n\nvoid Arrangement2_EEK_GetHalfEdges(void* ptr, ArrHalfEdge2* edges, int count)\n{\n\tArrangement2<EEK>::GetHalfEdges(ptr, edges, count);\n}\n\nBOOL Arrangement2_EEK_GetHalfEdge(void* ptr, int index, ArrHalfEdge2& arrEdge)\n{\n\treturn Arrangement2<EEK>::GetHalfEdge(ptr, index, arrEdge);\n}\n\nvoid Arrangement2_EEK_GetFaces(void* ptr, ArrFace2* faces, int count)\n{\n\tArrangement2<EEK>::GetFaces(ptr, faces, count);\n}\n\nBOOL Arrangement2_EEK_GetFace(void* ptr, int index, ArrFace2& arrFace)\n{\n\treturn Arrangement2<EEK>::GetFace(ptr, index, arrFace);\n}\n\nint Arrangement2_EEK_GetFaceHoleCount(void* ptr, int index)\n{\n\treturn Arrangement2<EEK>::GetFaceHoleCount(ptr, index);\n}\n\nint Arrangement2_EEK_GetHoleVertexCount(void* ptr, int faceIndex, int holeIndex)\n{\n\treturn Arrangement2<EEK>::GetHoleVertexCount(ptr, faceIndex, holeIndex);\n}\n\nvoid Arrangement2_EEK_CreateLocator(void* ptr, ARR_LOCATOR type)\n{\n\tArrangement2<EEK>::CreateLocator(ptr, type);\n}\n\nvoid Arrangement2_EEK_ReleaseLocator(void* ptr)\n{\n\tArrangement2<EEK>::ReleaseLocator(ptr);\n}\n\nBOOL Arrangement2_EEK_PointQuery(void* ptr, Point2d point, ArrQuery& result)\n{\n\treturn Arrangement2<EEK>::PointQuery(ptr, point, result);\n}\n\nBOOL Arrangement2_EEK_BatchedPointQuery(void* ptr, Point2d* points, ArrQuery* results, int count)\n{\n\treturn Arrangement2<EEK>::BatchedPointQuery(ptr, points, results, count);\n}\n\nBOOL Arrangement2_EEK_RayQuery(void* ptr, Point2d point, BOOL up, ArrQuery& result)\n{\n\treturn Arrangement2<EEK>::RayQuery(ptr, point, up, result);\n}\n\nBOOL Arrangement2_EEK_IntersectsSegment(void* ptr, Segment2d segment)\n{\n\treturn Arrangement2<EEK>::IntersectsSegment(ptr, segment);\n}\n\nvoid Arrangement2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tArrangement2<EEK>::InsertPoint(ptr, point);\n}\n\nvoid Arrangement2_EEK_InsertPolygon(void* ptr, void* polyPtr, BOOL nonItersecting)\n{\n\tArrangement2<EEK>::InsertPolygon(ptr, polyPtr, nonItersecting);\n}\n\nvoid Arrangement2_EEK_InsertPolygonWithHoles(void* ptr, void* pwhPtr, BOOL nonItersecting)\n{\n\tArrangement2<EEK>::InsertPolygonWithHoles(ptr, pwhPtr, nonItersecting);\n}\n\nvoid Arrangement2_EEK_InsertSegment(void* ptr, Segment2d segment, BOOL nonItersecting)\n{\n\tArrangement2<EEK>::InsertSegment(ptr, segment, nonItersecting);\n}\n\nvoid Arrangement2_EEK_InsertSegments(void* ptr, Segment2d* segments, int count, BOOL nonItersecting)\n{\n\tArrangement2<EEK>::InsertSegments(ptr, segments, count, nonItersecting);\n}\n\nBOOL Arrangement2_EEK_RemoveVertexByIndex(void* ptr, int index)\n{\n\treturn Arrangement2<EEK>::RemoveVertex(ptr, index);\n}\n\nBOOL Arrangement2_EEK_RemoveVertexByPoint(void* ptr, Point2d point)\n{\n\treturn Arrangement2<EEK>::RemoveVertex(ptr, point);\n}\n\nBOOL Arrangement2_EEK_RemoveEdgeByIndex(void* ptr, int index)\n{\n\treturn Arrangement2<EEK>::RemoveEdge(ptr, index);\n}\n\nBOOL Arrangement2_EEK_RemoveEdgeBySegment(void* ptr, Segment2d segment)\n{\n\treturn Arrangement2<EEK>::RemoveEdge(ptr, segment);\n}\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Arrangments/Arrangement2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Arrangement2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Arrangement2_EEK_Create();\n\n\tCGALWRAPPER_API void Arrangement2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_IsValid(void* ptr);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_IsEmpty(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_Assign(void* ptr, void* ptrOther);\n\n\tCGALWRAPPER_API void* Arrangement2_EEK_Overlay(void* ptr, void* ptrOther);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_IsolatedVerticesCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_VerticesAtInfinityCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_HalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_UnboundedFaceCount(void* ptr);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_GetVertices(void* ptr, ArrVertex2* vertices, int count);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_GetVertex(void* ptr, int index, ArrVertex2& arrVertex);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_GetHalfEdges(void* ptr, ArrHalfEdge2* edges, int count);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_GetHalfEdge(void* ptr, int index, ArrHalfEdge2& arrEdge);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_GetFaces(void* ptr, ArrFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_GetFace(void* ptr, int index, ArrFace2& arrFace);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_GetFaceHoleCount(void* ptr, int index);\n\n\tCGALWRAPPER_API int Arrangement2_EEK_GetHoleVertexCount(void* ptr, int faceIndex, int holeIndex);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_CreateLocator(void* ptr, ARR_LOCATOR type);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_ReleaseLocator(void* ptr);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_PointQuery(void* ptr, Point2d point, ArrQuery& result);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_BatchedPointQuery(void* ptr, Point2d* points, ArrQuery* results, int count);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_RayQuery(void* ptr, Point2d point, BOOL up, ArrQuery& result);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_IntersectsSegment(void* ptr, Segment2d segment);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_InsertPolygon(void* ptr, void* polyPtr, BOOL nonItersecting);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_InsertPolygonWithHoles(void* ptr, void* pwhPtr, BOOL nonItersecting);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_InsertSegment(void* ptr, Segment2d segment, BOOL nonItersecting);\n\n\tCGALWRAPPER_API void Arrangement2_EEK_InsertSegments(void* ptr, Segment2d* segments, int count, BOOL nonItersecting);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_RemoveVertexByIndex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_RemoveVertexByPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_RemoveEdgeByIndex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL Arrangement2_EEK_RemoveEdgeBySegment(void* ptr, Segment2d segment);\n\n}\n"
  },
  {
    "path": "CGALWrapper/Arrangments/ArrangementMap.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Collections/IndexMap.h\"\n\n#include <vector>\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Arr_segment_traits_2.h>\n#include <CGAL/Arrangement_2.h>\n\ntemplate<class K, class VERTEX, class FACE, class EDGE>\nclass ArrangementMap\n{\n\nprivate:\n\n\tIndexMap<VERTEX> vertexMap;\n\n\tIndexMap<FACE> faceMap;\n\n\tIndexMap<EDGE> edgeMap;\n\n\tint buildStamp;\n\npublic:\n\n\tArrangementMap()\n\t{\n\n\t}\n\n\tint BuildStamp()\n\t{\n\t\treturn buildStamp;\n\t}\n\n\tvoid IncrementBuildStamp()\n\t{\n\t\t++buildStamp;\n\t}\n\n\ttemplate<class ARR>\n\tvoid BuildMaps(ARR& model)\n\t{\n\t\tBuildVertexMap(model);\n\t\tBuildFaceMap(model);\n\t}\n\n\tvoid ClearMaps()\n\t{\n\t\tvertexMap.Clear();\n\t\tfaceMap.Clear();\n\t\tedgeMap.Clear();\n\t}\n\n\tvoid OnModelChanged()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t\tOnEdgesChanged();\n\t}\n\n\ttemplate<class ARR>\n\tvoid SetIndices(ARR& model)\n\t{\n\t\tSetVertexIndices(model);\n\t\tSetFaceIndices(model);\n\t\tSetEdgeIndices(model);\n\t}\n\n\tvoid OnVerticesChanged()\n\t{\n\t\tbuildStamp++;\n\t\tvertexMap.Clear();\n\t}\n\n\tvoid OnFacesChanged()\n\t{\n\t\tbuildStamp++;\n\t\tfaceMap.Clear();\n\t}\n\n\tvoid OnEdgesChanged()\n\t{\n\t\tbuildStamp++;\n\t\tedgeMap.Clear();\n\t}\n\n\ttemplate<class ARR>\n\tVERTEX* FindVertex(ARR& model, int index)\n\t{\n\t\tif (index == NULL_INDEX)\n\t\t\treturn nullptr;\n\n\t\tSetVertexIndices(model);\n\t\tBuildVertexMap(model);\n\t\treturn vertexMap.Find(index);\n\t}\n\n\ttemplate<class ARR>\n\tFACE* FindFace(ARR& model, int index)\n\t{\n\t\tif (index == NULL_INDEX)\n\t\t\treturn nullptr;\n\n\t\tSetFaceIndices(model);\n\t\tBuildFaceMap(model);\n\t\treturn faceMap.Find(index);\n\t}\n\n\ttemplate<class ARR>\n\tEDGE* FindEdge(ARR& model, int index)\n\t{\n\t\tif (index == NULL_INDEX)\n\t\t\treturn nullptr;\n\n\t\tSetEdgeIndices(model);\n\t\tBuildEdgeMap(model);\n\t\treturn edgeMap.Find(index);\n\t}\n\n\ttemplate<class ARR>\n\tvoid SetVertexIndices(ARR& model)\n\t{\n\t\tif (vertexMap.indicesSet)\n\t\t\treturn;\n\n\t\tvertexMap.Clear();\n\n\t\tfor (auto vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t\tvert->set_data(vertexMap.NextIndex());\n\n\t\tvertexMap.indicesSet = true;\n\t}\n\n\ttemplate<class ARR>\n\tvoid BuildVertexMap(ARR& model)\n\t{\n\t\tif (vertexMap.mapBuilt)\n\t\t\treturn;\n\n\t\tvertexMap.ClearMap();\n\n\t\tfor (auto vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t\tvertexMap.Insert(vert->data(), vert);\n\n\t\tvertexMap.mapBuilt = true;\n\t}\n\n\ttemplate<class ARR>\n\tvoid SetFaceIndices(ARR& model)\n\t{\n\t\tif (faceMap.indicesSet)\n\t\t\treturn;\n\n\t\tfaceMap.Clear();\n\n\t\tfor (auto face = model.faces_begin(); face != model.faces_end(); ++face)\n\t\t{\n\t\t\tif (!face->is_unbounded())\n\t\t\t\tface->set_data(faceMap.NextIndex());\n\t\t\telse\n\t\t\t\tface->set_data(-1);\n\t\t}\n\t\t\t\n\t\tfaceMap.indicesSet = true;\n\t}\n\n\ttemplate<class ARR>\n\tvoid BuildFaceMap(ARR& model)\n\t{\n\t\tif (faceMap.mapBuilt)\n\t\t\treturn;\n\n\t\tfaceMap.ClearMap();\n\n\t\tfor (auto face = model.faces_begin(); face != model.faces_end(); ++face)\n\t\t{\n\t\t\tif(!face->is_unbounded())\n\t\t\t\tfaceMap.Insert(face->data(), face);\n\t\t}\n\t\t\t\n\t\tfaceMap.mapBuilt = true;\n\t}\n\n\ttemplate<class ARR>\n\tvoid SetEdgeIndices(ARR& model)\n\t{\n\t\tif (edgeMap.indicesSet)\n\t\t\treturn;\n\n\t\tedgeMap.Clear();\n\n\t\tfor (auto edge = model.halfedges_begin(); edge != model.halfedges_end(); ++edge)\n\t\t\tedge->set_data(edgeMap.NextIndex());\n\n\t\tedgeMap.indicesSet = true;\n\t}\n\n\ttemplate<class ARR>\n\tvoid BuildEdgeMap(ARR& model)\n\t{\n\t\tif (edgeMap.mapBuilt)\n\t\t\treturn;\n\n\t\tedgeMap.ClearMap();\n\n\t\tfor (auto edge = model.halfedges_begin(); edge != model.halfedges_end(); ++edge)\n\t\t\tedgeMap.Insert(edge->data(), edge);\n\n\t\tedgeMap.mapBuilt = true;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Arrangments/SweepLine.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <vector>\n#include <list>\n#include <CGAL/Arr_segment_traits_2.h>\n#include <CGAL/Surface_sweep_2_algorithms.h>\n\ntemplate<class K>\nclass SweepLine\n{\n\nprivate:\n\n\ttypedef CGAL::Arr_segment_traits_2<K> Traits;\n\ttypedef typename  K::Point_2 Point_2;\n\ttypedef typename  Traits::Curve_2 Segment_2;\n\n\tstd::list<Point_2> pointBuffer;\n\n\tstd::list<Segment_2> segmentBuffer;\n\npublic:\n\n\tinline static SweepLine* NewSweepLine()\n\t{\n\t\treturn new SweepLine();\n\t}\n\n\tinline static void DeleteSweepLine(void* ptr)\n\t{\n\t\tauto obj = static_cast<SweepLine*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static SweepLine* CastToSweepLine(void* ptr)\n\t{\n\t\treturn static_cast<SweepLine*>(ptr);\n\t}\n\n\tstatic void ClearPointBuffer(void* ptr)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tsweep->pointBuffer.clear();\n\t}\n\n\tstatic void ClearSegmentBuffer(void* ptr)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tsweep->segmentBuffer.clear();\n\t}\n\n\tstatic int PointBufferSize(void* ptr)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\treturn (int)sweep->pointBuffer.size();\n\t}\n\n\tstatic int SegmentBufferSize(void* ptr)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\treturn (int)sweep->segmentBuffer.size();\n\t}\n\n\tstatic BOOL DoIntersect(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tauto list = ToList(segments, count);\n\n\t\treturn CGAL::do_curves_intersect(list.begin(), list.end());\n\t}\n\n\tstatic int ComputeSubcurves(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tauto list = ToList(segments, count);\n\n\t\tsweep->segmentBuffer.clear();\n\t\tCGAL::compute_subcurves(list.begin(), list.end(), std::back_inserter(sweep->segmentBuffer));\n\n\t\treturn (int)sweep->segmentBuffer.size();\n\t}\n\n\tstatic int ComputeIntersectionPoints(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tauto list = ToList(segments, count);\n\n\t\tsweep->pointBuffer.clear();\n\t\tCGAL::compute_intersection_points(list.begin(), list.end(), std::back_inserter(sweep->pointBuffer));\n\n\t\treturn (int)sweep->pointBuffer.size();\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tint i = 0;\n\n\t\tfor (auto point = sweep->pointBuffer.begin(); point != sweep->pointBuffer.end(); ++point, ++i)\n\t\t\tpoints[i] = Point2d::FromCGAL<K>(*point);\n\t\t\t\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto sweep = CastToSweepLine(ptr);\n\t\tint i = 0;\n\n\t\tfor (auto seg = sweep->segmentBuffer.begin(); seg != sweep->segmentBuffer.end(); ++seg, ++i)\n\t\t{\n\t\t\tauto a = seg->source();\n\t\t\tauto b = seg->target();\n\t\t\tsegments[i] = Segment2d::FromCGAL<K>(a, b);\n\t\t}\n\t}\n\n\tstatic std::vector<Segment_2> ToList(Segment2d* segments, int count)\n\t{\n\t\tauto list = std::vector<Segment_2>();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist.push_back(segments[i].ToCGAL<K, Segment_2>());\n\n\t\treturn list;\n\t}\n\n\tstatic Segment_2* ToArray(Segment2d* segments, int count)\n\t{\n\t\tauto arr = new Segment_2[count];\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tarr[i] = segments[i].ToCGAL<K, Segment_2>();\n\n\t\treturn arr;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Arrangments/SweepLine_EEK.cpp",
    "content": "\n#include \"SweepLine_EEK.h\"\n#include \"SweepLine.h\"\n\nvoid* SweepLine2_EEK_Create()\n{\n\treturn SweepLine<EEK>::NewSweepLine();\n}\n\nvoid SweepLine2_EEK_Release(void* ptr)\n{\n\tSweepLine<EEK>::DeleteSweepLine(ptr);\n}\n\nvoid SweepLine2_EEK_ClearPointBuffer(void* ptr)\n{\n\tSweepLine<EEK>::ClearPointBuffer(ptr);\n}\n\nvoid SweepLine2_EEK_ClearSegmentBuffer(void* ptr)\n{\n\tSweepLine<EEK>::ClearSegmentBuffer(ptr);\n}\n\nint SweepLine2_EEK_PointBufferSize(void* ptr)\n{\n\treturn SweepLine<EEK>::PointBufferSize(ptr);\n}\n\nint SweepLine2_EEK_SegmentBufferSize(void* ptr)\n{\n\treturn SweepLine<EEK>::SegmentBufferSize(ptr);\n}\n\nBOOL SweepLine2_EEK_DoIntersect(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EEK>::DoIntersect(ptr, segments, count);\n}\n\nint SweepLine2_EEK_ComputeSubcurves(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EEK>::ComputeSubcurves(ptr, segments, count);\n}\n\nint SweepLine2_EEK_ComputeIntersectionPoints(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EEK>::ComputeIntersectionPoints(ptr, segments, count);\n}\n\nvoid SweepLine2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tSweepLine<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid SweepLine2_EEK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tSweepLine<EEK>::GetSegments(ptr, segments, count);\n}"
  },
  {
    "path": "CGALWrapper/Arrangments/SweepLine_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"SweepLine.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SweepLine2_EEK_Create();\n\n\tCGALWRAPPER_API void SweepLine2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void SweepLine2_EEK_ClearPointBuffer(void* ptr);\n\n\tCGALWRAPPER_API void SweepLine2_EEK_ClearSegmentBuffer(void* ptr);\n\n\tCGALWRAPPER_API int SweepLine2_EEK_PointBufferSize(void* ptr);\n\n\tCGALWRAPPER_API int SweepLine2_EEK_SegmentBufferSize(void* ptr);\n\n\tCGALWRAPPER_API BOOL SweepLine2_EEK_DoIntersect(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API int SweepLine2_EEK_ComputeSubcurves(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API int SweepLine2_EEK_ComputeIntersectionPoints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void SweepLine2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void SweepLine2_EEK_GetSegments(void* ptr, Segment2d* segments, int count);\n}\n"
  },
  {
    "path": "CGALWrapper/Arrangments/SweepLine_EIK.cpp",
    "content": "\n#include \"SweepLine_EIK.h\"\n#include \"SweepLine.h\"\n\nvoid* SweepLine2_EIK_Create()\n{\n\treturn SweepLine<EIK>::NewSweepLine();\n}\n\nvoid SweepLine2_EIK_Release(void* ptr)\n{\n\tSweepLine<EIK>::DeleteSweepLine(ptr);\n}\n\nvoid SweepLine2_EIK_ClearPointBuffer(void* ptr)\n{\n\tSweepLine<EIK>::ClearPointBuffer(ptr);\n}\n\nvoid SweepLine2_EIK_ClearSegmentBuffer(void* ptr)\n{\n\tSweepLine<EIK>::ClearSegmentBuffer(ptr);\n}\n\nint SweepLine2_EIK_PointBufferSize(void* ptr)\n{\n\treturn SweepLine<EIK>::PointBufferSize(ptr);\n}\n\nint SweepLine2_EIK_SegmentBufferSize(void* ptr)\n{\n\treturn SweepLine<EIK>::SegmentBufferSize(ptr);\n}\n\nBOOL SweepLine2_EIK_DoIntersect(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EIK>::DoIntersect(ptr, segments, count);\n}\n\nint SweepLine2_EIK_ComputeSubcurves(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EIK>::ComputeSubcurves(ptr, segments, count);\n}\n\nint SweepLine2_EIK_ComputeIntersectionPoints(void* ptr, Segment2d* segments, int count)\n{\n\treturn SweepLine<EIK>::ComputeIntersectionPoints(ptr, segments, count);\n}\n\nvoid SweepLine2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tSweepLine<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid SweepLine2_EIK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tSweepLine<EIK>::GetSegments(ptr, segments, count);\n}"
  },
  {
    "path": "CGALWrapper/Arrangments/SweepLine_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"SweepLine.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SweepLine2_EIK_Create();\n\n\tCGALWRAPPER_API void SweepLine2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void SweepLine2_EIK_ClearPointBuffer(void* ptr);\n\n\tCGALWRAPPER_API void SweepLine2_EIK_ClearSegmentBuffer(void* ptr);\n\n\tCGALWRAPPER_API int SweepLine2_EIK_PointBufferSize(void* ptr);\n\n\tCGALWRAPPER_API int SweepLine2_EIK_SegmentBufferSize(void* ptr);\n\n\tCGALWRAPPER_API BOOL SweepLine2_EIK_DoIntersect(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API int SweepLine2_EIK_ComputeSubcurves(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API int SweepLine2_EIK_ComputeIntersectionPoints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void SweepLine2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void SweepLine2_EIK_GetSegments(void* ptr, Segment2d* segments, int count);\n}\n"
  },
  {
    "path": "CGALWrapper/CGALWrapper.h",
    "content": "#pragma once\n\n#define CGALWRAPPER_API __declspec(dllexport)\n\n#define NULL_INDEX -1\n#define WIN32_LEAN_AND_MEAN \n#define NOMINMAX\n\n#include <windows.h>\n#include <cstdbool>\n#include <CGAL/Cartesian.h>\n#include <CGAL/Homogeneous.h>\n#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel_with_kth_root.h>\n#include <CGAL/Exact_predicates_exact_constructions_kernel_with_root_of.h>\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include \"CGAL/Point_2.h\"\n\n#include <CGAL/Simple_cartesian.h>\n#include <CGAL/Quotient.h>\n#include <CGAL/MP_Float.h>\n\ntypedef CGAL::Exact_predicates_inexact_constructions_kernel EIK;\ntypedef CGAL::Exact_predicates_exact_constructions_kernel EEK;\ntypedef CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt EEK_SQRT2;\ntypedef CGAL::Exact_predicates_exact_constructions_kernel_with_kth_root EEK_KTH_ROOT;\ntypedef CGAL::Exact_predicates_exact_constructions_kernel_with_root_of EEK_ROOT_OF;\n\nenum class CGAL_KERNEL : int\n{\n    EXACT_PREDICATES_INEXACT_CONSTRUCTION = 0,\n    EXACT_PREDICATES_EXACT_CONSTRUCTION = 1,\n    EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_SQRT2 = 2,\n    EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_KTH_ROOT = 3,\n    EXACT_PREDICATES_EXACT_CONSTRUCTION_WITH_ROOT_OF = 4\n};\n\nenum class POLYGON_ELEMENT : int\n{\n    BOUNDARY = 0,\n    HOLE = 1\n};\n\n"
  },
  {
    "path": "CGALWrapper/CGALWrapper.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"winres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (United States) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE 9, 1\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE\nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE  \nBEGIN\n    \"#include \"\"winres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE  \nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n#endif    // English (United States) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n"
  },
  {
    "path": "CGALWrapper/CGALWrapper.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{14e85ae8-4516-4fd7-a464-69f55cab9e66}</ProjectGuid>\n    <RootNamespace>CGALWrapper</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;CGALWRAPPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;CGALWRAPPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;CGALWRAPPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>C:\\dev\\vcpkg\\installed\\x64-windows\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>C:\\dev\\vcpkg\\installed\\x64-windows\\lib\\gmp.lib;C:\\dev\\vcpkg\\installed\\x64-windows\\lib\\mpfr.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;CGALWRAPPER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <AdditionalIncludeDirectories>C:\\dev\\vcpkg\\installed\\x64-windows\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n      <DisableSpecificWarnings>26495;26451;26812;6387;6031;6385;6812;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>C:\\dev\\vcpkg\\installed\\x64-windows\\lib\\gmp.lib;C:\\dev\\vcpkg\\installed\\x64-windows\\lib\\mpfr.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"Arrangments\\Arrangement2.h\" />\n    <ClInclude Include=\"Arrangments\\Arrangement2_EEK.h\" />\n    <ClInclude Include=\"Arrangments\\ArrangementMap.h\" />\n    <ClInclude Include=\"Arrangments\\ArrMultiLocator.h\" />\n    <ClInclude Include=\"Arrangments\\ArrFace2.h\" />\n    <ClInclude Include=\"Arrangments\\ArrHalfEdge2.h\" />\n    <ClInclude Include=\"Arrangments\\ArrVertex2.h\" />\n    <ClInclude Include=\"Arrangments\\SweepLine_EEK.h\" />\n    <ClInclude Include=\"Arrangments\\SweepLine_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Box2_EIK.h\" />\n    <ClInclude Include=\"Eigen\\EigenRowVector.h\" />\n    <ClInclude Include=\"Eigen\\EigenColumnVector.h\" />\n    <ClInclude Include=\"Eigen\\EigenMatrix.h\" />\n    <ClInclude Include=\"Geometry\\HPoint2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\IntersectionResult.h\" />\n    <ClInclude Include=\"Geometry\\Intersections_geometry.h\" />\n    <ClInclude Include=\"Geometry\\Intersections_geometry_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Intersections_geometry_EEK.h\" />\n    <ClInclude Include=\"Geometry\\HPoint2_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Line2_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Point2_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Ray2_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Segment2_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Triangle2_EIK.h\" />\n    <ClInclude Include=\"Processing\\HeatMethod_EIK.h\" />\n    <ClInclude Include=\"Processing\\HeatMethod_EEK.h\" />\n    <ClInclude Include=\"Processing\\HeatMethod.h\" />\n    <ClInclude Include=\"Triangulations\\BaseTriangulation3.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EIK.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2_EIK.h\" />\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2_EIK.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull3_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Index.h\" />\n    <ClInclude Include=\"Geometry\\Point2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Line2_EEK.h\" />\n    <ClInclude Include=\"Polylines\\Polyline2_EIK.h\" />\n    <ClInclude Include=\"Polylines\\Polyline3_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingConnections_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingLocate_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingRepair_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer_EIK.h\" />\n    <ClInclude Include=\"Polyhedra\\MeshFace3.h\" />\n    <ClInclude Include=\"Polyhedra\\MeshHalfedge3.h\" />\n    <ClInclude Include=\"Polyhedra\\MeshHitResult.h\" />\n    <ClInclude Include=\"Polyhedra\\MeshVertex3.h\" />\n    <ClInclude Include=\"Polyhedra\\Polyhedron3_EIK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingLocate_EEK.h\" />\n    <ClInclude Include=\"Polyhedra\\PolyhedronMap.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures_EEK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingLocate.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer_EEK.h\" />\n    <ClInclude Include=\"Polylines\\Polyline3_EEK.h\" />\n    <ClInclude Include=\"Polylines\\Polyline2_EEK.h\" />\n    <ClInclude Include=\"Polylines\\Polyline2.h\" />\n    <ClInclude Include=\"Polylines\\Polyline3.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer.h\" />\n    <ClInclude Include=\"Processing\\SurfaceSimplification_EIK.h\" />\n    <ClInclude Include=\"Polyhedra\\SurfaceMeshMap.h\" />\n    <ClInclude Include=\"Geometry\\Ray2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Segment2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Triangle2_EEK.h\" />\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3_EIK.h\" />\n    <ClInclude Include=\"Processing\\SurfaceSubdivision_EIK.h\" />\n    <ClInclude Include=\"Triangulations\\Triangulation2_EIK.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\MinMax.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingConnections_EEK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean_EEK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingConnections.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation_EEK.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing_EEK.h\" />\n    <ClInclude Include=\"Polyhedra\\MeshBuilders.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing.h\" />\n    <ClInclude Include=\"Polyhedra\\PolygonalCount.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingRepair.h\" />\n    <ClInclude Include=\"Processing\\MeshProcessingRepair_EEK.h\" />\n    <ClInclude Include=\"Processing\\SurfaceSimplification.h\" />\n    <ClInclude Include=\"Processing\\SurfaceSubdivision.h\" />\n    <ClInclude Include=\"Processing\\SurfaceSubdivision_EEK.h\" />\n    <ClInclude Include=\"Triangulations\\BaseTriangulation2.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2.h\" />\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation3_EEK.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull3_EEK.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull2_EIK.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull3.h\" />\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2_EIK.h\" />\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3_EIK.h\" />\n    <ClInclude Include=\"Meshing\\SkinSurfaceMesing.h\" />\n    <ClInclude Include=\"Meshing\\SkinSurfaceMeshing_EEK.h\" />\n    <ClInclude Include=\"Meshing\\TetrahedralRemeshing.h\" />\n    <ClInclude Include=\"Meshing\\TetrahedralRemeshing_EEK.h\" />\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation3.h\" />\n    <ClInclude Include=\"Triangulations\\Triangulation3_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Matrices.h\" />\n    <ClInclude Include=\"Polygons\\PolygonSimplification2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonMinkowski_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonBoolean2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonPartition2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonOffset2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\Polygon2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2_EIK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonVisibility_EIK.h\" />\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3.h\" />\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3_EEK.h\" />\n    <ClInclude Include=\"Circlar\\Circle2.h\" />\n    <ClInclude Include=\"Circlar\\Circle2_EEK.h\" />\n    <ClInclude Include=\"Arrangments\\SweepLine.h\" />\n    <ClInclude Include=\"Polygons\\PolygonMinkowski_EEK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonMinkowski.h\" />\n    <ClInclude Include=\"Polygons\\PolygonVisiblity.h\" />\n    <ClInclude Include=\"Polygons\\PolygonVisibility_EEK.h\" />\n    <ClInclude Include=\"Polyhedra\\Polyhedron3.h\" />\n    <ClInclude Include=\"Polyhedra\\Polyhedron3_EEK.h\" />\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3.h\" />\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3_EEK.h\" />\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2_EEK.h\" />\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonOffset2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonOffset2_EEK.h\" />\n    <ClInclude Include=\"Triangulations\\Triangulation3.h\" />\n    <ClInclude Include=\"Triangulations\\TriCell3.h\" />\n    <ClInclude Include=\"Triangulations\\TriEdge2.h\" />\n    <ClInclude Include=\"Collections\\NativeList.h\" />\n    <ClInclude Include=\"Triangulations\\TriVertex3.h\" />\n    <ClInclude Include=\"Utility\\ArrayUtil.h\" />\n    <ClInclude Include=\"Utility\\CGALGlobal.h\" />\n    <ClInclude Include=\"Utility\\CGALGlobal_EIK_EEK.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull2.h\" />\n    <ClInclude Include=\"Hull\\ConvexHull2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Geometry3.h\" />\n    <ClInclude Include=\"Geometry\\Intersections_shapes.h\" />\n    <ClInclude Include=\"CGALWrapper.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2.h\" />\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2_EEK.h\" />\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2.h\" />\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2_EEK.h\" />\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"Collections\\IndexMap.h\" />\n    <ClInclude Include=\"Geometry\\Intersections_shapes_EIK.h\" />\n    <ClInclude Include=\"Geometry\\Box2_EEK.h\" />\n    <ClInclude Include=\"pch.h\" />\n    <ClInclude Include=\"Geometry\\Geometry2.h\" />\n    <ClInclude Include=\"Polygons\\Polygon2.h\" />\n    <ClInclude Include=\"Polygons\\Polygon2_EEK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonBoolean2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonBoolean2_EEK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonPartition2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonPartition2_EEK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonSimplification2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonSimplification2_EEK.h\" />\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2.h\" />\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2_EEK.h\" />\n    <ClInclude Include=\"resource.h\" />\n    <ClInclude Include=\"Triangulations\\Triangulation2.h\" />\n    <ClInclude Include=\"Triangulations\\Triangulation2_EEK.h\" />\n    <ClInclude Include=\"Triangulations\\TriangulationMap2.h\" />\n    <ClInclude Include=\"Triangulations\\TriFace2.h\" />\n    <ClInclude Include=\"Triangulations\\TriUtil.h\" />\n    <ClInclude Include=\"Triangulations\\TriVertex2.h\" />\n    <ClInclude Include=\"Utility\\VersionNumber.h\" />\n    <ClInclude Include=\"Geometry\\Vector2_EEK.h\" />\n    <ClInclude Include=\"Geometry\\Vector2_EIK.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"Arrangments\\Arrangement2_EEK.cpp\" />\n    <ClCompile Include=\"Arrangments\\SweepLine_EEK.cpp\" />\n    <ClCompile Include=\"Arrangments\\SweepLine_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Box2_EIK.cpp\" />\n    <ClCompile Include=\"Eigen\\EigenRowVector.cpp\" />\n    <ClCompile Include=\"Eigen\\EigenColumnVector.cpp\" />\n    <ClCompile Include=\"Eigen\\EigenMatrix.cpp\" />\n    <ClCompile Include=\"Geometry\\HPoint2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Intersections_geometry_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Intersections_geometry_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\HPoint2_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Line2_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Point2_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Ray2_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Segment2_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Triangle2_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\HeatMethod_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\HeatMethod_EEK.cpp\" />\n    <ClCompile Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EIK.cpp\" />\n    <ClCompile Include=\"Triangulations\\ConstrainedTriangulation2_EIK.cpp\" />\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation2_EIK.cpp\" />\n    <ClCompile Include=\"Hull\\ConvexHull3_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Point2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Line2_EEK.cpp\" />\n    <ClCompile Include=\"Polylines\\Polyline2_EIK.cpp\" />\n    <ClCompile Include=\"Polylines\\Polyline3_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingBoolean_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingConnections_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingFeatures_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingLocate_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingMeshing_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingOrientation_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingRepair_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingSlicer_EIK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\Polyhedron3_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingLocate_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingFeatures_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingSlicer_EEK.cpp\" />\n    <ClCompile Include=\"Polylines\\Polyline3_EEK.cpp\" />\n    <ClCompile Include=\"Polylines\\Polyline2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Ray2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Segment2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Triangle2_EEK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\SurfaceMesh3_EIK.cpp\" />\n    <ClCompile Include=\"Processing\\SurfaceSubdivision_EIK.cpp\" />\n    <ClCompile Include=\"Triangulations\\Triangulation2_EIK.cpp\" />\n    <ClCompile Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingConnections_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingBoolean_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingOrientation_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingMeshing_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\MeshProcessingRepair_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\SurfaceSubdivision_EEK.cpp\" />\n    <ClCompile Include=\"Processing\\SurfaceSimplification_EIK.cpp\" />\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation3_EEK.cpp\" />\n    <ClCompile Include=\"Hull\\ConvexHull3_EEK.cpp\" />\n    <ClCompile Include=\"Hull\\ConvexHull2_EIK.cpp\" />\n    <ClCompile Include=\"Meshing\\ConformingTriangulation2_EIK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\NefPolyhedron3_EIK.cpp\" />\n    <ClCompile Include=\"Meshing\\SkinSurfaceMeshing_EEK.cpp\" />\n    <ClCompile Include=\"Meshing\\TetrahedralRemeshing_EEK.cpp\" />\n    <ClCompile Include=\"Triangulations\\Triangulation3_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonSimplification2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonMinkowski_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonBoolean2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonPartition2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonOffset2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\Polygon2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonWithHoles2_EIK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonVisibility_EIK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\NefPolyhedron3_EEK.cpp\" />\n    <ClCompile Include=\"Circlar\\Circle2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonMinkowski_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonVisibility_EEK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\Polyhedron3_EEK.cpp\" />\n    <ClCompile Include=\"Polyhedra\\SurfaceMesh3_EEK.cpp\" />\n    <ClCompile Include=\"Meshing\\ConformingTriangulation2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonOffset2_EEK.cpp\" />\n    <ClCompile Include=\"Collections\\NativeList.cpp\" />\n    <ClCompile Include=\"Utility\\CGALGlobal_EIK_EEK.cpp\" />\n    <ClCompile Include=\"Triangulations\\ConstrainedTriangulation2_EEK.cpp\" />\n    <ClCompile Include=\"Hull\\ConvexHull2_EEK.cpp\" />\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Intersections_shapes_EIK.cpp\" />\n    <ClCompile Include=\"Geometry\\Box2_EEK.cpp\" />\n    <ClCompile Include=\"pch.cpp\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\Polygon2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonBoolean2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonPartition2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonSimplification2_EEK.cpp\" />\n    <ClCompile Include=\"Polygons\\PolygonWithHoles2_EEK.cpp\" />\n    <ClCompile Include=\"Triangulations\\Triangulation2_EEK.cpp\" />\n    <ClCompile Include=\"Utility\\VersionNumber.cpp\" />\n    <ClCompile Include=\"Geometry\\Vector2_EEK.cpp\" />\n    <ClCompile Include=\"Geometry\\Vector2_EIK.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"CGALWrapper.rc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "CGALWrapper/CGALWrapper.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\\Geometry\">\n      <UniqueIdentifier>{5d8d6fe4-c5ac-46b9-b198-41588c5c0f96}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\Polygons\">\n      <UniqueIdentifier>{c1a4e981-a230-4e33-9d7c-122f7f03caaa}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Polygons\">\n      <UniqueIdentifier>{52bcf3aa-6773-4300-87e1-f8fb778f5af1}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\Arrangements\">\n      <UniqueIdentifier>{88c3aad0-96b4-4bbe-928a-08872ee87f46}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Arrangements\">\n      <UniqueIdentifier>{2e0a034f-4a47-4736-8348-e07b217b9889}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\Triangulations\">\n      <UniqueIdentifier>{0e3ede1a-3015-4a20-a650-2a82785d9280}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Triangulations\">\n      <UniqueIdentifier>{52bfc570-b5b1-4323-b124-201edfd0b624}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Geometry\">\n      <UniqueIdentifier>{e994d2c5-19a5-484a-a5d4-a184067961f7}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\Hulls\">\n      <UniqueIdentifier>{e348a134-e84d-4f25-925a-bb64636fd6b4}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Hulls\">\n      <UniqueIdentifier>{58adffc0-ff8b-4646-be31-1a01eec5cadd}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\Circlar\">\n      <UniqueIdentifier>{024c45c4-a4b5-4e27-834d-320f1012d7be}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Circlar\">\n      <UniqueIdentifier>{0b18a7ac-011a-4aaa-9829-a5d3ee47825c}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Polyhedra\">\n      <UniqueIdentifier>{7da444bc-d4ef-4f6c-ad36-9108f57a099e}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\Polyhedra\">\n      <UniqueIdentifier>{b95b8396-79b1-4ba4-9def-493e1efeefb9}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"pch.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"CGALWrapper.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Geometry2.h\">\n      <Filter>Header Files\\Geometry</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\Polygon2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\Polygon2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonBoolean2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonBoolean2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\Arrangement2.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\Arrangement2_EEK.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\ArrMultiLocator.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\Triangulation2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\Triangulation2_EEK.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonPartition2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonPartition2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Collections\\IndexMap.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriVertex2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriFace2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriangulationMap2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2_EEK.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriUtil.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2_EEK.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\ArrangementMap.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Intersections_shapes.h\">\n      <Filter>Header Files\\Geometry</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Intersections_shapes_EIK.h\">\n      <Filter>Header Files\\Geometry</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull2.h\">\n      <Filter>Header Files\\Hulls</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull2_EEK.h\">\n      <Filter>Header Files\\Hulls</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Utility\\CGALGlobal.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Utility\\CGALGlobal_EIK_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Geometry3.h\">\n      <Filter>Header Files\\Geometry</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonSimplification2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonSimplification2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Box2_EEK.h\">\n      <Filter>Header Files\\Geometry</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Circlar\\Circle2.h\">\n      <Filter>Header Files\\Circlar</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Circlar\\Circle2_EEK.h\">\n      <Filter>Header Files\\Circlar</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriEdge2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\ArrFace2.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\ArrHalfEdge2.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\ArrVertex2.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\SweepLine.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\SweepLine_EEK.h\">\n      <Filter>Header Files\\Arrangements</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonOffset2.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonOffset2_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonMinkowski.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonMinkowski_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonVisibility_EEK.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonVisiblity.h\">\n      <Filter>Header Files\\Polygons</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\Polyhedron3_EEK.h\">\n      <Filter>Polyhedra</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\Polyhedron3.h\">\n      <Filter>Polyhedra</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2_EEK.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2.h\">\n      <Filter>Header Files\\Triangulations</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Matrices.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\Polygon2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonWithHoles2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonOffset2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonVisibility_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonPartition2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonBoolean2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonMinkowski_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polygons\\PolygonSimplification2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Arrangments\\SweepLine_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\ConformingTriangulation2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\NefPolyhedron3_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\Triangulation3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\Triangulation3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\SkinSurfaceMesing.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\SkinSurfaceMeshing_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\TetrahedralRemeshing.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Meshing\\TetrahedralRemeshing_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\SurfaceSubdivision.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\SurfaceSubdivision_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\SurfaceSimplification.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\PolygonalCount.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\MeshBuilders.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingRepair.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingRepair_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\MinMax.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingConnections.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingConnections_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\BaseTriangulation2.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline2.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline3_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\SurfaceSimplification_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Index.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Utility\\VersionNumber.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Collections\\NativeList.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Utility\\ArrayUtil.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\SurfaceMeshMap.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\PolyhedronMap.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingLocate.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingLocate_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\MeshHitResult.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\MeshVertex3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\MeshFace3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\MeshHalfedge3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Point2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Line2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Ray2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Segment2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Triangle2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\Polyhedron3_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polyhedra\\SurfaceMesh3_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingBoolean_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingConnections_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingFeatures_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingLocate_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingMeshing_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingOrientation_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingRepair_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\MeshProcessingSlicer_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\SurfaceSubdivision_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Polylines\\Polyline3_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Hull\\ConvexHull3_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\ConstrainedTriangulation2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\DelaunayTriangulation2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\Triangulation2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Eigen\\EigenMatrix.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Eigen\\EigenColumnVector.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Eigen\\EigenRowVector.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Vector2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\HPoint2_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Intersections_geometry.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\IntersectionResult.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Intersections_geometry_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Intersections_geometry_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\HPoint2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Line2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Point2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Ray2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Segment2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Triangle2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Vector2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Geometry\\Box2_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\BaseTriangulation3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriVertex3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Triangulations\\TriCell3.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\HeatMethod.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\HeatMethod_EEK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Processing\\HeatMethod_EIK.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"pch.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\Polygon2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonBoolean2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonWithHoles2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Arrangments\\Arrangement2_EEK.cpp\">\n      <Filter>Source Files\\Arrangements</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\Triangulation2_EEK.cpp\">\n      <Filter>Source Files\\Triangulations</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonPartition2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation2_EEK.cpp\">\n      <Filter>Source Files\\Triangulations</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\ConstrainedTriangulation2_EEK.cpp\">\n      <Filter>Source Files\\Triangulations</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Intersections_shapes_EIK.cpp\">\n      <Filter>Source Files\\Geometry</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Hull\\ConvexHull2_EEK.cpp\">\n      <Filter>Source Files\\Hulls</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Utility\\CGALGlobal_EIK_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonSimplification2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Box2_EEK.cpp\">\n      <Filter>Source Files\\Geometry</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Circlar\\Circle2_EEK.cpp\">\n      <Filter>Source Files\\Circlar</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Arrangments\\SweepLine_EEK.cpp\">\n      <Filter>Source Files\\Arrangements</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonOffset2_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonMinkowski_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonVisibility_EEK.cpp\">\n      <Filter>Source Files\\Polygons</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Meshing\\ConformingTriangulation2_EEK.cpp\">\n      <Filter>Source Files\\Triangulations</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\Polyhedron3_EEK.cpp\">\n      <Filter>Source Files\\Polyhedra</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\SurfaceMesh3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\NefPolyhedron3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\Polygon2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonWithHoles2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonOffset2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonVisibility_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonPartition2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonBoolean2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonMinkowski_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polygons\\PolygonSimplification2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Arrangments\\SweepLine_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Meshing\\ConformingTriangulation2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Hull\\ConvexHull2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\NefPolyhedron3_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Hull\\ConvexHull3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\Triangulation3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Meshing\\SkinSurfaceMeshing_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Meshing\\TetrahedralRemeshing_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\SurfaceSubdivision_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\SurfaceSimplification_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingMeshing_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingOrientation_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingRepair_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingBoolean_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingConnections_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polylines\\Polyline2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polylines\\Polyline3_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingSlicer_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingFeatures_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Utility\\VersionNumber.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Collections\\NativeList.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingLocate_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Point2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Line2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Ray2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Segment2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Triangle2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\Polyhedron3_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polyhedra\\SurfaceMesh3_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingBoolean_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingConnections_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingFeatures_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingLocate_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingMeshing_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingOrientation_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingRepair_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\MeshProcessingSlicer_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\SurfaceSubdivision_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polylines\\Polyline2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Polylines\\Polyline3_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Hull\\ConvexHull3_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\ConstrainedDelaunayTriangulation2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\ConstrainedTriangulation2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\DelaunayTriangulation2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Triangulations\\Triangulation2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Eigen\\EigenMatrix.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Eigen\\EigenColumnVector.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Eigen\\EigenRowVector.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Vector2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\HPoint2_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Intersections_geometry_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Intersections_geometry_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\HPoint2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Line2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Point2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Ray2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Segment2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Triangle2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Vector2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Geometry\\Box2_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\HeatMethod_EEK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Processing\\HeatMethod_EIK.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"CGALWrapper.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "CGALWrapper/Circlar/Circle2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Exact_circular_kernel_2.h>\n\ntemplate<class K>\nclass Circle2\n{\n\npublic:\n\n\ttypedef CGAL::Point_2<K> Point_2;\n\ttypedef CGAL::Circle_2<K> Circle_2;\n\n\tstatic Circle_2* CastToCircle(void* ptr)\n\t{\n\t\treturn static_cast<Circle_2*>(ptr);\n\t}\n\n\tstatic Circle_2* NewCircle2(Point2d center, double sq_radius, CGAL::Orientation orientation)\n\t{\n\t\tauto p = center.ToCGAL<K>();\n\t\treturn new Circle_2(p, sq_radius, orientation);\n\t}\n\n\tstatic void DeleteCircle2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Circle_2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Circlar/Circle2_EEK.cpp",
    "content": "#pragma once\n\n#include \"Circle2_EEK.h\"\n#include \"Circle2.h\"\n\n#include <CGAL/Exact_circular_kernel_2.h>\n#include <CGAL/Circular_kernel_2.h>\n#include <CGAL/Algebraic_kernel_for_circles_2_2.h>\n#include <CGAL/Gps_circle_segment_traits_2.h>\n#include <CGAL/Arr_Bezier_curve_traits_2.h>\n\nvoid* Circle2_EEK_Create(Point2d center, double sq_radius, CGAL::Orientation orientation)\n{\n\treturn Circle2<EEK>::NewCircle2(center, sq_radius, orientation);\n}\n\nvoid Circle2_EEK_Release(void* ptr)\n{\n\tCircle2<EEK>::DeleteCircle2(ptr);\n}\n"
  },
  {
    "path": "CGALWrapper/Circlar/Circle2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Circle2_EEK_Create(Point2d center, double sq_radius, CGAL::Orientation orientation);\n\n\tCGALWRAPPER_API void Circle2_EEK_Release(void* ptr);\n\n};\n"
  },
  {
    "path": "CGALWrapper/Collections/IndexMap.h",
    "content": "#pragma once\n\n#include <map>\n#include <unordered_map>\n\ntemplate<class T>\nclass IndexMap\n{\nprivate:\n\n\tint nextIndex = 0;\n\n\tstd::unordered_map<int, T> map;\n\npublic:\n\n\tIndexMap()\n\t{\n\t\tnextIndex = 0;\n\t\tindicesSet = false;\n\t\tmapBuilt = false;\n\t}\n\n\tbool indicesSet;\n\n\tbool mapBuilt;\n\n\tvoid Clear()\n\t{\n\t\tClearMap();\n\t\tResetIndices();\n\t}\n\n\tvoid ClearMap()\n\t{\n\t\tmapBuilt = false;\n\t\tmap.clear();\n\t}\n\n\tvoid ResetIndices()\n\t{\n\t\tindicesSet = false;\n\t\tnextIndex = 0;\n\t}\n\n\tint NextIndex()\n\t{\n\t\treturn nextIndex++;\n\t}\n\n\tvoid Insert(int index, T item)\n\t{\n\t\tmap.insert(std::pair<int, T>(index, item));\n\t}\n\n\tT* Find(int index)\n\t{\n\t\tauto item = map.find(index);\n\t\tif (item != map.end())\n\t\t\treturn &item->second;\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Collections/NativeList.cpp",
    "content": "#include \"NativeList.h\"\n\n#include <algorithm>\n\nvoid* NativeList_Create()\n{\n\treturn new NativeList();\n}\n\nvoid* NativeList_CreateWithCount(int count)\n{\n\treturn new NativeList(count);\n}\n\nvoid NativeList_Release(void* listPtr)\n{\n\tauto obj = static_cast<NativeList*>(listPtr);\n\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nvoid NativeList_Add(void* listPtr, void* ptr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->Add(ptr);\n}\n\nvoid NativeList_AddRange(void* listPtr, void** ptr_array, int count)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->AddRange(ptr_array, count);\n}\n\nint NativeList_Capacity(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->Capacity();\n}\n\nvoid NativeList_Clear(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->Clear();\n}\n\nint NativeList_Count(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->Count();\n}\n\nBOOL NativeList_Contains(void* listPtr, void* ptr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->Contains(ptr);\n}\n\nvoid* NativeList_Copy(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->Copy();\n}\n\nvoid* NativeList_Get(void* listPtr, int index)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->Get(index);\n}\n\nvoid NativeList_Set(void* listPtr, int index, void* ptr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->Set(index, ptr);\n}\n\nint NativeList_IndexOf(void* listPtr, void* ptr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\treturn list->IndexOf(ptr);\n}\n\nvoid NativeList_Insert(void* listPtr, void* ptr, int index)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->Insert(ptr, index);\n}\n\nBOOL NativeList_Remove(void* listPtr, void* ptr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tint before = list->Count();\n\tlist->Remove(ptr);\n\treturn list->Count() == before - 1;\n}\n\nvoid NativeList_RemoveAt(void* listPtr, int index)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->RemoveAt(index);\n}\n\nvoid NativeList_Reverse(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->Reverse();\n}\n\nvoid NativeList_TrimExcess(void* listPtr)\n{\n\tauto list = NativeList::CastToNativeList(listPtr);\n\tlist->TrimExcess();\n}\n\n\n\nNativeList::NativeList()\n{\n\n}\n\nNativeList::NativeList(int count)\n{\n\tvec.reserve(count);\n}\n\nNativeList::~NativeList()\n{\n\n}\n\nvoid NativeList::Add(void* ptr)\n{\n\tvec.push_back(ptr);\n}\n\nvoid NativeList::AddRange(void** ptr_array, int count)\n{\n\tvec.insert(vec.end(), ptr_array, ptr_array + count);\n}\n\nint NativeList::Capacity()\n{\n\treturn (int)vec.capacity();\n}\n\nvoid NativeList::Clear()\n{\n\tvec.clear();\n}\n\nint NativeList::Count()\n{\n\treturn (int)vec.size();\n}\n\nBOOL NativeList::Contains(void* ptr)\n{\n\treturn IndexOf(ptr) != -1;\n}\n\nvoid* NativeList::Copy()\n{\n\tauto copy = new NativeList();\n\tcopy->vec = vec;\n\treturn copy;\n}\n\nvoid* NativeList::Get(int index)\n{\n\tif (InRange(index))\n\t\treturn vec[index];\n\telse\n\t\treturn nullptr;\n}\n\nvoid NativeList::Set(int index, void* ptr)\n{\n\tif (InRange(index))\n\t\tvec[index] = ptr;\n}\n\nint NativeList::IndexOf(void* ptr)\n{\n\tfor (int i = 0; i < Count(); i++)\n\t\tif (vec[i] == ptr)\n\t\t\treturn i;\n\n\treturn -1;\n}\n\nvoid NativeList::Insert(void* ptr, int index)\n{\n\tif(InRange(index))\n\t\tvec.insert(vec.begin() + index, ptr);\n}\n\nvoid NativeList::Remove(void* ptr)\n{\n\tint i = IndexOf(ptr);\n\tif (i == -1) return;\n\n\tRemoveAt(i);\n}\n\nvoid NativeList::RemoveAt(int index)\n{\n\tif (InRange(index))\n\t\tvec.erase(vec.begin() + index);\n}\n\nvoid NativeList::Reverse()\n{\n\tstd::reverse(vec.begin(), vec.end());\n}\n\nvoid NativeList::TrimExcess()\n{\n\tvec.shrink_to_fit();\n}\n\nbool NativeList::InRange(int index)\n{\n\tif (index < 0 || index >= Count())\n\t\treturn false;\n\telse\n\t\treturn true;\n}\n\nbool NativeList::NotInRange(int index)\n{\n\treturn !InRange(index);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Collections/NativeList.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n\n#include <vector>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* NativeList_Create();\n\n\tCGALWRAPPER_API void* NativeList_CreateWithCount(int count);\n\n\tCGALWRAPPER_API void NativeList_Release(void* listPtr);\n\n\tCGALWRAPPER_API void NativeList_Add(void* listPtr, void* ptr);\n\n\tCGALWRAPPER_API void NativeList_AddRange(void* listPtr, void** ptr_array, int count);\n\n\tCGALWRAPPER_API int NativeList_Capacity(void* listPtr);\n\n\tCGALWRAPPER_API void NativeList_Clear(void* listPtr);\n\n\tCGALWRAPPER_API int NativeList_Count(void* listPtr);\n\n\tCGALWRAPPER_API BOOL NativeList_Contains(void* listPtr, void* ptr);\n\n\tCGALWRAPPER_API void* NativeList_Copy(void* listPtr);\n\n\tCGALWRAPPER_API void* NativeList_Get(void* listPtr, int index);\n\n\tCGALWRAPPER_API void NativeList_Set(void* listPtr, int index, void* ptr);\n\n\tCGALWRAPPER_API int NativeList_IndexOf(void* listPtr, void* ptr);\n\n\tCGALWRAPPER_API void NativeList_Insert(void* listPtr, void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL NativeList_Remove(void* listPtr, void* ptr);\n\n\tCGALWRAPPER_API void NativeList_RemoveAt(void* listPtr, int index);\n\n\tCGALWRAPPER_API void NativeList_Reverse(void* listPtr);\n\n\tCGALWRAPPER_API void NativeList_TrimExcess(void* listPtr);\n\n}\n\nclass NativeList\n{\n\nprivate:\n\n\tstd::vector<void*> vec;\n\npublic:\n\n\tNativeList();\n\n\tNativeList(int count);\n\n\t~NativeList();\n\n\tinline static NativeList* CastToNativeList(void* ptr)\n\t{\n\t\treturn static_cast<NativeList*>(ptr);\n\t}\n\n\tvoid Add(void* ptr);\n\n\tvoid AddRange(void** ptr_array, int count);\n\n\tint Capacity();\n\n\tvoid Clear();\n\n\tint Count();\n\n\tBOOL Contains(void* ptr);\n\n\tvoid* Copy();\n\n\tvoid* Get(int index);\n\n\tvoid Set(int index, void* ptr);\n\n\tint IndexOf(void* ptr);\n\n\tvoid Insert(void* ptr, int index);\n\n\tvoid Remove(void* ptr);\n\n\tvoid RemoveAt(int index);\n\n\tvoid Reverse();\n\n\tvoid TrimExcess();\n\nprivate:\n\n\tbool InRange(int index);\n\n\tbool NotInRange(int index);\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenColumnVector.cpp",
    "content": "#include \"EigenColumnVector.h\"\n#include <Eigen/Dense>\n\ntypedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;\ntypedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector;\ntypedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Matrix;\n\nvoid* EigenColumnVector_CreateVector(int rows)\n{\n\tauto v = new ColumnVector(rows, 1);\n\tfor (int i = 0; i < rows; i++)\n\t\t(*v)(i) = 0;\n\n\treturn v;\n}\n\nvoid EigenColumnVector_Release(void* ptr)\n{\n\tauto obj = static_cast<ColumnVector*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nColumnVector* CastToColumnVector(void* ptr)\n{\n\treturn static_cast<ColumnVector*>(ptr);\n}\n\nColumnVector* NewColumnVector(const ColumnVector& v)\n{\n\treturn new ColumnVector(v.rows(), 1);\n}\n\nColumnVector* NewColumnVector()\n{\n\treturn new ColumnVector();\n}\n\nRowVector* NewRowVector();\n\nint EigenColumnVector_Dimension(void* ptr)\n{\n\tauto m = CastToColumnVector(ptr);\n\treturn (int)m->rows();\n}\n\ndouble EigenColumnVector_Get(void* ptr, int x)\n{\n\tauto m = CastToColumnVector(ptr);\n\treturn (*m)(x);\n}\n\nvoid EigenColumnVector_Set(void* ptr, int x, double value)\n{\n\tauto m = CastToColumnVector(ptr);\n\t(*m)(x) = value;\n}\n\ndouble EigenColumnVector_Dot(void* ptr1, void* ptr2)\n{\n\tauto v1 = CastToColumnVector(ptr1);\n\tauto v2 = CastToColumnVector(ptr2);\n\n\treturn v1->dot(*v2);\n}\n\nvoid* EigenColumnVector_Normalized(void* ptr)\n{\n\tauto v = CastToColumnVector(ptr);\n\tauto n = NewColumnVector(*v);\n\n\t(*n) = v->normalized();\n\treturn n;\n}\n\nvoid EigenColumnVector_Normalize(void* ptr)\n{\n\tauto v = CastToColumnVector(ptr);\n\tv->normalize();\n}\n\ndouble EigenColumnVector_Norm(void* ptr)\n{\n\tauto v = CastToColumnVector(ptr);\n\treturn v->norm();\n}\n\nvoid* EigenColumnVector_Transpose(void* ptr)\n{\n\tauto v1 = CastToColumnVector(ptr);\n\tauto v2 = NewRowVector();\n\t(*v2) = v1->transpose();\n\treturn v2;\n}\n\nvoid* EigenColumnVector_Adjoint(void* ptr)\n{\n\tauto v1 = CastToColumnVector(ptr);\n\tauto v2 = NewColumnVector();\n\t(*v2) = v1->adjoint();\n\treturn v2;\n}\n\nvoid* EigenColumnVector_Conjugate(void* ptr)\n{\n\tauto v1 = CastToColumnVector(ptr);\n\tauto v2 = NewColumnVector();\n\t(*v2) = v1->conjugate();\n\treturn v2;\n}\n\nvoid EigenColumnVector_Resize(void* ptr, int dimension)\n{\n\tauto v = CastToColumnVector(ptr);\n\tv->resize(dimension);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenColumnVector.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* EigenColumnVector_CreateVector(int rows);\n\n\tCGALWRAPPER_API void EigenColumnVector_Release(void* ptr);\n\n\tCGALWRAPPER_API int EigenColumnVector_Dimension(void* ptr);\n\n\tCGALWRAPPER_API double EigenColumnVector_Get(void* ptr, int x);\n\n\tCGALWRAPPER_API void EigenColumnVector_Set(void* ptr, int x, double value);\n\n\tCGALWRAPPER_API double EigenColumnVector_Dot(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenColumnVector_Normalized(void* ptr);\n\n\tCGALWRAPPER_API void EigenColumnVector_Normalize(void* ptr);\n\n\tCGALWRAPPER_API double EigenColumnVector_Norm(void* ptr);\n\n\tCGALWRAPPER_API void* EigenColumnVector_Transpose(void* ptr);\n\n\tCGALWRAPPER_API void* EigenColumnVector_Adjoint(void* ptr);\n\n\tCGALWRAPPER_API void* EigenColumnVector_Conjugate(void* ptr);\n\n\tCGALWRAPPER_API void EigenColumnVector_Resize(void* ptr, int dimension);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenMatrix.cpp",
    "content": "\n#include <iostream>\n#include \"EigenMatrix.h\"\n#include <Eigen/Dense>\n#include <Eigen/LU>\n\ntypedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;\ntypedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector;\ntypedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Matrix;\n\nColumnVector* CastToColumnVector(void* ptr);\n\nColumnVector* NewColumnVector();\n\nColumnVector* NewColumnVector(const ColumnVector& v);\n\nRowVector* CastToRowVector(void* ptr);\n\nRowVector* NewRowVector();\n\nRowVector* NewRowVector(const RowVector& v);\n\nvoid* EigenMatrix_Create(int rows, int columns)\n{\n\tauto m = new Matrix(rows, columns);\n\tfor (int y = 0; y < columns; y++)\n\t\tfor (int x = 0; x < rows; x++)\n\t\t\t(*m)(x, y) = 0;\n\n\treturn m;\n}\n\nvoid* EigenMatrix_CreateIdentity(int rows, int columns)\n{\n\tauto m = new Matrix(rows, columns);\n\tfor (int y = 0; y < columns; y++)\n\t{\n\t\tfor (int x = 0; x < rows; x++)\n\t\t{\n\t\t\tif (x == y)\n\t\t\t\t(*m)(x,y) = 1;\n\t\t\telse\n\t\t\t\t(*m)(x, y) = 0;\n\t\t}\n\t}\n\n\treturn m;\n}\n\nvoid EigenMatrix_Release(void* ptr)\n{\n\tauto obj = static_cast<Matrix*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nMatrix* CastToMatrix(void* ptr)\n{\n\treturn static_cast<Matrix*>(ptr);\n}\n\nMatrix* NewMatrix(const Matrix& m)\n{\n\treturn new Matrix(m.rows(), m.cols());\n}\n\nMatrix* NewMatrix()\n{\n\treturn new Matrix();\n}\n\nint EigenMatrix_Rows(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn (int)m->rows();\n}\n\nint EigenMatrix_Columns(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn (int)m->cols();\n}\n\ndouble EigenMatrix_GetXY(void* ptr, int x, int y)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn (*m)(x, y);\n}\n\nvoid EigenMatrix_SetXY(void* ptr, int x, int y, double value)\n{\n\tauto m = CastToMatrix(ptr);\n\t(*m)(x, y) = value;\n}\n\ndouble EigenMatrix_GetX(void* ptr, int x)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn (*m)(x);\n}\n\nvoid EigenMatrix_SetX(void* ptr, int x, double value)\n{\n\tauto m = CastToMatrix(ptr);\n\t(*m)(x) = value;\n}\n\nvoid* EigenMatrix_Transpose(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->transpose();\n\treturn m2;\n}\n\nvoid* EigenMatrix_Conjugate(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->conjugate();\n\treturn m2;\n}\n\nvoid* EigenMatrix_Adjoint(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->adjoint();\n\treturn m2;\n}\n\nvoid* EigenMatrix_Inverse(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->inverse();\n\treturn m2;\n}\n\nBOOL EigenMatrix_IsInvertible(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tEigen::FullPivLU<Matrix> lu(*m);\n\n\treturn lu.isInvertible();\n}\n\nvoid* EigenMatrix_TryInverse(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\tEigen::FullPivLU<Matrix> lu(*m);\n\n\tif (lu.isInvertible())\n\t{\n\t\tauto inv = NewMatrix();\n\t\t(*inv) = lu.inverse();\n\t\treturn inv;\n\t}\n\telse\n\t{\n\t\treturn nullptr;\n\t}\n}\n\ndouble EigenMatrix_Determinant(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->determinant();\n}\n\ndouble EigenMatrix_Trace(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->trace();\n}\n\nBOOL EigenMatrix_IsIdentity(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->isIdentity();\n}\n\nBOOL EigenMatrix_IsDiagonal(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->isDiagonal();\n}\n\nBOOL EigenMatrix_IsUpperTriangular(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->isUpperTriangular();\n}\n\nBOOL EigenMatrix_IsLowerTriangular(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\treturn m->isLowerTriangular();\n}\n\nvoid* EigenMatrix_MulScalar(void* ptr1, double s)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto m = NewMatrix(*m1);\n\t(*m) = (*m1) * s;\n\treturn m;\n}\n\nvoid* EigenMatrix_DivideScalar(void* ptr1, double s)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto m = NewMatrix(*m1);\n\t(*m) = (*m1) / s;\n\treturn m;\n}\n\nvoid* EigenMatrix_MulMatrix(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto m2 = CastToMatrix(ptr2);\n\tauto m = NewMatrix(*m1);\n\t(*m) = (*m1) * (*m2);\n\treturn m;\n}\n\nvoid* EigenMatrix_AddMatrix(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto m2 = CastToMatrix(ptr2);\n\tauto m = NewMatrix(*m1);\n\t(*m) = (*m1) + (*m2);\n\treturn m;\n}\n\nvoid* EigenMatrix_SubMatrix(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto m2 = CastToMatrix(ptr2);\n\tauto m = NewMatrix(*m1);\n\t(*m) = (*m1) - (*m2);\n\treturn m;\n}\n\nvoid* EigenMatrix_MulColumnVector(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto v2 = CastToColumnVector(ptr2);\n\tauto v = NewColumnVector(*v2);\n\t(*v) = (*m1) * (*v2);\n\treturn v;\n}\n\nvoid* EigenMatrix_MulRowVector(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto v2 = CastToRowVector(ptr2);\n\tauto v = NewRowVector(*v2);\n\t(*v) = (*m1) * (*v2);\n\treturn v;\n}\n\nvoid* EigenMatrix_Block(void* ptr, int startRox, int startCol, int blockRows, int blockCols)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->block(startRox, startCol, blockRows, blockCols);\n\treturn m2;\n}\n\nvoid* EigenMatrix_Reshaped(void* ptr, int rows, int cols)\n{\n\tauto m = CastToMatrix(ptr);\n\tauto m2 = NewMatrix();\n\t(*m2) = m->reshaped(rows, cols);\n\treturn m2;\n}\n\nvoid* EigenMatrix_ColPivHouseholderQr_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->colPivHouseholderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_ColPivHouseholderQr_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->colPivHouseholderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_PartialPivLu_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->partialPivLu().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_PartialPivLu_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->partialPivLu().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_FullPivLu_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->fullPivLu().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_FullPivLu_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->fullPivLu().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_HouseholderQr_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->householderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_HouseholderQr_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->householderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_LLT_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->llt().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_LLT_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->llt().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_LDLT_Vec(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m1->ldlt().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_LDLT_Mat(void* ptr1, void* ptr2)\n{\n\tauto m1 = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m1->ldlt().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_BdcSvd_Vec(void* ptr1, void* ptr2, int options)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->bdcSvd(options).solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_BdcSvd_Mat(void* ptr1, void* ptr2, int options)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->bdcSvd(options).solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_JacobiSvd_Vec(void* ptr1, void* ptr2, int options)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->jacobiSvd(options).solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_JacobiSvd_Mat(void* ptr1, void* ptr2, int options)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->jacobiSvd(options).solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_FullPivHouseholderQr_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->fullPivHouseholderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_FullPivHouseholderQr_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->fullPivHouseholderQr().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_CompleteOrthogonalDecomposition_Vec(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToColumnVector(ptr2);\n\tauto x = NewColumnVector();\n\n\t(*x) = m->completeOrthogonalDecomposition().solve(*v);\n\treturn x;\n}\n\nvoid* EigenMatrix_CompleteOrthogonalDecomposition_Mat(void* ptr1, void* ptr2)\n{\n\tauto m = CastToMatrix(ptr1);\n\tauto v = CastToMatrix(ptr2);\n\tauto x = NewMatrix();\n\n\t(*x) = m->completeOrthogonalDecomposition().solve(*v);\n\treturn x;\n}\n\ndouble EigenMatrix_RelativeError_Vec(void* ptr1, void* ptr2, void* ptr3)\n{\n\tauto A = CastToMatrix(ptr1);\n\tauto b = CastToColumnVector(ptr2);\n\tauto x = CastToColumnVector(ptr3);\n\n\treturn ((*A) * (*x) - (*b)).norm() / b->norm();\n}\n\ndouble EigenMatrix_RelativeError_Mat(void* ptr1, void* ptr2, void* ptr3)\n{\n\tauto A = CastToMatrix(ptr1);\n\tauto b = CastToMatrix(ptr2);\n\tauto x = CastToMatrix(ptr3);\n\n\treturn ((*A) * (*x) - (*b)).norm() / b->norm();\n}\n\nvoid* EigenMatrix_Eigenvalues(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\n\tEigen::SelfAdjointEigenSolver<Matrix> solver(*m);\n\n\tif (solver.info() != Eigen::Success)\n\t\treturn nullptr;\n\telse\n\t{\n\t\tauto x = NewColumnVector();\n\t\t(*x) = solver.eigenvalues();\n\n\t\treturn x;\n\t}\n}\n\nvoid* EigenMatrix_Eigenvectors(void* ptr)\n{\n\tauto m = CastToMatrix(ptr);\n\n\tEigen::SelfAdjointEigenSolver<Matrix> solver(*m);\n\n\tif (solver.info() != Eigen::Success)\n\t\treturn nullptr;\n\telse\n\t{\n\t\tauto x = NewMatrix();\n\t\t(*x) = solver.eigenvectors();\n\n\t\treturn x;\n\t}\n}\n\nBOOL EigenMatrix_EigenValuesVectors(void* ptr, void** values, void** vectors)\n{\n\tauto m = CastToMatrix(ptr);\n\n\tEigen::SelfAdjointEigenSolver<Matrix> solver(*m);\n\t*values = nullptr;\n\t*vectors = nullptr;\n\n\tif (solver.info() != Eigen::Success)\n\t{\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tauto _values = solver.eigenvalues();\n\t\tauto _vectors = solver.eigenvectors();\n\n\t\tauto v = NewColumnVector(_values);\n\t\tfor (auto i = 0; i < _values.size(); i++)\n\t\t\t(*v)[i] = _values[i];\n\n\t\tauto m = NewMatrix(_vectors);\n\t\tfor (auto i = 0; i < _vectors.size(); i++)\n\t\t\t(*m)(i) = _vectors(i);\n\n\t\t(*values) = v;\n\t\t(*vectors) = m;\n\n\t\treturn TRUE;\n\t}\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenMatrix.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* EigenMatrix_Create(int rows, int columns);\n\n\tCGALWRAPPER_API void* EigenMatrix_CreateIdentity(int rows, int columns);\n\n\tCGALWRAPPER_API void EigenMatrix_Release(void* ptr);\n\n\tCGALWRAPPER_API int EigenMatrix_Rows(void* ptr);\n\n\tCGALWRAPPER_API int EigenMatrix_Columns(void* ptr);\n\n\tCGALWRAPPER_API double EigenMatrix_GetXY(void* ptr, int x, int y);\n\n\tCGALWRAPPER_API void EigenMatrix_SetXY(void* ptr, int x, int y, double value);\n\n\tCGALWRAPPER_API double EigenMatrix_GetX(void* ptr, int x);\n\n\tCGALWRAPPER_API void EigenMatrix_SetX(void* ptr, int x, double value);\n\n\tCGALWRAPPER_API void* EigenMatrix_Transpose(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_Conjugate(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_Adjoint(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_Inverse(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_IsInvertible(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_TryInverse(void* ptr);\n\n\tCGALWRAPPER_API double EigenMatrix_Determinant(void* ptr);\n\n\tCGALWRAPPER_API double EigenMatrix_Trace(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_IsIdentity(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_IsDiagonal(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_IsUpperTriangular(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_IsLowerTriangular(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_MulScalar(void* ptr1, double s);\n\n\tCGALWRAPPER_API void* EigenMatrix_DivideScalar(void* ptr1, double s);\n\n\tCGALWRAPPER_API void* EigenMatrix_MulMatrix(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_AddMatrix(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_SubMatrix(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_MulColumnVector(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_MulRowVector(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_Block(void* ptr, int startRox, int startCol, int blockRows, int blockCols);\n\n\tCGALWRAPPER_API void* EigenMatrix_Reshaped(void* ptr, int rows, int cols);\n\n\tCGALWRAPPER_API void* EigenMatrix_ColPivHouseholderQr_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_ColPivHouseholderQr_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_PartialPivLu_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_PartialPivLu_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_FullPivLu_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_FullPivLu_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_HouseholderQr_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_HouseholderQr_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_LLT_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_LLT_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_LDLT_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_LDLT_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_BdcSvd_Vec(void* ptr1, void* ptr2, int options);\n\n\tCGALWRAPPER_API void* EigenMatrix_BdcSvd_Mat(void* ptr1, void* ptr2, int options);\n\n\tCGALWRAPPER_API void* EigenMatrix_JacobiSvd_Vec(void* ptr1, void* ptr2, int options);\n\n\tCGALWRAPPER_API void* EigenMatrix_JacobiSvd_Mat(void* ptr1, void* ptr2, int options);\n\n\tCGALWRAPPER_API void* EigenMatrix_FullPivHouseholderQr_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_FullPivHouseholderQr_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_CompleteOrthogonalDecomposition_Vec(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenMatrix_CompleteOrthogonalDecomposition_Mat(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API double EigenMatrix_RelativeError_Vec(void* ptr1, void* ptr2, void* ptr3);\n\n\tCGALWRAPPER_API double EigenMatrix_RelativeError_Mat(void* ptr1, void* ptr2, void* ptr3);\n\n\tCGALWRAPPER_API void* EigenMatrix_Eigenvalues(void* ptr);\n\n\tCGALWRAPPER_API void* EigenMatrix_Eigenvectors(void* ptr);\n\n\tCGALWRAPPER_API BOOL EigenMatrix_EigenValuesVectors(void* ptr, void** values, void** vectors);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenRowVector.cpp",
    "content": "#include \"EigenRowVector.h\"\n#include <Eigen/Dense>\n\ntypedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;\ntypedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector;\ntypedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> Matrix;\n\nvoid* EigenRowVector_CreateVector(int columns)\n{\n\tauto v = new RowVector(1, columns);\n\tfor (int i = 0; i < columns; i++)\n\t\t(*v)(i) = 0;\n\n\treturn v;\n}\n\nvoid EigenRowVector_Release(void* ptr)\n{\n\tauto obj = static_cast<RowVector*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nRowVector* CastToRowVector(void* ptr)\n{\n\treturn static_cast<RowVector*>(ptr);\n}\n\nRowVector* NewRowVector(const RowVector& v)\n{\n\treturn new RowVector(1, v.cols());\n}\n\nRowVector* NewRowVector()\n{\n\treturn new RowVector();\n}\n\nColumnVector* NewColumnVector();\n\nint EigenRowVector_Dimension(void* ptr)\n{\n\tauto m = CastToRowVector(ptr);\n\treturn (int)m->cols();\n}\n\ndouble EigenRowVector_Get(void* ptr, int x)\n{\n\tauto m = CastToRowVector(ptr);\n\treturn (*m)(x);\n}\n\nvoid EigenRowVector_Set(void* ptr, int x, double value)\n{\n\tauto m = CastToRowVector(ptr);\n\t(*m)(x) = value;\n}\n\ndouble EigenRowVector_Dot(void* ptr1, void* ptr2)\n{\n\tauto v1 = CastToRowVector(ptr1);\n\tauto v2 = CastToRowVector(ptr2);\n\n\treturn v1->dot(*v2);\n}\n\nvoid* EigenRowVector_Normalized(void* ptr)\n{\n\tauto v = CastToRowVector(ptr);\n\tauto n = NewRowVector(*v);\n\n\t(*n) = v->normalized();\n\treturn n;\n}\n\nvoid EigenRowVector_Normalize(void* ptr)\n{\n\tauto v = CastToRowVector(ptr);\n\tv->normalize();\n}\n\ndouble EigenRowVector_Norm(void* ptr)\n{\n\tauto v = CastToRowVector(ptr);\n\treturn v->norm();\n}\n\nvoid* EigenRowVector_Transpose(void* ptr)\n{\n\tauto v1 = CastToRowVector(ptr);\n\tauto v2 = NewColumnVector();\n\t(*v2) = v1->transpose();\n\treturn v2;\n}\n\nvoid* EigenRowVector_Adjoint(void* ptr)\n{\n\tauto v1 = CastToRowVector(ptr);\n\tauto v2 = NewRowVector();\n\t(*v2) = v1->adjoint();\n\treturn v2;\n}\n\nvoid* EigenRowVector_Conjugate(void* ptr)\n{\n\tauto v1 = CastToRowVector(ptr);\n\tauto v2 = NewRowVector();\n\t(*v2) = v1->conjugate();\n\treturn v2;\n}\n\nvoid EigenRowVector_Resize(void* ptr, int dimension)\n{\n\tauto v = CastToRowVector(ptr);\n\tv->resize(dimension);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Eigen/EigenRowVector.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* EigenRowVector_CreateVector(int columns);\n\n\tCGALWRAPPER_API void EigenRowVector_Release(void* ptr);\n\n\tCGALWRAPPER_API int EigenRowVector_Dimension(void* ptr);\n\n\tCGALWRAPPER_API double EigenRowVector_Get(void* ptr, int x);\n\n\tCGALWRAPPER_API void EigenRowVector_Set(void* ptr, int x, double value);\n\n\tCGALWRAPPER_API double EigenRowVector_Dot(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* EigenRowVector_Normalized(void* ptr);\n\n\tCGALWRAPPER_API void EigenRowVector_Normalize(void* ptr);\n\n\tCGALWRAPPER_API double EigenRowVector_Norm(void* ptr);\n\n\tCGALWRAPPER_API void* EigenRowVector_Transpose(void* ptr);\n\n\tCGALWRAPPER_API void* EigenRowVector_Adjoint(void* ptr);\n\n\tCGALWRAPPER_API void* EigenRowVector_Conjugate(void* ptr);\n\n\tCGALWRAPPER_API void EigenRowVector_Resize(void* ptr, int dimension);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Box2_EEK.cpp",
    "content": "\n#include \"Box2_EEK.h\"\n#include <CGAL/Iso_rectangle_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Iso_rectangle_2<EEK> Box2;\ntypedef CGAL::Aff_transformation_2<EEK> Transformation2;\n\nvoid* Box2_EEK_Create(const Point2d& min, const Point2d& max)\n{\n\tauto _min = min.ToCGAL<EEK>();\n\tauto _max = max.ToCGAL<EEK>();\n\n\treturn new Box2(_min, _max);\n}\n\nvoid Box2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Box2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nBox2* CastToBox2(void* ptr)\n{\n\treturn static_cast<Box2*>(ptr);\n}\n\nBox2* NewBox2()\n{\n\treturn new Box2();\n}\n\nPoint2d Box2_EEK_GetMin(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn Point2d::FromCGAL<EEK>(rec->min());\n}\n\nvoid Box2_EEK_SetMin(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\t(*rec) = Box2(point.ToCGAL<EEK>(), rec->max());\n}\n\nPoint2d Box2_EEK_GetMax(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn Point2d::FromCGAL<EEK>(rec->max());\n}\n\nvoid Box2_EEK_SetMax(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\t(*rec) = Box2(rec->min(), point.ToCGAL<EEK>());\n}\n\ndouble Box2_EEK_Area(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn CGAL::to_double(rec->area());\n}\n\nCGAL::Bounded_side Box2_EEK_BoundedSide(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto p = point.ToCGAL<EEK>();\n\treturn rec->bounded_side(p);\n}\n\nBOOL Box2_EEK_ContainsPoint(void* ptr, const Point2d& point, BOOL inculdeBoundary)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto side = rec->bounded_side(point.ToCGAL<EEK>());\n\n\tif (inculdeBoundary && side == CGAL::Bounded_side::ON_BOUNDARY)\n\t\treturn true;\n\n\treturn side == CGAL::Bounded_side::ON_BOUNDED_SIDE;\n}\n\nBOOL Box2_EEK_IsDegenerate(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn rec->is_degenerate();\n}\n\nvoid Box2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto rec = CastToBox2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EEK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*rec) = rec->transform(T * R * S);\n}\n\nvoid* Box2_EEK_Copy(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto nrec = NewBox2();\n\n\t(*nrec) = *rec;\n\treturn nrec;\n}\n\ntemplate<class K2>\nstatic void* Convert(Box2* rec)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto min = convert(rec->min());\n\tauto max = convert(rec->max());\n\n\treturn new CGAL::Iso_rectangle_2<K2>(min, max);\n}\n\nvoid* Box2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto rec = CastToBox2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(rec);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(rec);\n\n\tdefault:\n\t\treturn Convert<EEK>(rec);\n\t}\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Box2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Box2_EEK_Create(const Point2d& min, const Point2d& max);\n\n\tCGALWRAPPER_API void Box2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* Box2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API Point2d Box2_EEK_GetMin(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EEK_SetMin(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Box2_EEK_GetMax(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EEK_SetMax(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Box2_EEK_Area(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Box2_EEK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Box2_EEK_ContainsPoint(void* ptr, const Point2d& point, BOOL inculdeBoundary);\n\n\tCGALWRAPPER_API BOOL Box2_EEK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Box2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Box2_EIK.cpp",
    "content": "\n#include \"Box2_EIK.h\"\n#include <CGAL/Iso_rectangle_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Iso_rectangle_2<EIK> Box2;\ntypedef CGAL::Aff_transformation_2<EIK> Transformation2;\n\nvoid* Box2_EIK_Create(const Point2d& min, const Point2d& max)\n{\n\tauto _min = min.ToCGAL<EIK>();\n\tauto _max = max.ToCGAL<EIK>();\n\n\treturn new Box2(_min, _max);\n}\n\nvoid Box2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Box2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nBox2* CastToBox2(void* ptr)\n{\n\treturn static_cast<Box2*>(ptr);\n}\n\nBox2* NewBox2()\n{\n\treturn new Box2();\n}\n\nPoint2d Box2_EIK_GetMin(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn Point2d::FromCGAL<EIK>(rec->min());\n}\n\nvoid Box2_EIK_SetMin(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\t(*rec) = Box2(point.ToCGAL<EIK>(), rec->max());\n}\n\nPoint2d Box2_EIK_GetMax(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn Point2d::FromCGAL<EIK>(rec->max());\n}\n\nvoid Box2_EIK_SetMax(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\t(*rec) = Box2(rec->min(), point.ToCGAL<EIK>());\n}\n\ndouble Box2_EIK_Area(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn CGAL::to_double(rec->area());\n}\n\nCGAL::Bounded_side Box2_EIK_BoundedSide(void* ptr, const Point2d& point)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto p = point.ToCGAL<EIK>();\n\treturn rec->bounded_side(p);\n}\n\nBOOL Box2_EIK_ContainsPoint(void* ptr, const Point2d& point, BOOL inculdeBoundary)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto side = rec->bounded_side(point.ToCGAL<EIK>());\n\n\tif (inculdeBoundary && side == CGAL::Bounded_side::ON_BOUNDARY)\n\t\treturn true;\n\n\treturn side == CGAL::Bounded_side::ON_BOUNDED_SIDE;\n}\n\nBOOL Box2_EIK_IsDegenerate(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\treturn rec->is_degenerate();\n}\n\nvoid Box2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto rec = CastToBox2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EIK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*rec) = rec->transform(T * R * S);\n}\n\nvoid* Box2_EIK_Copy(void* ptr)\n{\n\tauto rec = CastToBox2(ptr);\n\tauto nrec = NewBox2();\n\n\t(*nrec) = *rec;\n\treturn nrec;\n}\n\ntemplate<class K2>\nstatic void* Convert(Box2* rec)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto min = convert(rec->min());\n\tauto max = convert(rec->max());\n\n\treturn new CGAL::Iso_rectangle_2<K2>(min, max);\n}\n\nvoid* Box2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto rec = CastToBox2(ptr);\n\n\tswitch (k) \n\t{\n\t\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\t\treturn Convert<EIK>(rec);\n\n\t\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\t\treturn Convert<EEK>(rec);\n\n\t\tdefault:\n\t\t\treturn Convert<EIK>(rec);\n\t}\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Box2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Box2_EIK_Create(const Point2d& min, const Point2d& max);\n\n\tCGALWRAPPER_API void Box2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* Box2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API Point2d Box2_EIK_GetMin(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EIK_SetMin(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Box2_EIK_GetMax(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EIK_SetMax(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Box2_EIK_Area(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Box2_EIK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Box2_EIK_ContainsPoint(void* ptr, const Point2d& point, BOOL inculdeBoundary);\n\n\tCGALWRAPPER_API BOOL Box2_EIK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API void Box2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Box2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Geometry2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"CGAL/Point_2.h\"\n#include \"CGAL/Point_3.h\"\n#include \"CGAL/Vector_2.h\"\n#include \"CGAL/Segment_2.h\"\n\n#include <iostream>\n\n/*\n* Structs to pass data from C# and c++.\n* Must be c style layout.\n* \n* A standard-layout class is a class that:\n*\n* Has no non-static data members of type non-standard-layout class (or array of such types) or reference,\n* Has no virtual functions and no virtual base classes,\n* Has the same access control for all non-static data members,\n* Has no non-standard-layout base classes,\n* Either has no non-static data members in the most derived class and at most one base class with non-static data members, \n* or has no base classes with non-static data members, and\n* Has no base classes of the same type as the first non-static data member.\n*\n*/\n\nstruct Point2d\n{\n\n    double x;\n    double y;\n\n    template<class K>\n    CGAL::Point_2<K> ToCGAL() const\n    {\n        return CGAL::Point_2<K>(x, y);\n    }\n\n    template<class K>\n    CGAL::Point_3<K> ToCGAL3() const\n    {\n        return CGAL::Point_3<K>(x, y, 0);\n    }\n\n    template<class K>\n    CGAL::Point_3<K> ToCGAL3XZ() const\n    {\n        return CGAL::Point_3<K>(x, 0, y);\n    }\n\n    template<class K>\n    static Point2d FromCGAL(CGAL::Point_2<K> p)\n    {\n        double x = CGAL::to_double(p.x());\n        double y = CGAL::to_double(p.y());\n        return { x, y };\n    }\n\n    template<class K>\n    static Point2d FromCGAL(CGAL::Vector_2<K> v)\n    {\n        double x = CGAL::to_double(v.x());\n        double y = CGAL::to_double(v.y());\n        return { x, y };\n    }\n\n    template<class K>\n    CGAL::Vector_2<K> ToVector() const\n    {\n        return CGAL::Vector_2<K>(x, y);\n    }\n\n    bool operator==(const Point2d& rhs) const\n    {\n        return x == rhs.x && y == rhs.y;\n    }\n\n    bool operator!=(const Point2d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    Point2d operator+(const Point2d& rhs) const\n    {\n        return { x + rhs.x , y + rhs.y};\n    }\n\n    Point2d operator-(const Point2d& rhs) const\n    {\n        return { x - rhs.x , y - rhs.y };\n    }\n\n    Point2d operator/(double rhs) const\n    {\n        return { x / rhs , y / rhs };\n    }\n\n    Point2d operator*(double rhs) const\n    {\n        return { x * rhs , y * rhs };\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const Point2d& rhs) {\n        output << \"(\" << rhs.x << \", \" << rhs.y << \")\";\n        return output;\n    }\n\n};\n\n//used to represent a weighted or homogenous point.\nstruct HPoint2d\n{\n    double hx;\n    double hy;\n    double hw;\n\n    template<class K>\n    CGAL::Weighted_point_2<K> ToCGALWeightedPoint() const\n    {\n        return CGAL::Weighted_point_2<K>(CGAL::Point_2<K>(hx, hy), hw);\n    }\n\n    template<class K>\n    static HPoint2d FromCGAL(CGAL::Weighted_point_2<K> p)\n    {\n        double x = CGAL::to_double(p.hx());\n        double y = CGAL::to_double(p.hy());\n        double w = CGAL::to_double(p.hw());\n        return { x, y, w };\n    }\n\n    bool operator==(const HPoint2d& rhs) const\n    {\n        return hx == rhs.hx && hy == rhs.hy && hw == rhs.hw;\n    }\n\n    bool operator!=(const HPoint2d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    HPoint2d operator+(const HPoint2d& rhs) const\n    {\n        return { hx + rhs.hx , hy + rhs.hy, hw + rhs.hw };\n    }\n\n    HPoint2d operator-(const HPoint2d& rhs) const\n    {\n        return { hx - rhs.hx , hy - rhs.hy, hw - rhs.hw };\n    }\n\n    HPoint2d operator/(double rhs) const\n    {\n        return { hx / rhs , hy / rhs, hw / rhs };\n    }\n\n    HPoint2d operator*(double rhs) const\n    {\n        return { hx * rhs , hy * rhs, hw * rhs };\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const HPoint2d& rhs) {\n        output << \"(\" << rhs.hx << \", \" << rhs.hy << \", \" << rhs.hw << \")\";\n        return output;\n    }\n\n};\n\nstruct Vector2d\n{\n    double x;\n    double y;\n\n    template<class K>\n    CGAL::Vector_2<K> ToCGAL() const\n    {\n        return CGAL::Vector_2<K>(x, y);\n    }\n\n    template<class K>\n    static Vector2d FromCGAL(CGAL::Vector_2<K> p)\n    {\n        double x = CGAL::to_double(p.x());\n        double y = CGAL::to_double(p.y());\n        return { x, y };\n    }\n\n    template<class K>\n    CGAL::Point_2<K> ToPoint() const\n    {\n        return CGAL::Point_2<K>(x, y);\n    }\n\n    bool operator==(const Vector2d& rhs) const\n    {\n        return x == rhs.x && y == rhs.y;\n    }\n\n    bool operator!=(const Vector2d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const Vector2d& rhs) {\n        output << \"(\" << rhs.x << \", \" << rhs.y << \")\";\n        return output;\n    }\n\n};\n\nstruct Segment2d\n{\n    Point2d a;\n    Point2d b;\n\n    template<class K, class SEG>\n    SEG ToCGAL() const\n    {\n        return { a.ToCGAL<K>(), b.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Segment2d FromCGAL(CGAL::Point_2<K> a, CGAL::Point_2<K> b)\n    {\n        auto A = Point2d::FromCGAL<K>(a);\n        auto B = Point2d::FromCGAL<K>(b);\n        return { A, B };\n    }\n\n    template<class K>\n    static Segment2d FromCGAL(CGAL::Segment_2<K> seg)\n    {\n        auto A = Point2d::FromCGAL<K>(seg.source());\n        auto B = Point2d::FromCGAL<K>(seg.target());\n        return { A, B };\n    }\n\n};\n\nstruct Line2d\n{\n    double a, b, c;\n\n    template<class K, class LINE>\n    LINE ToCGAL() const\n    {\n        return { a, b, c };\n    }\n\n    template<class K>\n    static Line2d FromCGAL(K a, K b, K c)\n    {\n        double A = CGAL::to_double(a);\n        double B = CGAL::to_double(b);\n        double C = CGAL::to_double(c);\n        return { A, B, C };\n    }\n};\n\nstruct Triangle2d\n{\n    Point2d a;\n    Point2d b;\n    Point2d c;\n\n    template<class K, class TRI>\n    TRI ToCGAL() const\n    {\n        return { a.ToCGAL<K>(), b.ToCGAL<K>(), c.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Triangle2d FromCGAL(CGAL::Point_2<K> a, CGAL::Point_2<K> b, CGAL::Point_2<K> c)\n    {\n        auto A = Point2d::FromCGAL<K>(a);\n        auto B = Point2d::FromCGAL<K>(b);\n        auto C = Point2d::FromCGAL<K>(c);\n        return { A, B, C };\n    }\n};\n\nstruct Ray2d\n{\n    Point2d pos;\n    Vector2d dir;\n\n    template<class K, class RAY>\n    RAY ToCGAL() const\n    {\n        return { pos.ToCGAL<K>(), dir.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Ray2d FromCGAL(CGAL::Point_2<K> pos, CGAL::Vector_2<K> dir)\n    {\n        auto Pos = Point2d::FromCGAL<K>(pos);\n        auto Dir = Vector2d::FromCGAL<K>(dir);\n        return { Pos, Dir };\n    }\n};\n\nstruct Box2d\n{\n    Point2d min;\n    Point2d max;\n\n    template<class K, class BOX>\n    BOX ToCGAL() const\n    {\n        return { min.ToCGAL<K>(), max.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Box2d FromCGAL(CGAL::Point_2<K> min, CGAL::Point_2<K> max)\n    {\n        auto Min = Point2d::FromCGAL<K>(min);\n        auto Max = Point2d::FromCGAL<K>(max);\n        return { Min, Max };\n    }\n\n    template<class K>\n    static Box2d FromCGAL(CGAL::Bbox_2 box)\n    {\n        double xmin = CGAL::to_double(box.xmin());\n        double ymin = CGAL::to_double(box.ymin());\n\n        double xmax = CGAL::to_double(box.xmax());\n        double ymax = CGAL::to_double(box.ymax());\n\n        Point2d min = { xmin, ymin };\n        Point2d max = { xmax, ymax };\n\n        return { min, max };\n    }\n};\n\nstruct Circle2d\n{\n    Point2d center;\n    double radius;\n};\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Geometry3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"CGAL/Point_3.h\"\n#include \"CGAL/Vector_3.h\"\n#include <CGAL/Plane_3.h>\n#include <CGAL/Bbox_3.h>\n#include <CGAL/Ray_3.h>\n#include <CGAL/Triangle_3.h>\n#include <iostream>\n\n/*\n* Structs to pass data from C# and c++.\n* Must be c style layout.\n*\n* A standard-layout class is a class that:\n*\n* Has no non-static data members of type non-standard-layout class (or array of such types) or reference,\n* Has no virtual functions and no virtual base classes,\n* Has the same access control for all non-static data members,\n* Has no non-standard-layout base classes,\n* Either has no non-static data members in the most derived class and at most one base class with non-static data members,\n* or has no base classes with non-static data members, and\n* Has no base classes of the same type as the first non-static data member.\n*\n*/\n\nstruct Point3d\n{\n    double x;\n    double y;\n    double z;\n\n    template<class K>\n    CGAL::Point_3<K> ToCGAL() const\n    {\n        return CGAL::Point_3<K>(x, y, z);\n    }\n\n    template<class K>\n    CGAL::Weighted_point_3<K> ToCGALWeightedPoint() const\n    {\n        return CGAL::Weighted_point_3<K>(CGAL::Point_3<K>(x, y, z), 1);\n    }\n\n    template<class K>\n    static Point3d FromCGAL(CGAL::Point_3<K> p)\n    {\n        double x = CGAL::to_double(p.x());\n        double y = CGAL::to_double(p.y());\n        double z = CGAL::to_double(p.z());\n        return { x, y, z };\n    }\n\n    template<class K>\n    static Point3d FromCGAL(CGAL::Point_2<K> p)\n    {\n        double x = CGAL::to_double(p.x());\n        double y = CGAL::to_double(p.y());\n        double z = 0;\n        return { x, y, z };\n    }\n\n    template<class K>\n    static Point3d FromCGAL(CGAL::Vector_3<K> v)\n    {\n        double x = CGAL::to_double(v.x());\n        double y = CGAL::to_double(v.y());\n        double z = CGAL::to_double(v.z());\n        return { x, y, z };\n    }\n\n    template<class K>\n    CGAL::Vector_3<K> ToVector() const\n    {\n        return CGAL::Vector_3<K>(x, y, z);\n    }\n\n    bool operator==(const Point3d& rhs) const\n    {\n        return x == rhs.x && y == rhs.y && z == rhs.z;\n    }\n\n    bool operator!=(const Point3d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    Point3d operator+(const Point3d& rhs) const\n    {\n        return { x + rhs.x , y + rhs.y, z + rhs.z };\n    }\n\n    Point3d operator-(const Point3d& rhs) const\n    {\n        return { x - rhs.x , y - rhs.y, z - rhs.z };\n    }\n\n    Point3d operator/(double rhs) const\n    {\n        return { x / rhs , y / rhs, z / rhs };\n    }\n\n    Point3d operator*(double rhs) const\n    {\n        return { x * rhs , y * rhs, z * rhs };\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const Point3d& rhs) {\n        output << \"(\" << rhs.x << \", \" << rhs.y << \", \" << rhs.z << \")\";\n        return output;\n    }\n\n};\n\n//used to represent a weighted or homogenous point.\nstruct HPoint3d\n{\n    double hx;\n    double hy;\n    double hz;\n    double hw;\n\n    template<class K>\n    CGAL::Weighted_point_3<K> ToCGALWeightedPoint() const\n    {\n        return CGAL::Weighted_point_3<K>(CGAL::Point_3<K>(hx, hy, hz), hw);\n    }\n\n    template<class K>\n    static HPoint3d FromCGAL(CGAL::Weighted_point_3<K> p)\n    {\n        double hx = CGAL::to_double(p.hx());\n        double hy = CGAL::to_double(p.hy());\n        double hz = CGAL::to_double(p.hz());\n        double hw = CGAL::to_double(p.hw());\n        return { hx, hy, hz, hw };\n    }\n\n    bool operator==(const HPoint3d& rhs) const\n    {\n        return hx == rhs.hx && hy == rhs.hy && hz == rhs.hz && hw == rhs.hw;\n    }\n\n    bool operator!=(const HPoint3d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    HPoint3d operator+(const HPoint3d& rhs) const\n    {\n        return { hx + rhs.hx , hy + rhs.hy, hz + rhs.hz, hw + rhs.hw };\n    }\n\n    HPoint3d operator-(const HPoint3d& rhs) const\n    {\n        return { hx - rhs.hx , hy - rhs.hy, hz - rhs.hz, hw - rhs.hw };\n    }\n\n    HPoint3d operator/(double rhs) const\n    {\n        return { hx / rhs , hy / rhs, hz / rhs, hw / rhs };\n    }\n\n    HPoint3d operator*(double rhs) const\n    {\n        return { hx * rhs , hy * rhs, hz * rhs, hw * rhs };\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const HPoint3d& rhs) {\n        output << \"(\" << rhs.hx << \", \" << rhs.hy << \", \" << rhs.hz << \", \" << rhs.hw << \")\";\n        return output;\n    }\n\n};\n\nstruct Vector3d\n{\n    double x;\n    double y;\n    double z;\n\n    template<class K>\n    CGAL::Vector_3<K> ToCGAL() const\n    {\n        return CGAL::Vector_3<K>(x, y, z);\n    }\n\n    template<class K>\n    static Vector3d FromCGAL(CGAL::Vector_3<K> p)\n    {\n        double x = CGAL::to_double(p.x());\n        double y = CGAL::to_double(p.y());\n        double z = CGAL::to_double(p.z());\n        return { x, y, z };\n    }\n\n    template<class K>\n    CGAL::Point_3<K> ToPoint() const\n    {\n        return CGAL::Point_3<K>(x, y, z);\n    }\n\n    bool operator==(const Vector3d& rhs) const\n    {\n        return x == rhs.x && y == rhs.y && z == rhs.z;\n    }\n\n    bool operator!=(const Vector3d& rhs) const\n    {\n        return !operator==(rhs);\n    }\n\n    friend std::ostream& operator<<(std::ostream& output, const Vector3d& rhs) {\n        output << \"(\" << rhs.x << \", \" << rhs.y << \", \" << rhs.z << \")\";\n        return output;\n    }\n\n};\n\nstruct Segment3d\n{\n    Point3d a;\n    Point3d b;\n\n    template<class K, class SEG>\n    SEG ToCGAL() const\n    {\n        return { a.ToCGAL<K>(), b.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Segment3d FromCGAL(CGAL::Point_3<K> a, CGAL::Point_3<K> b)\n    {\n        auto A = Point3d::FromCGAL<K>(a);\n        auto B = Point3d::FromCGAL<K>(b);\n        return { A, B };\n    }\n\n    template<class K>\n    static Segment3d FromCGAL(CGAL::Segment_3<K> seg)\n    {\n        auto A = Point3d::FromCGAL<K>(seg.source());\n        auto B = Point3d::FromCGAL<K>(seg.target());\n        return { A, B };\n    }\n\n};\n\nstruct Line3d\n{\n    Point3d position;\n    Vector3d direction;\n\n    template<class K, class LINE>\n    LINE ToCGAL() const\n    {\n        return { position.ToCGAL<K>(), direction.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Line3d FromCGAL(CGAL::Point_3<K> pos, CGAL::Vector_3<K> dir)\n    {\n        return { Point3d::FromCGAL(pos), Vector3d::FromCGAL(dir) };\n    }\n};\n\nstruct TriangleIndex\n{\n    int a, b, c;\n};\n\nstruct  Plane3d\n{\n    Point3d position;\n    Vector3d direction;\n\n    template<class K, class PLANE>\n    PLANE ToCGAL() const\n    {\n        return { position.ToCGAL<K>(), direction.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Plane3d FromCGAL(CGAL::Point_3<K> pos, CGAL::Vector_3<K> dir)\n    {\n        return { Point3d::FromCGAL(pos), Vector3d::FromCGAL(dir) };\n    }\n};\n\nstruct Box3d\n{\n    Point3d min;\n    Point3d max;\n\n    template<class K, class BOX>\n    BOX ToCGAL() const\n    {\n        return { min.ToCGAL<K>(), max.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Box3d FromCGAL(CGAL::Point_3<K> min, CGAL::Point_3<K> max)\n    {\n        auto Min = Point3d::FromCGAL<K>(min);\n        auto Max = Point3d::FromCGAL<K>(max);\n        return { Min, Max };\n    }\n\n    template<class K>\n    static Box3d FromCGAL(CGAL::Bbox_3 box)\n    {\n        double xmin = CGAL::to_double(box.xmin());\n        double ymin = CGAL::to_double(box.ymin());\n        double zmin = CGAL::to_double(box.zmin());\n\n        double xmax = CGAL::to_double(box.xmax());\n        double ymax = CGAL::to_double(box.ymax());\n        double zmax = CGAL::to_double(box.zmax());\n\n        Point3d min = { xmin, ymin, zmin };\n        Point3d max = { xmax, ymax, zmax };\n\n        return { min, max };\n    }\n};\n\nstruct  Ray3d\n{\n    Point3d position;\n    Vector3d direction;\n\n    template<class K, class RAY>\n    RAY ToCGAL() const\n    {\n        return { position.ToCGAL<K>(), direction.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Ray3d FromCGAL(CGAL::Point_3<K> pos, CGAL::Vector_3<K> dir)\n    {\n        return { Point3d::FromCGAL(pos), Vector3d::FromCGAL(dir) };\n    }\n};\n\nstruct Triangle3d\n{\n    Point3d a;\n    Point3d b;\n    Point3d c;\n\n    template<class K, class TRI>\n    TRI ToCGAL() const\n    {\n        return { a.ToCGAL<K>(), b.ToCGAL<K>(), c.ToCGAL<K>() };\n    }\n\n    template<class K>\n    static Triangle3d FromCGAL(CGAL::Point_3<K> a, CGAL::Point_3<K> b, CGAL::Point_3<K> c)\n    {\n        auto A = Point3d::FromCGAL<K>(a);\n        auto B = Point3d::FromCGAL<K>(b);\n        auto C = Point3d::FromCGAL<K>(c);\n        return { A, B, C };\n    }\n\n    template<class K>\n    static Triangle3d FromCGAL(CGAL::Triangle_3<K> tri)\n    {\n        auto A = Point3d::FromCGAL<K>(tri[0]);\n        auto B = Point3d::FromCGAL<K>(tri[1]);\n        auto C = Point3d::FromCGAL<K>(tri[2]);\n        return { A, B, C };\n    }\n\n};\n\nstruct Tetahedron3d\n{\n    Point3d a;\n    Point3d b;\n    Point3d c;\n    Point3d d;\n\n    template<class K>\n    static Tetahedron3d FromCGAL(CGAL::Point_3<K> a, CGAL::Point_3<K> b, CGAL::Point_3<K> c, CGAL::Point_3<K> d)\n    {\n        auto A = Point3d::FromCGAL<K>(a);\n        auto B = Point3d::FromCGAL<K>(b);\n        auto C = Point3d::FromCGAL<K>(c);\n        auto D = Point3d::FromCGAL<K>(d);\n        return { A, B, C, D };\n    }\n\n};\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/HPoint2_EEK.cpp",
    "content": "#include \"HPoint2_EEK.h\"\n#include <CGAL/Point_2.h>\n#include <CGAL/Weighted_point_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Weighted_point_2<EEK> HPoint2;\ntypedef CGAL::Point_2<EEK> Point2;\n\nvoid* HPoint2_EEK_Create()\n{\n\treturn new HPoint2();\n}\n\nvoid* HPoint2_EEK_CreateFromPoint(const HPoint2d& point)\n{\n\tauto p = point.ToCGALWeightedPoint<EEK>();\n\treturn new HPoint2(p.x(), p.y());\n}\n\nvoid HPoint2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<HPoint2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nHPoint2* CastToHPoint2(void* ptr)\n{\n\treturn static_cast<HPoint2*>(ptr);\n}\n\ndouble HPoint2_EEK_GetX(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hx());\n}\n\ndouble HPoint2_EEK_GetY(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hy());\n}\n\ndouble HPoint2_EEK_GetW(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hw());\n}\n\nvoid HPoint2_EEK_SetX(void* ptr, double x)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(x, p->y()), p->hw());\n}\n\nvoid HPoint2_EEK_SetY(void* ptr, double y)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(p->x(), y), p->hw());\n}\n\nvoid HPoint2_EEK_SetW(void* ptr, double w)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(p->x(), p->y()), p->hw());\n}\n\nvoid* HPoint2_EEK_Copy(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\tauto p2 = new HPoint2();\n\n\t(*p2) = *p;\n\treturn p2;\n}\n\nvoid* HPoint2_EEK_Convert(void* ptr)\n{\n\ttypedef CGAL::Cartesian_converter<EEK, EIK> EEK_to_EIK;\n\tEEK_to_EIK convert;\n\n\tauto p = CastToHPoint2(ptr);\n\tauto hx = convert((*p)[0]);\n\tauto hy = convert((*p)[1]);\n\tauto hw = convert((*p)[2]);\n\n\treturn new CGAL::Weighted_point_2<EIK>(CGAL::Point_2<EIK>(hx, hy), hw);\n}\n\n\ntemplate<class K2>\nstatic void* Convert(HPoint2* hp)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto hx = convert((*hp)[0]);\n\tauto hy = convert((*hp)[1]);\n\tauto hw = convert((*hp)[2]);\n\tauto p = CGAL::Point_2<K2>(hx, hy);\n\n\treturn  new CGAL::Weighted_point_2<K2>(p, hw);\n}\n\nvoid* HPoint2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToHPoint2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EEK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/HPoint2_EEK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* HPoint2_EEK_Create();\n\n\tCGALWRAPPER_API void* HPoint2_EEK_CreateFromPoint(const HPoint2d& point);\n\n\tCGALWRAPPER_API void HPoint2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EEK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EEK_GetY(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EEK_GetW(void* ptr);\n\n\tCGALWRAPPER_API void HPoint2_EEK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void HPoint2_EEK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API void HPoint2_EEK_SetW(void* ptr, double y);\n\n\tCGALWRAPPER_API void* HPoint2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* HPoint2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/HPoint2_EIK.cpp",
    "content": "#include \"HPoint2_EIK.h\"\n#include <CGAL/Point_2.h>\n#include <CGAL/Weighted_point_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Weighted_point_2<EIK> HPoint2;\ntypedef CGAL::Point_2<EIK> Point2;\n\nvoid* HPoint2_EIK_Create()\n{\n\treturn new HPoint2();\n}\n\nvoid* HPoint2_EIK_CreateFromPoint(const HPoint2d& point)\n{\n\tauto p = point.ToCGALWeightedPoint<EIK>();\n\treturn new HPoint2(p.x(), p.y());\n}\n\nvoid HPoint2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<HPoint2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nHPoint2* CastToHPoint2(void* ptr)\n{\n\treturn static_cast<HPoint2*>(ptr);\n}\n\ndouble HPoint2_EIK_GetX(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hx());\n}\n\ndouble HPoint2_EIK_GetY(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hy());\n}\n\ndouble HPoint2_EIK_GetW(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\treturn CGAL::to_double(p->hw());\n}\n\nvoid HPoint2_EIK_SetX(void* ptr, double x)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(x, p->y()), p->hw());\n}\n\nvoid HPoint2_EIK_SetY(void* ptr, double y)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(p->x(), y), p->hw());\n}\n\nvoid HPoint2_EIK_SetW(void* ptr, double w)\n{\n\tauto p = CastToHPoint2(ptr);\n\t(*p) = HPoint2(Point2(p->x(), p->y()), p->hw());\n}\n\nvoid* HPoint2_EIK_Copy(void* ptr)\n{\n\tauto p = CastToHPoint2(ptr);\n\tauto p2 = new HPoint2();\n\n\t(*p2) = *p;\n\treturn p2;\n}\n\ntemplate<class K2>\nstatic void* Convert(HPoint2* hp)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto hx = convert((*hp)[0]);\n\tauto hy = convert((*hp)[1]);\n\tauto hw = convert((*hp)[2]);\n\tauto p = CGAL::Point_2<K2>(hx, hy);\n\n\treturn  new CGAL::Weighted_point_2<K2>(p, hw);\n}\n\nvoid* HPoint2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToHPoint2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EIK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/HPoint2_EIK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* HPoint2_EIK_Create();\n\n\tCGALWRAPPER_API void* HPoint2_EIK_CreateFromPoint(const HPoint2d& point);\n\n\tCGALWRAPPER_API void HPoint2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EIK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EIK_GetY(void* ptr);\n\n\tCGALWRAPPER_API double HPoint2_EIK_GetW(void* ptr);\n\n\tCGALWRAPPER_API void HPoint2_EIK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void HPoint2_EIK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API void HPoint2_EIK_SetW(void* ptr, double y);\n\n\tCGALWRAPPER_API void* HPoint2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* HPoint2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Index.h",
    "content": "#pragma once\n\nstruct Index2\n{\n\tint first;\n\tint second;\n};\n\nstruct Index3\n{\n\tint first;\n\tint second;\n\tint third;\n};\n\nstruct Index4\n{\n\tint first;\n\tint second;\n\tint third;\n\tint fourth;\n};\n"
  },
  {
    "path": "CGALWrapper/Geometry/IntersectionResult.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n\n#include <CGAL/intersections.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Direction_2.h>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Triangle_2.h>\n#include <CGAL/Line_2.h>\n#include <CGAL/Iso_rectangle_2.h>\n#include <CGAL/Ray_2.h>\n\nenum INTERSECTION_RESULT_2D : int\n{\n    NONE,\n    POINT2,\n    LINE2,\n    RAY2,\n    SEGMENT2,\n    BOX2,\n    TRIANGLE2,\n    POLYGON2\n};\n\nstruct IntersectionResult2d\n{\n    Point2d points[6];\n    int count;\n    INTERSECTION_RESULT_2D type;\n};\n\n#ifdef min\n#undef min\n#endif //min\n\n#ifdef max\n#undef max\n#endif //max\n\ntemplate<class K>\nclass IntersectionResult\n{\n\n    typedef CGAL::Point_2<K> Point2;\n    typedef CGAL::Line_2<K> Line2;\n    typedef CGAL::Ray_2<K> Ray2;\n    typedef CGAL::Segment_2<K> Segment2;\n    typedef CGAL::Triangle_2<K> Triangle2;\n    typedef CGAL::Iso_rectangle_2<K> Box2;\n    typedef std::vector<Point2> Polygon2;\n\npublic:\n\n    static IntersectionResult2d ToPoint(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToBox(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Box2 box;\n\n        if (assign(box, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::BOX2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(box.min());\n            result.points[1] = Point2d::FromCGAL(box.max());\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToPointOrSegment(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Segment2 seg;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(seg, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::SEGMENT2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(seg.source());\n            result.points[1] = Point2d::FromCGAL(seg.target());\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToPointSegmentTriangleOrPolygon(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Segment2 seg;\n        Triangle2 tri;\n        Polygon2 polygon;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(seg, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::SEGMENT2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(seg.source());\n            result.points[1] = Point2d::FromCGAL(seg.target());\n            return result;\n        }\n        else if (assign(tri, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::TRIANGLE2;\n            result.count = 3;\n            result.points[0] = Point2d::FromCGAL(tri[0]);\n            result.points[1] = Point2d::FromCGAL(tri[1]);\n            result.points[2] = Point2d::FromCGAL(tri[2]);\n            return result;\n        }\n        else if (assign(polygon, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POLYGON2;\n            result.count = (int)polygon.size();\n\n            for (int i = 0; i < result.count; i++)\n                result.points[i] = Point2d::FromCGAL(polygon[i]);\n\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToPointOrRay(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Ray2 ray;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(ray, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::RAY2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(ray.source());\n            result.points[1] = Point2d::FromCGAL(ray.to_vector());\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToPointOrLine(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Line2 line;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(line, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::LINE2;\n            result.count = 2;\n            result.points[0].x = CGAL::to_double(line.a());\n            result.points[0].y = CGAL::to_double(line.b());\n            result.points[1].x = CGAL::to_double(line.c());\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToPointSegmentOrRay(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Segment2 seg;\n        Ray2 ray;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(seg, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::SEGMENT2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(seg.source());\n            result.points[1] = Point2d::FromCGAL(seg.target());\n            return result;\n        }\n        else if (assign(ray, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::RAY2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(ray.source());\n            result.points[1] = Point2d::FromCGAL(ray.to_vector());\n            return result;\n        }\n\n        return {};\n    }\n\n    static IntersectionResult2d ToAny(CGAL::Object obj)\n    {\n        if (obj == nullptr || obj.is_empty())\n            return {};\n\n        Point2 point;\n        Segment2 seg;\n        Line2 line;\n        Ray2 ray;\n        Triangle2 tri;\n        Box2 box;\n        Polygon2 polygon;\n\n        if (assign(point, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POINT2;\n            result.count = 1;\n            result.points[0] = Point2d::FromCGAL(point);\n            return result;\n        }\n        else if (assign(seg, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::SEGMENT2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(seg.source());\n            result.points[1] = Point2d::FromCGAL(seg.target());\n            return result;\n        }\n        else if (assign(line, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::LINE2;\n            result.count = 2;\n            result.points[0].x = CGAL::to_double(line.a());\n            result.points[0].y = CGAL::to_double(line.b());\n            result.points[1].x = CGAL::to_double(line.c());\n            return result;\n        }\n        else if (assign(ray, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::RAY2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(ray.source());\n            result.points[1] = Point2d::FromCGAL(ray.to_vector());\n            return result;\n        }\n        else if (assign(tri, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::TRIANGLE2;\n            result.count = 3;\n            result.points[0] = Point2d::FromCGAL(tri[0]);\n            result.points[1] = Point2d::FromCGAL(tri[1]);\n            result.points[2] = Point2d::FromCGAL(tri[2]);\n            return result;\n        }\n        else if (assign(box, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::BOX2;\n            result.count = 2;\n            result.points[0] = Point2d::FromCGAL(box.min());\n            result.points[1] = Point2d::FromCGAL(box.max());\n            return result;\n        }\n        else if (assign(polygon, obj))\n        {\n            IntersectionResult2d result = {};\n            result.type = INTERSECTION_RESULT_2D::POLYGON2;\n            result.count = (int)polygon.size();\n\n            for (int i = 0; i < result.count; i++)\n                result.points[i] = Point2d::FromCGAL(polygon[i]);\n\n            return result;\n        }\n\n        return {};\n    }\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_geometry.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n#include \"IntersectionResult.h\"\n\n#include <CGAL/intersections.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Direction_2.h>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Triangle_2.h>\n#include <CGAL/Line_2.h>\n#include <CGAL/Iso_rectangle_2.h>\n#include <CGAL/Ray_2.h>\n\ntemplate<class K>\nclass Intersections_Geometry\n{\n\npublic:\n\n    typedef CGAL::Point_2<K> Point2;\n    typedef CGAL::Line_2<K> Line2;\n    typedef CGAL::Ray_2<K> Ray2;\n    typedef CGAL::Segment_2<K> Segment2;\n    typedef CGAL::Triangle_2<K> Triangle2;\n    typedef CGAL::Iso_rectangle_2<K> Box2;\n    typedef std::vector<Point2> Polygon2;\n\n    /*****************************************************\n    *                                                    *\n    *            Geometry Casting Functions              *\n    *                                                    *\n    ******************************************************/\n\n    inline static Point2* CastToPoint2(void* ptr)\n    {\n        return static_cast<Point2*>(ptr);\n    }\n\n    inline static Line2* CastToLine2(void* ptr)\n    {\n        return static_cast<Line2*>(ptr);\n    }\n\n    inline static Ray2* CastToRay2(void* ptr)\n    {\n        return static_cast<Ray2*>(ptr);\n    }\n\n    inline static Segment2* CastToSegment2(void* ptr)\n    {\n        return static_cast<Segment2*>(ptr);\n    }\n\n    inline static Triangle2* CastToTriangle2(void* ptr)\n    {\n        return static_cast<Triangle2*>(ptr);\n    }\n\n    inline static Box2* CastToBox2(void* ptr)\n    {\n        return static_cast<Box2*>(ptr);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Point2 DoIntersect Functions            *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_PointLine(void* point, void* line)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*p, *l);\n    }\n\n    static BOOL DoIntersect_PointRay(void* point, void* ray)\n    {\n        auto p = CastToPoint2(point);\n        auto r = CastToRay2(ray);\n        return CGAL::do_intersect(*p, *r);\n    }\n\n    static BOOL DoIntersect_PointSegment(void* point, void* seg)\n    {\n        auto p = CastToPoint2(point);\n        auto s = CastToSegment2(seg);\n        return CGAL::do_intersect(*p, *s);\n    }\n\n    static BOOL DoIntersect_PointTriangle(void* point, void* tri)\n    {\n        auto p = CastToPoint2(point);\n        auto t = CastToTriangle2(tri);\n        return CGAL::do_intersect(*p, *t);\n    }\n\n    static BOOL DoIntersect_PointBox(void* point, void* box)\n    {\n        auto p = CastToPoint2(point);\n        auto b = CastToBox2(box);\n        return CGAL::do_intersect(*p, *b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Line2 DoIntersect Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_LinePoint(void* line, void* point)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*p, *l);\n    }\n\n    static BOOL DoIntersect_LineLine(void* line, void* line2)\n    {\n        auto l = CastToLine2(line);\n        auto l2 = CastToLine2(line2);\n        return CGAL::do_intersect(*l, *l2);\n    }\n\n    static BOOL DoIntersect_LineRay(void* line, void* ray)\n    {\n        auto l = CastToLine2(line);\n        auto r = CastToRay2(ray);\n        return CGAL::do_intersect(*l, *r);\n    }\n\n    static BOOL DoIntersect_LineSegment(void* line, void* segment)\n    {\n        auto l = CastToLine2(line);\n        auto s = CastToSegment2(segment);\n        return CGAL::do_intersect(*l, *s);\n    }\n\n    static BOOL DoIntersect_LineTriangle(void* line, void* triangle)\n    {\n        auto l = CastToLine2(line);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::do_intersect(*l, *t);\n    }\n\n    static BOOL DoIntersect_LineBox(void* line, void* box)\n    {\n        auto l = CastToLine2(line);\n        auto b = CastToBox2(box);\n        return CGAL::do_intersect(*l, *b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2 DoIntersect Functions              *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_RayPoint(void* ray, void* point)\n    {\n        auto r = CastToRay2(ray);\n        auto p = CastToPoint2(point);\n        return CGAL::do_intersect(*r, *p);\n    }\n\n    static BOOL DoIntersect_RayLine(void* ray, void* line)\n    {\n        auto r = CastToRay2(ray);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*r, *l);\n    }\n\n    static BOOL DoIntersect_RayRay(void* ray, void* ray2)\n    {\n        auto r = CastToRay2(ray);\n        auto r2 = CastToRay2(ray2);\n        return CGAL::do_intersect(*r, *r2);\n    }\n\n    static BOOL DoIntersect_RaySegment(void* ray, void* segment)\n    {\n        auto r = CastToRay2(ray);\n        auto s = CastToSegment2(segment);\n        return CGAL::do_intersect(*r, *s);\n    }\n\n    static BOOL DoIntersect_RayTriangle(void* ray, void* triangle)\n    {\n        auto r = CastToRay2(ray);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::do_intersect(*r, *t);\n    }\n\n    static BOOL DoIntersect_RayBox(void* ray, void* box)\n    {\n        auto r = CastToRay2(ray);\n        auto b = CastToBox2(box);\n        return CGAL::do_intersect(*r, *b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2  DoIntersect Functions         *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_SegmentPoint(void* segment, void* point)\n    {\n        auto s = CastToSegment2(segment);\n        auto p = CastToPoint2(point);\n        return CGAL::do_intersect(*s, *p);\n    }\n\n    static BOOL DoIntersect_SegmentLine(void* segment, void* line)\n    {\n        auto s = CastToSegment2(segment);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*s, *l);\n    }\n\n    static BOOL DoIntersect_SegmentRay(void* segment, void* ray)\n    {\n        auto s = CastToSegment2(segment);\n        auto r = CastToRay2(ray);\n        return CGAL::do_intersect(*s, *r);\n    }\n\n    static BOOL DoIntersect_SegmentSegment(void* segment, void* segment2)\n    {\n        auto s = CastToSegment2(segment);\n        auto s2 = CastToSegment2(segment2);\n        return CGAL::do_intersect(*s, *s2);\n    }\n\n    static BOOL DoIntersect_SegmentTriangle(void* segment, void* triangle)\n    {\n        auto s = CastToSegment2(segment);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::do_intersect(*s, *t);\n    }\n\n    static BOOL DoIntersect_SegmentBox(void* segment, void* box)\n    {\n        auto s = CastToSegment2(segment);\n        auto b = CastToBox2(box);\n        return CGAL::do_intersect(*s, *b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2  DoIntersect Functions        *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_TrianglePoint(void* triangle, void* point)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto p = CastToPoint2(point);\n        return CGAL::do_intersect(*t, *p);\n    }\n\n    static BOOL DoIntersect_TriangleLine(void* triangle, void* line)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*t, *l);\n    }\n\n    static BOOL DoIntersect_TriangleRay(void* triangle, void* ray)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto r = CastToRay2(ray);\n        return CGAL::do_intersect(*t, *r);\n    }\n\n    static BOOL DoIntersect_TriangleSegment(void* triangle, void* segment)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto s = CastToSegment2(segment);\n        return CGAL::do_intersect(*t, *s);\n    }\n\n    static BOOL DoIntersect_TriangleTriangle(void* triangle, void* triangle2)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto t2 = CastToTriangle2(triangle2);\n        return CGAL::do_intersect(*t, *t2);\n    }\n\n    static BOOL DoIntersect_TriangleBox(void* triangle, void* box)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto b = CastToBox2(box);\n        return CGAL::do_intersect(*t, *b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Box2  DoIntersect Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect_BoxPoint(void* box, void* point)\n    {\n        auto b = CastToBox2(box);\n        auto p = CastToPoint2(point);\n        return CGAL::do_intersect(*b, *p);\n    }\n\n    static BOOL DoIntersect_BoxLine(void* box, void* line)\n    {\n        auto b = CastToBox2(box);\n        auto l = CastToLine2(line);\n        return CGAL::do_intersect(*b, *l);\n    }\n\n    static BOOL DoIntersect_BoxRay(void* box, void* ray)\n    {\n        auto b = CastToBox2(box);\n        auto r = CastToRay2(ray);\n        return CGAL::do_intersect(*b, *r);\n    }\n\n    static BOOL DoIntersect_BoxSegment(void* box, void* segment)\n    {\n        auto b = CastToBox2(box);\n        auto s = CastToSegment2(segment);\n        return CGAL::do_intersect(*b, *s);\n    }\n\n    static BOOL DoIntersect_BoxTriangle(void* box, void* triangle)\n    {\n        auto b = CastToBox2(box);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::do_intersect(*b, *t);\n    }\n\n    static BOOL DoIntersect_BoxBox(void* box, void* box2)\n    {\n        auto b = CastToBox2(box);\n        auto b2 = CastToBox2(box2);\n        return CGAL::do_intersect(*b, *b2);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Point2 Intersection Functions           *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_PointLine(void* point, void* line)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *l));\n    }\n\n    static IntersectionResult2d Intersection_PointRay(void* point, void* ray)\n    {\n        auto p = CastToPoint2(point);\n        auto r = CastToRay2(ray);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *r));\n    }\n\n    static IntersectionResult2d Intersection_PointSegment(void* point, void* segment)\n    {\n        auto p = CastToPoint2(point);\n        auto s = CastToSegment2(segment);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *s));\n    }\n\n    static IntersectionResult2d Intersection_PointTriangle(void* point, void* triangle)\n    {\n        auto p = CastToPoint2(point);\n        auto t = CastToTriangle2(triangle);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *t));\n    }\n\n    static IntersectionResult2d Intersection_PointBox(void* point, void* box)\n    {\n        auto p = CastToPoint2(point);\n        auto b = CastToBox2(box);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Line2 Intersection Functions           *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_LinePoint(void* line, void* point)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*p, *l));\n    }\n\n    static IntersectionResult2d Intersection_LineLine(void* line, void* line2)\n    {\n        auto l = CastToLine2(line);\n        auto l2 = CastToLine2(line2);\n        return IntersectionResult<K>::ToPointOrLine(CGAL::intersection(*l, *l2));\n    }\n\n    static IntersectionResult2d Intersection_LineRay(void* line, void* ray)\n    {\n        auto l = CastToLine2(line);\n        auto r = CastToRay2(ray);\n        return IntersectionResult<K>::ToPointOrRay(CGAL::intersection(*l, *r));\n    }\n\n    static IntersectionResult2d Intersection_LineSegment(void* line, void* segment)\n    {\n        auto l = CastToLine2(line);\n        auto s = CastToSegment2(segment);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*l, *s));\n    }\n\n    static IntersectionResult2d Intersection_LineTriangle(void* line, void* triangle)\n    {\n        auto l = CastToLine2(line);\n        auto t = CastToTriangle2(triangle);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*l, *t));\n    }\n\n    static IntersectionResult2d Intersection_LineBox(void* line, void* box)\n    {\n        auto l = CastToLine2(line);\n        auto b = CastToBox2(box);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*l, *b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2 Intersection Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_RayPoint(void* ray, void* point)\n    {\n        auto r = CastToRay2(ray);\n        auto p = CastToPoint2(point);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*r, *p));\n    }\n\n    static IntersectionResult2d Intersection_RayLine(void* ray, void* line)\n    {\n        auto r = CastToRay2(ray);\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPointOrRay(CGAL::intersection(*r, *l));\n    }\n\n    static IntersectionResult2d Intersection_RayRay(void* ray, void* ray2)\n    {\n        auto r = CastToRay2(ray);\n        auto r2 = CastToRay2(ray2);\n        return IntersectionResult<K>::ToPointSegmentOrRay(CGAL::intersection(*r, *r2));\n    }\n\n    static IntersectionResult2d Intersection_RaySegment(void* ray, void* segment)\n    {\n        auto r = CastToRay2(ray);\n        auto s = CastToSegment2(segment);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*r, *s));\n    }\n\n    static IntersectionResult2d Intersection_RayTriangle(void* ray, void* triangle)\n    {\n        auto r = CastToRay2(ray);\n        auto t = CastToTriangle2(triangle);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*r, *t));\n    }\n\n    static IntersectionResult2d Intersection_RayBox(void* ray, void* box)\n    {\n        auto r = CastToRay2(ray);\n        auto b = CastToBox2(box);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*r, *b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2 Intersection Functions         *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_SegmentPoint(void* segment, void* point)\n    {\n        auto s = CastToSegment2(segment);\n        auto p = CastToPoint2(point);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*s, *p));\n    }\n\n    static IntersectionResult2d Intersection_SegmentLine(void* segment, void* line)\n    {\n        auto s = CastToSegment2(segment);\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*s, *l));\n    }\n\n    static IntersectionResult2d Intersection_SegmentRay(void* segment, void* ray)\n    {\n        auto s = CastToSegment2(segment);\n        auto r = CastToRay2(ray);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*s, *r));\n    }\n\n    static IntersectionResult2d Intersection_SegmentSegment(void* segment, void* segment2)\n    {\n        auto s = CastToSegment2(segment);\n        auto s2 = CastToSegment2(segment2);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*s, *s2));\n    }\n\n    static IntersectionResult2d Intersection_SegmentTriangle(void* segment, void* triangle)\n    {\n        auto s = CastToSegment2(segment);\n        auto t = CastToTriangle2(triangle);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*s, *t));\n    }\n\n    static IntersectionResult2d Intersection_SegmentBox(void* segment, void* box)\n    {\n        auto s = CastToSegment2(segment);\n        auto b = CastToBox2(box);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*s, *b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2 Intersection Functions        *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_TrianglePoint(void* triangle, void* point)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto p = CastToPoint2(point);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*t, *p));\n    }\n\n    static IntersectionResult2d Intersection_TriangleLine(void* triangle, void* line)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*t, *l));\n    }\n\n    static IntersectionResult2d Intersection_TriangleRay(void* triangle, void* ray)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto r = CastToRay2(ray);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*t, *r));\n    }\n\n    static IntersectionResult2d Intersection_TriangleSegment(void* triangle, void* segment)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto s = CastToSegment2(segment);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*t, *s));\n    }\n\n    static IntersectionResult2d Intersection_TriangleTriangle(void* triangle, void* triangle2)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto t2 = CastToTriangle2(triangle2);\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(*t, *t2));\n    }\n\n    static IntersectionResult2d Intersection_TriangleBox(void* triangle, void* box)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto b = CastToBox2(box);\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(*t, *b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Box2 Intersection Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection_BoxPoint(void* box, void* point)\n    {\n        auto b = CastToBox2(box);\n        auto p = CastToPoint2(point);\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(*b, *p));\n    }\n\n    static IntersectionResult2d Intersection_BoxLine(void* box, void* line)\n    {\n        auto b = CastToBox2(box);;\n        auto l = CastToLine2(line);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*b, *l));\n    }\n\n    static IntersectionResult2d Intersection_BoxRay(void* box, void* ray)\n    {\n        auto b = CastToBox2(box);\n        auto r = CastToRay2(ray);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*b, *r));\n    }\n\n    static IntersectionResult2d Intersection_BoxSegment(void* box, void* segment)\n    {\n        auto b = CastToBox2(box);\n        auto s = CastToSegment2(segment);\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(*b, *s));\n    }\n\n    static IntersectionResult2d Intersection_BoxTriangle(void* box, void* triangle)\n    {\n        auto b = CastToBox2(box);\n        auto t = CastToTriangle2(triangle);\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(*b, *t));\n    }\n\n    static IntersectionResult2d Intersection_BoxBox(void* box, void* box2)\n    {\n        auto b = CastToBox2(box);\n        auto b2 = CastToBox2(box2);\n        return IntersectionResult<K>::ToBox(CGAL::intersection(*b, *b2));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Point2 SqrDistance Functions            *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance_PointPoint(void* point, void* point2)\n    {\n        auto p = CastToPoint2(point);\n        auto p2 = CastToPoint2(point2);\n        return CGAL::to_double(CGAL::squared_distance(*p, *p2));\n    }\n\n    static double SqrDistance_PointLine(void* point, void* line)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return CGAL::to_double(CGAL::squared_distance(*p, *l));\n    }\n\n    static double SqrDistance_PointRay(void* point, void* ray)\n    {\n        auto p = CastToPoint2(point);\n        auto r = CastToRay2(ray);\n        return CGAL::to_double(CGAL::squared_distance(*p, *r));\n    }\n\n    static double SqrDistance_PointSegment(void* point, void* segment)\n    {\n        auto p = CastToPoint2(point);\n        auto s = CastToSegment2(segment);\n        return CGAL::to_double(CGAL::squared_distance(*p, *s));\n    }\n\n    static double SqrDistance_PointTriangle(void* point, void* triangle)\n    {\n        auto p = CastToPoint2(point);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::to_double(CGAL::squared_distance(*p, *t));\n    }\n\n\n    /*****************************************************\n    *                                                    *\n    *            Line2 SqrDistance Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance_LinePoint(void* line, void* point)\n    {\n        auto p = CastToPoint2(point);\n        auto l = CastToLine2(line);\n        return CGAL::to_double(CGAL::squared_distance(*p, *l));\n    }\n\n    static double SqrDistance_LineLine(void* line, void* line2)\n    {\n        auto l = CastToLine2(line);\n        auto l2 = CastToLine2(line2);\n        return CGAL::to_double(CGAL::squared_distance(*l, *l2));\n    }\n\n    static double SqrDistance_LineRay(void* line, void* ray)\n    {\n        auto l = CastToLine2(line);\n        auto r = CastToRay2(ray);\n        return CGAL::to_double(CGAL::squared_distance(*l, *r));\n    }\n\n    static double SqrDistance_LineSegment(void* line, void* segment)\n    {\n        auto l = CastToLine2(line);\n        auto s = CastToSegment2(segment);\n        return CGAL::to_double(CGAL::squared_distance(*l, *s));\n    }\n\n    static double SqrDistance_LineTriangle(void* line, void* triangle)\n    {\n        auto l = CastToLine2(line);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::to_double(CGAL::squared_distance(*l, *t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2 SqrDistance Functions              *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance_RayPoint(void* ray, void* point)\n    {\n        auto r = CastToRay2(ray);\n        auto p = CastToPoint2(point);\n        return CGAL::to_double(CGAL::squared_distance(*r, *p));\n    }\n\n    static double SqrDistance_RayLine(void* ray, void* line)\n    {\n        auto r = CastToRay2(ray);\n        auto l = CastToLine2(line);\n        return CGAL::to_double(CGAL::squared_distance(*r, *l));\n    }\n\n    static double SqrDistance_RayRay(void* ray, void* ray2)\n    {\n        auto r = CastToRay2(ray);\n        auto r2 = CastToRay2(ray2);\n        return CGAL::to_double(CGAL::squared_distance(*r, *r2));\n    }\n\n    static double SqrDistance_RaySegment(void* ray, void* segment)\n    {\n        auto r = CastToRay2(ray);\n        auto s = CastToSegment2(segment);\n        return CGAL::to_double(CGAL::squared_distance(*r, *s));\n    }\n\n    static double SqrDistance_RayTriangle(void* ray, void* triangle)\n    {\n        auto r = CastToRay2(ray);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::to_double(CGAL::squared_distance(*r, *t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2 SqrDistance Functions          *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance_SegmentPoint(void* segment, void* point)\n    {\n        auto s = CastToSegment2(segment);\n        auto p = CastToPoint2(point);\n        return CGAL::to_double(CGAL::squared_distance(*s, *p));\n    }\n\n    static double SqrDistance_SegmentLine(void* segment, void* line)\n    {\n        auto s = CastToSegment2(segment);\n        auto l = CastToLine2(line);\n        return CGAL::to_double(CGAL::squared_distance(*s, *l));\n    }\n\n    static double SqrDistance_SegmentRay(void* segment, void* ray)\n    {\n        auto s = CastToSegment2(segment);\n        auto r = CastToRay2(ray);\n        return CGAL::to_double(CGAL::squared_distance(*s, *r));\n    }\n\n    static double SqrDistance_SegmentSegment(void* segment, void* segment2)\n    {\n        auto s = CastToSegment2(segment);\n        auto s2 = CastToSegment2(segment2);\n        return CGAL::to_double(CGAL::squared_distance(*s, *s2));\n    }\n\n    static double SqrDistance_SegmentTriangle(void* segment, void* triangle)\n    {\n        auto s = CastToSegment2(segment);\n        auto t = CastToTriangle2(triangle);\n        return CGAL::to_double(CGAL::squared_distance(*s, *t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2 SqrDistance Functions         *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance_TrianglePoint(void* triangle, void* point)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto p = CastToPoint2(point);\n        return CGAL::to_double(CGAL::squared_distance(*t, *p));\n    }\n\n    static double SqrDistance_TriangleLine(void* triangle, void* line)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto l = CastToLine2(line);\n        return CGAL::to_double(CGAL::squared_distance(*t, *l));\n    }\n\n    static double SqrDistance_TriangleRay(void* triangle, void* ray)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto r = CastToRay2(ray);\n        return CGAL::to_double(CGAL::squared_distance(*t, *r));\n    }\n\n    static double SqrDistance_TriangleSegment(void* triangle, void* segment)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto s = CastToSegment2(segment);\n        return CGAL::to_double(CGAL::squared_distance(*t, *s));\n    }\n\n    static double SqrDistance_TriangleTriangle(void* triangle, void* triangle2)\n    {\n        auto t = CastToTriangle2(triangle);\n        auto t2 = CastToTriangle2(triangle2);\n        return CGAL::to_double(CGAL::squared_distance(*t, *t2));\n    }\n    \n\n};\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_geometry_EEK.cpp",
    "content": "\n#include \"Intersections_geometry_EEK.h\"\n#include \"Intersections_geometry.h\"\n\n/*****************************************************\n*                                                    *\n*            Point2 DoIntersect Functions            *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_PointLine(point, line);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_PointRay(point, ray);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_PointSegment(point, segment);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_PointTriangle(point, triangle);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_PointBox(void* point, void* box)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_PointBox(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2 DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LinePoint(line, point);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LineLine(line, line2);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LineRay(line, ray);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LineSegment(line, segment);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LineTriangle(line, triangle);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_LineBox(void* line, void* box)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_LineBox(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 DoIntersect Functions              *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RayPoint(ray, point);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RayLine(ray, line);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RayRay(ray, ray2);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RaySegment(ray, segment);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RayTriangle(ray, triangle);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_RayBox(void* ray, void* box)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_RayBox(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 DoIntersect Functions          *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentPoint(segment, point);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentLine(segment, line);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentRay(segment, ray);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentSegment(segment, segment2);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentTriangle(segment, triangle);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_SegmentBox(void* segment, void* box)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_SegmentBox(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle DoIntersect Functions          *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TrianglePoint(triangle, point);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TriangleLine(triangle, line);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TriangleRay(triangle, ray);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TriangleSegment(triangle, segment);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TriangleTriangle(triangle, triangle2);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_TriangleBox(void* triangle, void* box)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_TriangleBox(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2 DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxPoint(void* box, void* point)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxPoint(box, point);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxLine(void* box, void* line)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxLine(box, line);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxRay(void* box, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxRay(box, ray);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxSegment(void* box, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxSegment(box, segment);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxTriangle(void* box, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxTriangle(box, triangle);\n}\n\nBOOL Intersections_Geometry_EEK_DoIntersect_BoxBox(void* box, void* box2)\n{\n\treturn Intersections_Geometry<EEK>::DoIntersect_BoxBox(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2 Intersection Functions           *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_PointLine(point, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_PointRay(point, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_PointSegment(point, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_PointTriangle(point, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_PointBox(void* point, void* box)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_PointBox(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LinePoint(point, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LineLine(line, line2);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LineRay(line, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LineSegment(line, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LineTriangle(line, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_LineBox(void* line, void* box)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_LineBox(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RayPoint(ray, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RayLine(ray, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RayRay(ray, ray2);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RaySegment(ray, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RayTriangle(ray, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_RayBox(void* ray, void* box)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_RayBox(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 Intersection Functions         *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentPoint(segment, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentLine(segment, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentRay(segment, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentSegment(segment, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentTriangle(segment, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentBox(void* segment, void* box)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_SegmentBox(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2 Intersection Functions        *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TrianglePoint(triangle, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TriangleLine(triangle, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TriangleRay(triangle, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TriangleSegment(triangle, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TriangleTriangle(triangle, triangle2);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleBox(void* triangle, void* box)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_TriangleBox(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2 Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxPoint(void* box, void* point)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxPoint(box, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxLine(void* box, void* line)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxLine(box, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxRay(void* box, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxRay(box, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxSegment(void* box, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxSegment(box, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxTriangle(void* box, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxTriangle(box, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxBox(void* box, void* box2)\n{\n\treturn Intersections_Geometry<EEK>::Intersection_BoxBox(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2 SqrDistance Functions            *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EEK_SqrDistance_PointPoint(void* point, void* point2)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_PointPoint(point, point2);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_PointLine(point, line);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_PointRay(point, ray);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_PointSegment(point, segment);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_PointTriangle(point, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2 SqrDistance Functions             *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EEK_SqrDistance_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_LinePoint(line, point);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_LineLine(line, line2);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_LineRay(line, ray);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_LineSegment(line, segment);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_LineTriangle(line, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 SqrDistance Functions              *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EEK_SqrDistance_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_RayPoint(ray, point);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_RayLine(ray, line);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_RayRay(ray, ray2);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_RaySegment(ray, segment);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_RayTriangle(ray, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 SqrDistance Functions          *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EEK_SqrDistance_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_SegmentPoint(segment, point);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_SegmentLine(segment, line);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_SegmentRay(segment, ray);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_SegmentSegment(segment, segment2);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_SegmentTriangle(segment, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2 SqrDistance Functions         *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EEK_SqrDistance_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_TrianglePoint(triangle, point);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_TriangleLine(triangle, line);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_TriangleRay(triangle, ray);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_TriangleSegment(triangle, segment);\n}\n\ndouble Intersections_Geometry_EEK_SqrDistance_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EEK>::SqrDistance_TriangleTriangle(triangle, triangle2);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_geometry_EEK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n#include \"Intersections_geometry.h\"\n\n#include <CGAL/Intersections.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_PointTriangle(void* point, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_PointBox(void* point, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LineTriangle(void* line, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_LineBox(void* line, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions\t\t\t *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RayTriangle(void* ray, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_RayBox(void* ray, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentTriangle(void* segment, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_SegmentBox(void* segment, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TriangleTriangle(void* triangle, void* triangle2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_TriangleBox(void* triangle, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions\t\t     *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxPoint(void* box, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxLine(void* box, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxRay(void* box, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxSegment(void* box, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxTriangle(void* box, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EEK_DoIntersect_BoxBox(void* box, void* box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions          *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointTriangle(void* point, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_PointBox(void* point, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineTriangle(void* line, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_LineBox(void* line, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayTriangle(void* ray, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_RayBox(void* ray, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentTriangle(void* segment, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_SegmentBox(void* segment, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions       *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleTriangle(void* triangle, void* triangle2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_TriangleBox(void* triangle, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxPoint(void* box, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxLine(void* box, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxRay(void* box, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxSegment(void* box, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxTriangle(void* box, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EEK_Intersection_BoxBox(void* box, void* box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_PointPoint(void* point, void* point2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_PointTriangle(void* point, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_LineTriangle(void* line, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions             *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_RayTriangle(void* ray, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_SegmentTriangle(void* segment, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EEK_SqrDistance_TriangleTriangle(void* triangle, void* triangle2);\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_geometry_EIK.cpp",
    "content": "\n#include \"Intersections_geometry_EIK.h\"\n#include \"Intersections_geometry.h\"\n\n/*****************************************************\n*                                                    *\n*            Point2 DoIntersect Functions            *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_PointLine(point, line);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_PointRay(point, ray);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_PointSegment(point, segment);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_PointTriangle(point, triangle);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_PointBox(void* point, void* box)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_PointBox(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2 DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LinePoint(line, point);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LineLine(line, line2);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LineRay(line, ray);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LineSegment(line, segment);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LineTriangle(line, triangle);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_LineBox(void* line, void* box)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_LineBox(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 DoIntersect Functions              *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RayPoint(ray, point);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RayLine(ray, line);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RayRay(ray, ray2);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RaySegment(ray, segment);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RayTriangle(ray, triangle);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_RayBox(void* ray, void* box)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_RayBox(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 DoIntersect Functions          *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentPoint(segment, point);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentLine(segment, line);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentRay(segment, ray);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentSegment(segment, segment2);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentTriangle(segment, triangle);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_SegmentBox(void* segment, void* box)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_SegmentBox(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle DoIntersect Functions          *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TrianglePoint(triangle, point);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TriangleLine(triangle, line);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TriangleRay(triangle, ray);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TriangleSegment(triangle, segment);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TriangleTriangle(triangle, triangle2);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_TriangleBox(void* triangle, void* box)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_TriangleBox(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2 DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxPoint(void* box, void* point)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxPoint(box, point);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxLine(void* box, void* line)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxLine(box, line);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxRay(void* box, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxRay(box, ray);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxSegment(void* box, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxSegment(box, segment);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxTriangle(void* box, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxTriangle(box, triangle);\n}\n\nBOOL Intersections_Geometry_EIK_DoIntersect_BoxBox(void* box, void* box2)\n{\n\treturn Intersections_Geometry<EIK>::DoIntersect_BoxBox(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2 Intersection Functions           *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_PointLine(point, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_PointRay(point, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_PointSegment(point, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_PointTriangle(point, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_PointBox(void* point, void* box)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_PointBox(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LinePoint(point, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LineLine(line, line2);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LineRay(line, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LineSegment(line, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LineTriangle(line, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_LineBox(void* line, void* box)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_LineBox(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RayPoint(ray, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RayLine(ray, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RayRay(ray, ray2);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RaySegment(ray, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RayTriangle(ray, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_RayBox(void* ray, void* box)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_RayBox(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 Intersection Functions         *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentPoint(segment, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentLine(segment, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentRay(segment, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentSegment(segment, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentTriangle(segment, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentBox(void* segment, void* box)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_SegmentBox(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2 Intersection Functions        *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TrianglePoint(triangle, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TriangleLine(triangle, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TriangleRay(triangle, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TriangleSegment(triangle, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TriangleTriangle(triangle, triangle2);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleBox(void* triangle, void* box)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_TriangleBox(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2 Intersection Functions             *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxPoint(void* box, void* point)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxPoint(box, point);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxLine(void* box, void* line)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxLine(box, line);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxRay(void* box, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxRay(box, ray);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxSegment(void* box, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxSegment(box, segment);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxTriangle(void* box, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxTriangle(box, triangle);\n}\n\nIntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxBox(void* box, void* box2)\n{\n\treturn Intersections_Geometry<EIK>::Intersection_BoxBox(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2 SqrDistance Functions            *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EIK_SqrDistance_PointPoint(void* point, void* point2)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_PointPoint(point, point2);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_PointLine(void* point, void* line)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_PointLine(point, line);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_PointRay(void* point, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_PointRay(point, ray);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_PointSegment(void* point, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_PointSegment(point, segment);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_PointTriangle(void* point, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_PointTriangle(point, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2 SqrDistance Functions             *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EIK_SqrDistance_LinePoint(void* line, void* point)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_LinePoint(line, point);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_LineLine(void* line, void* line2)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_LineLine(line, line2);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_LineRay(void* line, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_LineRay(line, ray);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_LineSegment(void* line, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_LineSegment(line, segment);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_LineTriangle(void* line, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_LineTriangle(line, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2 SqrDistance Functions              *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EIK_SqrDistance_RayPoint(void* ray, void* point)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_RayPoint(ray, point);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_RayLine(void* ray, void* line)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_RayLine(ray, line);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_RayRay(void* ray, void* ray2)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_RayRay(ray, ray2);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_RaySegment(void* ray, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_RaySegment(ray, segment);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_RayTriangle(void* ray, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_RayTriangle(ray, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2 SqrDistance Functions          *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EIK_SqrDistance_SegmentPoint(void* segment, void* point)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_SegmentPoint(segment, point);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_SegmentLine(void* segment, void* line)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_SegmentLine(segment, line);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_SegmentRay(void* segment, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_SegmentRay(segment, ray);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_SegmentSegment(void* segment, void* segment2)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_SegmentSegment(segment, segment2);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_SegmentTriangle(void* segment, void* triangle)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_SegmentTriangle(segment, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2 SqrDistance Functions         *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Geometry_EIK_SqrDistance_TrianglePoint(void* triangle, void* point)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_TrianglePoint(triangle, point);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_TriangleLine(void* triangle, void* line)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_TriangleLine(triangle, line);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_TriangleRay(void* triangle, void* ray)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_TriangleRay(triangle, ray);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_TriangleSegment(void* triangle, void* segment)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_TriangleSegment(triangle, segment);\n}\n\ndouble Intersections_Geometry_EIK_SqrDistance_TriangleTriangle(void* triangle, void* triangle2)\n{\n\treturn Intersections_Geometry<EIK>::SqrDistance_TriangleTriangle(triangle, triangle2);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_geometry_EIK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n#include \"Intersections_geometry.h\"\n\n#include <CGAL/Intersections.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_PointTriangle(void* point, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_PointBox(void* point, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LineTriangle(void* line, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_LineBox(void* line, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions\t\t\t *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RayTriangle(void* ray, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_RayBox(void* ray, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentTriangle(void* segment, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_SegmentBox(void* segment, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TriangleTriangle(void* triangle, void* triangle2);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_TriangleBox(void* triangle, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* DoIntersect Functions\t\t     *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxPoint(void* box, void* point);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxLine(void* box, void* line);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxRay(void* box, void* ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxSegment(void* box, void* segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxTriangle(void* box, void* triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Geometry_EIK_DoIntersect_BoxBox(void* box, void* box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions          *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointTriangle(void* point, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_PointBox(void* point, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineTriangle(void* line, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_LineBox(void* line, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayTriangle(void* ray, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_RayBox(void* ray, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentTriangle(void* segment, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_SegmentBox(void* segment, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions       *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleTriangle(void* triangle, void* triangle2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_TriangleBox(void* triangle, void* box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxPoint(void* box, void* point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxLine(void* box, void* line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxRay(void* box, void* ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxSegment(void* box, void* segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxTriangle(void* box, void* triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Geometry_EIK_Intersection_BoxBox(void* box, void* box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_PointPoint(void* point, void* point2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_PointLine(void* point, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_PointRay(void* point, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_PointSegment(void* point, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_PointTriangle(void* point, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_LinePoint(void* line, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_LineLine(void* line, void* line2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_LineRay(void* line, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_LineSegment(void* line, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_LineTriangle(void* line, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions             *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_RayPoint(void* ray, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_RayLine(void* ray, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_RayRay(void* ray, void* ray2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_RaySegment(void* ray, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_RayTriangle(void* ray, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_SegmentPoint(void* segment, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_SegmentLine(void* segment, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_SegmentRay(void* segment, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_SegmentSegment(void* segment, void* segment2);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_SegmentTriangle(void* segment, void* triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            void* SqrDistance Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_TrianglePoint(void* triangle, void* point);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_TriangleLine(void* triangle, void* line);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_TriangleRay(void* triangle, void* ray);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_TriangleSegment(void* triangle, void* segment);\n\n\tCGALWRAPPER_API double Intersections_Geometry_EIK_SqrDistance_TriangleTriangle(void* triangle, void* triangle2);\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_shapes.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n#include \"IntersectionResult.h\"\n\n#include <CGAL/intersections.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Direction_2.h>\n#include <CGAL/Segment_2.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Triangle_2.h>\n#include <CGAL/Line_2.h>\n#include <CGAL/Iso_rectangle_2.h>\n#include <CGAL/Ray_2.h>\n\ntemplate<class K>\nclass Intersections_Shapes\n{\n\n    typedef CGAL::Point_2<K> Point2;\n    typedef CGAL::Line_2<K> Line2;\n    typedef CGAL::Ray_2<K> Ray2;\n    typedef CGAL::Segment_2<K> Segment2;\n    typedef CGAL::Triangle_2<K> Triangle2;\n    typedef CGAL::Iso_rectangle_2<K> Box2;\n    typedef std::vector<Point2> Polygon2;\n\npublic:\n\n    /*****************************************************\n    *                                                    *\n    *            Point2d DoIntersect Functions           *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Point2d point, Line2d line)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(p, l);\n    }\n\n    static BOOL DoIntersect(Point2d point, Ray2d ray)\n    {\n        auto p = point.ToCGAL<K>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(p, r);\n    }\n\n    static BOOL DoIntersect(Point2d point, Segment2d segment)\n    {\n        auto p = point.ToCGAL<K>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(p, s);\n    }\n\n    static BOOL DoIntersect(Point2d point, Triangle2d triangle)\n    {\n        auto p = point.ToCGAL<K>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(p, t);\n    }\n\n    static BOOL DoIntersect(Point2d point, Box2d box)\n    {\n        auto p = point.ToCGAL<K>();\n        auto b = box.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(p, b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Line2d DoIntersect Functions            *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Line2d line, Point2d point)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(p, l);\n    }\n\n    static BOOL DoIntersect(Line2d line, Line2d line2)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto l2 = line2.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(l, l2);\n    }\n\n    static BOOL DoIntersect(Line2d line, Ray2d ray)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(l, r);\n    }\n\n    static BOOL DoIntersect(Line2d line, Segment2d segment)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(l, s);\n    }\n\n    static BOOL DoIntersect(Line2d line, Triangle2d triangle)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(l, t);\n    }\n\n    static BOOL DoIntersect(Line2d line, Box2d box)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto b = box.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(l, b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2d DoIntersect Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Ray2d ray, Point2d point)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::do_intersect(r, p);\n    }\n\n    static BOOL DoIntersect(Ray2d ray, Line2d line)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(r, l);\n    }\n\n    static BOOL DoIntersect(Ray2d ray, Ray2d ray2)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto r2 = ray2.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(r, r2);\n    }\n\n    static BOOL DoIntersect(Ray2d ray, Segment2d segment)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(r, s);\n    }\n\n    static BOOL DoIntersect(Ray2d ray, Triangle2d triangle)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(r, t);\n    }\n\n    static BOOL DoIntersect(Ray2d ray, Box2d box)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto b = box.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(r, b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2d DoIntersect Functions         *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Segment2d segment, Point2d point)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::do_intersect(s, p);\n    }\n\n    static BOOL DoIntersect(Segment2d segment, Line2d line)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(s, l);\n    }\n\n    static BOOL DoIntersect(Segment2d segment, Ray2d ray)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(s, r);\n    }\n\n    static BOOL DoIntersect(Segment2d segment, Segment2d segment2)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto s2 = segment2.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(s, s2);\n    }\n\n    static BOOL DoIntersect(Segment2d segment, Triangle2d triangle)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(s, t);\n    }\n\n    static BOOL DoIntersect(Segment2d segment, Box2d box)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto b = box.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(s, b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2d DoIntersect Functions        *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Triangle2d triangle, Point2d point)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::do_intersect(t, p);\n    }\n\n    static BOOL DoIntersect(Triangle2d triangle, Line2d line)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(t, l);\n    }\n\n    static BOOL DoIntersect(Triangle2d triangle, Ray2d ray)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(t, r);\n    }\n\n    static BOOL DoIntersect(Triangle2d triangle, Segment2d segment)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(t, s);\n    }\n\n    static BOOL DoIntersect(Triangle2d triangle, Triangle2d triangle2)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto t2 = triangle2.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(t, t2);\n    }\n\n    static BOOL DoIntersect(Triangle2d triangle, Box2d box)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto b = box.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(t, b);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Box2d DoIntersect Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static BOOL DoIntersect(Box2d box, Point2d point)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::do_intersect(b, p);\n    }\n\n    static BOOL DoIntersect(Box2d box, Line2d line)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::do_intersect(b, l);\n    }\n\n    static BOOL DoIntersect(Box2d box, Ray2d ray)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::do_intersect(b, r);\n    }\n\n    static BOOL DoIntersect(Box2d box, Segment2d segment)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::do_intersect(b, s);\n    }\n\n    static BOOL DoIntersect(Box2d box, Triangle2d triangle)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::do_intersect(b, t);\n    }\n\n    static BOOL DoIntersect(Box2d box, Box2d box2)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto b2 = box2.ToCGAL<K, Box2>();\n        return CGAL::do_intersect(b, b2);\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Point2d Intersection Functions          *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Point2d point, Line2d line)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, l));\n    }\n\n    static IntersectionResult2d Intersection(Point2d point, Ray2d ray)\n    {\n        auto p = point.ToCGAL<K>();\n        auto r = ray.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, r));\n    }\n\n    static IntersectionResult2d Intersection(Point2d point, Segment2d segment)\n    {\n        auto p = point.ToCGAL<K>();\n        auto s = segment.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, s));\n    }\n\n    static IntersectionResult2d Intersection(Point2d point, Triangle2d triangle)\n    {\n        auto p = point.ToCGAL<K>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, t));\n    }\n\n    static IntersectionResult2d Intersection(Point2d point, Box2d box)\n    {\n        auto p = point.ToCGAL<K>();\n        auto b = box.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Line2d Intersection Functions           *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Line2d line, Point2d point)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(p, l));\n    }\n\n    static IntersectionResult2d Intersection(Line2d line, Line2d line2)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto l2 = line2.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPointOrLine(CGAL::intersection(l, l2));\n    }\n\n    static IntersectionResult2d Intersection(Line2d line, Ray2d ray)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPointOrRay(CGAL::intersection(l, r));\n \n    }\n\n    static IntersectionResult2d Intersection(Line2d line, Segment2d segment)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(l, s));\n    }\n\n    static IntersectionResult2d Intersection(Line2d line, Triangle2d triangle)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(l, t));\n    }\n\n    static IntersectionResult2d Intersection(Line2d line, Box2d box)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto b = box.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(l, b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2d Intersection Functions            * \n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Ray2d ray, Point2d point)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto p = point.ToCGAL<K>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(r, p));\n    }\n\n    static IntersectionResult2d Intersection(Ray2d ray, Line2d line)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPointOrRay(CGAL::intersection(r, l));\n    }\n\n    static IntersectionResult2d Intersection(Ray2d ray, Ray2d ray2)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto r2 = ray2.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPointSegmentOrRay(CGAL::intersection(r, r2));\n    }\n\n    static IntersectionResult2d Intersection(Ray2d ray, Segment2d segment)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(r, s));\n    }\n\n    static IntersectionResult2d Intersection(Ray2d ray, Triangle2d triangle)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(r, t));\n    }\n\n    static IntersectionResult2d Intersection(Ray2d ray, Box2d box)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();;\n        auto b = box.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(r, b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2d Intersection Functions        *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Segment2d segment, Point2d point)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto p = point.ToCGAL<K>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(s, p));\n    }\n\n    static IntersectionResult2d Intersection(Segment2d segment, Line2d line)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(s, l));\n    }\n\n    static IntersectionResult2d Intersection(Segment2d segment, Ray2d ray)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(s, r));\n    }\n\n    static IntersectionResult2d Intersection(Segment2d segment, Segment2d segment2)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto s2 = segment2.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(s, s2));\n    }\n\n    static IntersectionResult2d Intersection(Segment2d segment, Triangle2d triangle)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(s, t));\n    }\n\n    static IntersectionResult2d Intersection(Segment2d segment, Box2d box)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto b = box.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(s, b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2d Intersection Functions       *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Point2d point)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto p = point.ToCGAL<K>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(t, p));\n    }\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Line2d line)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(t, l));\n    }\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Ray2d ray)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(t, r));\n    }\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Segment2d segment)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(t, s));\n    }\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Triangle2d triangle2)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto t2 = triangle2.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(t, t2));\n    }\n\n    static IntersectionResult2d Intersection(Triangle2d triangle, Box2d box)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto b = box.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(t, b));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Box2d Intersection Functions            *\n    *                                                    *\n    ******************************************************/\n\n    static IntersectionResult2d Intersection(Box2d box, Point2d point)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto p = point.ToCGAL<K>();\n\n        return IntersectionResult<K>::ToPoint(CGAL::intersection(b, p));\n    }\n\n    static IntersectionResult2d Intersection(Box2d box, Line2d line)\n    {\n        auto b = box.ToCGAL<K, Box2>();;\n        auto l = line.ToCGAL<K, Line2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(b, l));\n    }\n\n    static IntersectionResult2d Intersection(Box2d box, Ray2d ray)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(b, r));\n    }\n\n    static IntersectionResult2d Intersection(Box2d box, Segment2d segment)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n\n        return IntersectionResult<K>::ToPointOrSegment(CGAL::intersection(b, s));\n    }\n\n    static IntersectionResult2d Intersection(Box2d box, Triangle2d triangle)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n\n        return IntersectionResult<K>::ToPointSegmentTriangleOrPolygon(CGAL::intersection(b, t));\n    }\n\n    static IntersectionResult2d Intersection(Box2d box, Box2d box2)\n    {\n        auto b = box.ToCGAL<K, Box2>();\n        auto b2 = box2.ToCGAL<K, Box2>();\n\n        return IntersectionResult<K>::ToBox(CGAL::intersection(b, b2));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Point2d SqrDistance Functions           *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance(Point2d point, Point2d point2)\n    {\n        auto p = point.ToCGAL<K>();\n        auto p2 = point2.ToCGAL<K>();\n        return CGAL::to_double(CGAL::squared_distance(p, p2));\n    }\n\n    static double SqrDistance(Point2d point, Line2d line)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(p, l));\n    }\n\n    static double SqrDistance(Point2d point, Ray2d ray)\n    {\n        auto p = point.ToCGAL<K>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::to_double(CGAL::squared_distance(p, r));\n    }\n\n    static double SqrDistance(Point2d point, Segment2d segment)\n    {\n        auto p = point.ToCGAL<K>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::to_double(CGAL::squared_distance(p, s));\n    }\n\n    static double SqrDistance(Point2d point, Triangle2d triangle)\n    {\n        auto p = point.ToCGAL<K>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::to_double(CGAL::squared_distance(p, t));\n    }\n\n\n    /*****************************************************\n    *                                                    *\n    *            Line2d SqrDistance Functions            *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance(Line2d line, Point2d point)\n    {\n        auto p = point.ToCGAL<K>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(p, l));\n    }\n\n    static double SqrDistance(Line2d line, Line2d line2)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto l2 = line2.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(l, l2));\n    }\n\n    static double SqrDistance(Line2d line, Ray2d ray)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::to_double(CGAL::squared_distance(l, r));\n    }\n\n    static double SqrDistance(Line2d line, Segment2d segment)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::to_double(CGAL::squared_distance(l, s));\n    }\n\n    static double SqrDistance(Line2d line, Triangle2d triangle)\n    {\n        auto l = line.ToCGAL<K, Line2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::to_double(CGAL::squared_distance(l, t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Ray2d SqrDistance Functions             *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance(Ray2d ray, Point2d point)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::to_double(CGAL::squared_distance(r, p));\n    }\n\n    static double SqrDistance(Ray2d ray, Line2d line)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(r, l));\n    }\n\n    static double SqrDistance(Ray2d ray, Ray2d ray2)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto r2 = ray2.ToCGAL<K, Ray2>();\n        return CGAL::to_double(CGAL::squared_distance(r, r2));\n    }\n\n    static double SqrDistance(Ray2d ray, Segment2d segment)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::to_double(CGAL::squared_distance(r, s));\n    }\n\n    static double SqrDistance(Ray2d ray, Triangle2d triangle)\n    {\n        auto r = ray.ToCGAL<K, Ray2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::to_double(CGAL::squared_distance(r, t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Segment2d SqrDistance Functions         *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance(Segment2d segment, Point2d point)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::to_double(CGAL::squared_distance(s, p));\n    }\n\n    static double SqrDistance(Segment2d segment, Line2d line)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(s, l));\n    }\n\n    static double SqrDistance(Segment2d segment, Ray2d ray)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::to_double(CGAL::squared_distance(s, r));\n    }\n\n    static double SqrDistance(Segment2d segment, Segment2d segment2)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto s2 = segment2.ToCGAL<K, Segment2>();\n        return CGAL::to_double(CGAL::squared_distance(s, s2));\n    }\n\n    static double SqrDistance(Segment2d segment, Triangle2d triangle)\n    {\n        auto s = segment.ToCGAL<K, Segment2>();\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        return CGAL::to_double(CGAL::squared_distance(s, t));\n    }\n\n    /*****************************************************\n    *                                                    *\n    *            Triangle2d SqrDistance Functions        *\n    *                                                    *\n    ******************************************************/\n\n    static double SqrDistance(Triangle2d triangle, Point2d point)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto p = point.ToCGAL<K>();\n        return CGAL::to_double(CGAL::squared_distance(t, p));\n    }\n\n    static double SqrDistance(Triangle2d triangle, Line2d line)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto l = line.ToCGAL<K, Line2>();\n        return CGAL::to_double(CGAL::squared_distance(t, l));\n    }\n\n    static double SqrDistance(Triangle2d triangle, Ray2d ray)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto r = ray.ToCGAL<K, Ray2>();\n        return CGAL::to_double(CGAL::squared_distance(t, r));\n    }\n\n    static double SqrDistance(Triangle2d triangle, Segment2d segment)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto s = segment.ToCGAL<K, Segment2>();\n        return CGAL::to_double(CGAL::squared_distance(t, s));\n    }\n\n    static double SqrDistance(Triangle2d triangle, Triangle2d triangle2)\n    {\n        auto t = triangle.ToCGAL<K, Triangle2>();\n        auto t2 = triangle2.ToCGAL<K, Triangle2>();\n        return CGAL::to_double(CGAL::squared_distance(t, t2));\n    }\n\n};\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_shapes_EIK.cpp",
    "content": "\n#include \"Intersections_shapes_EIK.h\"\n#include \"Intersections_shapes.h\"\n\n/*****************************************************\n*                                                    *\n*            Point2d DoIntersect Functions           *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_PointLine(Point2d point, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(point, line);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_PointRay(Point2d point, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(point, ray);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_PointSegment(Point2d point, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(point, segment);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_PointTriangle(Point2d point, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(point, triangle);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_PointBox(Point2d point, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2d DoIntersect Functions            *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LinePoint(Line2d line, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, point);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LineLine(Line2d line, Line2d line2)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, line2);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LineRay(Line2d line, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, ray);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LineSegment(Line2d line, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, segment);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LineTriangle(Line2d line, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, triangle);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_LineBox(Line2d line, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2d DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RayPoint(Ray2d ray, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, point);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RayLine(Ray2d ray, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, line);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RayRay(Ray2d ray, Ray2d ray2)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, ray2);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RaySegment(Ray2d ray, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, segment);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RayTriangle(Ray2d ray, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, triangle);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_RayBox(Ray2d ray, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2d DoIntersect Functions         *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentPoint(Segment2d segment, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, point);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentLine(Segment2d segment, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, line);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentRay(Segment2d segment, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, ray);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentSegment(Segment2d segment, Segment2d segment2)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, segment2);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentTriangle(Segment2d segment, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, triangle);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_SegmentBox(Segment2d segment, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2d DoIntersect Functions        *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TrianglePoint(Triangle2d triangle, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, point);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TriangleLine(Triangle2d triangle, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, line);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TriangleRay(Triangle2d triangle, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, ray);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TriangleSegment(Triangle2d triangle, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, segment);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, triangle2);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_TriangleBox(Triangle2d triangle, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2d DoIntersect Functions             *\n*                                                    *\n******************************************************/\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxPoint(Box2d box, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, point);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxLine(Box2d box, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, line);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxRay(Box2d box, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, ray);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxSegment(Box2d box, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, segment);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxTriangle(Box2d box, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, triangle);\n}\n\nBOOL Intersections_Shapes_EIK_DoIntersect_BoxBox(Box2d box, Box2d box2)\n{\n\treturn Intersections_Shapes<EIK>::DoIntersect(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2d Intersection Functions          *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_PointLine(Point2d point, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_PointRay(Point2d point, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, ray);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_PointSegment(Point2d point, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_PointTriangle(Point2d point, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, triangle);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_PointBox(Point2d point, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2d Intersection Functions           *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LinePoint(Line2d line, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(point, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LineLine(Line2d line, Line2d line2)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(line, line2);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LineRay(Line2d line, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(line, ray);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LineSegment(Line2d line, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(line, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LineTriangle(Line2d line, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(line, triangle);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_LineBox(Line2d line, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(line, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2d Intersection Functions            *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RayPoint(Ray2d ray, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, point);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RayLine(Ray2d ray, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RayRay(Ray2d ray, Ray2d ray2)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, ray2);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RaySegment(Ray2d ray, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RayTriangle(Ray2d ray, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, triangle);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_RayBox(Ray2d ray, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(ray, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2d Intersection Functions        *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentPoint(Segment2d segment, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, point);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentLine(Segment2d segment, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentRay(Segment2d segment, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, ray);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentSegment(Segment2d segment, Segment2d segment2)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentTriangle(Segment2d segment, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, triangle);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentBox(Segment2d segment, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(segment, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2d Intersection Functions       *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TrianglePoint(Triangle2d triangle, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, point);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleLine(Triangle2d triangle, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleRay(Triangle2d triangle, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, ray);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleSegment(Triangle2d triangle, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, triangle2);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleBox(Triangle2d triangle, Box2d box)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(triangle, box);\n}\n\n/*****************************************************\n*                                                    *\n*            Box2d Intersection Functions            *\n*                                                    *\n******************************************************/\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxPoint(Box2d box, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, point);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxLine(Box2d box, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, line);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxRay(Box2d box, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, ray);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxSegment(Box2d box, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, segment);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxTriangle(Box2d box, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, triangle);\n}\n\nIntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxBox(Box2d box, Box2d box2)\n{\n\treturn Intersections_Shapes<EIK>::Intersection(box, box2);\n}\n\n/*****************************************************\n*                                                    *\n*            Point2d SqrDistance Functions           *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Shapes_EIK_SqrDistance_PointPoint(Point2d point, Point2d point2)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(point, point2);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_PointLine(Point2d point, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(point, line);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_PointRay(Point2d point, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(point, ray);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_PointSegment(Point2d point, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(point, segment);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_PointTriangle(Point2d point, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(point, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Line2d SqrDistance Functions            *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Shapes_EIK_SqrDistance_LinePoint(Line2d line, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(line, point);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_LineLine(Line2d line, Line2d line2)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(line, line2);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_LineRay(Line2d line, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(line, ray);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_LineSegment(Line2d line, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(line, segment);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_LineTriangle(Line2d line, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(line, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Ray2d SqrDistance Functions             *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Shapes_EIK_SqrDistance_RayPoint(Ray2d ray, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(ray, point);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_RayLine(Ray2d ray, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(ray, line);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_RayRay(Ray2d ray, Ray2d ray2)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(ray, ray2);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_RaySegment(Ray2d ray, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(ray, segment);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_RayTriangle(Ray2d ray, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(ray, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Segment2d SqrDistance Functions         *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Shapes_EIK_SqrDistance_SegmentPoint(Segment2d segment, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(segment, point);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_SegmentLine(Segment2d segment, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(segment, line);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_SegmentRay(Segment2d segment, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(segment, ray);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_SegmentSegment(Segment2d segment, Segment2d segment2)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(segment, segment2);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_SegmentTriangle(Segment2d segment, Triangle2d triangle)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(segment, triangle);\n}\n\n/*****************************************************\n*                                                    *\n*            Triangle2d SqrDistance Functions        *\n*                                                    *\n******************************************************/\n\ndouble Intersections_Shapes_EIK_SqrDistance_TrianglePoint(Triangle2d triangle, Point2d point)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(triangle, point);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_TriangleLine(Triangle2d triangle, Line2d line)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(triangle, line);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_TriangleRay(Triangle2d triangle, Ray2d ray)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(triangle, ray);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_TriangleSegment(Triangle2d triangle, Segment2d segment)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(triangle, segment);\n}\n\ndouble Intersections_Shapes_EIK_SqrDistance_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2)\n{\n\treturn Intersections_Shapes<EIK>::SqrDistance(triangle, triangle2);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Intersections_shapes_EIK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"Geometry2.h\"\n#include \"Intersections_shapes.h\"\n\n#include <CGAL/Intersections.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\t/*****************************************************\n\t*                                                    *\n\t*            Point2d DoIntersect Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_PointLine(Point2d point, Line2d line);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_PointRay(Point2d point, Ray2d ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_PointSegment(Point2d point, Segment2d segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_PointTriangle(Point2d point, Triangle2d triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_PointBox(Point2d point, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Line2d DoIntersect Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LinePoint(Line2d line, Point2d point);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LineLine(Line2d line, Line2d line2);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LineRay(Line2d line, Ray2d ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LineSegment(Line2d line, Segment2d segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LineTriangle(Line2d line, Triangle2d triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_LineBox(Line2d line, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Ray2d DoIntersect Functions\t\t\t *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RayPoint(Ray2d ray, Point2d point);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RayLine(Ray2d ray, Line2d line);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RayRay(Ray2d ray, Ray2d ray2);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RaySegment(Ray2d ray, Segment2d segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_RayBox(Ray2d ray, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Segment2d DoIntersect Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentPoint(Segment2d segment, Point2d point);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentLine(Segment2d segment, Line2d line);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentRay(Segment2d segment, Ray2d ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_SegmentBox(Segment2d segment, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Triangle2d DoIntersect Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TrianglePoint(Triangle2d triangle, Point2d point);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TriangleLine(Triangle2d triangle, Line2d line);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_TriangleBox(Triangle2d triangle, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Box2d DoIntersect Functions\t\t     *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxPoint(Box2d box, Point2d point);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxLine(Box2d box, Line2d line);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxRay(Box2d box, Ray2d ray);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxSegment(Box2d box, Segment2d segment);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxTriangle(Box2d box, Triangle2d triangle);\n\n\tCGALWRAPPER_API BOOL Intersections_Shapes_EIK_DoIntersect_BoxBox(Box2d box, Box2d box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Point2d Intersection Functions          *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointLine(Point2d point, Line2d line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointRay(Point2d point, Ray2d ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointSegment(Point2d point, Segment2d segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointTriangle(Point2d point, Triangle2d triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_PointBox(Point2d point, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Line2d Intersection Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LinePoint(Line2d line, Point2d point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineLine(Line2d line, Line2d line2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineRay(Line2d line, Ray2d ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineSegment(Line2d line, Segment2d segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineTriangle(Line2d line, Triangle2d triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_LineBox(Line2d line, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Ray2d Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayPoint(Ray2d ray, Point2d point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayLine(Ray2d ray, Line2d line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayRay(Ray2d ray, Ray2d ray2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RaySegment(Ray2d ray, Segment2d segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_RayBox(Ray2d ray, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Segment2d Intersection Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentPoint(Segment2d segment, Point2d point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentLine(Segment2d segment, Line2d line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentRay(Segment2d segment, Ray2d ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_SegmentBox(Segment2d segment, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Triangle2d Intersection Functions       *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TrianglePoint(Triangle2d triangle, Point2d point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleLine(Triangle2d triangle, Line2d line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_TriangleBox(Triangle2d triangle, Box2d box);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Box2d Intersection Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxPoint(Box2d box, Point2d point);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxLine(Box2d box, Line2d line);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxRay(Box2d box, Ray2d ray);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxSegment(Box2d box, Segment2d segment);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxTriangle(Box2d box, Triangle2d triangle);\n\n\tCGALWRAPPER_API IntersectionResult2d Intersections_Shapes_EIK_Intersection_BoxBox(Box2d box, Box2d box2);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Point2d SqrDistance Functions           *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_PointPoint(Point2d point, Point2d point2);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_PointLine(Point2d point, Line2d line);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_PointRay(Point2d point, Ray2d ray);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_PointSegment(Point2d point, Segment2d segment);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_PointTriangle(Point2d point, Triangle2d triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Line2d SqrDistance Functions            *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_LinePoint(Line2d line, Point2d point);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_LineLine(Line2d line, Line2d line2);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_LineRay(Line2d line, Ray2d ray);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_LineSegment(Line2d line, Segment2d segment);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_LineTriangle(Line2d line, Triangle2d triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Ray2d SqrDistance Functions             *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_RayPoint(Ray2d ray, Point2d point);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_RayLine(Ray2d ray, Line2d line);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_RayRay(Ray2d ray, Ray2d ray2);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_RaySegment(Ray2d ray, Segment2d segment);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_RayTriangle(Ray2d ray, Triangle2d triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Segment2d SqrDistance Functions         *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_SegmentPoint(Segment2d segment, Point2d point);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_SegmentLine(Segment2d segment, Line2d line);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_SegmentRay(Segment2d segment, Ray2d ray);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_SegmentSegment(Segment2d segment, Segment2d segment2);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_SegmentTriangle(Segment2d segment, Triangle2d triangle);\n\n\t/*****************************************************\n\t*                                                    *\n\t*            Triangle2d SqrDistance Functions        *\n\t*                                                    *\n\t******************************************************/\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_TrianglePoint(Triangle2d triangle, Point2d point);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_TriangleLine(Triangle2d triangle, Line2d line);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_TriangleRay(Triangle2d triangle, Ray2d ray);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_TriangleSegment(Triangle2d triangle, Segment2d segment);\n\n\tCGALWRAPPER_API double Intersections_Shapes_EIK_SqrDistance_TriangleTriangle(Triangle2d triangle, Triangle2d triangle2);\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Line2_EEK.cpp",
    "content": "\n#include \"Line2_EEK.h\"\n#include <CGAL/Line_2.h>\n#include <CGAL/Aff_transformation_2.h>\n\ntypedef CGAL::Line_2<EEK> Line2;\ntypedef CGAL::Point_2<EEK> Point2;\ntypedef CGAL::Aff_transformation_2<EEK> Transformation2;\n\nPoint2* CastToPoint2(void* ptr);\n\nvoid* Line2_EEK_Create(double a, double b, double c)\n{\n\treturn new Line2(a, b, c);\n}\n\nvoid* Line2_EEK_CreateFromPoints(const Point2d& p1, const Point2d& p2)\n{\n\treturn new Line2(p1.ToCGAL<EEK>(), p2.ToCGAL<EEK>());\n}\n\nvoid* Line2_EEK_CreateFromPointVector(const Point2d& p, const Vector2d& v)\n{\n\treturn new Line2(p.ToCGAL<EEK>(), v.ToCGAL<EEK>());\n}\n\nvoid Line2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Line2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nLine2* NewLine2()\n{\n\treturn new Line2();\n}\n\nLine2* CastToLine2(void* ptr)\n{\n\treturn static_cast<Line2*>(ptr);\n}\n\ndouble Line2_EEK_GetA(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->a());\n}\n\ndouble Line2_EEK_GetB(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->b());\n}\n\ndouble Line2_EEK_GetC(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->c());\n}\n\nvoid Line2_EEK_SetA(void* ptr, double a)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(a, line->b(), line->c());\n}\n\nvoid Line2_EEK_SetB(void* ptr, double b)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(line->a(), b, line->c());\n}\n\nvoid Line2_EEK_SetC(void* ptr, double c)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(line->a(), line->b(), c);\n}\n\nBOOL Line2_EEK_IsDegenerate(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_degenerate();\n}\n\nBOOL Line2_EEK_IsHorizontal(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_horizontal();\n}\n\nBOOL Line2_EEK_IsVertical(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_vertical();\n}\n\nBOOL Line2_EEK_HasOn(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on(point.ToCGAL<EEK>());\n}\n\nBOOL Line2_EEK_HasOnNegativeSide(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on_negative_side(point.ToCGAL<EEK>());\n}\n\nBOOL Line2_EEK_HasOnPositiveSide(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on_positive_side(point.ToCGAL<EEK>());\n}\n\nvoid* Line2_EEK_Opposite(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\tauto nline = NewLine2();\n\t(*nline) = line->opposite();\n\treturn nline;\n}\n\nvoid* Line2_EEK_Perpendicular(void* ptr, const Point2d& point)\n{\n\tauto line = CastToLine2(ptr);\n\tauto nline = NewLine2();\n\t(*nline) = line->perpendicular(point.ToCGAL<EEK>());\n\treturn nline;\n}\n\ndouble Line2_EEK_X_On_Y(void* ptr, double y)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->x_at_y(y));\n}\n\ndouble Line2_EEK_Y_On_X(void* ptr, double x)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->y_at_x(x));\n}\n\nVector2d Line2_EEK_Vector(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\tauto v = line->to_vector();\n\treturn Vector2d::FromCGAL<EEK>(v);\n}\n\nvoid Line2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto line = CastToLine2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EEK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*line) = line->transform(T * R * S);\n}\n\nvoid* Line2_EEK_Copy(void* ptr)\n{\n\tauto l = CastToLine2(ptr);\n\tauto l2 = new Line2();\n\n\t(*l2) = *l;\n\treturn l2;\n}\n\nvoid* Line2_EEK_Convert(void* ptr)\n{\n\ttypedef CGAL::Cartesian_converter<EEK, EIK> Converter;\n\tConverter convert;\n\n\tauto l = CastToLine2(ptr);\n\tauto a = convert(l->a());\n\tauto b = convert(l->b());\n\tauto c = convert(l->c());\n\n\treturn new CGAL::Line_2<EIK>(a, b, c);\n}\n\n\ntemplate<class K2>\nstatic void* Convert(Line2* l)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto a = convert(l->a());\n\tauto b = convert(l->b());\n\tauto c = convert(l->c());\n\n\treturn new CGAL::Line_2<K2>(a, b, c);\n}\n\nvoid* Line2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto l = CastToLine2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(l);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(l);\n\n\tdefault:\n\t\treturn Convert<EEK>(l);\n\t}\n}"
  },
  {
    "path": "CGALWrapper/Geometry/Line2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Point2_EEK.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Line2_EEK_Create(double a, double b, double c);\n\n\tCGALWRAPPER_API void* Line2_EEK_CreateFromPoints(const Point2d& p1, const Point2d& p2);\n\n\tCGALWRAPPER_API void* Line2_EEK_CreateFromPointVector(const Point2d& p, const Vector2d& v);\n\n\tCGALWRAPPER_API void Line2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EEK_GetA(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EEK_GetB(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EEK_GetC(void* ptr);\n\n\tCGALWRAPPER_API void Line2_EEK_SetA(void* ptr, double a);\n\n\tCGALWRAPPER_API void Line2_EEK_SetB(void* ptr, double b);\n\n\tCGALWRAPPER_API void Line2_EEK_SetC(void* ptr, double c);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_HasOn(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_HasOnNegativeSide(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Line2_EEK_HasOnPositiveSide(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API void* Line2_EEK_Opposite(void* ptr);\n\n\tCGALWRAPPER_API void* Line2_EEK_Perpendicular(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Line2_EEK_X_On_Y(void* ptr, double y);\n\n\tCGALWRAPPER_API double Line2_EEK_Y_On_X(void* ptr, double x);\n\n\tCGALWRAPPER_API Vector2d Line2_EEK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void Line2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Line2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Line2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Line2_EIK.cpp",
    "content": "\n#include \"Line2_EIK.h\"\n#include <CGAL/Line_2.h>\n#include <CGAL/Aff_transformation_2.h>\n\ntypedef CGAL::Line_2<EIK> Line2;\ntypedef CGAL::Point_2<EIK> Point2;\ntypedef CGAL::Aff_transformation_2<EIK> Transformation2;\n\nPoint2* CastToPoint2(void* ptr);\n\nvoid* Line2_EIK_Create(double a, double b, double c)\n{\n\treturn new Line2(a, b, c);\n}\n\nvoid* Line2_EIK_CreateFromPoints(const Point2d& p1, const Point2d& p2)\n{\n\treturn new Line2(p1.ToCGAL<EIK>(), p2.ToCGAL<EIK>());\n}\n\nvoid* Line2_EIK_CreateFromPointVector(const Point2d& p, const Vector2d& v)\n{\n\treturn new Line2(p.ToCGAL<EIK>(), v.ToCGAL<EIK>());\n}\n\nvoid Line2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Line2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nLine2* NewLine2()\n{\n\treturn new Line2();\n}\n\nLine2* CastToLine2(void* ptr)\n{\n\treturn static_cast<Line2*>(ptr);\n}\n\ndouble Line2_EIK_GetA(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->a());\n}\n\ndouble Line2_EIK_GetB(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->b());\n}\n\ndouble Line2_EIK_GetC(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->c());\n}\n\nvoid Line2_EIK_SetA(void* ptr, double a)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(a, line->b(), line->c());\n}\n\nvoid Line2_EIK_SetB(void* ptr, double b)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(line->a(), b, line->c());\n}\n\nvoid Line2_EIK_SetC(void* ptr, double c)\n{\n\tauto line = CastToLine2(ptr);\n\t(*line) = Line2(line->a(), line->b(), c);\n}\n\nBOOL Line2_EIK_IsDegenerate(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_degenerate();\n}\n\nBOOL Line2_EIK_IsHorizontal(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_horizontal();\n}\n\nBOOL Line2_EIK_IsVertical(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\treturn line->is_vertical();\n}\n\nBOOL Line2_EIK_HasOn(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on(point.ToCGAL<EIK>());\n}\n\nBOOL Line2_EIK_HasOnNegativeSide(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on_negative_side(point.ToCGAL<EIK>());\n}\n\nBOOL Line2_EIK_HasOnPositiveSide(void* linePtr, const Point2d& point)\n{\n\tauto line = CastToLine2(linePtr);\n\treturn line->has_on_positive_side(point.ToCGAL<EIK>());\n}\n\nvoid* Line2_EIK_Opposite(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\tauto nline = NewLine2();\n\t(*nline) = line->opposite();\n\treturn nline;\n}\n\nvoid* Line2_EIK_Perpendicular(void* ptr, const Point2d& point)\n{\n\tauto line = CastToLine2(ptr);\n\tauto nline = NewLine2();\n\t(*nline) = line->perpendicular(point.ToCGAL<EIK>());\n\treturn nline;\n}\n\ndouble Line2_EIK_X_On_Y(void* ptr, double y)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->x_at_y(y));\n}\n\ndouble Line2_EIK_Y_On_X(void* ptr, double x)\n{\n\tauto line = CastToLine2(ptr);\n\treturn CGAL::to_double(line->y_at_x(x));\n}\n\nVector2d Line2_EIK_Vector(void* ptr)\n{\n\tauto line = CastToLine2(ptr);\n\tauto v = line->to_vector();\n\treturn Vector2d::FromCGAL<EIK>(v);\n}\n\nvoid Line2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto line = CastToLine2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EIK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*line) = line->transform(T * R * S);\n}\n\nvoid* Line2_EIK_Copy(void* ptr)\n{\n\tauto l = CastToLine2(ptr);\n\tauto l2 = new Line2();\n\n\t(*l2) = *l;\n\treturn l2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Line2* l)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto a = convert(l->a());\n\tauto b = convert(l->b());\n\tauto c = convert(l->c());\n\n\treturn new CGAL::Line_2<K2>(a, b, c);\n}\n\nvoid* Line2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto l = CastToLine2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(l);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(l);\n\n\tdefault:\n\t\treturn Convert<EIK>(l);\n\t}\n}"
  },
  {
    "path": "CGALWrapper/Geometry/Line2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Point2_EIK.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Line2_EIK_Create(double a, double b, double c);\n\n\tCGALWRAPPER_API void* Line2_EIK_CreateFromPoints(const Point2d& p1, const Point2d& p2);\n\n\tCGALWRAPPER_API void* Line2_EIK_CreateFromPointVector(const Point2d& p, const Vector2d& v);\n\n\tCGALWRAPPER_API void Line2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EIK_GetA(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EIK_GetB(void* ptr);\n\n\tCGALWRAPPER_API double Line2_EIK_GetC(void* ptr);\n\n\tCGALWRAPPER_API void Line2_EIK_SetA(void* ptr, double a);\n\n\tCGALWRAPPER_API void Line2_EIK_SetB(void* ptr, double b);\n\n\tCGALWRAPPER_API void Line2_EIK_SetC(void* ptr, double c);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_HasOn(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_HasOnNegativeSide(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API BOOL Line2_EIK_HasOnPositiveSide(void* linePtr, const Point2d& point);\n\n\tCGALWRAPPER_API void* Line2_EIK_Opposite(void* ptr);\n\n\tCGALWRAPPER_API void* Line2_EIK_Perpendicular(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Line2_EIK_X_On_Y(void* ptr, double y);\n\n\tCGALWRAPPER_API double Line2_EIK_Y_On_X(void* ptr, double x);\n\n\tCGALWRAPPER_API Vector2d Line2_EIK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void Line2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Line2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Line2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Matrices.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\n#include <CGAL/Aff_transformation_3.h>\n\n/*\n* Structs to pass data from C# and c++.\n* Must be c style layout.\n*\n* A standard-layout class is a class that:\n*\n* Has no non-static data members of type non-standard-layout class (or array of such types) or reference,\n* Has no virtual functions and no virtual base classes,\n* Has the same access control for all non-static data members,\n* Has no non-standard-layout base classes,\n* Either has no non-static data members in the most derived class and at most one base class with non-static data members,\n* or has no base classes with non-static data members, and\n* Has no base classes of the same type as the first non-static data member.\n*\n*/\n\nstruct Matrix4x4d\n{\n    double m00, m10, m20, m30;\n    double m01, m11, m21, m31;\n    double m02, m12, m22, m32;\n    double m03, m13, m23, m33;\n\n    template<class K>\n    CGAL::Aff_transformation_3<K> ToCGAL() const\n    {\n        return CGAL::Aff_transformation_3<K>(\n            m00, m01, m02, m03,\n            m10, m11, m12, m13,\n            m20, m21, m22, m23,\n            /*m30, m31, m32,*/ m33);\n    }\n\n};\n"
  },
  {
    "path": "CGALWrapper/Geometry/MinMax.h",
    "content": "#pragma once\n\nstruct MinMax\n{\n\tdouble min;\n\tdouble max;\n};\n\nstruct MinMaxAvg\n{\n\tdouble min;\n\tdouble max;\n\tdouble avg;\n};\n"
  },
  {
    "path": "CGALWrapper/Geometry/Point2_EEK.cpp",
    "content": "#include \"Point2_EEK.h\"\n#include <CGAL/Point_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Point_2<EEK> Point2;\n\nvoid* Point2_EEK_Create()\n{\n\treturn new Point2();\n}\n\nvoid* Point2_EEK_CreateFromPoint(const Point2d& point)\n{\n\tauto p = point.ToCGAL<EEK>();\n\treturn new Point2(p.x(), p.y());\n}\n\nvoid Point2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Point2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nPoint2* CastToPoint2(void* ptr)\n{\n\treturn static_cast<Point2*>(ptr);\n}\n\ndouble Point2_EEK_GetX(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\treturn CGAL::to_double(p->x());\n}\n\ndouble Point2_EEK_GetY(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\treturn CGAL::to_double(p->y());\n}\n\nvoid Point2_EEK_SetX(void* ptr, double x)\n{\n\tauto p = CastToPoint2(ptr);\n\t(*p) = Point2(x, p->y());\n}\n\nvoid Point2_EEK_SetY(void* ptr, double y)\n{\n\tauto p = CastToPoint2(ptr);\n\t(*p) = Point2(p->x(), y);\n}\n\nvoid* Point2_EEK_Copy(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\tauto p2 = new Point2();\n\n\t(*p2) = *p;\n\treturn p2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Point2* p)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto x = convert((*p)[0]);\n\tauto y = convert((*p)[1]);\n\n\treturn new CGAL::Point_2<K2>(x, y);\n}\n\nvoid* Point2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToPoint2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EEK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Point2_EEK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Point2_EEK_Create();\n\n\tCGALWRAPPER_API void* Point2_EEK_CreateFromPoint(const Point2d& point);\n\n\tCGALWRAPPER_API void Point2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Point2_EEK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double Point2_EEK_GetY(void* ptr);\n\n\tCGALWRAPPER_API void Point2_EEK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void Point2_EEK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API void* Point2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Point2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Point2_EIK.cpp",
    "content": "#include \"Point2_EIK.h\"\n#include <CGAL/Point_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Point_2<EIK> Point2;\n\nvoid* Point2_EIK_Create()\n{\n\treturn new Point2();\n}\n\nvoid* Point2_EIK_CreateFromPoint(const Point2d& point)\n{\n\tauto p = point.ToCGAL<EIK>();\n\treturn new Point2(p.x(), p.y());\n}\n\nvoid Point2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Point2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nPoint2* CastToPoint2(void* ptr)\n{\n\treturn static_cast<Point2*>(ptr);\n}\n\ndouble Point2_EIK_GetX(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\treturn CGAL::to_double(p->x());\n}\n\ndouble Point2_EIK_GetY(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\treturn CGAL::to_double(p->y());\n}\n\nvoid Point2_EIK_SetX(void* ptr, double x)\n{\n\tauto p = CastToPoint2(ptr);\n\t(*p) = Point2(x, p->y());\n}\n\nvoid Point2_EIK_SetY(void* ptr, double y)\n{\n\tauto p = CastToPoint2(ptr);\n\t(*p) = Point2(p->x(), y);\n}\n\nvoid* Point2_EIK_Copy(void* ptr)\n{\n\tauto p = CastToPoint2(ptr);\n\tauto p2 = new Point2();\n\n\t(*p2) = *p;\n\treturn p2;\n}\n\nvoid* Point2_EIK_Convert(void* ptr)\n{\n\ttypedef CGAL::Cartesian_converter<EEK, EIK> Converter;\n\tConverter convert;\n\n\tauto p = CastToPoint2(ptr);\n\tauto x = convert(p->x());\n\tauto y = convert(p->y());\n\n\treturn new CGAL::Point_2<EIK>(x, y);\n}\n\ntemplate<class K2>\nstatic void* Convert(Point2* p)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto x = convert((*p)[0]);\n\tauto y = convert((*p)[1]);\n\n\treturn new CGAL::Point_2<K2>(x, y);\n}\n\nvoid* Point2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToPoint2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EIK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Point2_EIK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Point2_EIK_Create();\n\n\tCGALWRAPPER_API void* Point2_EIK_CreateFromPoint(const Point2d& point);\n\n\tCGALWRAPPER_API void Point2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Point2_EIK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double Point2_EIK_GetY(void* ptr);\n\n\tCGALWRAPPER_API void Point2_EIK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void Point2_EIK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API void* Point2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Point2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Ray2_EEK.cpp",
    "content": "\n#include \"Ray2_EEK.h\"\n#include <CGAL/Ray_2.h>\n#include <CGAL/Aff_transformation_2.h>\n\ntypedef CGAL::Ray_2<EEK> Ray2;\ntypedef CGAL::Line_2<EEK> Line2;\ntypedef CGAL::Point_2<EEK> Point2;\ntypedef CGAL::Aff_transformation_2<EEK> Transformation2;\n\nvoid* Ray2_EEK_Create(const Point2d& position, const Vector2d& direction)\n{\n\tauto p = position.ToCGAL<EEK>();\n\tauto d = direction.ToCGAL<EEK>();\n\n\treturn new Ray2(p, d);\n}\n\nvoid Ray2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Ray2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nRay2* CastToRay2(void* ptr)\n{\n\treturn static_cast<Ray2*>(ptr);\n}\n\nRay2* NewRay2()\n{\n\treturn new Ray2();\n}\n\nBOOL Ray2_EEK_IsDegenerate(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_degenerate();\n}\n\nBOOL Ray2_EEK_IsHorizontal(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_horizontal();\n}\n\nBOOL Ray2_EEK_IsVertical(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_vertical();\n}\n\nBOOL Ray2_EEK_HasOn(void* rayPtr, const Point2d& point)\n{\n\tauto ray = CastToRay2(rayPtr);\n\treturn ray->has_on(point.ToCGAL<EEK>());\n}\n\nPoint2d Ray2_EEK_Source(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto p = ray->source();\n\treturn Point2d::FromCGAL<EEK>(p);\n}\n\nVector2d Ray2_EEK_Vector(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto v = ray->to_vector();\n\treturn Vector2d::FromCGAL<EEK>(v);\n}\n\nvoid* Ray2_EEK_Opposite(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto nray = NewRay2();\n\t(*nray) = ray->opposite();\n\treturn nray;\n}\n\nvoid* Ray2_EEK_Line(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto line = new Line2();\n\t(*line) = ray->supporting_line();\n\treturn line;\n}\n\nvoid Ray2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto ray = CastToRay2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EEK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*ray) = ray->transform(T * R * S);\n}\n\nvoid* Ray2_EEK_Copy(void* ptr)\n{\n\tauto r = CastToRay2(ptr);\n\tauto r2 = new Ray2();\n\n\t(*r2) = *r;\n\treturn r2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Ray2* r)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto p = convert(r->source());\n\tauto d = convert(r->direction());\n\n\treturn new CGAL::Ray_2<K2>(p, d);\n}\n\nvoid* Ray2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto r = CastToRay2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(r);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(r);\n\n\tdefault:\n\t\treturn Convert<EEK>(r);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Ray2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Ray2_EEK_Create(const Point2d& position, const Vector2d& direction);\n\n\tCGALWRAPPER_API void Ray2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EEK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EEK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EEK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EEK_HasOn(void* rayPtr, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Ray2_EEK_Source(void* ptr);\n\n\tCGALWRAPPER_API Vector2d Ray2_EEK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void* Ray2_EEK_Opposite(void* ptr);\n\n\tCGALWRAPPER_API void* Ray2_EEK_Line(void* ptr);\n\n\tCGALWRAPPER_API void Ray2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Ray2_EEK_Copy(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Ray2_EIK.cpp",
    "content": "\n#include \"Ray2_EIK.h\"\n#include <CGAL/Ray_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Ray_2<EIK> Ray2;\ntypedef CGAL::Line_2<EIK> Line2;\ntypedef CGAL::Point_2<EIK> Point2;\ntypedef CGAL::Aff_transformation_2<EIK> Transformation2;\n\nvoid* Ray2_EIK_Create(const Point2d& position, const Vector2d& direction)\n{\n\tauto p = position.ToCGAL<EIK>();\n\tauto d = direction.ToCGAL<EIK>();\n\n\treturn new Ray2(p, d);\n}\n\nvoid Ray2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Ray2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nRay2* CastToRay2(void* ptr)\n{\n\treturn static_cast<Ray2*>(ptr);\n}\n\nRay2* NewRay2()\n{\n\treturn new Ray2();\n}\n\nBOOL Ray2_EIK_IsDegenerate(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_degenerate();\n}\n\nBOOL Ray2_EIK_IsHorizontal(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_horizontal();\n}\n\nBOOL Ray2_EIK_IsVertical(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\treturn ray->is_vertical();\n}\n\nBOOL Ray2_EIK_HasOn(void* rayPtr, const Point2d& point)\n{\n\tauto ray = CastToRay2(rayPtr);\n\treturn ray->has_on(point.ToCGAL<EIK>());\n}\n\nPoint2d Ray2_EIK_Source(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto p = ray->source();\n\treturn Point2d::FromCGAL<EIK>(p);\n}\n\nVector2d Ray2_EIK_Vector(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto v = ray->to_vector();\n\treturn Vector2d::FromCGAL<EIK>(v);\n}\n\nvoid* Ray2_EIK_Opposite(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto nray = NewRay2();\n\t(*nray) = ray->opposite();\n\treturn nray;\n}\n\nvoid* Ray2_EIK_Line(void* ptr)\n{\n\tauto ray = CastToRay2(ptr);\n\tauto line = new Line2();\n\t(*line) = ray->supporting_line();\n\treturn line;\n}\n\nvoid Ray2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto ray = CastToRay2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EIK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*ray) = ray->transform(T * R * S);\n}\n\ntemplate<class K2>\nstatic void* Convert(Ray2* r)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto p = convert(r->source());\n\tauto d = convert(r->direction());\n\n\treturn new CGAL::Ray_2<K2>(p, d);\n}\n\nvoid* Ray2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto r = CastToRay2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(r);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(r);\n\n\tdefault:\n\t\treturn Convert<EIK>(r);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Ray2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Ray2_EIK_Create(const Point2d& position, const Vector2d& direction);\n\n\tCGALWRAPPER_API void Ray2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EIK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EIK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EIK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Ray2_EIK_HasOn(void* rayPtr, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Ray2_EIK_Source(void* ptr);\n\n\tCGALWRAPPER_API Vector2d Ray2_EIK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void* Ray2_EIK_Opposite(void* ptr);\n\n\tCGALWRAPPER_API void* Ray2_EIK_Line(void* ptr);\n\n\tCGALWRAPPER_API void Ray2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Ray2_EIK_Copy(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Segment2_EEK.cpp",
    "content": "\n#include \"Segment2_EEK.h\"\n#include <CGAL/Segment_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Segment_2<EEK> Segment2;\ntypedef CGAL::Line_2<EEK> Line2;\ntypedef CGAL::Point_2<EEK> Point2;\ntypedef CGAL::Aff_transformation_2<EEK> Transformation2;\n\nvoid* Segment2_EEK_Create(const Point2d& a, const Point2d& b)\n{\n\tauto A = a.ToCGAL<EEK>();\n\tauto B = b.ToCGAL<EEK>();\n\n\treturn new Segment2(A, B);\n}\n\nvoid Segment2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Segment2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nSegment2* CastToSegment2(void* ptr)\n{\n\treturn static_cast<Segment2*>(ptr);\n}\n\nSegment2* NewSegment2()\n{\n\treturn new Segment2();\n}\n\nPoint2d Segment2_EEK_GetVertex(void* ptr, int i)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EEK>(seg->vertex(i));\n}\n\nvoid Segment2_EEK_SetVertex(void* ptr, int i, const Point2d& point)\n{\n\tif (i < 0 || i >= 2) return;\n\n\tauto seg = CastToSegment2(ptr);\n\t(*seg)[i] = point.ToCGAL<EEK>();\n}\n\nPoint2d Segment2_EEK_Min(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EEK>(seg->min());\n}\n\nPoint2d Segment2_EEK_Max(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EEK>(seg->max());\n}\n\nBOOL Segment2_EEK_IsDegenerate(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_degenerate();\n}\n\nBOOL Segment2_EEK_IsHorizontal(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_horizontal();\n}\n\nBOOL Segment2_EEK_IsVertical(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_vertical();\n}\n\nBOOL Segment2_EEK_HasOn(void* segPtr, const Point2d& point)\n{\n\tauto seg = CastToSegment2(segPtr);\n\treturn seg->has_on(point.ToCGAL<EEK>());\n}\n\nVector2d Segment2_EEK_Vector(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\tauto v = seg->to_vector();\n\treturn Vector2d::FromCGAL<EEK>(v);\n}\n\nvoid* Segment2_EEK_Line(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\tauto line = new Line2();\n\t(*line) = seg->supporting_line();\n\treturn line;\n}\n\ndouble Segment2_EEK_SqrLength(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn CGAL::to_double(seg->squared_length());\n}\n\nvoid Segment2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto seg = CastToSegment2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EEK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*seg) = seg->transform(T * R * S);\n}\n\nvoid* Segment2_EEK_Copy(void* ptr)\n{\n\tauto s = CastToSegment2(ptr);\n\tauto s2 = new Segment2();\n\n\t(*s2) = *s;\n\treturn s2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Segment2* s)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto a = convert(s->source());\n\tauto b = convert(s->target());\n\n\treturn new CGAL::Segment_2<K2>(a, b);\n}\n\nvoid* Segment2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto s = CastToSegment2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(s);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(s);\n\n\tdefault:\n\t\treturn Convert<EEK>(s);\n\t}\n}"
  },
  {
    "path": "CGALWrapper/Geometry/Segment2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Segment2_EEK_Create(const Point2d& a, const Point2d& b);\n\n\tCGALWRAPPER_API void Segment2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API Point2d Segment2_EEK_GetVertex(void* ptr, int i);\n\n\tCGALWRAPPER_API void Segment2_EEK_SetVertex(void* ptr, int i, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Segment2_EEK_Min(void* ptr);\n\n\tCGALWRAPPER_API Point2d Segment2_EEK_Max(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EEK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EEK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EEK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EEK_HasOn(void* segPtr, const Point2d& point);\n\n\tCGALWRAPPER_API Vector2d Segment2_EEK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void* Segment2_EEK_Line(void* ptr);\n\n\tCGALWRAPPER_API double Segment2_EEK_SqrLength(void* ptr);\n\n\tCGALWRAPPER_API void Segment2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Segment2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Segment2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Segment2_EIK.cpp",
    "content": "\n#include \"Segment2_EIK.h\"\n#include <CGAL/Segment_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Segment_2<EIK> Segment2;\ntypedef CGAL::Line_2<EIK> Line2;\ntypedef CGAL::Point_2<EIK> Point2;\ntypedef CGAL::Aff_transformation_2<EIK> Transformation2;\n\nvoid* Segment2_EIK_Create(const Point2d& a, const Point2d& b)\n{\n\tauto A = a.ToCGAL<EIK>();\n\tauto B = b.ToCGAL<EIK>();\n\n\treturn new Segment2(A, B);\n}\n\nvoid Segment2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Segment2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nSegment2* CastToSegment2(void* ptr)\n{\n\treturn static_cast<Segment2*>(ptr);\n}\n\nSegment2* NewSegment2()\n{\n\treturn new Segment2();\n}\n\nPoint2d Segment2_EIK_GetVertex(void* ptr, int i)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EIK>(seg->vertex(i));\n}\n\nvoid Segment2_EIK_SetVertex(void* ptr, int i, const Point2d& point)\n{\n\tauto seg = CastToSegment2(ptr);\n\n\tif (i == 0)\n\t{\n\t\tauto p = point.ToCGAL<EIK>();\n\t\t(*seg) = Segment2(p, seg->target());\n\t}\n\telse\n\t{\n\t\tauto p = point.ToCGAL<EIK>();\n\t\t(*seg) = Segment2(seg->source(), p);\n\t}\n\t\n}\n\nPoint2d Segment2_EIK_Min(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EIK>(seg->min());\n}\n\nPoint2d Segment2_EIK_Max(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn Point2d::FromCGAL<EIK>(seg->max());\n}\n\nBOOL Segment2_EIK_IsDegenerate(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_degenerate();\n}\n\nBOOL Segment2_EIK_IsHorizontal(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_horizontal();\n}\n\nBOOL Segment2_EIK_IsVertical(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn seg->is_vertical();\n}\n\nBOOL Segment2_EIK_HasOn(void* segPtr, const Point2d& point)\n{\n\tauto seg = CastToSegment2(segPtr);\n\treturn seg->has_on(point.ToCGAL<EIK>());\n}\n\nVector2d Segment2_EIK_Vector(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\tauto v = seg->to_vector();\n\treturn Vector2d::FromCGAL<EIK>(v);\n}\n\nvoid* Segment2_EIK_Line(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\tauto line = new Line2();\n\t(*line) = seg->supporting_line();\n\treturn line;\n}\n\ndouble Segment2_EIK_SqrLength(void* ptr)\n{\n\tauto seg = CastToSegment2(ptr);\n\treturn CGAL::to_double(seg->squared_length());\n}\n\nvoid Segment2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto seg = CastToSegment2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EIK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*seg) = seg->transform(T * R * S);\n}\n\nvoid* Segment2_EIK_Copy(void* ptr)\n{\n\tauto s = CastToSegment2(ptr);\n\tauto s2 = new Segment2();\n\n\t(*s2) = *s;\n\treturn s2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Segment2* s)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto a = convert(s->source());\n\tauto b = convert(s->target());\n\n\treturn new CGAL::Segment_2<K2>(a, b);\n}\n\nvoid* Segment2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto s = CastToSegment2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(s);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(s);\n\n\tdefault:\n\t\treturn Convert<EIK>(s);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Segment2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Segment2_EIK_Create(const Point2d& a, const Point2d& b);\n\n\tCGALWRAPPER_API void Segment2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API Point2d Segment2_EIK_GetVertex(void* ptr, int i);\n\n\tCGALWRAPPER_API void Segment2_EIK_SetVertex(void* ptr, int i, const Point2d& point);\n\n\tCGALWRAPPER_API Point2d Segment2_EIK_Min(void* ptr);\n\n\tCGALWRAPPER_API Point2d Segment2_EIK_Max(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EIK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EIK_IsHorizontal(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EIK_IsVertical(void* ptr);\n\n\tCGALWRAPPER_API BOOL Segment2_EIK_HasOn(void* segPtr, const Point2d& point);\n\n\tCGALWRAPPER_API Vector2d Segment2_EIK_Vector(void* ptr);\n\n\tCGALWRAPPER_API void* Segment2_EIK_Line(void* ptr);\n\n\tCGALWRAPPER_API double Segment2_EIK_SqrLength(void* ptr);\n\n\tCGALWRAPPER_API void Segment2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Segment2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Segment2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Triangle2_EEK.cpp",
    "content": "\n#include \"Triangle2_EEK.h\"\n#include <CGAL/Triangle_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Triangle_2<EEK> Triangle2;\ntypedef CGAL::Point_2<EEK> Point2;\ntypedef CGAL::Aff_transformation_2<EEK> Transformation2;\n\nvoid* Triangle2_EEK_Create(const Point2d& a, const Point2d& b, const Point2d& c)\n{\n\tauto A = a.ToCGAL<EEK>();\n\tauto B = b.ToCGAL<EEK>();\n\tauto C = c.ToCGAL<EEK>();\n\n\treturn new Triangle2(A, B, C);\n}\n\nvoid Triangle2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Triangle2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nTriangle2* CastToTriangle2(void* ptr)\n{\n\treturn static_cast<Triangle2*>(ptr);\n}\n\nTriangle2* NewTriangle2()\n{\n\treturn new Triangle2();\n}\n\nPoint2d Triangle2_EEK_GetVertex(void* ptr, int i)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn Point2d::FromCGAL<EEK>(tri->vertex(i));\n}\n\nvoid Triangle2_EEK_SetVertex(void* ptr, int i, const Point2d& point)\n{\n\tif (i < 0 || i >= 3) return;\n\n\tauto tri = CastToTriangle2(ptr);\n\t(*tri)[i] = point.ToCGAL<EEK>();\n}\n\ndouble Triangle2_EEK_Area(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn CGAL::to_double(tri->area());\n}\n\nCGAL::Bounded_side Triangle2_EEK_BoundedSide(void* ptr, const Point2d& point)\n{\n\tauto tri = CastToTriangle2(ptr);\n\tauto p = point.ToCGAL<EEK>();\n\treturn tri->bounded_side(p);\n}\n\nCGAL::Sign Triangle2_EEK_OrientedSide(void* ptr, const Point2d& point)\n{\n\tauto tri = CastToTriangle2(ptr);\n\tauto p = point.ToCGAL<EEK>();\n\treturn tri->oriented_side(p);\n}\n\nCGAL::Sign Triangle2_EEK_Orientation(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn tri->orientation();\n}\n\nBOOL Triangle2_EEK_IsDegenerate(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn tri->is_degenerate();\n}\n\nvoid Triangle2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto tri = CastToTriangle2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EEK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*tri) = tri->transform(T * R * S);\n}\n\nvoid* Triangle2_EEK_Copy(void* ptr)\n{\n\tauto t = CastToTriangle2(ptr);\n\tauto t2 = new Triangle2();\n\n\t(*t2) = *t;\n\treturn t2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Triangle2* t)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto a = convert(t->vertex(0));\n\tauto b = convert(t->vertex(1));\n\tauto c = convert(t->vertex(2));\n\n\treturn new CGAL::Triangle_2<K2>(a, b, c);\n}\n\nvoid* Triangle2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto t = CastToTriangle2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(t);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(t);\n\n\tdefault:\n\t\treturn Convert<EEK>(t);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Triangle2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Triangle2_EEK_Create(const Point2d& a, const Point2d& b, const Point2d& c);\n\n\tCGALWRAPPER_API void Triangle2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API Point2d Triangle2_EEK_GetVertex(void* ptr, int i);\n\n\tCGALWRAPPER_API void Triangle2_EEK_SetVertex(void* ptr, int i, const Point2d& point);\n\n\tCGALWRAPPER_API double Triangle2_EEK_Area(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Triangle2_EEK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Sign Triangle2_EEK_OrientedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Sign Triangle2_EEK_Orientation(void* ptr);\n\n\tCGALWRAPPER_API BOOL Triangle2_EEK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API void Triangle2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Triangle2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Triangle2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Triangle2_EIK.cpp",
    "content": "\n#include \"Triangle2_EIK.h\"\n#include <CGAL/Triangle_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef CGAL::Triangle_2<EIK> Triangle2;\ntypedef CGAL::Point_2<EIK> Point2;\ntypedef CGAL::Aff_transformation_2<EIK> Transformation2;\n\nvoid* Triangle2_EIK_Create(const Point2d& a, const Point2d& b, const Point2d& c)\n{\n\tauto A = a.ToCGAL<EIK>();\n\tauto B = b.ToCGAL<EIK>();\n\tauto C = c.ToCGAL<EIK>();\n\n\treturn new Triangle2(A, B, C);\n}\n\nvoid Triangle2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Triangle2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nTriangle2* CastToTriangle2(void* ptr)\n{\n\treturn static_cast<Triangle2*>(ptr);\n}\n\nTriangle2* NewTriangle2()\n{\n\treturn new Triangle2();\n}\n\nPoint2d Triangle2_EIK_GetVertex(void* ptr, int i)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn Point2d::FromCGAL<EIK>(tri->vertex(i));\n}\n\nvoid Triangle2_EIK_SetVertex(void* ptr, int i, const Point2d& point)\n{\n\n\tauto tri = CastToTriangle2(ptr);\n\t\n\tif (i == 0)\n\t{\n\t\tauto p = point.ToCGAL<EIK>();\n\t\t(*tri) = Triangle2(p, tri->vertex(1), tri->vertex(2));\n\t}\n\telse if(i == 1)\n\t{\n\t\tauto p = point.ToCGAL<EIK>();\n\t\t(*tri) = Triangle2(tri->vertex(0), p, tri->vertex(2));\n\t}\n\telse\n\t{\n\t\tauto p = point.ToCGAL<EIK>();\n\t\t(*tri) = Triangle2(tri->vertex(0), tri->vertex(1), p);\n\t}\n}\n\ndouble Triangle2_EIK_Area(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn CGAL::to_double(tri->area());\n}\n\nCGAL::Bounded_side Triangle2_EIK_BoundedSide(void* ptr, const Point2d& point)\n{\n\tauto tri = CastToTriangle2(ptr);\n\tauto p = point.ToCGAL<EIK>();\n\treturn tri->bounded_side(p);\n}\n\nCGAL::Sign Triangle2_EIK_OrientedSide(void* ptr, const Point2d& point)\n{\n\tauto tri = CastToTriangle2(ptr);\n\tauto p = point.ToCGAL<EIK>();\n\treturn tri->oriented_side(p);\n}\n\nCGAL::Sign Triangle2_EIK_Orientation(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn tri->orientation();\n}\n\nBOOL Triangle2_EIK_IsDegenerate(void* ptr)\n{\n\tauto tri = CastToTriangle2(ptr);\n\treturn tri->is_degenerate();\n}\n\nvoid Triangle2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tauto tri = CastToTriangle2(ptr);\n\n\tTransformation2 T(CGAL::TRANSLATION, translation.ToVector<EIK>());\n\tTransformation2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\tTransformation2 S(CGAL::SCALING, scale);\n\n\t(*tri) = tri->transform(T * R * S);\n}\n\nvoid* Triangle2_EIK_Copy(void* ptr)\n{\n\tauto t = CastToTriangle2(ptr);\n\tauto t2 = new Triangle2();\n\n\t(*t2) = *t;\n\treturn t2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Triangle2* t)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto a = convert(t->vertex(0));\n\tauto b = convert(t->vertex(1));\n\tauto c = convert(t->vertex(2));\n\n\treturn new CGAL::Triangle_2<K2>(a, b, c);\n}\n\nvoid* Triangle2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto t = CastToTriangle2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(t);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(t);\n\n\tdefault:\n\t\treturn Convert<EIK>(t);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Triangle2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Triangle2_EIK_Create(const Point2d& a, const Point2d& b, const Point2d& c);\n\n\tCGALWRAPPER_API void Triangle2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API Point2d Triangle2_EIK_GetVertex(void* ptr, int i);\n\n\tCGALWRAPPER_API void Triangle2_EIK_SetVertex(void* ptr, int i, const Point2d& point);\n\n\tCGALWRAPPER_API double Triangle2_EIK_Area(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Triangle2_EIK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Sign Triangle2_EIK_OrientedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Sign Triangle2_EIK_Orientation(void* ptr);\n\n\tCGALWRAPPER_API BOOL Triangle2_EIK_IsDegenerate(void* ptr);\n\n\tCGALWRAPPER_API void Triangle2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void* Triangle2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Triangle2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Vector2_EEK.cpp",
    "content": "#include \"Vector2_EEK.h\"\n#include <CGAL/Vector_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef EEK::FT FT;\ntypedef CGAL::Vector_2<EEK> Vector2;\n\nvoid* Vector2_EEK_Create()\n{\n\treturn new Vector2();\n}\n\nvoid* Vector2_EEK_CreateFromVector(const Vector2d& point)\n{\n\tauto p = point.ToCGAL<EEK>();\n\treturn new Vector2(p.x(), p.y());\n}\n\nvoid Vector2_EEK_Release(void* ptr)\n{\n\tauto obj = static_cast<Vector2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nVector2* CastToVector2(void* ptr)\n{\n\treturn static_cast<Vector2*>(ptr);\n}\n\ndouble Vector2_EEK_GetX(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->x());\n}\n\ndouble Vector2_EEK_GetY(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->y());\n}\n\nvoid Vector2_EEK_SetX(void* ptr, double x)\n{\n\tauto p = CastToVector2(ptr);\n\t(*p) = Vector2(x, p->y());\n}\n\nvoid Vector2_EEK_SetY(void* ptr, double y)\n{\n\tauto p = CastToVector2(ptr);\n\t(*p) = Vector2(p->x(), y);\n}\n\ndouble Vector2_EEK_SqrLength(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->squared_length());\n}\n\nvoid* Vector2_EEK_Perpendicular(void* ptr, CGAL::Orientation orientation)\n{\n\tauto p = CastToVector2(ptr);\n\tauto v = new Vector2();\n\t(*v) = p->perpendicular(orientation);\n\treturn v;\n}\n\nvoid Vector2_EEK_Normalize(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\tauto sq_len = CGAL::to_double(p->squared_length());\n\n\tif (sq_len == 0) return;\n\n\tauto len = CGAL::sqrt(sq_len);\n\t(*p) = Vector2(p->x() / len, p->y() / len);\n}\n\ndouble Vector2_EEK_Magnitude(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\tauto sq_len = CGAL::to_double(p->squared_length());\n\n\tif (sq_len == 0) return 0;\n\treturn CGAL::sqrt(sq_len);\n}\n\nvoid* Vector2_EEK_Copy(void* ptr)\n{\n\tauto v = CastToVector2(ptr);\n\tauto v2 = new Vector2();\n\n\t(*v2) = *v;\n\treturn v2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Vector2* v)\n{\n\tCGAL::Cartesian_converter<EEK, K2> convert;\n\n\tauto x = convert((*v)[0]);\n\tauto y = convert((*v)[1]);\n\n\treturn new CGAL::Vector_2<K2>(x, y);\n}\n\nvoid* Vector2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToVector2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EEK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Vector2_EEK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Vector2_EEK_Create();\n\n\tCGALWRAPPER_API void* Vector2_EEK_CreateFromVector(const Vector2d& vector);\n\n\tCGALWRAPPER_API void Vector2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EEK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EEK_GetY(void* ptr);\n\n\tCGALWRAPPER_API void Vector2_EEK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void Vector2_EEK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API double Vector2_EEK_SqrLength(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EEK_Perpendicular(void* ptr, CGAL::Orientation orientation);\n\n\tCGALWRAPPER_API void Vector2_EEK_Normalize(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EEK_Magnitude(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Geometry/Vector2_EIK.cpp",
    "content": "#include \"Vector2_EIK.h\"\n#include <CGAL/Vector_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntypedef EIK::FT FT;\ntypedef CGAL::Vector_2<EIK> Vector2;\n\nvoid* Vector2_EIK_Create()\n{\n\treturn new Vector2();\n}\n\nvoid* Vector2_EIK_CreateFromVector(const Vector2d& point)\n{\n\tauto p = point.ToCGAL<EIK>();\n\treturn new Vector2(p.x(), p.y());\n}\n\nvoid Vector2_EIK_Release(void* ptr)\n{\n\tauto obj = static_cast<Vector2*>(ptr);\n\tif (obj != nullptr)\n\t{\n\t\tdelete obj;\n\t\tobj = nullptr;\n\t}\n}\n\nVector2* CastToVector2(void* ptr)\n{\n\treturn static_cast<Vector2*>(ptr);\n}\n\ndouble Vector2_EIK_GetX(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->x());\n}\n\ndouble Vector2_EIK_GetY(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->y());\n}\n\nvoid Vector2_EIK_SetX(void* ptr, double x)\n{\n\tauto p = CastToVector2(ptr);\n\t(*p) = Vector2(x, p->y());\n}\n\nvoid Vector2_EIK_SetY(void* ptr, double y)\n{\n\tauto p = CastToVector2(ptr);\n\t(*p) = Vector2(p->x(), y);\n}\n\ndouble Vector2_EIK_SqrLength(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\treturn CGAL::to_double(p->squared_length());\n}\n\nvoid* Vector2_EIK_Perpendicular(void* ptr, CGAL::Orientation orientation)\n{\n\tauto p = CastToVector2(ptr);\n\tauto v = new Vector2();\n\t(*v) = p->perpendicular(orientation);\n\treturn v;\n}\n\nvoid Vector2_EIK_Normalize(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\tauto sq_len = CGAL::to_double(p->squared_length());\n\n\tif (sq_len == 0) return;\n\n\tauto len = CGAL::sqrt(sq_len);\n\n\t(*p) = Vector2(p->x() / len, p->y() / len);\n}\n\ndouble Vector2_EIK_Magnitude(void* ptr)\n{\n\tauto p = CastToVector2(ptr);\n\tauto sq_len = CGAL::to_double(p->squared_length());\n\n\tif (sq_len == 0) return 0;\n\treturn CGAL::sqrt(sq_len);\n}\n\nvoid* Vector2_EIK_Copy(void* ptr)\n{\n\tauto v = CastToVector2(ptr);\n\tauto v2 = new Vector2();\n\n\t(*v2) = *v;\n\treturn v2;\n}\n\ntemplate<class K2>\nstatic void* Convert(Vector2* v)\n{\n\tCGAL::Cartesian_converter<EIK, K2> convert;\n\n\tauto x = convert((*v)[0]);\n\tauto y = convert((*v)[1]);\n\n\treturn new CGAL::Vector_2<K2>(x, y);\n}\n\nvoid* Vector2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tauto p = CastToVector2(ptr);\n\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Convert<EIK>(p);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Convert<EEK>(p);\n\n\tdefault:\n\t\treturn Convert<EIK>(p);\n\t}\n}\n"
  },
  {
    "path": "CGALWrapper/Geometry/Vector2_EIK.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Vector2_EIK_Create();\n\n\tCGALWRAPPER_API void* Vector2_EIK_CreateFromVector(const Vector2d& vector);\n\n\tCGALWRAPPER_API void Vector2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EIK_GetX(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EIK_GetY(void* ptr);\n\n\tCGALWRAPPER_API void Vector2_EIK_SetX(void* ptr, double x);\n\n\tCGALWRAPPER_API void Vector2_EIK_SetY(void* ptr, double y);\n\n\tCGALWRAPPER_API double Vector2_EIK_SqrLength(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EIK_Perpendicular(void* ptr, CGAL::Orientation orientation);\n\n\tCGALWRAPPER_API void Vector2_EIK_Normalize(void* ptr);\n\n\tCGALWRAPPER_API double Vector2_EIK_Magnitude(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Vector2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n\n#include <vector>\n#include <CGAL/convex_hull_2.h>\n#include <CGAL/ch_eddy.h>\n#include <CGAL/ch_jarvis.h>\n#include <CGAL/ch_melkman.h>\n#include <CGAL/Convex_hull_traits_adapter_2.h>\n\ntemplate<class K>\nclass ConvexHull2\n{\nprivate:\n\n\ttypedef std::vector<CGAL::Point_2<K>> PointList;\n\ttypedef CGAL::Polygon_2<K> Polygon_2;\n\npublic:\n\n\tConvexHull2()\n\t{\n\n\t}\n\n\t~ConvexHull2()\n\t{\n\n\t}\n\n\tinline static ConvexHull2* NewConvexHull2()\n\t{\n\t\treturn new ConvexHull2();\n\t}\n\n\tinline static void DeleteConvexHull2(void* ptr)\n\t{\n\t\tauto obj = static_cast<ConvexHull2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static ConvexHull2* CastToConvexHull2(void* ptr)\n\t{\n\t\treturn static_cast<ConvexHull2*>(ptr);\n\t}\n\n\tstatic PointList ConvertPoints(Point2d* points, int count)\n\t{\n\t\tPointList list(count);\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\t\t\n\t\treturn list;\n\t}\n\n\tstatic void* CreateHull(Point2d* points, int count, HULL_METHOD method)\n\t{\n\t\tPointList list = ConvertPoints(points, count);\n\t\tPointList out;\n\n\t\tswitch(method)\n\t\t{\n\t\tcase HULL_METHOD::DEFAULT:\n\t\t\tCGAL::convex_hull_2(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\n\t\tcase HULL_METHOD::AKL_TOUSSAINT:\n\t\t\tCGAL::ch_akl_toussaint(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\n\t\tcase HULL_METHOD::BYKAT:\n\t\t\tCGAL::ch_bykat(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\n\t\tcase HULL_METHOD::EDDY:\n\t\t\tCGAL::ch_eddy(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\n\t\tcase HULL_METHOD::GRAHAM_ANDREW:\n\t\t\tCGAL::ch_graham_andrew(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\t\tcase HULL_METHOD::JARVIS:\n\t\t\tCGAL::ch_jarvis(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tCGAL::convex_hull_2(list.begin(), list.end(), std::back_inserter(out));\n\t\t\tbreak;\n\t\t}\n\n\t\treturn new Polygon_2(out.begin(), out.end());\n\t}\n\n\tstatic void* LowerHull(Point2d* points, int count)\n\t{\n\t\tPointList list = ConvertPoints(points, count);\n\t\tPointList out;\n\n\t\tCGAL::lower_hull_points_2(list.begin(), list.end(), std::back_inserter(out));\n\n\t\treturn new Polygon_2(out.begin(), out.end());\n\t}\n\n\tstatic void* UpperHull(Point2d* points, int count)\n\t{\n\t\tPointList list = ConvertPoints(points, count);\n\t\tPointList out;\n\n\t\tCGAL::upper_hull_points_2(list.begin(), list.end(), std::back_inserter(out));\n\n\t\treturn new Polygon_2(out.begin(), out.end());\n\t}\n\n\tstatic BOOL IsStronglyConvexCCW(Point2d* points, int count)\n\t{\n\t\tPointList list = ConvertPoints(points, count);\n\t\treturn CGAL::is_ccw_strongly_convex_2(list.begin(), list.end());\n\t}\n\n\tstatic BOOL IsStronglyConvexCW(Point2d* points, int count)\n\t{\n\t\tPointList list = ConvertPoints(points, count);\n\t\treturn CGAL::is_cw_strongly_convex_2(list.begin(), list.end());\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull2_EEK.cpp",
    "content": "\n#include \"ConvexHull2_EEK.h\"\n#include \"ConvexHull2.h\"\n\nvoid* ConvexHull2_EEK_Create()\n{\n\treturn ConvexHull2<EEK>::NewConvexHull2();\n}\n\nvoid ConvexHull2_EEK_Release(void* ptr)\n{\n\tConvexHull2<EEK>::DeleteConvexHull2(ptr);\n}\n\nvoid* ConvexHull2_EEK_CreateHull(Point2d* points, int count, HULL_METHOD method)\n{\n\treturn ConvexHull2<EEK>::CreateHull(points, count, method);\n}\n\nvoid* ConvexHull2_EEK_UpperHull(Point2d* points, int count)\n{\n\treturn ConvexHull2<EEK>::UpperHull(points, count);\n}\n\nvoid* ConvexHull2_EEK_LowerHull(Point2d* points, int count)\n{\n\treturn ConvexHull2<EEK>::LowerHull(points, count);\n}\n\nBOOL ConvexHull2_EEK_IsStronglyConvexCCW(Point2d* points, int count)\n{\n\treturn ConvexHull2<EEK>::IsStronglyConvexCCW(points, count);\n}\n\nBOOL ConvexHull2_EEK_IsStronglyConvexCW(Point2d* points, int count)\n{\n\treturn ConvexHull2<EEK>::IsStronglyConvexCW(points, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/enum.h>\n\nenum class HULL_METHOD : int\n{\n\tDEFAULT,\n    AKL_TOUSSAINT,\n    BYKAT,\n    EDDY,\n    GRAHAM_ANDREW,\n    JARVIS\n};\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConvexHull2_EEK_Create();\n\n\tCGALWRAPPER_API void ConvexHull2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* ConvexHull2_EEK_CreateHull(Point2d* points, int count, HULL_METHOD method);\n\n\tCGALWRAPPER_API void* ConvexHull2_EEK_UpperHull(Point2d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull2_EEK_LowerHull(Point2d* points, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull2_EEK_IsStronglyConvexCCW(Point2d* points, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull2_EEK_IsStronglyConvexCW(Point2d* points, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull2_EIK.cpp",
    "content": "\n#include \"ConvexHull2_EIK.h\"\n#include \"ConvexHull2.h\"\n\nvoid* ConvexHull2_EIK_Create()\n{\n\treturn ConvexHull2<EIK>::NewConvexHull2();\n}\n\nvoid ConvexHull2_EIK_Release(void* ptr)\n{\n\tConvexHull2<EIK>::DeleteConvexHull2(ptr);\n}\n\nvoid* ConvexHull2_EIK_CreateHull(Point2d* points, int count, HULL_METHOD method)\n{\n\treturn ConvexHull2<EIK>::CreateHull(points, count, method);\n}\n\nvoid* ConvexHull2_EIK_UpperHull(Point2d* points, int count)\n{\n\treturn ConvexHull2<EIK>::UpperHull(points, count);\n}\n\nvoid* ConvexHull2_EIK_LowerHull(Point2d* points, int count)\n{\n\treturn ConvexHull2<EIK>::LowerHull(points, count);\n}\n\nBOOL ConvexHull2_EIK_IsStronglyConvexCCW(Point2d* points, int count)\n{\n\treturn ConvexHull2<EIK>::IsStronglyConvexCCW(points, count);\n}\n\nBOOL ConvexHull2_EIK_IsStronglyConvexCW(Point2d* points, int count)\n{\n\treturn ConvexHull2<EIK>::IsStronglyConvexCW(points, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/enum.h>\n\nenum class HULL_METHOD : int\n{\n\tDEFAULT,\n\tAKL_TOUSSAINT,\n\tBYKAT,\n\tEDDY,\n\tGRAHAM_ANDREW,\n\tJARVIS\n};\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConvexHull2_EIK_Create();\n\n\tCGALWRAPPER_API void ConvexHull2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* ConvexHull2_EIK_CreateHull(Point2d* points, int count, HULL_METHOD method);\n\n\tCGALWRAPPER_API void* ConvexHull2_EIK_UpperHull(Point2d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull2_EIK_LowerHull(Point2d* points, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull2_EIK_IsStronglyConvexCCW(Point2d* points, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull2_EIK_IsStronglyConvexCW(Point2d* points, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <vector>\n#include <CGAL/convex_hull_3.h>\n#include <CGAL/Convex_hull_3/dual/halfspace_intersection_3.h>\n\ntemplate<class K>\nclass ConvexHull3\n{\nprivate:\n\n\ttypedef CGAL::Point_3<K>     Point_3;\n\ttypedef CGAL::Plane_3<K>     Plane_3;\n\ttypedef std::vector<Point_3> PointList;\n\ttypedef std::vector<Plane_3> PlaneList;\n\npublic:\n\n\tinline static ConvexHull3* NewConvexHull3()\n\t{\n\t\treturn new ConvexHull3();\n\t}\n\n\tinline static void DeleteConvexHull3(void* ptr)\n\t{\n\t\tauto obj = static_cast<ConvexHull3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static ConvexHull3* CastToConvexHull3(void* ptr)\n\t{\n\t\treturn static_cast<ConvexHull3*>(ptr);\n\t}\n\n\tstatic PointList ConvertPoints(Point3d* points, int count)\n\t{\n\t\tPointList list(count);\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\n\t\treturn list;\n\t}\n\n\tstatic PlaneList ConvertPlanes(Plane3d* planes, int count)\n\t{\n\t\tPlaneList list(count);\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t\tlist[i] = planes[i].ToCGAL<K, Plane_3>();\n\n\t\treturn list;\n\t}\n\n\tstatic void* CreateHullAsPolyhedronFromPoints(Point3d* points, int count)\n\t{\n\t\tauto list = ConvertPoints(points, count);\n\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\n\t\tCGAL::convex_hull_3(list.begin(), list.end(), poly->model);\n\n\t\treturn poly;\n\t}\n\n\tstatic void* CreateHullAsSurfaceMeshFromPoints(Point3d* points, int count)\n\t{\n\t\tauto list = ConvertPoints(points, count);\n\t\tauto mesh = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tCGAL::convex_hull_3(list.begin(), list.end(), mesh->model);\n\n\t\treturn mesh;\n\t}\n\n\tstatic void* CreateHullAsPolyhedronFromPlanes(Plane3d* planes, int count)\n\t{\n\t\tauto list = ConvertPlanes(planes, count);\n\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\n\t\tCGAL::halfspace_intersection_3(list.begin(), list.end(), poly->model);\n\n\t\treturn poly;\n\t}\n\n\tstatic void* CreateHullAsSurfaceMeshFromPlanes(Plane3d* planes, int count)\n\t{\n\t\tauto list = ConvertPlanes(planes, count);\n\t\tauto mesh = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tCGAL::halfspace_intersection_3(list.begin(), list.end(), mesh->model);\n\n\t\treturn mesh;\n\t}\n\n\tstatic BOOL IsPolyhedronStronglyConvex(void* ptr)\n\t{\n\t\tauto poly = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\treturn CGAL::is_strongly_convex_3(poly->model);\n\t}\n\n\tstatic BOOL IsSurfaceMeshStronglyConvex(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\t\treturn CGAL::is_strongly_convex_3(mesh->model);\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull3_EEK.cpp",
    "content": "\n#include \"ConvexHull3_EEK.h\"\n#include \"ConvexHull3.h\"\n\nvoid* ConvexHull3_EEK_Create()\n{\n\treturn ConvexHull3<EEK>::NewConvexHull3();\n}\n\nvoid ConvexHull3_EEK_Release(void* ptr)\n{\n\tConvexHull3<EEK>::DeleteConvexHull3(ptr);\n}\n\nvoid* ConvexHull3_EEK_CreateHullAsPolyhedronFromPoints(Point3d* points, int count)\n{\n\treturn ConvexHull3<EEK>::CreateHullAsPolyhedronFromPoints(points, count);\n}\n\nvoid* ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPoints(Point3d* points, int count)\n{\n\treturn ConvexHull3<EEK>::CreateHullAsSurfaceMeshFromPoints(points, count);\n}\n\nvoid* ConvexHull3_EEK_CreateHullAsPolyhedronFromPlanes(Plane3d* planes, int count)\n{\n\treturn ConvexHull3<EEK>::CreateHullAsPolyhedronFromPlanes(planes, count);\n}\n\nvoid* ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPlanes(Plane3d* planes, int count)\n{\n\treturn ConvexHull3<EEK>::CreateHullAsSurfaceMeshFromPlanes(planes, count);\n}\n\nBOOL ConvexHull3_EEK_IsPolyhedronStronglyConvex(void* ptr)\n{\n\treturn ConvexHull3<EEK>::IsPolyhedronStronglyConvex(ptr);\n}\n\nBOOL ConvexHull3_EEK_IsSurfaceMeshStronglyConvex(void* ptr)\n{\n\treturn ConvexHull3<EEK>::IsSurfaceMeshStronglyConvex(ptr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConvexHull3_EEK_Create();\n\n\tCGALWRAPPER_API void ConvexHull3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* ConvexHull3_EEK_CreateHullAsPolyhedronFromPoints(Point3d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPoints(Point3d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EEK_CreateHullAsPolyhedronFromPlanes(Plane3d* planes, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EEK_CreateHullAsSurfaceMeshFromPlanes(Plane3d* planes, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull3_EEK_IsPolyhedronStronglyConvex(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConvexHull3_EEK_IsSurfaceMeshStronglyConvex(void* ptr);\n\n}"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull3_EIK.cpp",
    "content": "\n#include \"ConvexHull3_EIK.h\"\n#include \"ConvexHull3.h\"\n\nvoid* ConvexHull3_EIK_Create()\n{\n\treturn ConvexHull3<EIK>::NewConvexHull3();\n}\n\nvoid ConvexHull3_EIK_Release(void* ptr)\n{\n\tConvexHull3<EIK>::DeleteConvexHull3(ptr);\n}\n\nvoid* ConvexHull3_EIK_CreateHullAsPolyhedronFromPoints(Point3d* points, int count)\n{\n\treturn ConvexHull3<EIK>::CreateHullAsPolyhedronFromPoints(points, count);\n}\n\nvoid* ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPoints(Point3d* points, int count)\n{\n\treturn ConvexHull3<EIK>::CreateHullAsSurfaceMeshFromPoints(points, count);\n}\n\nvoid* ConvexHull3_EIK_CreateHullAsPolyhedronFromPlanes(Plane3d* planes, int count)\n{\n\treturn ConvexHull3<EIK>::CreateHullAsPolyhedronFromPlanes(planes, count);\n}\n\nvoid* ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPlanes(Plane3d* planes, int count)\n{\n\treturn ConvexHull3<EIK>::CreateHullAsSurfaceMeshFromPlanes(planes, count);\n}\n\nBOOL ConvexHull3_EIK_IsPolyhedronStronglyConvex(void* ptr)\n{\n\treturn ConvexHull3<EIK>::IsPolyhedronStronglyConvex(ptr);\n}\n\nBOOL ConvexHull3_EIK_IsSurfaceMeshStronglyConvex(void* ptr)\n{\n\treturn ConvexHull3<EIK>::IsSurfaceMeshStronglyConvex(ptr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Hull/ConvexHull3_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConvexHull3_EIK_Create();\n\n\tCGALWRAPPER_API void ConvexHull3_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* ConvexHull3_EIK_CreateHullAsPolyhedronFromPoints(Point3d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPoints(Point3d* points, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EIK_CreateHullAsPolyhedronFromPlanes(Plane3d* planes, int count);\n\n\tCGALWRAPPER_API void* ConvexHull3_EIK_CreateHullAsSurfaceMeshFromPlanes(Plane3d* planes, int count);\n\n\tCGALWRAPPER_API BOOL ConvexHull3_EIK_IsPolyhedronStronglyConvex(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConvexHull3_EIK_IsSurfaceMeshStronglyConvex(void* ptr);\n\n}"
  },
  {
    "path": "CGALWrapper/Meshing/ConformingTriangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n\n#include <map>\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Delaunay_mesher_2.h>\n#include <CGAL/Delaunay_mesh_face_base_2.h>\n#include <CGAL/Delaunay_mesh_size_criteria_2.h>\n#include <CGAL/Triangulation_conformer_2.h>\n#include <CGAL/Delaunay_mesh_face_base_2.h>\n#include <CGAL/Delaunay_mesh_vertex_base_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/lloyd_optimize_mesh_2.h>\n#include <CGAL/Aff_transformation_2.h>\n\ntemplate<class K>\nclass ConformingTriangulation2\n{\n\npublic:\n\n\ttypedef CGAL::Delaunay_mesh_vertex_base_2<K>                Vb;\n\ttypedef CGAL::Delaunay_mesh_face_base_2<K>                  Fb;\n\ttypedef CGAL::Triangulation_data_structure_2<Vb, Fb>        Tds;\n\ttypedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds>  CDT;\n\ttypedef CGAL::Delaunay_mesh_size_criteria_2<CDT>            Criteria;\n\ttypedef CGAL::Delaunay_mesher_2<CDT, Criteria>              Mesher;\n\ttypedef typename CDT::Vertex_handle Vertex;\n\ttypedef typename CDT::Point Point;\n\n\ttypedef CGAL::Aff_transformation_2<K> Transformation_2;\n\n\tCDT model;\n\n\tConformingTriangulation2()\n\t{\n\n\t}\n\n\t~ConformingTriangulation2()\n\t{\n\n\t}\n\n\tinline static ConformingTriangulation2* NewTriangulation2()\n\t{\n\t\treturn new ConformingTriangulation2();\n\t}\n\n\tinline static void DeleteTriangulation2(void* ptr)\n\t{\n\t\tauto obj = static_cast<ConformingTriangulation2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static ConformingTriangulation2* CastToTriangulation2(void* ptr)\n\t{\n\t\treturn static_cast<ConformingTriangulation2*>(ptr);\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\ttri->model.clear();\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tauto copy = NewTriangulation2();\n\t\tcopy->model = tri->model;\n\t\treturn copy;\n\t}\n\n\tstatic int VertexCount(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\treturn (int)tri->model.number_of_vertices();\n\t}\n\n\tstatic int FaceCount(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\treturn (int)tri->model.number_of_faces();\n\t}\n\n\tstatic void InsertPoint(void* ptr, Point2d point)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\ttri->model.insert(point.ToCGAL<K>());\n\t}\n\n\tstatic void InsertPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\n\t\tstd::vector<Point> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\n\t\ttri->model.insert(list.begin(), list.end());\n\t}\n\n\tstatic void InsertPolygon(void* triPtr, void* polyPtr)\n\t{\n\t\tauto tri = CastToTriangulation2(triPtr);\n\n\t\tauto polygon = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\ttri->model.insert(polygon->vertices_begin(), polygon->vertices_end());\n\t}\n\n\tstatic void InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n\t{\n\t\tauto tri = CastToTriangulation2(triPtr);\n\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\ttri->model.insert(pwh->outer_boundary().vertices_begin(), pwh->outer_boundary().vertices_end());\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t\ttri->model.insert(hole.vertices_begin(), hole.vertices_end());\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tint i = 0;\n\n\t\tfor (auto vert = tri->model.finite_vertices_begin(); vert != tri->model.finite_vertices_end(); ++vert)\n\t\t{\n\t\t\tpoints[i++] = Point2d::FromCGAL<K>(vert->point());\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t\t\t\n\t}\n\n\tstatic void GetIndices(void* ptr, int* indices, int count)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tint index = 0;\n\n\t\tstd::map<Vertex, int> map;\n\n\t\tfor (auto vert = tri->model.finite_vertices_begin(); vert != tri->model.finite_vertices_end(); ++vert)\n\t\t{\n\t\t\tmap.insert(std::pair<Vertex, int>(vert, index++));\n\t\t}\n\n\t\tindex = 0;\n\t\tfor (auto face = tri->model.finite_faces_begin(); face != tri->model.finite_faces_end(); ++face)\n\t\t{\n\t\t\tauto i0 = map.find(face->vertex(0));\n\t\t\tauto i1 = map.find(face->vertex(1));\n\t\t\tauto i2 = map.find(face->vertex(2));\n\n\t\t\tif (i0 == map.end() || i1 == map.end() || i2 == map.end())\n\t\t\t{\n\t\t\t\tindices[index * 3 + 0] = NULL_INDEX;\n\t\t\t\tindices[index * 3 + 1] = NULL_INDEX;\n\t\t\t\tindices[index * 3 + 2] = NULL_INDEX;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tindices[index * 3 + 0] = i0->second;\n\t\t\t\tindices[index * 3 + 1] = i1->second;\n\t\t\t\tindices[index * 3 + 2] = i2->second;\n\t\t\t}\n\n\t\t\tindex++;\n\n\t\t\tif (index * 3 >= count) return;\n\t\t}\n\t}\n\n\tstatic void Transform(void* ptr, Point2d translation, double rotation, double scale)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\n\t\tTransformation_2 T(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\tTransformation_2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\tTransformation_2 S(CGAL::SCALING, scale);\n\n\t\tauto M = T * R * S;\n\t\tfor (auto& vert : tri->model.finite_vertex_handles())\n\t\t\tvert->point() = M(vert->point());\n\t}\n\n\tstatic void InsertSegmentConstraint(void* ptr, Point2d a, Point2d b)\n\t{\n\t\tif (a == b) return;\n\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\ttri->model.insert_constraint(a.ToCGAL<K>(), b.ToCGAL<K>());\n\t}\n\n\tstatic void InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (segments[i].a == segments[i].b)\n\t\t\t\tcontinue;\n\n\t\t\tauto a = segments[i].a.ToCGAL<K>();\n\t\t\tauto b = segments[i].b.ToCGAL<K>();\n\n\t\t\ttri->model.insert_constraint(a, b);\n\t\t}\n\n\t}\n\n\tstatic void InsertPolygonConstraint(void* triPtr, void* polyPtr)\n\t{\n\t\tauto tri = CastToTriangulation2(triPtr);\n\n\t\tauto polygon = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\ttri->model.insert_constraint(polygon->vertices_begin(), polygon->vertices_end(), true);\n\t}\n\n\tstatic void InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n\t{\n\t\tauto tri = CastToTriangulation2(triPtr);\n\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\ttri->model.insert_constraint(pwh->outer_boundary().vertices_begin(), pwh->outer_boundary().vertices_end(), true);\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t\ttri->model.insert_constraint(hole.vertices_begin(), hole.vertices_end(), true);\n\t}\n\n\tstatic void MakeConformingDelaunay(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tCGAL::make_conforming_Delaunay_2(tri->model);\n\t}\n\n\tstatic void MakeConformingGabriel(void* ptr)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tCGAL::make_conforming_Gabriel_2(tri->model);\n\t}\n\n\tvoid RefineAndOptimize(int iterations, double angleBounds, double lengthBounds, std::vector<Point>& seeds)\n\t{\n\t\tif (angleBounds > 0.125)\n\t\t\tangleBounds = 0.125;\n\n\t\tMesher mesher(model);\n\n\t\tint numSeeds = (int)seeds.size();\n\n\t\tif (numSeeds > 0)\n\t\t\tmesher.set_seeds(seeds.begin(), seeds.end());\n\n\t\tmesher.set_criteria(Criteria(angleBounds, lengthBounds));\n\t\tmesher.refine_mesh();\n\n\t\t//auto code =  CGAL::lloyd_optimize_mesh_2(model);\n\t}\n\n\tstatic void RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\t\tstd::vector<Point> points;\n\t\ttri->RefineAndOptimize(iterations, angleBounds, lengthBounds, points);\n\t}\n\n\tstatic void RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds, Point2d* seeds, int count)\n\t{\n\t\tauto tri = CastToTriangulation2(ptr);\n\n\t\tstd::vector<Point> points;\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tpoints.push_back(seeds[i].ToCGAL<K>());\n\n\t\ttri->RefineAndOptimize(iterations, angleBounds, lengthBounds, points);\n\t}\n\n};\n\n\n"
  },
  {
    "path": "CGALWrapper/Meshing/ConformingTriangulation2_EEK.cpp",
    "content": "#include \"ConformingTriangulation2_EEK.h\"\n\n\nvoid* ConformingTriangulation2_EEK_Create()\n{\n\treturn ConformingTriangulation2<EEK>::NewTriangulation2();\n}\n\nvoid ConformingTriangulation2_EEK_Release(void* ptr)\n{\n\tConformingTriangulation2<EEK>::DeleteTriangulation2(ptr);\n}\n\nvoid ConformingTriangulation2_EEK_Clear(void* ptr)\n{\n\tConformingTriangulation2<EEK>::Clear(ptr);\n}\n\nvoid* ConformingTriangulation2_EEK_Copy(void* ptr)\n{\n\treturn ConformingTriangulation2<EEK>::Copy(ptr);\n}\n\nint ConformingTriangulation2_EEK_VertexCount(void* ptr)\n{\n\treturn ConformingTriangulation2<EEK>::VertexCount(ptr);\n}\n\nint ConformingTriangulation2_EEK_FaceCount(void* ptr)\n{\n\treturn ConformingTriangulation2<EEK>::FaceCount(ptr);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tConformingTriangulation2<EEK>::InsertPoint(ptr, point);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tConformingTriangulation2<EEK>::InsertPoints(ptr, points, count);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tConformingTriangulation2<EEK>::InsertPolygon(triPtr, polyPtr);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tConformingTriangulation2<EEK>::InsertPolygonWithHoles(triPtr, pwhPtr);\n}\n\nvoid ConformingTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tConformingTriangulation2<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid ConformingTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count)\n{\n\tConformingTriangulation2<EEK>::GetIndices(ptr, indices, count);\n}\n\nvoid ConformingTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tConformingTriangulation2<EEK>::Transform(ptr, translation, rotation, scale);\n}\n\nvoid ConformingTriangulation2_EEK_InsertSegmentConstraint(void* ptr, Point2d a, Point2d b)\n{\n\tConformingTriangulation2<EEK>::InsertSegmentConstraint(ptr, a, b);\n}\n\nvoid ConformingTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tConformingTriangulation2<EEK>::InsertSegmentConstraints(ptr, segments, count);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tConformingTriangulation2<EEK>::InsertPolygonConstraint(triPtr, polyPtr);\n}\n\nvoid ConformingTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tConformingTriangulation2<EEK>::InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n}\n\nvoid ConformingTriangulation2_EEK_MakeDelaunay(void* ptr)\n{\n\tConformingTriangulation2<EEK>::MakeConformingDelaunay(ptr);\n}\n\nvoid ConformingTriangulation2_EEK_MakeGabriel(void* ptr)\n{\n\tConformingTriangulation2<EEK>::MakeConformingGabriel(ptr);\n}\n\nvoid Conformingriangulation2_EEK_RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds)\n{\n\tConformingTriangulation2<EEK>::RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds);\n}\n\nvoid ConformingTriangulation2_EEK_RefineAndOptimizeWithSeeds(void* ptr, int iterations, double angleBounds, double lengthBounds, Point2d* points, int count)\n{\n\tConformingTriangulation2<EEK>::RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds, points, count);\n}\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Meshing/ConformingTriangulation2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConformingTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConformingTriangulation2_EEK_Create();\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConformingTriangulation2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API int ConformingTriangulation2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConformingTriangulation2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertSegmentConstraint(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_MakeDelaunay(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_MakeGabriel(void* ptr);\n\n\tCGALWRAPPER_API void Conformingriangulation2_EEK_RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EEK_RefineAndOptimizeWithSeeds(void* ptr, int iterations, double angleBounds, double lengthBounds, Point2d* points, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Meshing/ConformingTriangulation2_EIK.cpp",
    "content": "#include \"ConformingTriangulation2_EIK.h\"\n\n\nvoid* ConformingTriangulation2_EIK_Create()\n{\n\treturn ConformingTriangulation2<EIK>::NewTriangulation2();\n}\n\nvoid ConformingTriangulation2_EIK_Release(void* ptr)\n{\n\tConformingTriangulation2<EIK>::DeleteTriangulation2(ptr);\n}\n\nvoid ConformingTriangulation2_EIK_Clear(void* ptr)\n{\n\tConformingTriangulation2<EIK>::Clear(ptr);\n}\n\nvoid* ConformingTriangulation2_EIK_Copy(void* ptr)\n{\n\treturn ConformingTriangulation2<EIK>::Copy(ptr);\n}\n\nint ConformingTriangulation2_EIK_VertexCount(void* ptr)\n{\n\treturn ConformingTriangulation2<EIK>::VertexCount(ptr);\n}\n\nint ConformingTriangulation2_EIK_FaceCount(void* ptr)\n{\n\treturn ConformingTriangulation2<EIK>::FaceCount(ptr);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPoint(void* ptr, Point2d point)\n{\n\tConformingTriangulation2<EIK>::InsertPoint(ptr, point);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tConformingTriangulation2<EIK>::InsertPoints(ptr, points, count);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tConformingTriangulation2<EIK>::InsertPolygon(triPtr, polyPtr);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tConformingTriangulation2<EIK>::InsertPolygonWithHoles(triPtr, pwhPtr);\n}\n\nvoid ConformingTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tConformingTriangulation2<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid ConformingTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count)\n{\n\tConformingTriangulation2<EIK>::GetIndices(ptr, indices, count);\n}\n\nvoid ConformingTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tConformingTriangulation2<EIK>::Transform(ptr, translation, rotation, scale);\n}\n\nvoid ConformingTriangulation2_EIK_InsertSegmentConstraint(void* ptr, Point2d a, Point2d b)\n{\n\tConformingTriangulation2<EIK>::InsertSegmentConstraint(ptr, a, b);\n}\n\nvoid ConformingTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tConformingTriangulation2<EIK>::InsertSegmentConstraints(ptr, segments, count);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tConformingTriangulation2<EIK>::InsertPolygonConstraint(triPtr, polyPtr);\n}\n\nvoid ConformingTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tConformingTriangulation2<EIK>::InsertPolygonWithHolesConstraint(triPtr, pwhPtr);\n}\n\nvoid ConformingTriangulation2_EIK_MakeDelaunay(void* ptr)\n{\n\tConformingTriangulation2<EIK>::MakeConformingDelaunay(ptr);\n}\n\nvoid ConformingTriangulation2_EIK_MakeGabriel(void* ptr)\n{\n\tConformingTriangulation2<EIK>::MakeConformingGabriel(ptr);\n}\n\nvoid Conformingriangulation2_EIK_RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds)\n{\n\tConformingTriangulation2<EIK>::RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds);\n}\n\nvoid ConformingTriangulation2_EIK_RefineAndOptimizeWithSeeds(void* ptr, int iterations, double angleBounds, double lengthBounds, Point2d* points, int count)\n{\n\tConformingTriangulation2<EIK>::RefineAndOptimize(ptr, iterations, angleBounds, lengthBounds, points, count);\n}\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Meshing/ConformingTriangulation2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConformingTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConformingTriangulation2_EIK_Create();\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConformingTriangulation2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API int ConformingTriangulation2_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConformingTriangulation2_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertSegmentConstraint(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_MakeDelaunay(void* ptr);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_MakeGabriel(void* ptr);\n\n\tCGALWRAPPER_API void Conformingriangulation2_EIK_RefineAndOptimize(void* ptr, int iterations, double angleBounds, double lengthBounds);\n\n\tCGALWRAPPER_API void ConformingTriangulation2_EIK_RefineAndOptimizeWithSeeds(void* ptr, int iterations, double angleBounds, double lengthBounds, Point2d* points, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Meshing/SkinSurfaceMeshing_EEK.cpp",
    "content": "#include \"SkinSurfaceMeshing_EEK.h\"\n\n#include \"SkinSurfaceMesing.h\"\n\nvoid* SkinSurfaceMeshing_EEK_Create()\n{\n\treturn SkinSurfaceMeshing<EEK>::NewSkinSurfaceMeshing();\n}\n\nvoid SkinSurfaceMeshing_EEK_Release(void* ptr)\n{\n\tSkinSurfaceMeshing<EEK>::DeleteSkinSurfaceMeshing(ptr);\n}\n\nvoid* SkinSurfaceMeshing_EEK_MakeSkinSurface_Point3d(double shrinkfactor, BOOL subdivide, Point3d* points, int count)\n{\n\treturn SkinSurfaceMeshing<EEK>::MakeSkinSurface(shrinkfactor, subdivide, points, count);\n}\n\nvoid* SkinSurfaceMeshing_EEK_MakeSkinSurface_HPoint3d(double shrinkfactor, BOOL subdivide, HPoint3d* points, int count)\n{\n\treturn SkinSurfaceMeshing<EEK>::MakeSkinSurface(shrinkfactor, subdivide, points, count);\n}"
  },
  {
    "path": "CGALWrapper/Meshing/SkinSurfaceMeshing_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SkinSurfaceMeshing_EEK_Create();\n\n\tCGALWRAPPER_API void SkinSurfaceMeshing_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* SkinSurfaceMeshing_EEK_MakeSkinSurface_Point3d(double shrinkfactor, BOOL subdivide, Point3d* points, int count);\n\n\tCGALWRAPPER_API void* SkinSurfaceMeshing_EEK_MakeSkinSurface_HPoint3d(double shrinkfactor, BOOL subdivide, HPoint3d* points, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Meshing/SkinSurfaceMesing.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra//Polyhedron3.h\"\n\n#include <CGAL/Skin_surface_3.h>\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/mesh_skin_surface_3.h>\n#include <CGAL/subdivide_skin_surface_mesh_3.h>\n#include <list>\n#include <vector>\n\ntemplate<class K>\nclass SkinSurfaceMeshing\n{\n\npublic:\n\n\ttypedef typename K::Point_3                                          Point;\n\ttypedef typename K::Weighted_point_3                                 WPoint;\n\ttypedef typename CGAL::Polyhedron_3<K>\t\t\t\t\t\t\t\t Polyhedron;\n\n\ttypedef typename CGAL::Skin_surface_traits_3<K>                      Traits;\n\ttypedef typename CGAL::Skin_surface_3<Traits>                        Skin_surface_3;\n\n\tinline static SkinSurfaceMeshing* NewSkinSurfaceMeshing()\n\t{\n\t\treturn new SkinSurfaceMeshing();\n\t}\n\n\tinline static void DeleteSkinSurfaceMeshing(void* ptr)\n\t{\n\t\tauto obj = static_cast<SkinSurfaceMeshing*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static SkinSurfaceMeshing* CastToSkinSurfaceMeshing(void* ptr)\n\t{\n\t\treturn static_cast<SkinSurfaceMeshing*>(ptr);\n\t}\n\n\tstatic std::vector<WPoint> PointList(HPoint3d* points, int count)\n\t{\n\t\tstd::vector< WPoint> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tlist[i] = points[i].ToCGALWeightedPoint<K>();\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tstatic std::vector<WPoint> PointList(Point3d* points, int count)\n\t{\n\t\tstd::vector< WPoint> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tlist[i] = points[i].ToCGALWeightedPoint<K>();\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tstatic void* MakeSkinSurface(double shrinkfactor, BOOL subdivide, Point3d* points, int count)\n\t{\n\t\tauto list = PointList(points, count);\n\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\n\t\tSkin_surface_3 skin_surface(list.begin(), list.end(), shrinkfactor);\n\t\tCGAL::mesh_skin_surface_3(skin_surface, poly->model);\n\n\t\tif (subdivide)\n\t\t\tCGAL::subdivide_skin_surface_mesh_3(skin_surface, poly->model);\n\n\t\tpoly->OnModelChanged();\n\t\treturn poly;\n\t}\n\t\n\tstatic void* MakeSkinSurface(double shrinkfactor, BOOL subdivide, HPoint3d* points, int count)\n\t{\n\t\tauto list = PointList(points, count);\n\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\n\t\tSkin_surface_3 skin_surface(list.begin(), list.end(), shrinkfactor);\n\t\tCGAL::mesh_skin_surface_3(skin_surface, poly->model);\n\n\t\tif(subdivide)\n\t\t\tCGAL::subdivide_skin_surface_mesh_3(skin_surface, poly->model);\n\n\t\tpoly->OnModelChanged();\n\t\treturn poly;\n\t}\n\t\n\n};\n"
  },
  {
    "path": "CGALWrapper/Meshing/TetrahedralRemeshing.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include <CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h>\n#include <CGAL/tetrahedral_remeshing.h>\n#include <CGAL/Mesh_triangulation_3.h>\n#include <CGAL/Mesh_complex_3_in_triangulation_3.h>\n#include <CGAL/Mesh_criteria_3.h>\n#include <CGAL/Polyhedral_mesh_domain_with_features_3.h>\n#include <CGAL/make_mesh_3.h>\n#include <vector>\n\ntemplate<class K>\nclass TetrahedralRemeshing\n{\n\nprivate:\n\n\tstd::vector<Point3d> buffer;\n\npublic:\n\n\ttypedef typename CGAL::Tetrahedral_remeshing::Remeshing_triangulation_3<K> Remeshing_triangulation;\n\ttypedef typename Remeshing_triangulation::Point Point;\n\n\tinline static TetrahedralRemeshing* NewTetrahedralRemeshing()\n\t{\n\t\treturn new TetrahedralRemeshing();\n\t}\n\n\tinline static void DeleteTetrahedralRemeshing(void* ptr)\n\t{\n\t\tauto obj = static_cast<TetrahedralRemeshing*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static TetrahedralRemeshing* CastToTetrahedralRemeshing(void* ptr)\n\t{\n\t\treturn static_cast<TetrahedralRemeshing*>(ptr);\n\t}\n\n\tstatic std::vector<Point> PointList(Point3d* points, int count)\n\t{\n\t\tstd::vector<Point> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\n\t\treturn list;\n\t}\n\n\tstatic void GetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto mesher = CastToTetrahedralRemeshing(ptr);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tpoints[i] = mesher->buffer[i];\n\n\t\t\tif (i >= mesher->buffer.size())\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tmesher->buffer.clear();\n\t}\n\n\tstatic int Remesh(void* ptr, double targetLength, int iterations, Point3d* points, int count)\n\t{\n\t\tauto mesher = CastToTetrahedralRemeshing(ptr);\n\n\t\tauto list = PointList(points, count);\n\t\tauto tr = Remeshing_triangulation(list.begin(), list.end());\n\n\t\tCGAL::tetrahedral_isotropic_remeshing(tr, targetLength, CGAL::parameters::number_of_iterations(iterations));\n\n\t\tmesher->buffer.clear();\n\t\tfor (auto v = tr.vertices_begin(); v != tr.vertices_end(); ++v)\n\t\t{\n\t\t\tauto p = v->point();\n\t\t\tmesher->buffer.push_back(Point3d::FromCGAL<EIK>(p));\n\t\t}\n\n\t\treturn (int)mesher->buffer.size();\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Meshing/TetrahedralRemeshing_EEK.cpp",
    "content": "#include \"TetrahedralRemeshing_EEK.h\"\n\n#include \"TetrahedralRemeshing.h\"\n\n#include <CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h>\n#include <CGAL/tetrahedral_remeshing.h>\n\nvoid* TetrahedralRemeshing_EEK_Create()\n{\n\treturn TetrahedralRemeshing<EEK>::NewTetrahedralRemeshing();\n}\n\nvoid TetrahedralRemeshing_EEK_Release(void* ptr)\n{\n\tTetrahedralRemeshing<EEK>::DeleteTetrahedralRemeshing(ptr);\n}\n\nvoid TetrahedralRemeshing_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tTetrahedralRemeshing<EEK>::GetPoints(ptr, points, count);\n}\n\nint TetrahedralRemeshing_EEK_Remesh(void* ptr, double targetLength, int iterations, Point3d* points, int count)\n{\n\t/*\n\ttypedef typename CGAL::Tetrahedral_remeshing::Remeshing_triangulation_3<EIK> Remeshing_triangulation;\n\ttypedef typename Remeshing_triangulation::Point Point;\n\n\tstd::vector<Point> points;\n\tpoints.push_back(Point(1, 0, 0));\n\tpoints.push_back(Point(0, 1, 0));\n\tpoints.push_back(Point(0, 0, 1));\n\tpoints.push_back(Point(0, 0, 0));\n\n\tRemeshing_triangulation tr = Remeshing_triangulation(points.begin(), points.end());\n\n\tCGAL::tetrahedral_isotropic_remeshing(tr, target_edge_length, CGAL::parameters::number_of_iterations(iterations));\n\n\tstd::cout << \"Number of cells \" << tr.number_of_cells() << std::endl;\n\n\tfor (auto v = tr.vertices_begin(); v != tr.vertices_end(); ++v)\n\t{\n\t\tauto p = v->point();\n\t\tbuffer.push_back(Point3d::FromCGAL<EIK>(p));\n\t}\n\t*/\n\n\treturn TetrahedralRemeshing<EIK>::Remesh(ptr, targetLength, iterations, points, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Meshing/TetrahedralRemeshing_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* TetrahedralRemeshing_EEK_Create();\n\n\tCGALWRAPPER_API void TetrahedralRemeshing_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void TetrahedralRemeshing_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API int TetrahedralRemeshing_EEK_Remesh(void* ptr, double targetLength, int iterations, Point3d* points, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Polygons/Polygon2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Polygon_2.h>\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Vector_2.h>\n#include <CGAL/Direction_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntemplate<class K>\nclass Polygon2\n{\n\npublic:\n\n\tPolygon2() {}\n\n\ttypedef CGAL::Point_2<K> Point_2;\n\ttypedef CGAL::Segment_2<K> Segment_2;\n\ttypedef CGAL::Polygon_2<K> Polygon_2;\n\ttypedef CGAL::Aff_transformation_2<K> Transformation_2;\n\t\n\tinline static Polygon_2* NewPolygon2()\n\t{\n\t\treturn new Polygon_2();\n\t}\n\n\tinline static void DeletePolygon2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Polygon_2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Polygon_2* CastToPolygon2(void* ptr)\n\t{\n\t\treturn static_cast<Polygon_2*>(ptr);\n\t}\n\n\tinline static Polygon_2* CreatePolygon2(const Polygon_2& poly)\n\t{\n\t\treturn new Polygon_2(poly);\n\t}\n\n\tinline static bool OutOfRange(Polygon_2* poly, int index)\n\t{\n\t\tif (index < 0 || index >= poly->size())\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tstatic int Count(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn (int)polygon->size();\n\t}\n\n\tstatic Box2d GetBoundingBox(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tauto box = polygon->bbox();\n\t\treturn Box2d::FromCGAL<K>(box);\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn new Polygon_2(*polygon);\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tauto count = polygon->size();\n\n\t\tauto poly2 = new CGAL::Polygon_2<K2>();\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto p = convert(polygon->vertex(i));\n\t\t\tpoly2->push_back(p);\n\t\t}\n\n\t\treturn poly2;\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tpolygon->clear();\n\t}\n\n\tstatic int Capacity(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn (int)polygon->container().capacity();\n\t}\n\n\tstatic void Resize(void* ptr, int count)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tpolygon->container().resize(count);\n\t}\n\n\tstatic void ShrinkToFit(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tpolygon->container().shrink_to_fit();\n\t}\n\n\tstatic void Erase(void* ptr, int index)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tif (OutOfRange(polygon, index))\n\t\t\treturn;\n\n\t\tpolygon->container().erase(polygon->container().begin() + index);\n\t}\n\n\tstatic void Erase(void* ptr, int start, int count)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tif (OutOfRange(polygon, start) ||\n\t\t\tOutOfRange(polygon, start + count))\n\t\t\treturn;\n\n\t\tpolygon->container().erase(polygon->container().begin() + start, polygon->container().begin() + count);\n\t}\n\n\tstatic void Insert(void* ptr, int index, Point2d point)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tif (OutOfRange(polygon, index))\n\t\t\treturn;\n\n\t\tpolygon->container().insert(polygon->container().begin() + index, point.ToCGAL<K>());\n\t}\n\n\tstatic void Insert(void* ptr, int start, int count, Point2d* points)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tif (OutOfRange(polygon, start))\n\t\t\treturn;\n\n\t\tstd::vector<Point_2> tmp(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\ttmp.push_back(points[i].ToCGAL<K>());\n\n\t\tpolygon->container().insert(polygon->container().begin() + start, tmp.begin(), tmp.end());\n\t}\n\n\tstatic double SqPerimeter(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tauto count = polygon->container().size();\n\t\tif (count < 2) return 0;\n\n\t\tauto sum = CGAL::squared_distance(polygon->vertex(0), polygon->vertex(1));\n\n\t\tfor (auto i = 1; i < count - 1; i++)\n\t\t\tsum += CGAL::squared_distance(polygon->vertex(i), polygon->vertex(i + 1));\n\n\t\treturn CGAL::to_double(sum);\n\t}\n\n\tstatic Point2d GetPoint(void* ptr, int index)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tif (OutOfRange(polygon, index)) \n\t\t\treturn { 0, 0};\n\n\t\tauto point = polygon->vertex(index);\n\n\t\treturn Point2d::FromCGAL<K>(point);\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tauto size = polygon->size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polygon->vertex(i);\n\t\t\tpoints[i] = Point2d::FromCGAL<K>(point);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void GetPoints(Polygon_2* polygon, std::vector<Point2d>& points)\n\t{\n\t\tint count = (int)polygon->size();\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polygon->vertex(i);\n\t\t\tpoints.push_back(Point2d::FromCGAL<K>(point));\n\t\t}\n\t}\n\n\tinline static int Wrap(int v, int count)\n\t{\n\t\tint r = v % count;\n\t\treturn r < 0 ? r + count : r;\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tauto size = polygon->size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tint i0 = Wrap(i + 0, count);\n\t\t\tint i1 = Wrap(i + 1, count);\n\n\t\t\tauto v0 = polygon->vertex(i0);\n\t\t\tauto v1 = polygon->vertex(i1);\n\n\t\t\tsegments[i].a = Point2d::FromCGAL<K>(v0);\n\t\t\tsegments[i].b = Point2d::FromCGAL<K>(v1);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void SetPoint(void* ptr, int index, const Point2d& point)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tif (OutOfRange(polygon, index)) return;\n\n\t\t(*polygon)[index] = point.ToCGAL<K>();\n\t}\n\n\tstatic void SetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tauto size = polygon->size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (i < size)\n\t\t\t\t(*polygon)[i] = points[i].ToCGAL<K>();\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Adding more points than polygon currently contains\n\t\t\t\t//so push back instead.\n\t\t\t\tpolygon->push_back(points[i].ToCGAL<K>());\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void Reverse(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tpolygon->reverse_orientation();\n\t}\n\n\tstatic BOOL IsSimple(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn polygon->is_simple();\n\t}\n\n\tstatic BOOL IsConvex(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn polygon->is_convex();\n\t}\n\n\tstatic CGAL::Orientation Orientation(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn polygon->orientation();\n\t}\n\n\tstatic CGAL::Oriented_side OrientedSide(void* ptr, const Point2d& point)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn polygon->oriented_side(point.ToCGAL<K>());\n\t}\n\n\tstatic CGAL::Bounded_side BoundedSide(void* ptr, const Point2d& point)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn polygon->bounded_side(point.ToCGAL<K>());\n\t}\n\n\tstatic double SignedArea(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn CGAL::to_double(polygon->area());\n\t}\n\n\tstatic void Translate(void* ptr, const Point2d& translation)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tTransformation_2 transformation(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t}\n\n\tstatic void Rotate(void* ptr, double rotation)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tTransformation_2 transformation(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t}\n\n\tstatic void Scale(void* ptr, double scale)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\tTransformation_2 transformation(CGAL::SCALING, scale);\n\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t}\n\n\tstatic void Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tTransformation_2 T(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\tTransformation_2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\tTransformation_2 S(CGAL::SCALING, scale);\n\n\t\t(*polygon) = CGAL::transform(T * R * S, *polygon);\n\t}\n\n\tstatic BOOL ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\n\t\tauto side = polygon->oriented_side(point.ToCGAL<K>());\n\n\t\tif (inculdeBoundary && side == CGAL::Oriented_side::ON_ORIENTED_BOUNDARY)\n\t\t\treturn true;\n\n\t\treturn side == orientation;\n\t}\n\n};\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/Polygon2_EEK.cpp",
    "content": "\n#include \"Polygon2_EEK.h\"\n#include \"Polygon2.h\"\n\n#include <CGAL/Polygon_2.h>\n\nvoid* Polygon2_EEK_Create()\n{\n\treturn Polygon2<EEK>::NewPolygon2();\n}\n\nvoid Polygon2_EEK_Release(void* ptr)\n{\n\tPolygon2<EEK>::DeletePolygon2(ptr);\n}\n\nint Polygon2_EEK_Count(void* ptr)\n{\n\tauto polygon = Polygon2<EEK>::CastToPolygon2(ptr);\n\treturn Polygon2<EEK>::Count(ptr);\n}\n\nBox2d Polygon2_EEK_GetBoundingBox(void* ptr)\n{\n\treturn Polygon2<EEK>::GetBoundingBox(ptr);\n}\n\nvoid* Polygon2_EEK_Copy(void* ptr)\n{\n\treturn Polygon2<EEK>::Copy(ptr);\n}\n\nvoid* Polygon2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polygon2<EEK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polygon2<EEK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polygon2<EEK>::Convert<EEK>(ptr);\n\t}\n}\n\nvoid Polygon2_EEK_Clear(void* ptr)\n{\n\tPolygon2<EEK>::Clear(ptr);\n}\n\nint Polygon2_EEK_Capacity(void* ptr)\n{\n\treturn Polygon2<EEK>::Capacity(ptr);\n}\n\nvoid Polygon2_EEK_Resize(void* ptr, int count)\n{\n\tPolygon2<EEK>::Resize(ptr, count);\n}\n\nvoid Polygon2_EEK_ShrinkToFit(void* ptr)\n{\n\tPolygon2<EEK>::ShrinkToFit(ptr);\n}\n\nvoid Polygon2_EEK_Erase(void* ptr, int index)\n{\n\tPolygon2<EEK>::Erase(ptr, index);\n}\n\nvoid Polygon2_EEK_EraseRange(void* ptr, int start, int count)\n{\n\tPolygon2<EEK>::Erase(ptr, start, count);\n}\n\nvoid Polygon2_EEK_Insert(void* ptr, int index, Point2d point)\n{\n\tPolygon2<EEK>::Insert(ptr, index, point);\n}\n\nvoid Polygon2_EEK_InsertRange(void* ptr, int start, int count, Point2d* points)\n{\n\tPolygon2<EEK>::Insert(ptr, start, count, points);\n}\n\ndouble Polygon2_EEK_SqPerimeter(void* ptr)\n{\n\treturn Polygon2<EEK>::SqPerimeter(ptr);\n}\n\nPoint2d Polygon2_EEK_GetPoint(void* ptr, int index)\n{\n\treturn Polygon2<EEK>::GetPoint(ptr, index);\n}\n\nvoid Polygon2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygon2<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid Polygon2_EEK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolygon2<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polygon2_EEK_SetPoint(void* ptr, int index, const Point2d& point)\n{\n\tPolygon2<EEK>::SetPoint(ptr, index, point);\n}\n\nvoid Polygon2_EEK_SetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygon2<EEK>::SetPoints(ptr, points, count);\n}\n\nvoid Polygon2_EEK_Reverse(void* ptr)\n{\n\tPolygon2<EEK>::Reverse(ptr);\n}\n\nBOOL Polygon2_EEK_IsSimple(void* ptr)\n{\n\tauto polygon = (CGAL::Polygon_2<EEK>*)ptr;\n\treturn polygon->is_simple();\n\n\t//return Polygon2<EEK>::IsSimple<(ptr);\n}\n\nBOOL Polygon2_EEK_IsConvex(void* ptr)\n{\n\treturn Polygon2<EEK>::IsConvex(ptr);\n}\n\nCGAL::Orientation Polygon2_EEK_Orientation(void* ptr)\n{\n\treturn Polygon2<EEK>::Orientation(ptr);\n}\n\nCGAL::Oriented_side Polygon2_EEK_OrientedSide(void* ptr, const Point2d& point)\n{\n\treturn Polygon2<EEK>::OrientedSide(ptr, point);\n}\n\nCGAL::Bounded_side Polygon2_EEK_BoundedSide(void* ptr, const Point2d& point)\n{\n\treturn Polygon2<EEK>::BoundedSide(ptr, point);\n}\n\ndouble Polygon2_EEK_SignedArea(void* ptr)\n{\n\treturn Polygon2<EEK>::SignedArea(ptr);\n}\n\nvoid Polygon2_EEK_Translate(void* ptr, const Point2d& translation)\n{\n\tPolygon2<EEK>::Translate(ptr, translation);\n}\n\nvoid Polygon2_EEK_Rotate(void* ptr, double rotation)\n{\n\tPolygon2<EEK>::Rotate(ptr, rotation);\n}\n\nvoid Polygon2_EEK_Scale(void* ptr, double scale)\n{\n\tPolygon2<EEK>::Scale(ptr, scale);\n}\n\nvoid Polygon2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tPolygon2<EEK>::Transform(ptr, translation, rotation, scale);\n}\n\nBOOL Polygon2_EEK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n{\n\treturn Polygon2<EEK>::ContainsPoint(ptr, point, orientation, inculdeBoundary);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/Polygon2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Polygon2_EEK_Create();\n\n\tCGALWRAPPER_API void Polygon2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polygon2_EEK_Count(void* ptr);\n\n\tCGALWRAPPER_API Box2d Polygon2_EEK_GetBoundingBox(void* ptr);\n\n\tCGALWRAPPER_API void* Polygon2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polygon2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API int Polygon2_EEK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API void Polygon2_EEK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polygon2_EEK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Insert(void* ptr, int index, Point2d point);\n\n\tCGALWRAPPER_API void Polygon2_EEK_InsertRange(void* ptr, int start, int count, Point2d* points);\n\n\tCGALWRAPPER_API double Polygon2_EEK_SqPerimeter(void* ptr);\n\n\tCGALWRAPPER_API Point2d Polygon2_EEK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polygon2_EEK_GetPoints(void* ptr, Point2d * points, int count);\n\n\tCGALWRAPPER_API void Polygon2_EEK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void Polygon2_EEK_SetPoint(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API void Polygon2_EEK_SetPoints(void* ptr, Point2d * points, int count);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polygon2_EEK_IsSimple(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polygon2_EEK_IsConvex(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Orientation Polygon2_EEK_Orientation(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Oriented_side Polygon2_EEK_OrientedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Polygon2_EEK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Polygon2_EEK_SignedArea(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Translate(void* ptr, const Point2d& translation);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Rotate(void* ptr, double rotation);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Scale(void* ptr, double scale);\n\n\tCGALWRAPPER_API void Polygon2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API BOOL Polygon2_EEK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary);\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/Polygon2_EIK.cpp",
    "content": "\n#include \"Polygon2_EIK.h\"\n#include \"Polygon2.h\"\n\n#include <CGAL/Polygon_2.h>\n\nvoid* Polygon2_EIK_Create()\n{\n\treturn Polygon2<EIK>::NewPolygon2();\n}\n\nvoid Polygon2_EIK_Release(void* ptr)\n{\n\tPolygon2<EIK>::DeletePolygon2(ptr);\n}\n\nint Polygon2_EIK_Count(void* ptr)\n{\n\tauto polygon = Polygon2<EIK>::CastToPolygon2(ptr);\n\treturn Polygon2<EIK>::Count(ptr);\n}\n\nBox2d Polygon2_EIK_GetBoundingBox(void* ptr)\n{\n\treturn Polygon2<EIK>::GetBoundingBox(ptr);\n}\n\nvoid* Polygon2_EIK_Copy(void* ptr)\n{\n\treturn Polygon2<EIK>::Copy(ptr);\n}\n\nvoid* Polygon2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polygon2<EIK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polygon2<EIK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polygon2<EIK>::Convert<EIK>(ptr);\n\t}\n}\n\nvoid Polygon2_EIK_Clear(void* ptr)\n{\n\tPolygon2<EIK>::Clear(ptr);\n}\n\nint Polygon2_EIK_Capacity(void* ptr)\n{\n\treturn Polygon2<EIK>::Capacity(ptr);\n}\n\nvoid Polygon2_EIK_Resize(void* ptr, int count)\n{\n\tPolygon2<EIK>::Resize(ptr, count);\n}\n\nvoid Polygon2_EIK_ShrinkToFit(void* ptr)\n{\n\tPolygon2<EIK>::ShrinkToFit(ptr);\n}\n\nvoid Polygon2_EIK_Erase(void* ptr, int index)\n{\n\tPolygon2<EIK>::Erase(ptr, index);\n}\n\nvoid Polygon2_EIK_EraseRange(void* ptr, int start, int count)\n{\n\tPolygon2<EIK>::Erase(ptr, start, count);\n}\n\nvoid Polygon2_EIK_Insert(void* ptr, int index, Point2d point)\n{\n\tPolygon2<EIK>::Insert(ptr, index, point);\n}\n\nvoid Polygon2_EIK_InsertRange(void* ptr, int start, int count, Point2d* points)\n{\n\tPolygon2<EIK>::Insert(ptr, start, count, points);\n}\n\ndouble Polygon2_EIK_SqPerimeter(void* ptr)\n{\n\treturn Polygon2<EIK>::SqPerimeter(ptr);\n}\n\nPoint2d Polygon2_EIK_GetPoint(void* ptr, int index)\n{\n\treturn Polygon2<EIK>::GetPoint(ptr, index);\n}\n\nvoid Polygon2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygon2<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid Polygon2_EIK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolygon2<EIK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polygon2_EIK_SetPoint(void* ptr, int index, const Point2d& point)\n{\n\tPolygon2<EIK>::SetPoint(ptr, index, point);\n}\n\nvoid Polygon2_EIK_SetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygon2<EIK>::SetPoints(ptr, points, count);\n}\n\nvoid Polygon2_EIK_Reverse(void* ptr)\n{\n\tPolygon2<EIK>::Reverse(ptr);\n}\n\nBOOL Polygon2_EIK_IsSimple(void* ptr)\n{\n\tauto polygon = (CGAL::Polygon_2<EIK>*)ptr;\n\treturn polygon->is_simple();\n\n\t//return Polygon2<EIK>::IsSimple<(ptr);\n}\n\nBOOL Polygon2_EIK_IsConvex(void* ptr)\n{\n\treturn Polygon2<EIK>::IsConvex(ptr);\n}\n\nCGAL::Orientation Polygon2_EIK_Orientation(void* ptr)\n{\n\treturn Polygon2<EIK>::Orientation(ptr);\n}\n\nCGAL::Oriented_side Polygon2_EIK_OrientedSide(void* ptr, const Point2d& point)\n{\n\treturn Polygon2<EIK>::OrientedSide(ptr, point);\n}\n\nCGAL::Bounded_side Polygon2_EIK_BoundedSide(void* ptr, const Point2d& point)\n{\n\treturn Polygon2<EIK>::BoundedSide(ptr, point);\n}\n\ndouble Polygon2_EIK_SignedArea(void* ptr)\n{\n\treturn Polygon2<EIK>::SignedArea(ptr);\n}\n\nvoid Polygon2_EIK_Translate(void* ptr, const Point2d& translation)\n{\n\tPolygon2<EIK>::Translate(ptr, translation);\n}\n\nvoid Polygon2_EIK_Rotate(void* ptr, double rotation)\n{\n\tPolygon2<EIK>::Rotate(ptr, rotation);\n}\n\nvoid Polygon2_EIK_Scale(void* ptr, double scale)\n{\n\tPolygon2<EIK>::Scale(ptr, scale);\n}\n\nvoid Polygon2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tPolygon2<EIK>::Transform(ptr, translation, rotation, scale);\n}\n\nBOOL Polygon2_EIK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n{\n\treturn Polygon2<EIK>::ContainsPoint(ptr, point, orientation, inculdeBoundary);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/Polygon2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Polygon2_EIK_Create();\n\n\tCGALWRAPPER_API void Polygon2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polygon2_EIK_Count(void* ptr);\n\n\tCGALWRAPPER_API Box2d Polygon2_EIK_GetBoundingBox(void* ptr);\n\n\tCGALWRAPPER_API void* Polygon2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polygon2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API int Polygon2_EIK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API void Polygon2_EIK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polygon2_EIK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Insert(void* ptr, int index, Point2d point);\n\n\tCGALWRAPPER_API void Polygon2_EIK_InsertRange(void* ptr, int start, int count, Point2d* points);\n\n\tCGALWRAPPER_API double Polygon2_EIK_SqPerimeter(void* ptr);\n\n\tCGALWRAPPER_API Point2d Polygon2_EIK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polygon2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polygon2_EIK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void Polygon2_EIK_SetPoint(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API void Polygon2_EIK_SetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polygon2_EIK_IsSimple(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polygon2_EIK_IsConvex(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Orientation Polygon2_EIK_Orientation(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Oriented_side Polygon2_EIK_OrientedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Polygon2_EIK_BoundedSide(void* ptr, const Point2d& point);\n\n\tCGALWRAPPER_API double Polygon2_EIK_SignedArea(void* ptr);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Translate(void* ptr, const Point2d& translation);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Rotate(void* ptr, double rotation);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Scale(void* ptr, double scale);\n\n\tCGALWRAPPER_API void Polygon2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API BOOL Polygon2_EIK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary);\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonBoolean2.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Boolean_set_operations_2.h>\n#include <CGAL/connect_holes.h>\n#include <CGAL/Polygon_2.h>\n#include <CGAL/enum.h>\n#include <vector>\n\ntemplate<class K>\nclass PolygonBoolean2\n{\n\npublic:\n\n\ttypedef CGAL::Polygon_2<K> Polygon_2;\n\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\nprivate:\n\t\n\tstd::vector<Pwh_2> buffer;\n\npublic:\n\n\tPolygonBoolean2() \n\t{\n\n\t}\n\n\t~PolygonBoolean2() \n\t{\n\n\t}\n\n\tinline static PolygonBoolean2* NewPolygonBoolean2()\n\t{\n\t\treturn new PolygonBoolean2();\n\t}\n\n\tinline static void DeletePolygonBoolean2(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonBoolean2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonBoolean2* CastToBoolean2(void* ptr)\n\t{\n\t\treturn static_cast<PolygonBoolean2*>(ptr);\n\t}\n\n\tinline static Polygon_2* CastToPolygon2(void* ptr)\n\t{\n\t\treturn static_cast<Polygon_2*>(ptr);\n\t}\n\n\tinline static Pwh_2* CastToPolygonWithHoles2(void* ptr)\n\t{\n\t\treturn static_cast<Pwh_2*>(ptr);\n\t}\n\n\tstatic void ClearBuffer(void* ptr)\n\t{\n\t\tauto boo = CastToBoolean2(ptr);\n\t\tboo->buffer.clear();\n\t}\n\n\tstatic void* CopyBufferItem(void* ptr, int index)\n\t{\n\t\tauto boo = CastToBoolean2(ptr);\n\t\treturn new Pwh_2(boo->buffer[index]);\n\t}\n\n\t//Do Intersect\n\n\ttemplate<class P1, class P2>\n\tBOOL DoIntersect(P1* polygon1, P2* polygon2)\n\t{\n\t\treturn CGAL::do_intersect(*polygon1, *polygon2);\n\t}\n\n\tstatic BOOL DoIntersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygon2(ptr2);\n\n\t\treturn boo->DoIntersect<Polygon_2, Polygon_2>(polygon1, polygon2);\n\t}\n\n\tstatic BOOL DoIntersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->DoIntersect<Polygon_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\tstatic BOOL DoIntersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygonWithHoles2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->DoIntersect<Pwh_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\t//Join\n\n\ttemplate<class P1, class P2>\n\tBOOL Join(P1* polygon1, P2* polygon2, void** resultPtr)\n\t{\n\t\tauto result = new CGAL::Polygon_with_holes_2<K>();\n\n\t\tif (CGAL::join(*polygon1, *polygon2, *result))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\tresult = nullptr;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic BOOL Join_P_P(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygon2(ptr2);\n\n\t\treturn boo->Join<Polygon_2, Polygon_2>(polygon1, polygon2, resultPtr);\n\t}\n\n\tstatic BOOL Join_P_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Join<Polygon_2, Pwh_2>(polygon1, polygon2, resultPtr);\n\t}\n\n\tstatic BOOL Join_PWH_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygonWithHoles2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Join<Pwh_2, Pwh_2>(polygon1, polygon2, resultPtr);\n\t}\n\n\t//Intersect\n\n\ttemplate<class P1, class P2>\n\tint Intersect(P1* polygon1, P2* polygon2)\n\t{\n\t\tCGAL::intersection(*polygon1, *polygon2, std::back_inserter(buffer));\n\t\treturn (int)buffer.size();\n\t}\n\n\tstatic int Intersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygon2(ptr2);\n\n\t\treturn boo->Intersect<Polygon_2, Polygon_2>(polygon1, polygon2);\n\t}\n\n\tstatic int Intersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Intersect<Polygon_2, Pwh_2>(polygon1, polygon2);\n\n\t}\n\n\tstatic int Intersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygonWithHoles2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Intersect<Pwh_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\t//Difference\n\n\ttemplate<class P1, class P2>\n\tint Difference(P1* polygon1, P2* polygon2)\n\t{\n\t\tCGAL::difference(*polygon1, *polygon2, std::back_inserter(buffer));\n\t\treturn (int)buffer.size();\n\t}\n\n\tstatic int Difference_P_P(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygon2(ptr2);\n\n\t\treturn boo->Difference<Polygon_2, Polygon_2>(polygon1, polygon2);\n\t}\n\n\tstatic int Difference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Difference<Polygon_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\tstatic int Difference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygonWithHoles2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->Difference<Pwh_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\t//Symmetric Difference\n\n\ttemplate<class P1, class P2>\n\tint SymmetricDifference(P1* polygon1, P2* polygon2)\n\t{\n\t\tCGAL::symmetric_difference(*polygon1, *polygon2, std::back_inserter(buffer));\n\t\treturn (int)buffer.size();\n\t}\n\n\tstatic int SymmetricDifference_P_P(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygon2(ptr2);\n\n\t\treturn boo->SymmetricDifference<Polygon_2, Polygon_2>(polygon1, polygon2);\n\t}\n\n\tstatic int SymmetricDifference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygon2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->SymmetricDifference<Polygon_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\tstatic int SymmetricDifference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto polygon1 = CastToPolygonWithHoles2(ptr1);\n\t\tauto polygon2 = CastToPolygonWithHoles2(ptr2);\n\n\t\treturn boo->SymmetricDifference<Pwh_2, Pwh_2>(polygon1, polygon2);\n\t}\n\n\t//Complement\n\n\ttemplate<class P>\n\tint Complement(P* polygon)\n\t{\n\t\tCGAL::complement(*polygon, std::back_inserter(buffer));\n\t\treturn (int)buffer.size();\n\t}\n\n\tstatic int Complement_PWH(void*ptr0, void* ptr1)\n\t{\n\t\tauto boo = CastToBoolean2(ptr0);\n\t\tauto pwh = CastToPolygonWithHoles2(ptr1);\n\n\t\treturn boo->Complement<Pwh_2>(pwh);\n\t}\n\n};\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonBoolean2_EEK.cpp",
    "content": "#include \"../pch.h\"\n#include \"PolygonBoolean2_EEK.h\"\n#include \"PolygonBoolean2.h\"\n#include <vector>\n#include <list>\n\nvoid* PolygonBoolean2_EEK_Create()\n{\n\treturn PolygonBoolean2<EEK>::NewPolygonBoolean2();\n}\n\nvoid PolygonBoolean2_EEK_Release(void* ptr)\n{\n\tPolygonBoolean2<EEK>::DeletePolygonBoolean2(ptr);\n}\n\nvoid PolygonBoolean2_EEK_ClearBuffer(void* ptr)\n{\n\tPolygonBoolean2<EEK>::ClearBuffer(ptr);\n}\n\nvoid* PolygonBoolean2_EEK_CopyBufferItem(void* ptr, int index)\n{\n\treturn PolygonBoolean2<EEK>::CopyBufferItem(ptr, index);\n}\n\nBOOL PolygonBoolean2_EEK_DoIntersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::DoIntersect_P_P(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EEK_DoIntersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::DoIntersect_P_PWH(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EEK_DoIntersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::DoIntersect_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EEK_Join_P_P(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EEK>::Join_P_P(ptr0, ptr1, ptr2, resultPtr);\n}\n\nBOOL PolygonBoolean2_EEK_Join_P_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EEK>::Join_P_PWH(ptr0, ptr1, ptr2, resultPtr);\n}\n\nBOOL PolygonBoolean2_EEK_Join_PWH_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EEK>::Join_PWH_PWH(ptr0, ptr1, ptr2, resultPtr);\n}\n\nint PolygonBoolean2_EEK_Intersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Intersect_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Intersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Intersect_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Intersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Intersect_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Difference_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Difference_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Difference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Difference_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Difference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::Difference_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_SymmetricDifference_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::SymmetricDifference_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_SymmetricDifference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::SymmetricDifference_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_SymmetricDifference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EEK>::SymmetricDifference_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EEK_Complement_PWH(void* ptr0, void* ptr1)\n{\n\treturn PolygonBoolean2<EEK>::Complement_PWH(ptr0, ptr1);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonBoolean2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonBoolean2_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonBoolean2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void PolygonBoolean2_EEK_ClearBuffer(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonBoolean2_EEK_CopyBufferItem(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_DoIntersect_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_DoIntersect_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_DoIntersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_Join_P_P(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_Join_P_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EEK_Join_PWH_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Intersect_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Intersect_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Intersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Difference_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Difference_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Difference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_SymmetricDifference_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_SymmetricDifference_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_SymmetricDifference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EEK_Complement_PWH(void* ptr0, void* ptr1);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonBoolean2_EIK.cpp",
    "content": "#include \"../pch.h\"\n#include \"PolygonBoolean2_EIK.h\"\n#include \"PolygonBoolean2.h\"\n#include <vector>\n#include <list>\n\nvoid* PolygonBoolean2_EIK_Create()\n{\n\treturn PolygonBoolean2<EIK>::NewPolygonBoolean2();\n}\n\nvoid PolygonBoolean2_EIK_Release(void* ptr)\n{\n\tPolygonBoolean2<EIK>::DeletePolygonBoolean2(ptr);\n}\n\nvoid PolygonBoolean2_EIK_ClearBuffer(void* ptr)\n{\n\tPolygonBoolean2<EIK>::ClearBuffer(ptr);\n}\n\nvoid* PolygonBoolean2_EIK_CopyBufferItem(void* ptr, int index)\n{\n\treturn PolygonBoolean2<EIK>::CopyBufferItem(ptr, index);\n}\n\nBOOL PolygonBoolean2_EIK_DoIntersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::DoIntersect_P_P(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EIK_DoIntersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::DoIntersect_P_PWH(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EIK_DoIntersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::DoIntersect_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nBOOL PolygonBoolean2_EIK_Join_P_P(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EIK>::Join_P_P(ptr0, ptr1, ptr2, resultPtr);\n}\n\nBOOL PolygonBoolean2_EIK_Join_P_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EIK>::Join_P_PWH(ptr0, ptr1, ptr2, resultPtr);\n}\n\nBOOL PolygonBoolean2_EIK_Join_PWH_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr)\n{\n\treturn PolygonBoolean2<EIK>::Join_PWH_PWH(ptr0, ptr1, ptr2, resultPtr);\n}\n\nint PolygonBoolean2_EIK_Intersect_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Intersect_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Intersect_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Intersect_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Intersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Intersect_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Difference_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Difference_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Difference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Difference_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Difference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::Difference_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_SymmetricDifference_P_P(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::SymmetricDifference_P_P(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_SymmetricDifference_P_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::SymmetricDifference_P_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_SymmetricDifference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2)\n{\n\treturn PolygonBoolean2<EIK>::SymmetricDifference_PWH_PWH(ptr0, ptr1, ptr2);\n}\n\nint PolygonBoolean2_EIK_Complement_PWH(void* ptr0, void* ptr1)\n{\n\treturn PolygonBoolean2<EIK>::Complement_PWH(ptr0, ptr1);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonBoolean2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonBoolean2_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonBoolean2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void PolygonBoolean2_EIK_ClearBuffer(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonBoolean2_EIK_CopyBufferItem(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_DoIntersect_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_DoIntersect_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_DoIntersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_Join_P_P(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_Join_P_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL PolygonBoolean2_EIK_Join_PWH_PWH(void* ptr0, void* ptr1, void* ptr2, void** resultPtr);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Intersect_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Intersect_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Intersect_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Difference_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Difference_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Difference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_SymmetricDifference_P_P(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_SymmetricDifference_P_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_SymmetricDifference_PWH_PWH(void* ptr0, void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API int PolygonBoolean2_EIK_Complement_PWH(void* ptr0, void* ptr1);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonMinkowski.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/minkowski_sum_2.h>\n#include <CGAL/Small_side_angle_bisector_decomposition_2.h>\n#include <CGAL/Polygon_convex_decomposition_2.h>\n#include <CGAL/Polygon_vertical_decomposition_2.h>\n#include <CGAL/Polygon_triangulation_decomposition_2.h>\n#include <CGAL/approximated_offset_2.h>\n\ntemplate<class K>\nclass PolygonMinkowski\n{\npublic:\n\n\tPolygonMinkowski()\n\t{\n\n\t}\n\n\tinline static PolygonMinkowski* NewPolygonMinkowski()\n\t{\n\t\treturn new PolygonMinkowski();\n\t}\n\n\tinline static void DeletePolygonMinkowski(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonMinkowski*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonMinkowski* CastToPolygonMinkowski(void* ptr)\n\t{\n\t\treturn static_cast<PolygonMinkowski*>(ptr);\n\t}\n\n\tstatic void* MinkowskiSum(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSumPWH(void* pwhPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_SSAB(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Small_side_angle_bisector_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_OptimalConvex(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Optimal_convex_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_HertelMehlhorn(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Hertel_Mehlhorn_convex_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_GreeneConvex(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Greene_convex_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_Vertical(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Polygon_vertical_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSumPWH_Vertical(void* pwhPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Polygon_vertical_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSum_Triangle(void* polyPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = Polygon2<K>::CastToPolygon2(polyPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Polygon_triangulation_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\tstatic void* MinkowskiSumPWH_Triangle(void* pwhPtr1, void* polyPtr2)\n\t{\n\t\tauto poly1 = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr1);\n\t\tauto poly2 = Polygon2<K>::CastToPolygon2(polyPtr2);\n\n\t\tCGAL::Polygon_triangulation_decomposition_2<K> decomp;\n\t\tauto sum = CGAL::minkowski_sum_2(*poly1, *poly2, decomp);\n\n\t\treturn PolygonWithHoles2<K>::NewPolygonWithHoles2(&sum);\n\t}\n\n\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonMinkowski_EEK.cpp",
    "content": "#include \"PolygonMinkowski_EEK.h\"\n#include \"PolygonMinkowski.h\"\n\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Polygon_2.h>\n#include <CGAL/minkowski_sum_2.h>\n#include <CGAL/Small_side_angle_bisector_decomposition_2.h>\n#include <CGAL/Polygon_convex_decomposition_2.h>\n#include <CGAL/Polygon_vertical_decomposition_2.h>\n#include <CGAL/Polygon_triangulation_decomposition_2.h>\n#include <CGAL/approximated_offset_2.h>\n\nvoid* PolygonMinkowski_EEK_Create()\n{\n\treturn PolygonMinkowski<EEK>::NewPolygonMinkowski();\n}\n\nvoid PolygonMinkowski_EEK_Release(void* ptr)\n{\n\tPolygonMinkowski<EEK>::DeletePolygonMinkowski(ptr);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSumPWH(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSumPWH(pwhPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_SSAB(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_SSAB(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_OptimalConvex(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_OptimalConvex(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_HertelMehlhorn(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_HertelMehlhorn(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_GreeneConvex(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_GreeneConvex(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_Vertical(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_Vertical(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSumPWH_Vertical(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSumPWH_Vertical(pwhPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSum_Triangle(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSum_Triangle(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EEK_MinkowskiSumPWH_Triangle(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EEK>::MinkowskiSumPWH_Triangle(pwhPtr1, polyPtr2);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonMinkowski_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonMinkowski_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSumPWH(void* pwhPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_SSAB(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_OptimalConvex(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_HertelMehlhorn(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_GreeneConvex(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_Vertical(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSumPWH_Vertical(void* pwhPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSum_Triangle(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EEK_MinkowskiSumPWH_Triangle(void* pwhPtr1, void* polyPtr2);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonMinkowski_EIK.cpp",
    "content": "#include \"PolygonMinkowski_EIK.h\"\n#include \"PolygonMinkowski.h\"\n\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Polygon_2.h>\n#include <CGAL/minkowski_sum_2.h>\n#include <CGAL/Small_side_angle_bisector_decomposition_2.h>\n#include <CGAL/Polygon_convex_decomposition_2.h>\n#include <CGAL/Polygon_vertical_decomposition_2.h>\n#include <CGAL/Polygon_triangulation_decomposition_2.h>\n#include <CGAL/approximated_offset_2.h>\n\nvoid* PolygonMinkowski_EIK_Create()\n{\n\treturn PolygonMinkowski<EIK>::NewPolygonMinkowski();\n}\n\nvoid PolygonMinkowski_EIK_Release(void* ptr)\n{\n\tPolygonMinkowski<EIK>::DeletePolygonMinkowski(ptr);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSumPWH(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSumPWH(pwhPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_SSAB(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_SSAB(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_OptimalConvex(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_OptimalConvex(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_HertelMehlhorn(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_HertelMehlhorn(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_GreeneConvex(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_GreeneConvex(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_Vertical(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_Vertical(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSumPWH_Vertical(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSumPWH_Vertical(pwhPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSum_Triangle(void* polyPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSum_Triangle(polyPtr1, polyPtr2);\n}\n\nvoid* PolygonMinkowski_EIK_MinkowskiSumPWH_Triangle(void* pwhPtr1, void* polyPtr2)\n{\n\treturn PolygonMinkowski<EIK>::MinkowskiSumPWH_Triangle(pwhPtr1, polyPtr2);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonMinkowski_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonMinkowski_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSumPWH(void* pwhPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_SSAB(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_OptimalConvex(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_HertelMehlhorn(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_GreeneConvex(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_Vertical(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSumPWH_Vertical(void* pwhPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSum_Triangle(void* polyPtr1, void* polyPtr2);\n\n\tCGALWRAPPER_API void* PolygonMinkowski_EIK_MinkowskiSumPWH_Triangle(void* pwhPtr1, void* polyPtr2);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonOffset2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <vector>\n#include <unordered_set>\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/create_offset_polygons_2.h>\n#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h>\n#include <boost/shared_ptr.hpp>\n\ntemplate<class K>\nclass PolygonOffset2\n{\n\nprivate:\n\n\ttypedef typename K::Point_2\t\t\t\t\t\tPoint;\n\ttypedef typename CGAL::Polygon_2<K>\t\t\t\tPolygon_2;\n\ttypedef typename CGAL::Polygon_2<EIK>\t\t    Polygon_2_EIK;\n\ttypedef CGAL::Polygon_with_holes_2<K>\t\t\tPolygon_with_holes;\n\n\ttypedef CGAL::Straight_skeleton_2<EIK>\t\t\tSs;\n\ttypedef boost::shared_ptr<Ss>\t\t\t\t\tSsPtr;\n\ttypedef typename Ss::Vertex_handle\t\t\t\tVertex;\n\ttypedef typename Ss::Halfedge_handle\t\t\tHalfEdge;\n\n\ttypedef boost::shared_ptr<Polygon_2_EIK>\t\tPolygonPtr;\n\ttypedef std::vector<PolygonPtr>\t\t\t\t\tPolygonPtrVector;\n\n\tstd::vector<Polygon_2*>  polygonBuffer;\n\n\tstd::vector<Segment2d> segmentBuffer;\n\npublic:\n\n\tinline static PolygonOffset2* NewPolygonOffset2()\n\t{\n\t\treturn new PolygonOffset2();\n\t}\n\n\tinline static void DeletePolygonOffset2(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonOffset2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonOffset2* CastToPolygonOffset2(void* ptr)\n\t{\n\t\treturn static_cast<PolygonOffset2*>(ptr);\n\t}\n\n\tstatic int PolygonBufferSize(void* ptr)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\treturn (int)offset->polygonBuffer.size();\n\t}\n\n\tstatic int SegmentBufferSize(void* ptr)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\treturn (int)offset->segmentBuffer.size();\n\t}\n\n\tstatic void ClearPolygonBuffer(void* ptr)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\toffset->polygonBuffer.clear();\n\t}\n\n\tstatic void ClearSegmentBuffer(void* ptr)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\toffset->segmentBuffer.clear();\n\t}\n\n\tstatic void* GetBufferedPolygon(void* ptr, int index)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\treturn offset->polygonBuffer[index];\n\t}\n\n\tstatic Segment2d GetSegment(void* ptr, int index)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\treturn offset->segmentBuffer[index];\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tsegments[i] = offset->segmentBuffer[i];\n\t}\n\n\tstatic void CreateInteriorOffset(void* ptr, void* polyPtr, double amount)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tauto polygons = CGAL::create_interior_skeleton_and_offset_polygons_2(amount, *poly);\n\t\toffset->CopyToBuffer(polygons);\n\t}\n\n\tstatic void CreateInteriorOffsetPWH(void* ptr, void* pwhPtr, double amount, BOOL boundaryOnly)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t{\n\t\t\tauto boundary = CGAL::create_interior_skeleton_and_offset_polygons_2(amount, pwh->outer_boundary());\n\t\t\toffset->CopyToBuffer(boundary);\n\t\t}\n\n\t\t/*\n\t\tif (!boundaryOnly)\n\t\t{\n\t\t\tfor (auto& hole : pwh->holes())\n\t\t\t{\n\t\t\t\tauto polygons = CGAL::create_interior_skeleton_and_offset_polygons_2(amount, hole);\n\t\t\t\toffset->CopyToBuffer(polygons);\n\t\t\t}\n\t\t}\n\t\t*/\n\t}\n\n\tstatic void CreateExteriorOffset(void* ptr, void* polyPtr, double maxOffset)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tauto polygons = CGAL::create_exterior_skeleton_and_offset_polygons_2(maxOffset, *poly);\n\t\toffset->CopyToBuffer(polygons);\n\t}\n\n\tstatic void CreateExteriorOffsetPWH(void* ptr, void* pwhPtr, double amount, BOOL boundaryOnly)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t{\n\t\t\tauto boundary = CGAL::create_exterior_skeleton_and_offset_polygons_2(amount, pwh->outer_boundary());\n\t\t\toffset->CopyToBuffer(boundary);\n\t\t}\n\t}\n\n\tvoid CopyToBuffer(const PolygonPtrVector& polygons)\n\t{\n\t\tfor (auto iter = polygons.begin(); iter != polygons.end(); ++iter)\n\t\t{\n\t\t\tauto p = new Polygon_2();\n\n\t\t\tfor (auto v = (*iter)->vertices_begin(); v != (*iter)->vertices_end(); ++v)\n\t\t\t{\n\t\t\t\tPoint point(v->x(), v->y());\n\t\t\t\tp->push_back(point);\n\t\t\t}\n\n\t\t\tpolygonBuffer.push_back(p);\n\t\t}\n\t}\n\n\tvoid CreateSegments(SsPtr iss, BOOL includeBorder)\n\t{\n\t\tstd::unordered_set<int> set;\n\n\t\tsegmentBuffer.clear();\n\n\t\tfor (HalfEdge edge = iss->halfedges_begin(); edge != iss->halfedges_end(); ++edge)\n\t\t{\n\t\t\tbool isBorder = edge->is_border() || edge->opposite()->is_border();\n\n\t\t\tif ((includeBorder && isBorder) || !isBorder)\n\t\t\t{\n\t\t\t\t\n\t\t\t\tif (set.find(edge->id()) == set.end())\n\t\t\t\t{\n\t\t\t\t\tauto a = Point2d::FromCGAL<EIK>(edge->vertex()->point());\n\t\t\t\t\tauto b = Point2d::FromCGAL<EIK>(edge->opposite()->vertex()->point());\n\n\t\t\t\t\tsegmentBuffer.push_back({ a, b });\n\n\t\t\t\t\tset.insert(edge->id());\n\t\t\t\t\tset.insert(edge->opposite()->id());\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\n\n\tstatic void CreateInteriorSkeleton(void* ptr, void* polyPtr, BOOL includeBorder)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tSsPtr iss = CGAL::create_interior_straight_skeleton_2(*poly);\n\t\toffset->CreateSegments(iss, includeBorder);\n\t}\n\n\tstatic void CreateInteriorSkeletonPWH(void* ptr, void* pwhPtr, BOOL includeBorder)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto pwh = Polygon2<K>::CastToPolygon2(pwhPtr);\n\n\t\tSsPtr iss = CGAL::create_interior_straight_skeleton_2(*pwh);\n\t\toffset->CreateSegments(iss, includeBorder);\n\t}\n\n\tstatic void CreateExteriorSkeleton(void* ptr, void* polyPtr, double maxOffset, BOOL includeBorder)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\t\n\t\tSsPtr iss = CGAL::create_exterior_straight_skeleton_2(maxOffset, *poly);\n\t\toffset->CreateSegments(iss, includeBorder);\n\t}\n\n\tstatic void CreateExteriorSkeletonPWH(void* ptr, void* pwhPtr, double maxOffset, BOOL includeBorder)\n\t{\n\t\tauto offset = CastToPolygonOffset2(ptr);\n\t\tauto pwh = Polygon2<K>::CastToPolygon2(pwhPtr);\n\n\t\tSsPtr iss = CGAL::create_exterior_straight_skeleton_2(maxOffset, *pwh);\n\t\toffset->CreateSegments(iss, includeBorder);\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonOffset2_EEK.cpp",
    "content": "\n#include \"PolygonOffset2_EEK.h\"\n#include \"PolygonOffset2.h\"\n\n#include <vector>\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/create_offset_polygons_2.h>\n#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h>\n#include <boost/shared_ptr.hpp>\n\nvoid* PolygonOffset2_EEK_Create()\n{\n\treturn PolygonOffset2<EEK>::NewPolygonOffset2();\n}\n\nvoid PolygonOffset2_EEK_Release(void* ptr)\n{\n\tPolygonOffset2<EEK>::DeletePolygonOffset2(ptr);\n}\n\nint PolygonOffset2_EEK_PolygonBufferSize(void* ptr)\n{\n\treturn PolygonOffset2<EEK>::PolygonBufferSize(ptr);\n}\n\nint PolygonOffset2_EEK_SegmentBufferSize(void* ptr)\n{\n\treturn PolygonOffset2<EEK>::SegmentBufferSize(ptr);\n}\n\nvoid PolygonOffset2_EEK_ClearPolygonBuffer(void* ptr)\n{\n\tPolygonOffset2<EEK>::ClearPolygonBuffer(ptr);\n}\n\nvoid PolygonOffset2_EEK_ClearSegmentBuffer(void* ptr)\n{\n\tPolygonOffset2<EEK>::ClearSegmentBuffer(ptr);\n}\n\nvoid* PolygonOffset2_EEK_GetBufferedPolygon(void* ptr, int index)\n{\n\treturn PolygonOffset2<EEK>::GetBufferedPolygon(ptr, index);\n}\n\nSegment2d PolygonOffset2_EEK_GetSegment(void* ptr, int index)\n{\n\treturn PolygonOffset2<EEK>::GetSegment(ptr, index);\n}\n\nvoid PolygonOffset2_EEK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolygonOffset2<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid PolygonOffset2_EEK_CreateInteriorOffset(void* ptr, void* polyPtr, double offset)\n{\n\tPolygonOffset2<EEK>::CreateInteriorOffset(ptr, polyPtr, offset);\n}\n\nvoid PolygonOffset2_EEK_CreateInteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly)\n{\n\tPolygonOffset2<EEK>::CreateInteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n}\n\nvoid PolygonOffset2_EEK_CreateExteriorOffset(void* ptr, void* polyPtr, double offset)\n{\n\tPolygonOffset2<EEK>::CreateExteriorOffset(ptr, polyPtr, offset);\n}\n\nvoid PolygonOffset2_EEK_CreateExteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly)\n{\n\tPolygonOffset2<EEK>::CreateExteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n}\n\nvoid PolygonOffset2_EEK_CreateInteriorSkeleton(void* ptr, void* polyPtr, BOOL includeBorder)\n{\n\tPolygonOffset2<EEK>::CreateInteriorSkeleton(ptr, polyPtr, includeBorder);\n}\n\nvoid PolygonOffset2_EEK_CreateInteriorSkeletonPWH(void* ptr, void* pwhPtr, BOOL includeBorder)\n{\n\tPolygonOffset2<EEK>::CreateInteriorSkeletonPWH(ptr, pwhPtr, includeBorder);\n}\n\nvoid PolygonOffset2_EEK_CreateExteriorSkeleton(void* ptr, void* polyPtr, double maxOffset, BOOL includeBorder)\n{\n\tPolygonOffset2<EEK>::CreateExteriorSkeleton(ptr, polyPtr, maxOffset, includeBorder);\n}\n\nvoid PolygonOffset2_EEK_CreateExteriorSkeletonPWH(void* ptr, void* pwhPtr, double maxOffset, BOOL includeBorder)\n{\n\tPolygonOffset2<EEK>::CreateExteriorSkeletonPWH(ptr, pwhPtr, maxOffset, includeBorder);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonOffset2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonOffset2_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int PolygonOffset2_EEK_PolygonBufferSize(void* ptr);\n\n\tCGALWRAPPER_API int PolygonOffset2_EEK_SegmentBufferSize(void* ptr);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_ClearPolygonBuffer(void* ptr);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_ClearSegmentBuffer(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonOffset2_EEK_GetBufferedPolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API Segment2d PolygonOffset2_EEK_GetSegment(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateInteriorOffset(void* ptr, void* polyPtr, double offset);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateInteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateExteriorOffset(void* ptr, void* polyPtr, double offset);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateExteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateInteriorSkeleton(void* ptr, void* polyPtr, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateInteriorSkeletonPWH(void* ptr, void* pwhPtr, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateExteriorSkeleton(void* ptr, void* polyPtr, double maxOffset, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EEK_CreateExteriorSkeletonPWH(void* ptr, void* pwhPtr, double maxOffset, BOOL includeBorder);\n\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonOffset2_EIK.cpp",
    "content": "\n#include \"PolygonOffset2_EIK.h\"\n#include \"PolygonOffset2.h\"\n\n#include <vector>\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/create_offset_polygons_2.h>\n#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h>\n#include <boost/shared_ptr.hpp>\n\nvoid* PolygonOffset2_EIK_Create()\n{\n\treturn PolygonOffset2<EIK>::NewPolygonOffset2();\n}\n\nvoid PolygonOffset2_EIK_Release(void* ptr)\n{\n\tPolygonOffset2<EIK>::DeletePolygonOffset2(ptr);\n}\n\nint PolygonOffset2_EIK_PolygonBufferSize(void* ptr)\n{\n\treturn PolygonOffset2<EIK>::PolygonBufferSize(ptr);\n}\n\nint PolygonOffset2_EIK_SegmentBufferSize(void* ptr)\n{\n\treturn PolygonOffset2<EIK>::SegmentBufferSize(ptr);\n}\n\nvoid PolygonOffset2_EIK_ClearPolygonBuffer(void* ptr)\n{\n\tPolygonOffset2<EIK>::ClearPolygonBuffer(ptr);\n}\n\nvoid PolygonOffset2_EIK_ClearSegmentBuffer(void* ptr)\n{\n\tPolygonOffset2<EIK>::ClearSegmentBuffer(ptr);\n}\n\nvoid* PolygonOffset2_EIK_GetBufferedPolygon(void* ptr, int index)\n{\n\treturn PolygonOffset2<EIK>::GetBufferedPolygon(ptr, index);\n}\n\nSegment2d PolygonOffset2_EIK_GetSegment(void* ptr, int index)\n{\n\treturn PolygonOffset2<EIK>::GetSegment(ptr, index);\n}\n\nvoid PolygonOffset2_EIK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolygonOffset2<EIK>::GetSegments(ptr, segments, count);\n}\n\nvoid PolygonOffset2_EIK_CreateInteriorOffset(void* ptr, void* polyPtr, double offset)\n{\n\tPolygonOffset2<EIK>::CreateInteriorOffset(ptr, polyPtr, offset);\n}\n\nvoid PolygonOffset2_EIK_CreateInteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly)\n{\n\tPolygonOffset2<EIK>::CreateInteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n}\n\nvoid PolygonOffset2_EIK_CreateExteriorOffset(void* ptr, void* polyPtr, double offset)\n{\n\tPolygonOffset2<EIK>::CreateExteriorOffset(ptr, polyPtr, offset);\n}\n\nvoid PolygonOffset2_EIK_CreateExteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly)\n{\n\tPolygonOffset2<EIK>::CreateExteriorOffsetPWH(ptr, pwhPtr, offset, boundaryOnly);\n}\n\nvoid PolygonOffset2_EIK_CreateInteriorSkeleton(void* ptr, void* polyPtr, BOOL includeBorder)\n{\n\tPolygonOffset2<EIK>::CreateInteriorSkeleton(ptr, polyPtr, includeBorder);\n}\n\nvoid PolygonOffset2_EIK_CreateInteriorSkeletonPWH(void* ptr, void* pwhPtr, BOOL includeBorder)\n{\n\tPolygonOffset2<EIK>::CreateInteriorSkeletonPWH(ptr, pwhPtr, includeBorder);\n}\n\nvoid PolygonOffset2_EIK_CreateExteriorSkeleton(void* ptr, void* polyPtr, double maxOffset, BOOL includeBorder)\n{\n\tPolygonOffset2<EIK>::CreateExteriorSkeleton(ptr, polyPtr, maxOffset, includeBorder);\n}\n\nvoid PolygonOffset2_EIK_CreateExteriorSkeletonPWH(void* ptr, void* pwhPtr, double maxOffset, BOOL includeBorder)\n{\n\tPolygonOffset2<EIK>::CreateExteriorSkeletonPWH(ptr, pwhPtr, maxOffset, includeBorder);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonOffset2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonOffset2_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int PolygonOffset2_EIK_PolygonBufferSize(void* ptr);\n\n\tCGALWRAPPER_API int PolygonOffset2_EIK_SegmentBufferSize(void* ptr);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_ClearPolygonBuffer(void* ptr);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_ClearSegmentBuffer(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonOffset2_EIK_GetBufferedPolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API Segment2d PolygonOffset2_EIK_GetSegment(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateInteriorOffset(void* ptr, void* polyPtr, double offset);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateInteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateExteriorOffset(void* ptr, void* polyPtr, double offset);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateExteriorOffsetPWH(void* ptr, void* pwhPtr, double offset, BOOL boundaryOnly);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateInteriorSkeleton(void* ptr, void* polyPtr, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateInteriorSkeletonPWH(void* ptr, void* pwhPtr, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateExteriorSkeleton(void* ptr, void* polyPtr, double maxOffset, BOOL includeBorder);\n\n\tCGALWRAPPER_API void PolygonOffset2_EIK_CreateExteriorSkeletonPWH(void* ptr, void* pwhPtr, double maxOffset, BOOL includeBorder);\n\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonPartition2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <vector>\n#include <CGAL/Partition_traits_2.h>\n#include <CGAL/partition_2.h>\n\ntemplate<class K>\nclass PolygonPartition2\n{\n\npublic:\n\n\ttypedef CGAL::Partition_traits_2<K> Traits;\n\ttypedef typename Traits::Point_2 Point_2;\n\ttypedef typename Traits::Polygon_2 Polygon_2;\n\ttypedef typename std::vector<Polygon_2> Polygon_List;\n\nprivate:\n\n\tPolygon_List buffer;\n\npublic:\n\n\tPolygonPartition2()\n\t{\n\n\t}\n\n\t~PolygonPartition2()\n\t{\n\n\t}\n\n\tinline static PolygonPartition2* NewPolygonPartition2()\n\t{\n\t\treturn new PolygonPartition2();\n\t}\n\n\tinline static void DeletePolygonPartition2(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonPartition2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonPartition2* CastToPolygonPartition2(void* ptr)\n\t{\n\t\treturn static_cast<PolygonPartition2*>(ptr);\n\t}\n\n\tstatic void ClearBuffer(void* ptr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tpar->buffer.clear();\n\t}\n\n\tstatic int BufferCount(void* ptr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic void* CopyBufferItem(void* ptr, int index)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\n\t\tauto copy = Polygon2<K>::NewPolygon2();\n\n\t\tfor (const Point_2& p : par->buffer[index])\n\t\t\tcopy->push_back(p);\n\n\t\treturn copy;\n\t}\n\n\tstatic BOOL Is_Y_Monotone(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\treturn CGAL::is_y_monotone_2(poly->vertices_begin(), poly->vertices_end());\n\t}\n\n\tstatic BOOL Is_Y_MonotonePWH(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = PolygonWithHoles2<K>::CastToPolygonWithHoles2(polyPtr);\n\n\t\treturn CGAL::is_y_monotone_2(poly->outer_boundary().vertices_begin(), poly->outer_boundary().vertices_end());\n\t}\n\n\tstatic BOOL PartionIsValid(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\treturn CGAL::partition_is_valid_2(poly->vertices_begin(), poly->vertices_end(), par->buffer.begin(), par->buffer.end());\n\t}\n\n\tstatic BOOL ConvexPartionIsValid(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\treturn CGAL::convex_partition_is_valid_2(poly->vertices_begin(), poly->vertices_end(), par->buffer.begin(), par->buffer.end());\n\t}\n\n\tstatic BOOL Y_MonotonePartionIsValid(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\treturn CGAL::y_monotone_partition_is_valid_2(poly->vertices_begin(), poly->vertices_end(), par->buffer.begin(), par->buffer.end());\n\t}\n\n\tstatic int Y_MonotonePartition(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::y_monotone_partition_2(poly->vertices_begin(), poly->vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int Y_MonotonePartitionPWH(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = PolygonWithHoles2<K>::CastToPolygonWithHoles2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::y_monotone_partition_2(poly->outer_boundary().vertices_begin(), poly->outer_boundary().vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int ApproxConvexPartition(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::approx_convex_partition_2(poly->vertices_begin(), poly->vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int ApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = PolygonWithHoles2<K>::CastToPolygonWithHoles2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::approx_convex_partition_2(poly->outer_boundary().vertices_begin(), poly->outer_boundary().vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int GreeneApproxConvexPartition(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::greene_approx_convex_partition_2(poly->vertices_begin(), poly->vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int GreeneApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = PolygonWithHoles2<K>::CastToPolygonWithHoles2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::greene_approx_convex_partition_2(poly->outer_boundary().vertices_begin(), poly->outer_boundary().vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int OptimalConvexPartition(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::optimal_convex_partition_2(poly->vertices_begin(), poly->vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\tstatic int OptimalConvexPartitionPWH(void* ptr, void* polyPtr)\n\t{\n\t\tauto par = CastToPolygonPartition2(ptr);\n\t\tauto poly = PolygonWithHoles2<K>::CastToPolygonWithHoles2(polyPtr);\n\n\t\tpar->buffer.clear();\n\t\tCGAL::optimal_convex_partition_2(poly->outer_boundary().vertices_begin(), poly->outer_boundary().vertices_end(), std::back_inserter(par->buffer));\n\n\t\treturn (int)par->buffer.size();\n\t}\n\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonPartition2_EEK.cpp",
    "content": "\n#include \"PolygonPartition2_EEK.h\"\n#include \"PolygonPartition2.h\"\n\nvoid* PolygonPartition2_EEK_Create()\n{\n\treturn PolygonPartition2<EEK>::NewPolygonPartition2();\n}\n\nvoid PolygonPartition2_EEK_Release(void* ptr)\n{\n\tPolygonPartition2<EEK>::DeletePolygonPartition2(ptr);\n}\n\nvoid PolygonPartition2_EEK_ClearBuffer(void* ptr)\n{\n\tPolygonPartition2<EEK>::ClearBuffer(ptr);\n}\n\nint PolygonPartition2_EEK_BufferCount(void* ptr)\n{\n\treturn PolygonPartition2<EEK>::BufferCount(ptr);\n}\n\nvoid* PolygonPartition2_EEK_CopyBufferItem(void* ptr, int index)\n{\n\treturn PolygonPartition2<EEK>::CopyBufferItem(ptr, index);\n}\n\nBOOL PolygonPartition2_EEK_Is_Y_Monotone(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::Is_Y_Monotone(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EEK_Is_Y_MonotonePWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::Is_Y_MonotonePWH(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EEK_PartitionIsValid(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::PartionIsValid(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EEK_ConvexPartitionIsValid(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::ConvexPartionIsValid(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_Y_MonotonePartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::Y_MonotonePartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_Y_MonotonePartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::Y_MonotonePartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_ApproxConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::ApproxConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_ApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::ApproxConvexPartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_GreeneApproxConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::GreeneApproxConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_GreeneApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::GreeneApproxConvexPartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_OptimalConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::OptimalConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EEK_OptimalConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EEK>::OptimalConvexPartitionPWH(ptr, polyPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonPartition2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* PolygonPartition2_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonPartition2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void PolygonPartition2_EEK_ClearBuffer(void* ptr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_BufferCount(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonPartition2_EEK_CopyBufferItem(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EEK_Is_Y_Monotone(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EEK_Is_Y_MonotonePWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EEK_PartitionIsValid(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EEK_ConvexPartitionIsValid(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int  PolygonPartition2_EEK_Y_MonotonePartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int  PolygonPartition2_EEK_Y_MonotonePartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_ApproxConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_ApproxConvexPartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_GreeneApproxConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_GreeneApproxConvexPartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_OptimalConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EEK_OptimalConvexPartitionPWH(void* ptr, void* polyPtr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonPartition2_EIK.cpp",
    "content": "\n#include \"PolygonPartition2_EIK.h\"\n#include \"PolygonPartition2.h\"\n\nvoid* PolygonPartition2_EIK_Create()\n{\n\treturn PolygonPartition2<EIK>::NewPolygonPartition2();\n}\n\nvoid PolygonPartition2_EIK_Release(void* ptr)\n{\n\tPolygonPartition2<EIK>::DeletePolygonPartition2(ptr);\n}\n\nvoid PolygonPartition2_EIK_ClearBuffer(void* ptr)\n{\n\tPolygonPartition2<EIK>::ClearBuffer(ptr);\n}\n\nint PolygonPartition2_EIK_BufferCount(void* ptr)\n{\n\treturn PolygonPartition2<EIK>::BufferCount(ptr);\n}\n\nvoid* PolygonPartition2_EIK_CopyBufferItem(void* ptr, int index)\n{\n\treturn PolygonPartition2<EIK>::CopyBufferItem(ptr, index);\n}\n\nBOOL PolygonPartition2_EIK_Is_Y_Monotone(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::Is_Y_Monotone(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EIK_Is_Y_MonotonePWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::Is_Y_MonotonePWH(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EIK_PartitionIsValid(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::PartionIsValid(ptr, polyPtr);\n}\n\nBOOL PolygonPartition2_EIK_ConvexPartitionIsValid(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::ConvexPartionIsValid(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_Y_MonotonePartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::Y_MonotonePartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_Y_MonotonePartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::Y_MonotonePartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_ApproxConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::ApproxConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_ApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::ApproxConvexPartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_GreeneApproxConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::GreeneApproxConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_GreeneApproxConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::GreeneApproxConvexPartitionPWH(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_OptimalConvexPartition(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::OptimalConvexPartition(ptr, polyPtr);\n}\n\nint PolygonPartition2_EIK_OptimalConvexPartitionPWH(void* ptr, void* polyPtr)\n{\n\treturn PolygonPartition2<EIK>::OptimalConvexPartitionPWH(ptr, polyPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonPartition2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* PolygonPartition2_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonPartition2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void PolygonPartition2_EIK_ClearBuffer(void* ptr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_BufferCount(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonPartition2_EIK_CopyBufferItem(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EIK_Is_Y_Monotone(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EIK_Is_Y_MonotonePWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EIK_PartitionIsValid(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API BOOL PolygonPartition2_EIK_ConvexPartitionIsValid(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int  PolygonPartition2_EIK_Y_MonotonePartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int  PolygonPartition2_EIK_Y_MonotonePartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_ApproxConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_ApproxConvexPartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_GreeneApproxConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_GreeneApproxConvexPartitionPWH(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_OptimalConvexPartition(void* ptr, void* polyPtr);\n\n\tCGALWRAPPER_API int PolygonPartition2_EIK_OptimalConvexPartitionPWH(void* ptr, void* polyPtr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonSimplification2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/enum.h> \n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/Polyline_simplification_2/simplify.h>\n#include <CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h>\n\ntemplate<class K>\nclass PolygonSimplification2\n{\n\npublic:\n\n\tPolygonSimplification2() {}\n\n\ttypedef CGAL::Polygon_2<K> Polygon_2;\n\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\ttypedef CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold stop_below_ratio;\n\ttypedef CGAL::Polyline_simplification_2::Stop_below_count_threshold stop_below_threshold;\n\ttypedef CGAL::Polyline_simplification_2::Stop_above_cost_threshold stop_above_threshold;\n\n\ttypedef CGAL::Polyline_simplification_2::Squared_distance_cost            sq_dist_cost;\n\ttypedef CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost<K>  hsq_dist_cost;\n\ttypedef CGAL::Polyline_simplification_2::Scaled_squared_distance_cost     ssq_dist_cost;\n\n\tinline static PolygonSimplification2* NewPolygonSimplification2()\n\t{\n\t\treturn new PolygonSimplification2();\n\t}\n\n\tinline static void DeletePolygonSimplification2(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonSimplification2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonSimplification2* CastToPolygonSimplification2(void* ptr)\n\t{\n\t\treturn static_cast<PolygonSimplification2*>(ptr);\n\t}\n\n\tinline static Polygon_2* CastToPolygon2(void* ptr)\n\t{\n\t\treturn static_cast<Polygon_2*>(ptr);\n\t}\n\n\tinline static Pwh_2* CastToPolygonWithHoles2(void* ptr)\n\t{\n\t\treturn static_cast<Pwh_2*>(ptr);\n\t}\n\n\tstatic void* Simplify(void* polyPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n\t{\n\t\tauto poly = CastToPolygon2(polyPtr);\n\n\t\tsize_t intThreshold = (size_t)std::round(theshold);\n\n\t\tPolygon_2 result;\n\n\t\tswitch (costFunc)\n\t\t{\n\n\t\tcase COST_FUNC::SQUARE_DIST:\n\t\t\tswitch (stopFunc)\n\t\t\t{\n\t\t\tcase STOP_FUNC::ABOVE_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, sq_dist_cost(), stop_above_threshold(theshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, sq_dist_cost(), stop_below_threshold(intThreshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_RATIO:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, sq_dist_cost(), stop_below_ratio(theshold));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase COST_FUNC::SCALED_SQ_DIST:\n\t\t\tswitch (stopFunc)\n\t\t\t{\n\t\t\tcase STOP_FUNC::ABOVE_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, ssq_dist_cost(), stop_above_threshold(theshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, ssq_dist_cost(), stop_below_threshold(intThreshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_RATIO:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(*poly, ssq_dist_cost(), stop_below_ratio(theshold));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\treturn new Polygon_2(result);\n\t}\n\n\tstatic Polygon_2 Simplify(const Polygon_2& poly, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n\t{\n\n\t\tsize_t intThreshold = (size_t)std::round(theshold);\n\n\t\tPolygon_2 result;\n\n\t\tswitch (costFunc)\n\t\t{\n\n\t\tcase COST_FUNC::SQUARE_DIST:\n\t\t\tswitch (stopFunc)\n\t\t\t{\n\t\t\tcase STOP_FUNC::ABOVE_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, sq_dist_cost(), stop_above_threshold(theshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, sq_dist_cost(), stop_below_threshold(intThreshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_RATIO:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, sq_dist_cost(), stop_below_ratio(theshold));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase COST_FUNC::SCALED_SQ_DIST:\n\t\t\tswitch (stopFunc)\n\t\t\t{\n\t\t\tcase STOP_FUNC::ABOVE_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, ssq_dist_cost(), stop_above_threshold(theshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_THRESHOLD:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, ssq_dist_cost(), stop_below_threshold(intThreshold));\n\t\t\t\tbreak;\n\t\t\tcase STOP_FUNC::BELOW_RATIO:\n\t\t\t\tresult = CGAL::Polyline_simplification_2::simplify(poly, ssq_dist_cost(), stop_below_ratio(theshold));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tstatic void* SimplifyPolygonWithHoles_All(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double threshold)\n\t{\n\t\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\t\tauto pwh = PolygonSimplification2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tPwh_2* p = nullptr;\n\n\t\tif (!pwh->is_unbounded())\n\t\t{\n\t\t\tauto boundary = Simplify(pwh->outer_boundary(), costFunc, stopFunc, threshold);\n\t\t\tp = new Pwh_2(boundary);\n\t\t}\n\t\telse\n\t\t\tp = new Pwh_2();\n\n\t\tfor (auto hole : pwh->holes())\n\t\t{\n\t\t\tauto h = Simplify(hole, costFunc, stopFunc, threshold);\n\t\t\tp->add_hole(h);\n\t\t}\n\n\t\treturn p;\n\t}\n\n\tstatic void* SimplifyPolygonWithHoles_Boundary(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double threshold)\n\t{\n\t\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\t\tauto pwh = PolygonSimplification2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tPwh_2* p = nullptr;\n\n\t\tif (!pwh->is_unbounded())\n\t\t{\n\t\t\tauto boundary = Simplify(pwh->outer_boundary(), costFunc, stopFunc, threshold);\n\t\t\tp = new Pwh_2(boundary);\n\t\t}\n\t\telse\n\t\t\tp = new Pwh_2();\n\n\t\tfor (auto hole : pwh->holes())\n\t\t\tp->add_hole(hole);\n\t\t\n\t\treturn p;\n\t}\n\n\tstatic void* SimplifyPolygonWithHoles_Holes(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double threshold)\n\t{\n\t\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\t\tauto pwh = PolygonSimplification2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tPwh_2* p = nullptr;\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tp = new Pwh_2(pwh->outer_boundary());\n\t\telse\n\t\t\tp = new Pwh_2();\n\n\t\tfor (auto hole : pwh->holes())\n\t\t\tp->add_hole(hole);\n\n\t\treturn p;\n\t}\n\n\tstatic void* SimplifyPolygonWithHoles_Hole(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double threshold, int index)\n\t{\n\t\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\t\tauto pwh = PolygonSimplification2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tPwh_2* p = nullptr;\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tp = new Pwh_2(pwh->outer_boundary());\n\t\telse\n\t\t\tp = new Pwh_2();\n\n\t\tint count = 0;\n\t\tfor (auto hole : pwh->holes())\n\t\t{\n\t\t\tif (count == index)\n\t\t\t{\n\t\t\t\tauto h = Simplify(hole, costFunc, stopFunc, threshold);\n\t\t\t\tp->add_hole(h);\n\t\t\t}\n\t\t\telse\n\t\t\t\tp->add_hole(hole);\n\n\t\t\tcount++;\n\t\t}\n\t\t\t\n\t\treturn p;\n\t}\n\n};\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonSimplification2_EEK.cpp",
    "content": "\n#include \"PolygonSimplification2_EEK.h\"\n#include \"PolygonSimplification2.h\"\n#include <vector>\n#include <list>\n\nvoid* PolygonSimplification2_EEK_Create()\n{\n\treturn PolygonSimplification2<EEK>::NewPolygonSimplification2();\n}\n\nvoid PolygonSimplification2_EEK_Release(void* ptr)\n{\n\tPolygonSimplification2<EEK>::DeletePolygonSimplification2(ptr);\n}\n\nvoid* PolygonSimplification2_EEK_Simplify(void* polyPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\t\n\treturn PolygonSimplification2<EEK>::Simplify(polyPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_All(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EEK>::SimplifyPolygonWithHoles_All(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Boundary(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EEK>::SimplifyPolygonWithHoles_Boundary(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Holes(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EEK>::SimplifyPolygonWithHoles_Holes(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Hole(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold, int index)\n{\n\treturn PolygonSimplification2<EEK>::SimplifyPolygonWithHoles_Hole(pwhPtr, costFunc, stopFunc, theshold, index);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonSimplification2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/enum.h>\n\nenum COST_FUNC : int\n{\n\tSQUARE_DIST,\n\tSCALED_SQ_DIST\n};\n\nenum STOP_FUNC : int\n{\n\tBELOW_RATIO,\n\tBELOW_THRESHOLD,\n\tABOVE_THRESHOLD\n};\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonSimplification2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_Simplify(void* polyPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_All(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Boundary(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Holes(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EEK_SimplifyPolygonWithHoles_Hole(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold, int index);\n\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonSimplification2_EIK.cpp",
    "content": "\n#include \"PolygonSimplification2_EIK.h\"\n#include \"PolygonSimplification2.h\"\n#include <vector>\n#include <list>\n\nvoid* PolygonSimplification2_EIK_Create()\n{\n\treturn PolygonSimplification2<EIK>::NewPolygonSimplification2();\n}\n\nvoid PolygonSimplification2_EIK_Release(void* ptr)\n{\n\tPolygonSimplification2<EIK>::DeletePolygonSimplification2(ptr);\n}\n\nvoid* PolygonSimplification2_EIK_Simplify(void* polyPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EIK>::Simplify(polyPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_All(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EIK>::SimplifyPolygonWithHoles_All(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Boundary(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EIK>::SimplifyPolygonWithHoles_Boundary(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Holes(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold)\n{\n\treturn PolygonSimplification2<EIK>::SimplifyPolygonWithHoles_Holes(pwhPtr, costFunc, stopFunc, theshold);\n}\n\nvoid* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Hole(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold, int index)\n{\n\treturn PolygonSimplification2<EIK>::SimplifyPolygonWithHoles_Hole(pwhPtr, costFunc, stopFunc, theshold, index);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonSimplification2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/enum.h>\n\nenum COST_FUNC : int\n{\n\tSQUARE_DIST,\n\tSCALED_SQ_DIST\n};\n\nenum STOP_FUNC : int\n{\n\tBELOW_RATIO,\n\tBELOW_THRESHOLD,\n\tABOVE_THRESHOLD\n};\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonSimplification2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_Simplify(void* polyPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_All(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Boundary(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Holes(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold);\n\n\tCGALWRAPPER_API void* PolygonSimplification2_EIK_SimplifyPolygonWithHoles_Hole(void* pwhPtr, COST_FUNC costFunc, STOP_FUNC stopFunc, double theshold, int index);\n\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonVisibility_EEK.cpp",
    "content": "#include \"PolygonVisibility_EEK.h\"\n#include \"PolygonVisiblity.h\"\n\nvoid* PolygonVisibility_EEK_Create()\n{\n\treturn PolygonVisibility<EEK>::NewPolygonVisibility();\n}\n\nvoid PolygonVisibility_EEK_Release(void* ptr)\n{\n\tPolygonVisibility<EEK>::DeletePolygonVisibility(ptr);\n}\n\nvoid* PolygonVisibility_EEK_ComputeVisibilitySimple(const Point2d& point, void* polyPtr)\n{\n\treturn PolygonVisibility<EEK>::ComputeVisibilitySimple(point, polyPtr);\n}\n\nvoid* PolygonVisibility_EEK_ComputeVisibilityTEV(const Point2d& point, void* pwhPtr)\n{\n\treturn PolygonVisibility<EEK>::ComputeVisibilityTEV(point, pwhPtr);\n}\n\nvoid* PolygonVisibility_EEK_ComputeVisibilityRSV(const Point2d& point, void* pwhPtr)\n{\n\treturn PolygonVisibility<EEK>::ComputeVisibilityRSV(point, pwhPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonVisibility_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonVisibility_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonVisibility_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EEK_ComputeVisibilitySimple(const Point2d& point, void* polyPtr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EEK_ComputeVisibilityTEV(const Point2d& point, void* pwhPtr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EEK_ComputeVisibilityRSV(const Point2d& point, void* pwhPtr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonVisibility_EIK.cpp",
    "content": "#include \"PolygonVisibility_EIK.h\"\n#include \"PolygonVisiblity.h\"\n\nvoid* PolygonVisibility_EIK_Create()\n{\n\treturn PolygonVisibility<EIK>::NewPolygonVisibility();\n}\n\nvoid PolygonVisibility_EIK_Release(void* ptr)\n{\n\tPolygonVisibility<EIK>::DeletePolygonVisibility(ptr);\n}\n\nvoid* PolygonVisibility_EIK_ComputeVisibilitySimple(const Point2d& point, void* polyPtr)\n{\n\treturn PolygonVisibility<EIK>::ComputeVisibilitySimple(point, polyPtr);\n}\n\nvoid* PolygonVisibility_EIK_ComputeVisibilityTEV(const Point2d& point, void* pwhPtr)\n{\n\treturn PolygonVisibility<EIK>::ComputeVisibilityTEV(point, pwhPtr);\n}\n\nvoid* PolygonVisibility_EIK_ComputeVisibilityRSV(const Point2d& point, void* pwhPtr)\n{\n\treturn PolygonVisibility<EIK>::ComputeVisibilityRSV(point, pwhPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonVisibility_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonVisibility_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonVisibility_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EIK_ComputeVisibilitySimple(const Point2d& point, void* polyPtr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EIK_ComputeVisibilityTEV(const Point2d& point, void* pwhPtr);\n\n\tCGALWRAPPER_API void* PolygonVisibility_EIK_ComputeVisibilityRSV(const Point2d& point, void* pwhPtr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonVisiblity.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Polygon2.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/Exact_predicates_exact_constructions_kernel.h>\n#include <CGAL/Simple_polygon_visibility_2.h>\n#include <CGAL/Triangular_expansion_visibility_2.h>\n#include <CGAL/Rotational_sweep_visibility_2.h>\n#include <CGAL/Arrangement_2.h>\n#include <CGAL/Arr_segment_traits_2.h>\n#include <CGAL/Arr_naive_point_location.h>\n#include <istream>\n#include <vector>\n\ntemplate<class K>\nclass PolygonVisibility\n{\npublic:\n\n\t//typedef CGAL::Exact_predicates_exact_constructions_kernel       Kernel;\n\ttypedef CGAL::Polygon_2<K>                                        Point_2;\n\ttypedef CGAL::Segment_2<K>                                      Segment_2;\n\ttypedef CGAL::Arr_segment_traits_2<K>                      Traits_2;\n\ttypedef CGAL::Arrangement_2<Traits_2>                           Arrangement_2;\n\n\ttypedef CGAL::Triangular_expansion_visibility_2<Arrangement_2>  TEV;\n\ttypedef CGAL::Rotational_sweep_visibility_2<Arrangement_2> RSV;\n\n\ttypedef CGAL::Arr_walk_along_line_point_location<Arrangement_2> Locator;\n\n\ttypedef typename Polygon2<K>::Polygon_2 Polygon;\n\ttypedef typename PolygonWithHoles2<K>::Pwh_2 Pwh;\n\n\tinline static PolygonVisibility* NewPolygonVisibility()\n\t{\n\t\treturn new PolygonVisibility();\n\t}\n\n\tinline static void DeletePolygonVisibility(void* ptr)\n\t{\n\t\tauto obj = static_cast<PolygonVisibility*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static PolygonVisibility* CastToPolygonVisibility(void* ptr)\n\t{\n\t\treturn static_cast<PolygonVisibility>(ptr);\n\t}\n\n\tstatic void GetSegments(std::vector<Segment_2>& segments, const Polygon& poly)\n\t{\n\t\tint count = (int)poly.size();\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (i != count - 1)\n\t\t\t{\n\t\t\t\tauto p1 = poly.vertex(i);\n\t\t\t\tauto p2 = poly.vertex(i + 1);\n\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto p1 = poly.vertex(i);\n\t\t\t\tauto p2 = poly.vertex(0);\n\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void GetSegments(std::vector<Segment_2>& segments, const Pwh& pwh)\n\t{\n\t\tint count = (int)pwh.outer_boundary().size();\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (i != count - 1)\n\t\t\t{\n\t\t\t\tauto p1 = pwh.outer_boundary().vertex(i);\n\t\t\t\tauto p2 = pwh.outer_boundary().vertex(i + 1);\n\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto p1 = pwh.outer_boundary().vertex(i);\n\t\t\t\tauto p2 = pwh.outer_boundary().vertex(0);\n\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t}\n\t\t}\n\n\t\tint holes = (int)pwh.number_of_holes();\n\t\tfor (int j = 0; j < holes; j++)\n\t\t{\n\t\t\tauto& hole = pwh.holes().at(j);\n\t\t\tcount = (int)hole.size();\n\t\t\tfor (int i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tif (i != count - 1)\n\t\t\t\t{\n\t\t\t\t\tauto p1 = hole.vertex(i);\n\t\t\t\t\tauto p2 = hole.vertex(i + 1);\n\t\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tauto p1 = hole.vertex(i);\n\t\t\t\t\tauto p2 = hole.vertex(0);\n\t\t\t\t\tsegments.push_back(Segment_2(p1, p2));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void* ComputeVisibilitySimple(const Point2d& point, void* polyPtr)\n\t{\n\n\t\tauto poly = Polygon2<K>::CastToPolygon2(polyPtr);\n\n\t\tstd::vector<Segment_2> segments;\n\t\tGetSegments(segments, *poly);\n\n\t\tArrangement_2 env;\n\t\tCGAL::insert_non_intersecting_curves(env, segments.begin(), segments.end());\n\n\t\tLocator pl(env);\n\n\t\tauto q = point.ToCGAL<K>();\n\t\tauto obj = pl.locate(q);\n\t\tauto face = boost::get<Arrangement_2::Face_const_handle>(&obj);\n\n\t\ttypedef CGAL::Simple_polygon_visibility_2<Arrangement_2, CGAL::Tag_true> RSPV;\n\n\t\tArrangement_2 regular_output;\n\t\tRSPV regular_visibility(env);\n\t\tregular_visibility.compute_visibility(q, *face, regular_output);\n\n\t\tauto result = Polygon2<K>::NewPolygon2();\n\t\tauto start = regular_output.edges_begin()->next();\n\t\tauto eit = start;\n\n\t\tdo\n\t\t{\n\t\t\tauto p = eit->source()->point();\n\t\t\tresult->push_back(p);\n\t\t\teit = eit->next();\n\n\t\t} while (eit != start);\n\n\t\treturn result;\n\t}\n\n\tstatic void* ComputeVisibilityTEV(const Point2d& point, void* pwhPtr)\n\t{\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tstd::vector<Segment_2> segments;\n\t\tGetSegments(segments, *pwh);\n\n\t\tArrangement_2 env;\n\t\tCGAL::insert_non_intersecting_curves(env, segments.begin(), segments.end());\n\n\t\tLocator pl(env);\n\n\t\tauto q = point.ToCGAL<K>();\n\t\tauto obj = pl.locate(q);\n\t\tauto face = boost::get<Arrangement_2::Face_const_handle>(&obj);\n\n\t\tArrangement_2 output_arr;\n\t\tTEV tev(env);\n\t\tauto fh = tev.compute_visibility(q, *face, output_arr);\n\n\t\tauto result = PolygonWithHoles2<K>::NewPolygonWithHoles2();\n\t\tauto curr = fh->outer_ccb();\n\n\t\tresult->outer_boundary().push_back(curr->source()->point());\n\n\t\twhile (++curr != fh->outer_ccb())\n\t\t{\n\t\t\tresult->outer_boundary().push_back(curr->source()->point());\n\t\t}\n\t\t\t\n\t\treturn result;\n\t}\n\n\tstatic void* ComputeVisibilityRSV(const Point2d& point, void* pwhPtr)\n\t{\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tstd::vector<Segment_2> segments;\n\t\tGetSegments(segments, *pwh);\n\n\t\tArrangement_2 env;\n\t\tCGAL::insert_non_intersecting_curves(env, segments.begin(), segments.end());\n\n\t\tLocator pl(env);\n\n\t\tauto q = point.ToCGAL<K>();\n\t\tauto obj = pl.locate(q);\n\t\tauto face = boost::get<Arrangement_2::Face_const_handle>(&obj);\n\n\t\tArrangement_2 output_arr;\n\t\tRSV rsv(env);\n\t\tauto fh = rsv.compute_visibility(q, *face, output_arr);\n\n\t\tauto result = PolygonWithHoles2<K>::NewPolygonWithHoles2();\n\t\tauto curr = fh->outer_ccb();\n\n\t\tresult->outer_boundary().push_back(curr->source()->point());\n\n\t\twhile (++curr != fh->outer_ccb())\n\t\t{\n\t\t\tresult->outer_boundary().push_back(curr->source()->point());\n\t\t}\n\n\t\treturn result;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonWithHoles2.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/connect_holes.h>\n#include <CGAL/enum.h>\n#include <CGAL/Cartesian_converter.h>\n\n#define BOUNDARY_INDEX -1\n\ntemplate<class K>\nclass PolygonWithHoles2\n{\n\nprivate:\n\n\tPolygonWithHoles2() {}\n\npublic:\n\n\ttypedef CGAL::Polygon_with_holes_2<K> Pwh_2;\n\ttypedef CGAL::Polygon_2<K> Polygon_2;\n\ttypedef CGAL::Point_2<K> Point_2;\n\n\tstatic Pwh_2* NewPolygonWithHoles2()\n\t{\n\t\treturn new Pwh_2();\n\t}\n\n\tstatic Pwh_2* NewPolygonWithHoles2(Pwh_2* pwh)\n\t{\n\t\treturn new Pwh_2(*pwh);\n\t}\n\n\tstatic void DeletePolygonWithHoles2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Pwh_2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Polygon_2* CastToPolygon2(void* ptr)\n\t{\n\t\treturn static_cast<Polygon_2*>(ptr);\n\t}\n\n\tinline static Pwh_2* CastToPolygonWithHoles2(void* ptr)\n\t{\n\t\treturn static_cast<Pwh_2*>(ptr);\n\t}\n\n\tstatic Polygon_2* GetBoundaryOrHole(void* ptr, int index)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\n\t\tif (index == BOUNDARY_INDEX)\n\t\t{\n\t\t\tif (pwh->is_unbounded())\n\t\t\t\treturn nullptr;\n\t\t\telse\n\t\t\t\treturn &pwh->outer_boundary();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn &pwh->holes().at(index);\n\t\t}\n\t}\n\n\tstatic int HoleCount(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\treturn pwh->number_of_holes();\n\t}\n\n\tstatic int PointCount(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t\treturn (int)polygon->size();\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\treturn new Pwh_2(*pwh);\n\t}\n\n\tstatic Pwh_2* Copy(Pwh_2& pwh)\n\t{\n\t\treturn new Pwh_2(pwh);\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\n\t\tauto pwh2 = new CGAL::Polygon_with_holes_2<K2>();\n\n\t\tif (!pwh->is_unbounded())\n\t\t{\n\t\t\tauto count = pwh->outer_boundary().size();\n\t\t\tfor (auto i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tauto p = convert(pwh->outer_boundary().vertex(i));\n\t\t\t\tpwh2->outer_boundary().push_back(p);\n\t\t\t}\n\t\t}\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t{\n\t\t\tauto count = hole.size();\n\t\t\tauto hole2 = CGAL::Polygon_2<K2>();\n\n\t\t\tfor (auto i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tauto p = convert(hole.vertex(i));\n\t\t\t\thole2.push_back(p);\n\t\t\t}\n\n\t\t\tpwh2->add_hole(hole2);\n\t\t}\n\n\t\treturn pwh2;\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\tpwh->clear();\n\t}\n\n\tstatic void ClearBoundary(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\tpwh->outer_boundary().clear();\n\t}\n\n\tstatic void ClearHoles(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\tpwh->holes().clear();\n\t}\n\n\tstatic void* CreateFromPolygon(void* ptr)\n\t{\n\t\tauto polygon = CastToPolygon2(ptr);\n\t\treturn new Pwh_2(*polygon);\n\t}\n\n\tstatic void* CreateFromPoints(Point2d* points, int count)\n\t{\n\t\tauto polygon = Polygon_2();\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t\tpolygon.push_back(points[i].ToCGAL<K>());\n\n\t\treturn new Pwh_2(polygon);\n\t}\n\n\tstatic Point2d GetPoint(void* ptr, int polyIndex, int pointIndex)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, polyIndex);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tauto point = polygon->vertex(pointIndex);\n\t\t\treturn Point2d::FromCGAL<K>(point);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn { 0, 0 };\n\t\t}\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, polyIndex);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tfor (auto i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tauto point = polygon->vertex(i);\n\t\t\t\tpoints[i] = Point2d::FromCGAL<K>(point);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void SetPoint(void* ptr, int polyIndex, int pointIndex, const Point2d& point)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, polyIndex);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tauto size = polygon->size();\n\t\t\tif (pointIndex < 0 || pointIndex >= size)\n\t\t\t\treturn;\n\n\t\t\t(*polygon)[pointIndex] = Point_2(point.x, point.y);\n\t\t}\n\t}\n\n\tstatic void SetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, polyIndex);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tauto size = polygon->size();\n\n\t\t\tfor (auto i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tif (i < size)\n\t\t\t\t\t(*polygon)[i] = points[i].ToCGAL<K>();\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//Adding more points than poygon currently contains\n\t\t\t\t\t//so push back instead.\n\t\t\t\t\tpolygon->push_back(points[i].ToCGAL<K>());\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void AddHoleFromPolygon(void* pwhPtr, void* polygonPtr)\n\t{\n\t\tauto pwh = (Pwh_2*)pwhPtr;\n\t\tauto polygon = (Polygon_2*)polygonPtr;\n\t\tpwh->add_hole(*polygon);\n\t}\n\n\tstatic void AddHoleFromPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto pwh = (Pwh_2*)ptr;\n\t\tauto polygon = Polygon_2();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tpolygon.push_back(points[i].ToCGAL<K>());\n\n\t\tpwh->add_hole(polygon);\n\t}\n\n\tstatic void RemoveHole(void* ptr, int index)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\tpwh->erase_hole(pwh->holes_begin() + index);\n\t}\n\n\tstatic void* CopyPolygon(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t\treturn new Polygon_2(*polygon);\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\tstatic void ReversePolygon(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t\treturn polygon->reverse_orientation();\n\t}\n\n\tstatic BOOL IsUnbounded(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\treturn pwh->is_unbounded();\n\t}\n\n\tstatic Box2d GetBoundingBox(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tauto box = polygon->bbox();\n\t\t\treturn Box2d::FromCGAL<K>(box);\n\t\t}\n\t\telse\n\t\t\treturn {};\n\t}\n\n\tstatic BOOL IsSimple(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t\treturn polygon->is_simple();\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tstatic BOOL IsConvex(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr && polygon->is_simple())\n\t\t\treturn polygon->is_convex();\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tstatic CGAL::Orientation Orientation(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr && polygon->is_simple())\n\t\t\treturn polygon->orientation();\n\t\telse\n\t\t\treturn CGAL::Orientation::DEGENERATE;\n\t}\n\n\tstatic CGAL::Oriented_side OrientedSide(void* ptr, int index, const Point2d& point)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr && polygon->is_simple())\n\t\t\treturn polygon->oriented_side(point.ToCGAL<K>());\n\t\telse\n\t\t\treturn CGAL::Oriented_side::DEGENERATE;\n\t}\n\n\tstatic double SignedArea(void* ptr, int index)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr && polygon->is_simple())\n\t\t\treturn CGAL::to_double(polygon->area());\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic void Translate(void* ptr, int index, const Point2d& translation)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tCGAL::Aff_transformation_2<K> transformation(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t\t}\n\t}\n\n\tstatic void Rotate(void* ptr, int index, double rotation)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tCGAL::Aff_transformation_2<K> transformation(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t\t}\n\t}\n\n\tstatic void Scale(void* ptr, int index, double scale)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tCGAL::Aff_transformation_2<K> transformation(CGAL::SCALING, scale);\n\t\t\t(*polygon) = CGAL::transform(transformation, *polygon);\n\t\t}\n\t}\n\n\tstatic void Transform(void* ptr, int index, const Point2d& translation, double rotation, double scale)\n\t{\n\t\tauto polygon = GetBoundaryOrHole(ptr, index);\n\t\tif (polygon != nullptr)\n\t\t{\n\t\t\tCGAL::Aff_transformation_2<K> T(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\t\tCGAL::Aff_transformation_2<K> R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\t\tCGAL::Aff_transformation_2<K> S(CGAL::SCALING, scale);\n\n\t\t\t(*polygon) = CGAL::transform(T * R * S, *polygon);\n\t\t}\n\t}\n\n\tstatic BOOL ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\t\tauto& boundary = pwh->outer_boundary();\n\n\t\tif (ContainsPoint(boundary, true, point, orientation, inculdeBoundary))\n\t\t{\n\t\t\tfor (auto& hole : pwh->holes())\n\t\t\t{\n\t\t\t\tif (ContainsPoint(hole, false, point, orientation, inculdeBoundary))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL ContainsPoint(Pwh_2& pwh, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n\t{\n\t\tauto& boundary = pwh.outer_boundary();\n\n\t\tif (ContainsPoint(boundary, true, point, orientation, inculdeBoundary))\n\t\t{\n\t\t\tfor (auto& hole : pwh.holes())\n\t\t\t{\n\t\t\t\tif (ContainsPoint(hole, false, point, orientation, inculdeBoundary))\n\t\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void* ConnectHoles(void* ptr)\n\t{\n\t\tauto pwh = CastToPolygonWithHoles2(ptr);\n\n\t\tstd::list<Point_2> pts;\n\t\tCGAL::connect_holes(*pwh, std::back_inserter(pts));\n\n\t\treturn new Polygon_2(pts.begin(), pts.end());\n\t}\n\nprivate:\n\n\tstatic BOOL ContainsPoint(Polygon_2& polygon, bool isBoundary, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n\t{\n\t\tauto side = polygon.oriented_side(point.ToCGAL<K>());\n\n\t\tif (inculdeBoundary && side == CGAL::Oriented_side::ON_ORIENTED_BOUNDARY)\n\t\t\treturn true;\n\n\t\tif(isBoundary)\n\t\t\treturn side == orientation;\n\t\telse\n\t\t\treturn side == (orientation * -1);\n\t}\n\n};\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonWithHoles2_EEK.cpp",
    "content": "#include \"../pch.h\"\n#include \"PolygonWithHoles2_EEK.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/Boolean_set_operations_2.h>\n\nvoid* PolygonWithHoles2_EEK_Create()\n{\n\treturn PolygonWithHoles2<EEK>::NewPolygonWithHoles2();\n}\n\nvoid PolygonWithHoles2_EEK_Release(void* ptr)\n{\n\tPolygonWithHoles2<EEK>::DeletePolygonWithHoles2(ptr);\n}\n\nint PolygonWithHoles2_EEK_HoleCount(void* ptr)\n{\n\treturn PolygonWithHoles2<EEK>::HoleCount(ptr);\n}\n\nint PolygonWithHoles2_EEK_PointCount(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::PointCount(ptr, index);\n}\n\nvoid* PolygonWithHoles2_EEK_Copy(void* ptr)\n{\n\treturn PolygonWithHoles2<EEK>::Copy(ptr);\n}\n\nvoid* PolygonWithHoles2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn PolygonWithHoles2<EEK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn PolygonWithHoles2<EEK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn PolygonWithHoles2<EEK>::Convert<EEK>(ptr);\n\t}\n}\n\nvoid PolygonWithHoles2_EEK_Clear(void* ptr)\n{\n\tPolygonWithHoles2<EEK>::Clear(ptr);\n}\n\nvoid PolygonWithHoles2_EEK_ClearBoundary(void* ptr)\n{\n\tPolygonWithHoles2<EEK>::ClearBoundary(ptr);\n}\n\nvoid PolygonWithHoles2_EEK_ClearHoles(void* ptr)\n{\n\tPolygonWithHoles2<EEK>::ClearHoles(ptr);\n}\n\nvoid* PolygonWithHoles2_EEK_CreateFromPolygon(void* ptr)\n{\n\treturn PolygonWithHoles2<EEK>::CreateFromPolygon(ptr);\n}\n\nvoid* PolygonWithHoles2_EEK_CreateFromPoints(Point2d* points, int count)\n{\n\treturn PolygonWithHoles2<EEK>::CreateFromPoints(points, count);\n}\n\nPoint2d PolygonWithHoles2_EEK_GetPoint(void* ptr, int polyIndex, int pointIndex)\n{\n\treturn PolygonWithHoles2<EEK>::GetPoint(ptr, polyIndex, pointIndex);\n}\n\nvoid PolygonWithHoles2_EEK_GetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n{\n\tPolygonWithHoles2<EEK>::GetPoints(ptr, points, polyIndex, count);\n}\n\nvoid PolygonWithHoles2_EEK_SetPoint(void* ptr, int polyIndex, int pointIndex, const Point2d& point)\n{\n\tPolygonWithHoles2<EEK>::SetPoint(ptr, polyIndex, pointIndex, point);\n}\n\nvoid PolygonWithHoles2_EEK_SetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n{\n\tPolygonWithHoles2<EEK>::SetPoints(ptr, points, polyIndex, count);\n}\n\nvoid PolygonWithHoles2_EEK_AddHoleFromPolygon(void* pwhPtr, void* polygonPtr)\n{\n\tPolygonWithHoles2<EEK>::AddHoleFromPolygon(pwhPtr, polygonPtr);\n}\n\nvoid PolygonWithHoles2_EEK_AddHoleFromPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygonWithHoles2<EEK>::AddHoleFromPoints(ptr, points, count);\n}\n\nvoid PolygonWithHoles2_EEK_RemoveHole(void* ptr, int index)\n{\n\tPolygonWithHoles2<EEK>::RemoveHole(ptr, index);\n}\n\nvoid* PolygonWithHoles2_EEK_CopyPolygon(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::CopyPolygon(ptr, index);\n}\n\nvoid PolygonWithHoles2_EEK_ReversePolygon(void* ptr, int index)\n{\n\tPolygonWithHoles2<EEK>::ReversePolygon(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EEK_IsUnbounded(void* ptr)\n{\n\treturn PolygonWithHoles2<EEK>::IsUnbounded(ptr);\n}\n\nBox2d PolygonWithHoles2_EEK_GetBoundingBox(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::GetBoundingBox(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EEK_IsSimple(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::IsSimple(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EEK_IsConvex(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::IsConvex(ptr, index);\n}\n\nCGAL::Orientation PolygonWithHoles2_EEK_Orientation(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::Orientation(ptr, index);\n}\n\nCGAL::Oriented_side PolygonWithHoles2_EEK_OrientedSide(void* ptr, int index, const Point2d& point)\n{\n\treturn PolygonWithHoles2<EEK>::OrientedSide(ptr, index, point);\n}\n\ndouble PolygonWithHoles2_EEK_SignedArea(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EEK>::SignedArea(ptr, index);\n}\n\nvoid PolygonWithHoles2_EEK_Translate(void* ptr, int index, const Point2d& translation)\n{\n\tPolygonWithHoles2<EEK>::Translate(ptr, index, translation);\n}\n\nvoid PolygonWithHoles2_EEK_Rotate(void* ptr, int index, double rotation)\n{\n\tPolygonWithHoles2<EEK>::Rotate(ptr, index, rotation);\n}\n\nvoid PolygonWithHoles2_EEK_Scale(void* ptr, int index, double scale)\n{\n\tPolygonWithHoles2<EEK>::Scale(ptr, index, scale);\n}\n\nvoid PolygonWithHoles2_EEK_Transform(void* ptr, int index, const Point2d& translation, double rotation, double scale)\n{\n\tPolygonWithHoles2<EEK>::Transform(ptr, index, translation, rotation, scale);\n}\n\nBOOL PolygonWithHoles2_EEK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n{\n\treturn PolygonWithHoles2<EEK>::ContainsPoint(ptr, point, orientation, inculdeBoundary);\n}\n\nvoid* PolygonWithHoles2_EEK_ConnectHoles(void* ptr)\n{\n\treturn PolygonWithHoles2<EEK>::ConnectHoles(ptr);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonWithHoles2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_Create();\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int PolygonWithHoles2_EEK_HoleCount(void* ptr);\n\n\tCGALWRAPPER_API int PolygonWithHoles2_EEK_PointCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_ClearBoundary(void* ptr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_ClearHoles(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_CreateFromPolygon(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_CreateFromPoints(Point2d * points, int count);\n\n\tCGALWRAPPER_API Point2d PolygonWithHoles2_EEK_GetPoint(void* ptr, int polyIndex, int pointIndex);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_GetPoints(void* ptr, Point2d* points, int polyIndex, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_SetPoint(void* ptr, int polyIndex, int pointIndex, const Point2d& point);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_SetPoints(void* ptr, Point2d* points, int polyIndex, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_AddHoleFromPolygon(void* pwhPtr, void* polygonPtr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_AddHoleFromPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_RemoveHole(void* ptr, int index);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_CopyPolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_ReversePolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EEK_IsUnbounded(void* ptr);\n\n\tCGALWRAPPER_API Box2d PolygonWithHoles2_EEK_GetBoundingBox(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EEK_IsSimple(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EEK_IsConvex(void* ptr, int index);\n\n\tCGALWRAPPER_API CGAL::Orientation PolygonWithHoles2_EEK_Orientation(void* ptr, int index);\n\n\tCGALWRAPPER_API CGAL::Oriented_side PolygonWithHoles2_EEK_OrientedSide(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API double PolygonWithHoles2_EEK_SignedArea(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Translate(void* ptr, int index, const Point2d& translation);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Rotate(void* ptr, int index, double rotation);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Scale(void* ptr, int index, double scale);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EEK_Transform(void* ptr, int index, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EEK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EEK_ConnectHoles(void* ptr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonWithHoles2_EIK.cpp",
    "content": "#include \"../pch.h\"\n#include \"PolygonWithHoles2_EIK.h\"\n#include \"PolygonWithHoles2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/Boolean_set_operations_2.h>\n\nvoid* PolygonWithHoles2_EIK_Create()\n{\n\treturn PolygonWithHoles2<EIK>::NewPolygonWithHoles2();\n}\n\nvoid PolygonWithHoles2_EIK_Release(void* ptr)\n{\n\tPolygonWithHoles2<EIK>::DeletePolygonWithHoles2(ptr);\n}\n\nint PolygonWithHoles2_EIK_HoleCount(void* ptr)\n{\n\treturn PolygonWithHoles2<EIK>::HoleCount(ptr);\n}\n\nint PolygonWithHoles2_EIK_PointCount(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::PointCount(ptr, index);\n}\n\nvoid* PolygonWithHoles2_EIK_Copy(void* ptr)\n{\n\treturn PolygonWithHoles2<EIK>::Copy(ptr);\n}\n\nvoid PolygonWithHoles2_EIK_Clear(void* ptr)\n{\n\tPolygonWithHoles2<EIK>::Clear(ptr);\n}\n\nvoid PolygonWithHoles2_EIK_ClearBoundary(void* ptr)\n{\n\tPolygonWithHoles2<EIK>::ClearBoundary(ptr);\n}\n\nvoid PolygonWithHoles2_EIK_ClearHoles(void* ptr)\n{\n\tPolygonWithHoles2<EIK>::ClearHoles(ptr);\n}\n\nvoid* PolygonWithHoles2_EIK_CreateFromPolygon(void* ptr)\n{\n\treturn PolygonWithHoles2<EIK>::CreateFromPolygon(ptr);\n}\n\nvoid* PolygonWithHoles2_EIK_CreateFromPoints(Point2d* points, int count)\n{\n\treturn PolygonWithHoles2<EIK>::CreateFromPoints(points, count);\n}\n\nPoint2d PolygonWithHoles2_EIK_GetPoint(void* ptr, int polyIndex, int pointIndex)\n{\n\treturn PolygonWithHoles2<EIK>::GetPoint(ptr, polyIndex, pointIndex);\n}\n\nvoid PolygonWithHoles2_EIK_GetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n{\n\tPolygonWithHoles2<EIK>::GetPoints(ptr, points, polyIndex, count);\n}\n\nvoid PolygonWithHoles2_EIK_SetPoint(void* ptr, int polyIndex, int pointIndex, const Point2d& point)\n{\n\tPolygonWithHoles2<EIK>::SetPoint(ptr, polyIndex, pointIndex, point);\n}\n\nvoid PolygonWithHoles2_EIK_SetPoints(void* ptr, Point2d* points, int polyIndex, int count)\n{\n\tPolygonWithHoles2<EIK>::SetPoints(ptr, points, polyIndex, count);\n}\n\nvoid PolygonWithHoles2_EIK_AddHoleFromPolygon(void* pwhPtr, void* polygonPtr)\n{\n\tPolygonWithHoles2<EIK>::AddHoleFromPolygon(pwhPtr, polygonPtr);\n}\n\nvoid PolygonWithHoles2_EIK_AddHoleFromPoints(void* ptr, Point2d* points, int count)\n{\n\tPolygonWithHoles2<EIK>::AddHoleFromPoints(ptr, points, count);\n}\n\nvoid PolygonWithHoles2_EIK_RemoveHole(void* ptr, int index)\n{\n\tPolygonWithHoles2<EIK>::RemoveHole(ptr, index);\n}\n\nvoid* PolygonWithHoles2_EIK_CopyPolygon(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::CopyPolygon(ptr, index);\n}\n\nvoid PolygonWithHoles2_EIK_ReversePolygon(void* ptr, int index)\n{\n\tPolygonWithHoles2<EIK>::ReversePolygon(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EIK_IsUnbounded(void* ptr)\n{\n\treturn PolygonWithHoles2<EIK>::IsUnbounded(ptr);\n}\n\nBox2d PolygonWithHoles2_EIK_GetBoundingBox(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::GetBoundingBox(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EIK_IsSimple(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::IsSimple(ptr, index);\n}\n\nBOOL PolygonWithHoles2_EIK_IsConvex(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::IsConvex(ptr, index);\n}\n\nCGAL::Orientation PolygonWithHoles2_EIK_Orientation(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::Orientation(ptr, index);\n}\n\nCGAL::Oriented_side PolygonWithHoles2_EIK_OrientedSide(void* ptr, int index, const Point2d& point)\n{\n\treturn PolygonWithHoles2<EIK>::OrientedSide(ptr, index, point);\n}\n\ndouble PolygonWithHoles2_EIK_SignedArea(void* ptr, int index)\n{\n\treturn PolygonWithHoles2<EIK>::SignedArea(ptr, index);\n}\n\nvoid PolygonWithHoles2_EIK_Translate(void* ptr, int index, const Point2d& translation)\n{\n\tPolygonWithHoles2<EIK>::Translate(ptr, index, translation);\n}\n\nvoid PolygonWithHoles2_EIK_Rotate(void* ptr, int index, double rotation)\n{\n\tPolygonWithHoles2<EIK>::Rotate(ptr, index, rotation);\n}\n\nvoid PolygonWithHoles2_EIK_Scale(void* ptr, int index, double scale)\n{\n\tPolygonWithHoles2<EIK>::Scale(ptr, index, scale);\n}\n\nvoid PolygonWithHoles2_EIK_Transform(void* ptr, int index, const Point2d& translation, double rotation, double scale)\n{\n\tPolygonWithHoles2<EIK>::Transform(ptr, index, translation, rotation, scale);\n}\n\nBOOL PolygonWithHoles2_EIK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary)\n{\n\treturn PolygonWithHoles2<EIK>::ContainsPoint(ptr, point, orientation, inculdeBoundary);\n}\n\nvoid* PolygonWithHoles2_EIK_ConnectHoles(void* ptr)\n{\n\treturn PolygonWithHoles2<EIK>::ConnectHoles(ptr);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polygons/PolygonWithHoles2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <CGAL/Polygon_2.h>\n#include <CGAL/Polygon_with_holes_2.h>\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_Create();\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int PolygonWithHoles2_EIK_HoleCount(void* ptr);\n\n\tCGALWRAPPER_API int PolygonWithHoles2_EIK_PointCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_ClearBoundary(void* ptr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_ClearHoles(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_CreateFromPolygon(void* ptr);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_CreateFromPoints(Point2d* points, int count);\n\n\tCGALWRAPPER_API Point2d PolygonWithHoles2_EIK_GetPoint(void* ptr, int polyIndex, int pointIndex);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_GetPoints(void* ptr, Point2d* points, int polyIndex, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_SetPoint(void* ptr, int polyIndex, int pointIndex, const Point2d& point);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_SetPoints(void* ptr, Point2d* points, int polyIndex, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_AddHoleFromPolygon(void* pwhPtr, void* polygonPtr);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_AddHoleFromPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_RemoveHole(void* ptr, int index);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_CopyPolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_ReversePolygon(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EIK_IsUnbounded(void* ptr);\n\n\tCGALWRAPPER_API Box2d PolygonWithHoles2_EIK_GetBoundingBox(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EIK_IsSimple(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EIK_IsConvex(void* ptr, int index);\n\n\tCGALWRAPPER_API CGAL::Orientation PolygonWithHoles2_EIK_Orientation(void* ptr, int index);\n\n\tCGALWRAPPER_API CGAL::Oriented_side PolygonWithHoles2_EIK_OrientedSide(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API double PolygonWithHoles2_EIK_SignedArea(void* ptr, int index);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Translate(void* ptr, int index, const Point2d& translation);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Rotate(void* ptr, int index, double rotation);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Scale(void* ptr, int index, double scale);\n\n\tCGALWRAPPER_API void PolygonWithHoles2_EIK_Transform(void* ptr, int index, const Point2d& translation, double rotation, double scale);\n\n\tCGALWRAPPER_API BOOL PolygonWithHoles2_EIK_ContainsPoint(void* ptr, const Point2d& point, CGAL::Orientation orientation, BOOL inculdeBoundary);\n\n\tCGALWRAPPER_API void* PolygonWithHoles2_EIK_ConnectHoles(void* ptr);\n}\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/MeshBuilders.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_incremental_builder_3.h>\n\ntemplate <class HDS, class K>\nclass BuildTriangleMesh : public CGAL::Modifier_base<HDS>\n{\npublic:\n\n\tPoint3d* vertices;\n\n\tint verticesCount;\n\n\tint* triangles;\n\n\tint triangleCount;\n\n\tvoid operator()(HDS& hds)\n\t{\n\t\ttypedef typename HDS::Vertex   Vertex;\n\t\ttypedef typename Vertex::Point Point;\n\n\t\tCGAL::Polyhedron_incremental_builder_3<HDS> B(hds);\n\n\t\t//Only a estimate of actual count\n\t\tint numTriangles = triangleCount / 3;\n\t\tint numEdges = numTriangles * 6;\n\n\t\tB.begin_surface(verticesCount, numTriangles, numEdges, B.ABSOLUTE_INDEXING);\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t{\n\t\t\tauto p = vertices[i].ToCGAL<K>();\n\t\t\tB.add_vertex(p);\n\t\t}\n\n\t\tfor (int i = 0; i < numTriangles; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 0]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 1]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 2]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tB.end_surface();\n\t}\n};\n\ntemplate <class HDS, class K>\nclass BuildQuadMesh : public CGAL::Modifier_base<HDS>\n{\npublic:\n\n\tPoint3d* vertices;\n\n\tint verticesCount;\n\n\tint* quads;\n\n\tint quadCount;\n\n\tvoid operator()(HDS& hds)\n\t{\n\t\ttypedef typename HDS::Vertex   Vertex;\n\t\ttypedef typename Vertex::Point Point;\n\n\t\tCGAL::Polyhedron_incremental_builder_3<HDS> B(hds);\n\n\t\t//Only a estimate of actual count\n\t\tint numQuads = quadCount / 4;\n\t\tint numEdges = numQuads * 8;\n\n\t\tB.begin_surface(verticesCount, numQuads, numEdges, B.ABSOLUTE_INDEXING);\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t{\n\t\t\tauto p = vertices[i].ToCGAL<K>();\n\t\t\tB.add_vertex(p);\n\t\t}\n\n\t\tfor (int i = 0; i < numQuads; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 0]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 1]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 2]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 3]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tB.end_surface();\n\t}\n};\n\ntemplate <class HDS, class K>\nclass BuildTriangleQuadMesh : public CGAL::Modifier_base<HDS>\n{\npublic:\n\n\tPoint3d* vertices;\n\n\tint verticesCount;\n\n\tint* triangles;\n\n\tint triangleCount;\n\n\tint* quads;\n\n\tint quadCount;\n\n\tvoid operator()(HDS& hds)\n\t{\n\t\ttypedef typename HDS::Vertex   Vertex;\n\t\ttypedef typename Vertex::Point Point;\n\n\t\tCGAL::Polyhedron_incremental_builder_3<HDS> B(hds);\n\n\t\t//Only a estimate of actual count\n\t\tint numTriangles = triangleCount / 3;\n\t\tint numQuads = quadCount / 4;\n\t\tint numFaces = numTriangles + numQuads;\n\t\tint numEdges = numTriangles * 6 + numQuads * 8;\n\n\t\tB.begin_surface(verticesCount, numFaces, numEdges, B.ABSOLUTE_INDEXING);\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t{\n\t\t\tauto p = vertices[i].ToCGAL<K>();\n\t\t\tB.add_vertex(p);\n\t\t}\n\n\t\tfor (int i = 0; i < numTriangles; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 0]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 1]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 2]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tfor (int i = 0; i < numQuads; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 0]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 1]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 2]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 3]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tB.end_surface();\n\t}\n};\n\ntemplate <class HDS, class K>\nclass BuildPolygonalMesh : public CGAL::Modifier_base<HDS>\n{\npublic:\n\n\tPoint3d* vertices;\n\n\tint verticesCount;\n\n\tint* triangles;\n\n\tint triangleCount;\n\n\tint* quads;\n\n\tint quadCount;\n\n\tint* pentagons;\n\n\tint pentagonCount;\n\n\tint* hexagons;\n\n\tint hexagonCount;\n\n\tvoid operator()(HDS& hds)\n\t{\n\t\ttypedef typename HDS::Vertex   Vertex;\n\t\ttypedef typename Vertex::Point Point;\n\n\t\tCGAL::Polyhedron_incremental_builder_3<HDS> B(hds);\n\n\t\t//Only a estimate of actual count\n\t\tint numTriangles = triangleCount / 3;\n\t\tint numQuads = quadCount / 4;\n\t\tint numPentagons = pentagonCount / 5;\n\t\tint numHexagons = hexagonCount / 6;\n\t\tint numFaces = numTriangles + numQuads + numPentagons + numHexagons;\n\t\tint numEdges = numTriangles * 6 + numQuads * 8 + numPentagons * 10 + numHexagons * 12;\n\n\t\tB.begin_surface(verticesCount, numFaces, numEdges, B.ABSOLUTE_INDEXING);\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t{\n\t\t\tauto p = vertices[i].ToCGAL<K>();\n\t\t\tB.add_vertex(p);\n\t\t}\n\n\t\tfor (int i = 0; i < numTriangles; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 0]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 1]);\n\t\t\tB.add_vertex_to_facet(triangles[i * 3 + 2]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tfor (int i = 0; i < numQuads; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 0]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 1]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 2]);\n\t\t\tB.add_vertex_to_facet(quads[i * 4 + 3]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tfor (int i = 0; i < numPentagons; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(pentagons[i * 5 + 0]);\n\t\t\tB.add_vertex_to_facet(pentagons[i * 5 + 1]);\n\t\t\tB.add_vertex_to_facet(pentagons[i * 5 + 2]);\n\t\t\tB.add_vertex_to_facet(pentagons[i * 5 + 3]);\n\t\t\tB.add_vertex_to_facet(pentagons[i * 5 + 4]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tfor (int i = 0; i < numHexagons; i++)\n\t\t{\n\t\t\tB.begin_facet();\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 0]);\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 1]);\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 2]);\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 3]);\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 4]);\n\t\t\tB.add_vertex_to_facet(hexagons[i * 6 + 5]);\n\t\t\tB.end_facet();\n\t\t}\n\n\t\tB.end_surface();\n\t}\n};\n\ntemplate <class HDS, class K>\nclass BuildPolygonMesh : public CGAL::Modifier_base<HDS>\n{\npublic:\n\n\tPoint2d* vertices;\n\n\tint verticesCount;\n\n\tBOOL xz;\n\n\tvoid operator()(HDS& hds)\n\t{\n\t\ttypedef typename HDS::Vertex   Vertex;\n\t\ttypedef typename Vertex::Point Point;\n\n\t\tCGAL::Polyhedron_incremental_builder_3<HDS> B(hds);\n\n\t\t//Only a estimate of actual count\n\t\tint numFaces = 1;\n\t\tint numEdges = numFaces * 2;\n\n\t\tB.begin_surface(verticesCount, numFaces, numEdges, B.ABSOLUTE_INDEXING);\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t{\n\t\t\tif (xz)\n\t\t\t\tB.add_vertex(vertices[i].ToCGAL3XZ<K>());\n\t\t\telse\n\t\t\t\tB.add_vertex(vertices[i].ToCGAL3<K>());\n\t\t}\n\n\t\tB.begin_facet();\n\n\t\tfor (int i = 0; i < verticesCount; i++)\n\t\t\tB.add_vertex_to_facet(i);\n\n\t\tB.end_facet();\n\n\t\tB.end_surface();\n\t}\n};\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/MeshFace3.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nstruct MeshFace3\n{\n\tint Index;\n\n\tint Halfedge;\n\n\tstatic MeshFace3 NullFace()\n\t{\n\t\tMeshFace3 f;\n\t\tf.Index = NULL_INDEX;\n\t\tf.Halfedge = NULL_INDEX;\n\t\treturn f;\n\t}\n\n};"
  },
  {
    "path": "CGALWrapper/Polyhedra/MeshHalfedge3.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nstruct MeshHalfedge3\n{\n\tBOOL IsBorder;\n\n\tint Index;\n\n\tint Source;\n\n\tint Target;\n\n\tint Opposite;\n\n\tint Next;\n\n\tint Previous;\n\n\tint Face;\n\n\tstatic MeshHalfedge3 NullHalfedge()\n\t{\n\t\tMeshHalfedge3 e;\n\t\te.Index = NULL_INDEX;\n\t\te.Source = NULL_INDEX;\n\t\te.Target = NULL_INDEX;\n\t\te.Opposite = NULL_INDEX;\n\t\te.Next = NULL_INDEX;\n\t\te.Previous = NULL_INDEX;\n\t\te.Face = NULL_INDEX;\n\t\treturn e;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/MeshHitResult.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nstruct MeshHitResult\n{\n    int face;\n\n    Point3d point;\n\n    Point3d coord;\n\n    //BOOL on_face_border;\n    //BOOL on_edge;\n    //BOOL on_mesh_border;\n    //BOOL on_vertex;\n};\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/MeshVertex3.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nstruct MeshVertex3\n{\n    Point3d Point;\n\n    int Degree;\n\n    int Index;\n\n\tint Halfedge;\n\n\tstatic MeshVertex3 NullVertex()\n\t{\n\t\tMeshVertex3 v;\n\t\tv.Point = { 0, 0, 0 };\n\t\tv.Degree = 0;\n\t\tv.Index = NULL_INDEX;\n\t\tv.Halfedge = NULL_INDEX;\n\t\treturn v;\n\t}\n\n};"
  },
  {
    "path": "CGALWrapper/Polyhedra/NefPolyhedron3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"Polyhedron3.h\"\n#include \"SurfaceMesh3.h\"\n\n#include <CGAL/Nef_polyhedron_3.h>\n#include <CGAL/Surface_mesh.h>\n#include <CGAL/minkowski_sum_3.h>\n#include <CGAL/convex_decomposition_3.h>\n#include <CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h>\n\ntemplate<class K>\nclass NefPolyhedron3\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point_3;\n\ttypedef typename K::Plane_3 Plane_3;\n\ttypedef CGAL::Nef_polyhedron_3<K> NefPolyhedron;\n\n\tinline static NefPolyhedron* NewNefPolyhedron()\n\t{\n\t\treturn new NefPolyhedron(NefPolyhedron::EMPTY);\n\t}\n\n\tinline static NefPolyhedron* CreateFromSpace(int space)\n\t{\n\t\tif(space == NefPolyhedron::EMPTY)\n\t\t\treturn new NefPolyhedron(NefPolyhedron::EMPTY);\n\t\telse\n\t\t\treturn new NefPolyhedron(NefPolyhedron::COMPLETE);\n\t}\n\n\tinline static NefPolyhedron* CreateFromPlane(Plane3d plane, int boundary)\n\t{\n\t\tauto p = plane.ToCGAL<K, Plane_3>();\n\n\t\tif (boundary == NefPolyhedron::EXCLUDED)\n\t\t\treturn new NefPolyhedron(p, NefPolyhedron::EXCLUDED);\n\t\telse\n\t\t\treturn new NefPolyhedron(p, NefPolyhedron::INCLUDED);\n\t}\n\n\tinline static NefPolyhedron* CreateFromPolyhedron(void* ptr)\n\t{\n\t\tauto p = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\treturn new NefPolyhedron(p->model);\n\t}\n\n\tinline static void DeleteNefPolyhedron(void* ptr)\n\t{\n\t\tauto obj = static_cast<NefPolyhedron*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static NefPolyhedron* CastToNefPolyhedron(void* ptr)\n\t{\n\t\treturn static_cast<NefPolyhedron*>(ptr);\n\t}\n\n\tstatic void Clear(void* ptr, int space)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\n\t\tif(space == NefPolyhedron::EMPTY)\n\t\t\tnef->clear(NefPolyhedron::EMPTY);\n\t\telse\n\t\t\tnef->clear(NefPolyhedron::COMPLETE);\n\t}\n\n\tstatic BOOL IsEmpty(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn nef->is_empty();\n\t}\n\n\tstatic BOOL IsSimple(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn nef->is_simple();\n\t}\n\n\tstatic BOOL IsSpace(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn nef->is_space();\n\t}\n\n\tstatic BOOL IsValid(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn nef->is_valid();\n\t}\n\n\tstatic int EdgeCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_edges();\n\t}\n\n\tstatic int FacetCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_facets();\n\t}\n\n\tstatic int HalfEdgeCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_halfedges();\n\t}\n\n\tstatic int HalfFacetCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_halffacets();\n\t}\n\n\tstatic int VertexCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_vertices();\n\t}\n\n\tstatic int VolumeCount(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\treturn (int)nef->number_of_volumes();\n\t}\n\n\tstatic void* Intersection(void* ptr1, void* ptr2)\n\t{\n\t\tauto nef1 = CastToNefPolyhedron(ptr1);\n\t\tauto nef2 = CastToNefPolyhedron(ptr2);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef1->intersection(*nef2);\n\n\t\t return result;\n\t}\n\n\tstatic void* Join(void* ptr1, void* ptr2)\n\t{\n\t\tauto nef1 = CastToNefPolyhedron(ptr1);\n\t\tauto nef2 = CastToNefPolyhedron(ptr2);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef1->join(*nef2);\n\n\t\treturn result;\n\t}\n\n\tstatic void* Difference(void* ptr1, void* ptr2)\n\t{\n\t\tauto nef1 = CastToNefPolyhedron(ptr1);\n\t\tauto nef2 = CastToNefPolyhedron(ptr2);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef1->difference(*nef2);\n\n\t\treturn result;\n\t}\n\n\tstatic void* SymmetricDifference(void* ptr1, void* ptr2)\n\t{\n\t\tauto nef1 = CastToNefPolyhedron(ptr1);\n\t\tauto nef2 = CastToNefPolyhedron(ptr2);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef1->symmetric_difference(*nef2);\n\n\t\treturn result;\n\t}\n\n\tstatic void* Complement(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef->complement();\n\n\t\treturn result;\n\t}\n\n\tstatic void* Interior(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef->interior();\n\n\t\treturn result;\n\t}\n\n\tstatic void* Boundary(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef->boundary();\n\n\t\treturn result;\n\t}\n\n\tstatic void* Closure(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef->closure();\n\n\t\treturn result;\n\t}\n\n\tstatic void* Regularization(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = nef->regularization();\n\n\t\treturn result;\n\t}\n\n\tstatic void* MinkowskiSum(void* ptr1, void* ptr2)\n\t{\n\t\tauto nef1 = CastToNefPolyhedron(ptr1);\n\t\tauto nef2 = CastToNefPolyhedron(ptr2);\n\t\tauto result = NewNefPolyhedron();\n\n\t\t*result = CGAL::minkowski_sum_3(*nef1, *nef2);\n\n\t\treturn result;\n\t}\n\n\tstatic void* ConvertToPolyhedron(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\n\t\tnef->convert_to_polyhedron(poly->model);\n\n\t\treturn poly;\n\t}\n\n\tstatic void* ConvertToSurfaceMesh(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tauto mesh = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tCGAL::convert_nef_polyhedron_to_polygon_mesh(*nef, mesh->model);\n\n\t\treturn mesh;\n\t}\n\n\tstatic void ConvexDecomposition(void* ptr)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\tCGAL::convex_decomposition_3(*nef);\n\t}\n\n\tstatic void GetVolumes(void* ptr, void** volumes, int count)\n\t{\n\t\tauto nef = CastToNefPolyhedron(ptr);\n\t\t\n\t\tint index = 0;\n\t\tfor (auto ci = nef->volumes_begin(); ci != nef->volumes_end(); ++ci)\n\t\t{\n\t\t\tauto poly = Polyhedron3<K>::NewPolyhedron();\n\t\t\tnef->convert_inner_shell_to_polyhedron(ci->shells_begin(), poly->model);\n\n\t\t\tvolumes[index++] = poly;\n\n\t\t\tif (index >= count)\n\t\t\t\treturn;\n\t\t}\n\t}\n\t\t\n};"
  },
  {
    "path": "CGALWrapper/Polyhedra/NefPolyhedron3_EEK.cpp",
    "content": "#include \"NefPolyhedron3_EEK.h\"\n#include \"NefPolyhedron3.h\"\n#include \"Polyhedron3.h\"\n\n#include <CGAL/Nef_polyhedron_3.h>\n\nvoid* NefPolyhedron3_EEK_CreateFromSpace(int space)\n{\n\treturn NefPolyhedron3<EEK>::CreateFromSpace(space);\n}\n\nvoid* NefPolyhedron3_EEK_CreateFromPlane(Plane3d plane, int boundary)\n{\n\treturn NefPolyhedron3<EEK>::CreateFromPlane(plane, boundary);\n}\n\nvoid* NefPolyhedron3_EEK_CreateFromPolyhedron(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::CreateFromPolyhedron(ptr);\n}\n\nvoid NefPolyhedron3_EEK_Release(void* ptr)\n{\n\tNefPolyhedron3<EEK>::DeleteNefPolyhedron(ptr);\n}\n\nvoid NefPolyhedron3_EEK_Clear(void* ptr, int space)\n{\n\tNefPolyhedron3<EEK>::Clear(ptr, space);\n}\n\nBOOL NefPolyhedron3_EEK_IsEmpty(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::IsEmpty(ptr);\n}\n\nBOOL NefPolyhedron3_EEK_IsSimple(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::IsSimple(ptr);\n}\n\nBOOL NefPolyhedron3_EEK_IsSpace(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::IsSpace(ptr);\n}\n\nBOOL NefPolyhedron3_EEK_IsValid(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::IsValid(ptr);\n}\n\nint NefPolyhedron3_EEK_EdgeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::EdgeCount(ptr);\n}\n\nint NefPolyhedron3_EEK_FacetCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::FacetCount(ptr);\n}\n\nint NefPolyhedron3_EEK_HalfEdgeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::HalfEdgeCount(ptr);\n}\n\nint NefPolyhedron3_EEK_HalfFacetCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::HalfFacetCount(ptr);\n}\n\nint NefPolyhedron3_EEK_VertexCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::VertexCount(ptr);\n}\n\nint NefPolyhedron3_EEK_VolumeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::VolumeCount(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_Intersection(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EEK>::Intersection(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EEK_Join(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EEK>::Join(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EEK_Difference(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EEK>::Difference(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EEK_SymmetricDifference(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EEK>::SymmetricDifference(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EEK_Complement(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::Complement(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_Interior(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::Interior(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_Boundary(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::Boundary(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_Closure(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::Closure(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_Regularization(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::Regularization(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_MinkowskiSum(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EEK>::MinkowskiSum(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EEK_ConvertToPolyhedron(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::ConvertToPolyhedron(ptr);\n}\n\nvoid* NefPolyhedron3_EEK_ConvertToSurfaceMesh(void* ptr)\n{\n\treturn NefPolyhedron3<EEK>::ConvertToSurfaceMesh(ptr);\n}\n\nvoid NefPolyhedron3_EEK_ConvexDecomposition(void* ptr)\n{\n\tNefPolyhedron3<EEK>::ConvexDecomposition(ptr);\n}\n\nvoid NefPolyhedron3_EEK_GetVolumes(void* ptr, void** volumes, int count)\n{\n\tNefPolyhedron3<EEK>::GetVolumes(ptr, volumes, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/NefPolyhedron3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_CreateFromSpace(int space);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_CreateFromPlane(Plane3d plane, int boundary);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_CreateFromPolyhedron(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EEK_Clear(void* ptr, int space);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EEK_IsEmpty(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EEK_IsSimple(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EEK_IsSpace(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EEK_IsValid(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_FacetCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_HalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_HalfFacetCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EEK_VolumeCount(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Intersection(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Join(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Difference(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_SymmetricDifference(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Complement(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Interior(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Boundary(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Closure(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_Regularization(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_MinkowskiSum(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_ConvertToPolyhedron(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EEK_ConvertToSurfaceMesh(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EEK_ConvexDecomposition(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EEK_GetVolumes(void* ptr, void** volumes, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/NefPolyhedron3_EIK.cpp",
    "content": "#include \"NefPolyhedron3_EIK.h\"\n#include \"NefPolyhedron3.h\"\n#include \"Polyhedron3.h\"\n\n#include <CGAL/Nef_polyhedron_3.h>\n\nvoid* NefPolyhedron3_EIK_CreateFromSpace(int space)\n{\n\treturn NefPolyhedron3<EIK>::CreateFromSpace(space);\n}\n\nvoid* NefPolyhedron3_EIK_CreateFromPlane(Plane3d plane, int boundary)\n{\n\treturn NefPolyhedron3<EIK>::CreateFromPlane(plane, boundary);\n}\n\nvoid* NefPolyhedron3_EIK_CreateFromPolyhedron(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::CreateFromPolyhedron(ptr);\n}\n\nvoid NefPolyhedron3_EIK_Release(void* ptr)\n{\n\tNefPolyhedron3<EIK>::DeleteNefPolyhedron(ptr);\n}\n\nvoid NefPolyhedron3_EIK_Clear(void* ptr, int space)\n{\n\tNefPolyhedron3<EIK>::Clear(ptr, space);\n}\n\nBOOL NefPolyhedron3_EIK_IsEmpty(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::IsEmpty(ptr);\n}\n\nBOOL NefPolyhedron3_EIK_IsSimple(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::IsSimple(ptr);\n}\n\nBOOL NefPolyhedron3_EIK_IsSpace(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::IsSpace(ptr);\n}\n\nBOOL NefPolyhedron3_EIK_IsValid(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::IsValid(ptr);\n}\n\nint NefPolyhedron3_EIK_EdgeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::EdgeCount(ptr);\n}\n\nint NefPolyhedron3_EIK_FacetCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::FacetCount(ptr);\n}\n\nint NefPolyhedron3_EIK_HalfEdgeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::HalfEdgeCount(ptr);\n}\n\nint NefPolyhedron3_EIK_HalfFacetCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::HalfFacetCount(ptr);\n}\n\nint NefPolyhedron3_EIK_VertexCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::VertexCount(ptr);\n}\n\nint NefPolyhedron3_EIK_VolumeCount(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::VolumeCount(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_Intersection(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EIK>::Intersection(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EIK_Join(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EIK>::Join(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EIK_Difference(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EIK>::Difference(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EIK_SymmetricDifference(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EIK>::SymmetricDifference(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EIK_Complement(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::Complement(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_Interior(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::Interior(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_Boundary(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::Boundary(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_Closure(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::Closure(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_Regularization(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::Regularization(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_MinkowskiSum(void* ptr1, void* ptr2)\n{\n\treturn NefPolyhedron3<EIK>::MinkowskiSum(ptr1, ptr2);\n}\n\nvoid* NefPolyhedron3_EIK_ConvertToPolyhedron(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::ConvertToPolyhedron(ptr);\n}\n\nvoid* NefPolyhedron3_EIK_ConvertToSurfaceMesh(void* ptr)\n{\n\treturn NefPolyhedron3<EIK>::ConvertToSurfaceMesh(ptr);\n}\n\nvoid NefPolyhedron3_EIK_ConvexDecomposition(void* ptr)\n{\n\tNefPolyhedron3<EIK>::ConvexDecomposition(ptr);\n}\n\nvoid NefPolyhedron3_EIK_GetVolumes(void* ptr, void** volumes, int count)\n{\n\tNefPolyhedron3<EIK>::GetVolumes(ptr, volumes, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/NefPolyhedron3_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_CreateFromSpace(int space);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_CreateFromPlane(Plane3d plane, int boundary);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_CreateFromPolyhedron(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EIK_Clear(void* ptr, int space);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EIK_IsEmpty(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EIK_IsSimple(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EIK_IsSpace(void* ptr);\n\n\tCGALWRAPPER_API BOOL NefPolyhedron3_EIK_IsValid(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_FacetCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_HalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_HalfFacetCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int NefPolyhedron3_EIK_VolumeCount(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Intersection(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Join(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Difference(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_SymmetricDifference(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Complement(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Interior(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Boundary(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Closure(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_Regularization(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_MinkowskiSum(void* ptr1, void* ptr2);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_ConvertToPolyhedron(void* ptr);\n\n\tCGALWRAPPER_API void* NefPolyhedron3_EIK_ConvertToSurfaceMesh(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EIK_ConvexDecomposition(void* ptr);\n\n\tCGALWRAPPER_API void NefPolyhedron3_EIK_GetVolumes(void* ptr, void** volumes, int count);\n\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/PolygonalCount.h",
    "content": "#pragma once\n\n\nstruct PolygonalCount\n{\n\tint degenerate;\n\tint three;\n\tint four;\n\tint five;\n\tint six;\n\tint greater;\n};\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/Polyhedron3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"PolygonalCount.h\"\n#include \"MeshBuilders.h\"\n#include \"PolyhedronMap.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\n#include <limits>\n#include <map>\n#include <unordered_map>\n#include <set>\n#include <fstream>\n#include <iostream>\n#include <CGAL/enum.h>\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Polyhedron_incremental_builder_3.h>\n#include <CGAL/Polygon_mesh_processing/transform.h>\n#include <CGAL/Aff_transformation_3.h>\n#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>\n#include <CGAL/Side_of_triangle_mesh.h>\n#include <CGAL/Polygon_mesh_processing/orientation.h>\n#include <CGAL/Polygon_mesh_processing/self_intersections.h>\n#include <CGAL/Polygon_mesh_processing/measure.h>\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/Polygon_mesh_processing/locate.h>\n#include <CGAL/Polygon_mesh_processing/intersection.h>\n#include <CGAL/Polygon_mesh_processing/bbox.h>\n#include <CGAL/Bbox_3.h>\n\ntemplate<class K>\nclass Polyhedron3\n{\n\npublic:\n\n\ttypedef typename K::FT FT;\n\ttypedef typename K::Point_3 Point;\n\ttypedef typename K::Vector_3 Vector;\n\t//typedef CGAL::Polyhedron_3<K, CGAL::Polyhedron_items_with_id_3> Polyhedron;\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename Polyhedron::HalfedgeDS HalfedgeDS;\n\ttypedef typename HalfedgeDS::Vertex Vertex;\n\ttypedef typename HalfedgeDS::Face Face;\n\ttypedef typename HalfedgeDS::Halfedge Halfedge;\n\n\t//typedef typename boost::graph_traits<Polyhedron>::vertex_descriptor\tVertex_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::face_descriptor Face_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::edge_descriptor Edge_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor Halfedge_Des;\n\n\ttypedef typename HalfedgeDS::Vertex_iterator Vertex_Iter;\n\ttypedef typename HalfedgeDS::Face_iterator Face_Iter;\n\ttypedef typename HalfedgeDS::Halfedge_iterator Halfedge_Iter;\n\n\ttypedef typename CGAL::AABB_face_graph_triangle_primitive<Polyhedron> AABB_face_graph_primitive;\n\ttypedef typename CGAL::AABB_traits<K, AABB_face_graph_primitive> AABB_face_graph_traits;\n\ttypedef typename CGAL::AABB_tree<AABB_face_graph_traits> AABBTree;\n\ttypedef CGAL::Aff_transformation_3<K> Transformation_3;\n\n\npublic:\n\n\tPolyhedronMap<K> map;\n\n\tstd::unordered_map<Vertex_Iter, Vector> vertexNormalMap;\n\tbool rebuildVertexNormalMap = true;\n\n\tstd::unordered_map<Face_Iter, Vector> faceNormalMap;\n\tbool rebuildFaceNormalMap = true;\n\n\tPolyhedron3()\n\t{\n\n\t}\n\n\t~Polyhedron3()\n\t{\n\t\tDeleteTree();\n\t}\n\n\tPolyhedron model;\n\n\tAABBTree* tree = nullptr;\n\n\tinline static Polyhedron3* NewPolyhedron()\n\t{\n\t\treturn new Polyhedron3();\n\t}\n\n\tinline static void DeletePolyhedron(void* ptr)\n\t{\n\t\tauto obj = static_cast<Polyhedron3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Polyhedron3* CastToPolyhedron(void* ptr)\n\t{\n\t\treturn static_cast<Polyhedron3*>(ptr);\n\t}\n\n\tvoid OnVertexNormalsChanged()\n\t{\n\t\tvertexNormalMap.clear();\n\t\trebuildVertexNormalMap = true;\n\t}\n\n\tvoid OnFaceNormalsChanged()\n\t{\n\t\tfaceNormalMap.clear();\n\t\trebuildFaceNormalMap = true;\n\t}\n\n\tvoid OnVerticesChanged()\n\t{\n\t\tOnVertexNormalsChanged();\n\t\tmap.OnVerticesChanged();\n\t\tDeleteTree();\n\t}\n\t\n\tvoid OnFacesChanged()\n\t{\n\t\tOnFaceNormalsChanged();\n\t\tmap.OnFacesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnHalfedgesChanged()\n\t{\n\t\tmap.OnHalfedgesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnModelChanged()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t\tOnHalfedgesChanged();\n\t}\n\n\tvoid BuildModel()\n\t{\n\t\tmap.BuildVertexMaps();\n\t\tmap.BuildFaceMaps();\n\t\tmap.BuildHalfedgeMaps();\n\t}\n\n\tvoid DeleteTree()\n\t{\n\t\tif (tree != nullptr)\n\t\t{\n\t\t\tdelete tree;\n\t\t\ttree = nullptr;\n\t\t}\n\t}\n\n\tvoid BuildAABBTree()\n\t{\n\t\tif (tree == nullptr)\n\t\t{\n\t\t\ttree = new AABBTree();\n\t\t\tCGAL::Polygon_mesh_processing::build_AABB_tree(model, *tree);\n\t\t}\n\t}\n\n\tint FindVertexIndex(Vertex_Iter vert)\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\treturn map.FindVertexIndex(model, vert);\n\t}\n\n\tVertex_Iter* FindVertexIter(int index)\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\treturn map.FindVertexIter(model, index);\n\t}\n\n\tVertex* FindVertex(int index)\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\treturn map.FindVertex(model, index);\n\t}\n\n\tint FindFaceIndex(Face_Iter face)\n\t{\n\t\tmap.BuildFaceMaps(model);\n\t\treturn map.FindFaceIndex(face);\n\t}\n\n\tFace_Iter* FindFaceIter(int index)\n\t{\n\t\tmap.BuildFaceMaps(model);\n\t\treturn map.FindFaceIter(index);\n\t}\n\n\tint FindHalfedgeIndex(Halfedge_Iter edge)\n\t{\n\t\tmap.BuildHalfedgeMaps(model);\n\t\treturn map.FindHalfedgeIndex(edge);\n\t}\n\n\tHalfedge_Iter* FindHalfedgeIter(int index)\n\t{\n\t\tmap.BuildHalfedgeMaps(model);\n\t\treturn map.FindHalfedgeIter(index);\n\t}\n\n\tHalfedge_Iter GetHalfedgeIter(int index)\n\t{\n\t\tmap.BuildHalfedgeMaps(model);\n\t\treturn map.GetHalfedgeIter(index);\n\t}\n\n\tVector FindVertexNormal(Vertex_Iter vert)\n\t{\n\t\tauto item = vertexNormalMap.find(vert);\n\t\tif (item != vertexNormalMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn { 0,0,0 };\n\t}\n\n\tstatic int GetBuildStamp(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn poly->map.BuildStamp();\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->model.clear();\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tif (vertices) poly->map.OnVerticesChanged();\n\t\tif (faces) poly->map.OnFacesChanged();\n\t\tif (edges) poly->map.OnHalfedgesChanged();\n\t}\n\n\tstatic void ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tif (vertices) poly->OnVertexNormalsChanged();\n\t\tif (faces) poly->OnFaceNormalsChanged();\n\t}\n\n\tstatic void BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL force)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tif (vertices) poly->map.BuildVertexMaps(poly->model, force);\n\t\tif (faces) poly->map.BuildFaceMaps(poly->model, force);\n\t\tif (edges) poly->map.BuildHalfedgeMaps(poly->model, force);\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto copy = NewPolyhedron();\n\t\tcopy->model = poly->model;\n\t\treturn copy;\n\t}\n\n\tstatic int VertexCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.size_of_vertices();\n\t}\n\n\tstatic int FaceCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.size_of_facets();\n\t}\n\n\tstatic int HalfEdgeCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.size_of_halfedges();\n\t}\n\n\tstatic int BorderEdgeCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.size_of_border_edges();\n\t}\n\n\tstatic int BorderHalfEdgeCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.size_of_border_halfedges();\n\t}\n\n\tstatic BOOL IsValid(void* ptr, int level)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.is_valid(level);\n\t}\n\n\tstatic BOOL IsClosed(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.is_closed();\n\t}\n\n\tstatic BOOL IsPureBivalent(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.is_pure_bivalent();\n\t}\n\n\tstatic BOOL IsPureTrivalent(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn (int)poly->model.is_pure_trivalent();\n\t}\n\n\tstatic BOOL IsPureTriangle(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\t//return (int)poly->model.is_pure_triangle();\n\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) return FALSE;\n\t\t\tif (!face->is_triangle()) return FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\tstatic BOOL IsPureQuad(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\t//return (int)poly->model.is_pure_quad();\n\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) return FALSE;\n\t\t\tif (!face->is_quad()) return FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\tstatic Box3d GetBoundingBox(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tif (poly->tree != nullptr)\n\t\t{\n\t\t\tauto box = poly->tree->root_node()->bbox();\n\t\t\treturn Box3d::FromCGAL<K>(box);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto box = CGAL::Polygon_mesh_processing::bbox(poly->model);\n\t\t\treturn Box3d::FromCGAL<K>(box);\n\t\t}\n\t}\n\n\tstatic int MakeTetrahedron(void* ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto e = poly->model.make_tetrahedron(p1.ToCGAL<K>(), p2.ToCGAL<K>(), p3.ToCGAL<K>(), p4.ToCGAL<K>());\n\t\tpoly->OnModelChanged();\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int MakeTriangle(void* ptr, Point3d p1, Point3d p2, Point3d p3)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto e = poly->model.make_triangle(p1.ToCGAL<K>(), p2.ToCGAL<K>(), p3.ToCGAL<K>());\n\t\tpoly->OnModelChanged();\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tPoint3d GetPoint(int index)\n\t{\n\t\tauto vertex = FindVertex(index);\n\t\tif (vertex != nullptr)\n\t\t\treturn Point3d::FromCGAL(vertex->point());\n\t\telse\n\t\t\treturn { 0, 0, 0 };\n\t}\n\n\tstatic Point3d GetPoint(void* ptr, int index)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn poly->GetPoint(index);\n\t}\n\n\tstatic void GetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tint i = 0;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tpoints[i] = poly->GetPoint(i);\n\t\t}\n\t}\n\n\tvoid SetPoint(int index, const Point3d& point)\n\t{\n\t\tauto vertex = FindVertex(index);\n\t\tif (vertex != nullptr)\n\t\t\tvertex->point() = point.ToCGAL<K>();\n\t}\n\n\tstatic void SetPoint(void* ptr, int index, const Point3d& point)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->SetPoint(index, point);\n\t}\n\n\tstatic void SetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tpoly->SetPoint(i, points[i]);\n\t\t}\n\t}\n\n\tstatic BOOL GetSegment(void* ptr, int index, Segment3d& segment)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto edge = poly->FindHalfedgeIter(index);\n\t\tif (edge != nullptr)\n\t\t{\n\t\t\tauto a = (*edge)->vertex()->point();\n\t\t\tauto b = (*edge)->opposite()->vertex()->point();\n\n\t\t\tsegment.a = Point3d::FromCGAL<K>(a);\n\t\t\tsegment.b = Point3d::FromCGAL<K>(b);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment3d* segments, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto edge = poly->model.halfedges_begin(); edge != poly->model.halfedges_end(); ++edge)\n\t\t{\n\t\t\tauto a = edge->vertex()->point();\n\t\t\tauto b = edge->opposite()->vertex()->point();\n\n\t\t\tSegment3d seg;\n\t\t\tseg.a = Point3d::FromCGAL<K>(a);\n\t\t\tseg.b = Point3d::FromCGAL<K>(b);\n\n\t\t\tsegments[i++] = seg;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetTriangle(void* ptr, int index, Triangle3d& tri)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto face = poly->FindFaceIter(index);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tauto a = (*face)->halfedge()->prev()->vertex()->point();\n\t\t\tauto b = (*face)->halfedge()->vertex()->point();\n\t\t\tauto c = (*face)->halfedge()->next()->vertex()->point();\n\n\t\t\ttri.a = Point3d::FromCGAL<K>(a);\n\t\t\ttri.b = Point3d::FromCGAL<K>(b);\n\t\t\ttri.c = Point3d::FromCGAL<K>(c);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetTriangles(void* ptr, Triangle3d* triangles, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) continue;\n\n\t\t\tauto a = face->halfedge()->prev()->vertex()->point();\n\t\t\tauto b = face->halfedge()->vertex()->point();\n\t\t\tauto c = face->halfedge()->next()->vertex()->point();\n\n\t\t\tTriangle3d tri;\n\t\t\ttri.a = Point3d::FromCGAL<K>(a);\n\t\t\ttri.b = Point3d::FromCGAL<K>(b);\n\t\t\ttri.c = Point3d::FromCGAL<K>(c);\n\n\t\t\ttriangles[i++] = tri;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetVertex(void* ptr, int index, MeshVertex3& vert)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tvert = MeshVertex3::NullVertex();\n\n\t\tauto v = poly->FindVertexIter(index);\n\t\tif (v != nullptr)\n\t\t{\n\t\t\tvert.Index = index;\n\t\t\tvert.Halfedge = poly->FindHalfedgeIndex((*v)->halfedge());\n\t\t\tvert.Point = Point3d::FromCGAL<K>((*v)->point());\n\t\t\tvert.Degree = (int)(*v)->degree();\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic void GetVertices(void* ptr, MeshVertex3* vertices, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto v = poly->model.vertices_begin(); v != poly->model.vertices_end(); ++v)\n\t\t{\n\t\t\tMeshVertex3 vert = MeshVertex3::NullVertex();\n\t\t\tvert.Index = i;\n\t\t\tvert.Halfedge = poly->FindHalfedgeIndex(v->halfedge());\n\t\t\tvert.Point = Point3d::FromCGAL<K>(v->point());\n\t\t\tvert.Degree = (int)v->degree();\n\n\t\t\tvertices[i] = vert;\n\n\t\t\ti++;\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetFace(void* ptr, int index, MeshFace3& face)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tface = MeshFace3::NullFace();\n\n\t\tauto f = poly->FindFaceIter(index);\n\t\tif (f != nullptr)\n\t\t{\n\t\t\tface.Index = index;\n\t\t\tface.Halfedge = poly->FindHalfedgeIndex((*f)->halfedge());\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic void GetFaces(void* ptr, MeshFace3* faces, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto f = poly->model.facets_begin(); f != poly->model.facets_end(); ++f)\n\t\t{\n\t\t\tMeshFace3 face = MeshFace3::NullFace();\n\t\t\tface.Index = i;\n\n\t\t\tif (f->halfedge() != nullptr)\n\t\t\t\tface.Halfedge = poly->FindHalfedgeIndex(f->halfedge());\n\n\t\t\tfaces[i] = face;\n\n\t\t\ti++;\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tedge = MeshHalfedge3::NullHalfedge();\n\n\t\tauto e = poly->FindHalfedgeIter(index);\n\t\tif (e != nullptr)\n\t\t{\n\t\t\tedge.Index = index;\n\t\t\tedge.Source = poly->FindVertexIndex((*e)->vertex());\n\t\t\tedge.Target = poly->FindVertexIndex((*e)->opposite()->vertex());\n\t\t\tedge.Opposite = poly->FindHalfedgeIndex((*e)->opposite());\n\t\t\tedge.Next = poly->FindHalfedgeIndex((*e)->next());\n\t\t\tedge.Previous = poly->FindHalfedgeIndex((*e)->prev());\n\t\t\tedge.Face = poly->FindFaceIndex((*e)->face());\n\t\t\tedge.IsBorder = (*e)->is_border();\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic void GetHalfedges(void* ptr, MeshHalfedge3* edges, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto e = poly->model.halfedges_begin(); e != poly->model.halfedges_end(); ++e)\n\t\t{\n\t\t\tMeshHalfedge3 edge = MeshHalfedge3::NullHalfedge();\n\t\t\tedge.Index = i;\n\t\t\tedge.Source = poly->FindVertexIndex(e->vertex());\n\t\t\tedge.Target = poly->FindVertexIndex(e->opposite()->vertex());\n\t\t\tedge.Opposite = poly->FindHalfedgeIndex(e->opposite());\n\t\t\tedge.Next = poly->FindHalfedgeIndex(e->next());\n\t\t\tedge.Previous = poly->FindHalfedgeIndex(e->prev());\n\t\t\tedge.Face = poly->FindFaceIndex(e->face());\n\t\t\tedge.IsBorder = e->is_border();\n\n\t\t\tedges[i] = edge;\n\n\t\t\ti++;\n\t\t\tif (i >= count) return;\n\t\t}\n\t\t\n\t}\n\n\tstatic void Transform(void* ptr, const Matrix4x4d& matrix)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto m = matrix.ToCGAL<K>();\n\n\t\tstd::transform(poly->model.points_begin(), poly->model.points_end(), poly->model.points_begin(), m);\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void InsideOut(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->model.inside_out();\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void Triangulate(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tCGAL::Polygon_mesh_processing::triangulate_faces(poly->model);\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void NormalizeBorder(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->model.normalize_border();\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic BOOL NormalizedBorderIsValid(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn poly->model.normalized_border_is_valid();\n\t}\n\n\tstatic BOOL DoesSelfIntersect(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn CGAL::Polygon_mesh_processing::does_self_intersect(poly->model);\n\t}\n\n\tstatic double Area(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn CGAL::to_double(CGAL::Polygon_mesh_processing::area(poly->model));\n\t}\n\n\tstatic Point3d Centroid(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto p = CGAL::Polygon_mesh_processing::centroid(poly->model);\n\t\treturn Point3d::FromCGAL<K>(p);\n\t}\n\n\tstatic double Volume(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn CGAL::to_double(CGAL::Polygon_mesh_processing::volume(poly->model));\n\t}\n\n\tstatic BOOL DoesBoundAVolume(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\treturn CGAL::Polygon_mesh_processing::does_bound_a_volume(poly->model);\n\t}\n\n\tstatic void BuildAABBTree(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->BuildAABBTree();\n\t}\n\n\tstatic void ReleaseAABBTree(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->DeleteTree();\n\t}\n\n\tstatic CGAL::Bounded_side SideOfTriangleMesh(void* ptr, const Point3d& point)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->BuildAABBTree();\n\t\tCGAL::Side_of_triangle_mesh<Polyhedron, K> inside(*poly->tree);\n\t\treturn inside(point.ToCGAL<K>());\n\t}\n\n\tstatic BOOL DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tauto other = CastToPolyhedron(otherPtr);\n\t\tauto param = CGAL::parameters::do_overlap_test_of_bounded_sides(test_bounded_sides);\n\n\t\treturn CGAL::Polygon_mesh_processing::do_intersect(poly->model, other->model, param, param);\n\t}\n\n\tstatic void ReadOFF(void* ptr, const char* filename)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tstd::ifstream i(filename);\n\t\ti >> poly->model;\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void WriteOFF(void* ptr, const char* filename)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tstd::ofstream o(filename);\n\t\to << poly->model;\n\t}\n\n\tstatic void GetCentroids(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tint numFaces = (int)poly->model.size_of_facets();\n\n\t\tint index = 0;\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) continue;\n\n\t\t\tauto c = ComputeCentroid(*face);\n\t\t\tpoints[index] = Point3d::FromCGAL<K>(c);\n\n\t\t\tindex++;\n\n\t\t\tif (index >= numFaces || index >= count)\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tstatic void ComputeVertexNormals(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tif (!poly->rebuildVertexNormalMap) return;\n\t\tpoly->rebuildVertexNormalMap = false;\n\t\t;\n\t\tCGAL::Polygon_mesh_processing::compute_vertex_normals(poly->model,\n\t\t\tboost::make_assoc_property_map(poly->vertexNormalMap));\n\t}\n\n\tstatic void ComputeFaceNormals(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tif (!poly->rebuildFaceNormalMap) return;\n\t\tpoly->rebuildFaceNormalMap = false;\n\n\t\tCGAL::Polygon_mesh_processing::compute_face_normals(poly->model,\n\t\t\tboost::make_assoc_property_map(poly->faceNormalMap));\n\t}\n\n\tstatic void GetVertexNormals(void* ptr, Vector3d* normals, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tComputeVertexNormals(ptr);\n\t\tpoly->map.BuildVertexMaps(poly->model);\n\n\t\tfor (auto const& pair : poly->vertexNormalMap)\n\t\t{\n\t\t\tauto vert = pair.first;\n\t\t\tauto vec = pair.second;\n\n\t\t\tint i = poly->FindVertexIndex(vert);\n\n\t\t\tif (i >= 0 && i < count)\n\t\t\t\tnormals[i] = Vector3d::FromCGAL<K>(vec);\n\t\t}\n\t}\n\n\tstatic void GetFaceNormals(void* ptr, Vector3d* normals, int count)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tComputeFaceNormals(ptr);\n\t\tpoly->map.BuildFaceMaps(poly->model);\n\n\t\tfor (auto const& pair : poly->faceNormalMap)\n\t\t{\n\t\t\tauto face = pair.first;\n\t\t\tauto vec = pair.second;\n\n\t\t\tint i = poly->FindFaceIndex(face);\n\n\t\t\tif (i >= 0 && i < count)\n\t\t\t\tnormals[i] = Vector3d::FromCGAL<K>(vec);\n\t\t}\n\t}\n\n\tstatic Point ComputeCentroid(const Face& face)\n\t{\n\t\tint num = 0;\n\n\t\tFT x = 0;\n\t\tFT y = 0;\n\t\tFT z = 0;\n\n\t\tauto hedge = face.facet_begin();\n\t\tdo\n\t\t{\n\t\t\tauto p = hedge->vertex()->point();\n\t\t\tx += p.x();\n\t\t\ty += p.y();\n\t\t\tz += p.z();\n\t\t\tnum++;\n\t\t} while (++hedge != face.facet_begin());\n\n\t\tif (num != 0)\n\t\t{\n\t\t\tx /= num;\n\t\t\ty /= num;\n\t\t\tz /= num;\n\t\t}\n\n\t\treturn { x, y, z };\n\t}\n\n\tstatic int CountFaceVertices(const Face& face)\n\t{\n\t\tint num = 0;\n\n\t\tauto hedge = face.facet_begin();\n\t\tdo\n\t\t{\n\t\t\tnum++;\n\t\t} while (++hedge != face.facet_begin());\n\n\t\treturn num;\n\t}\n\n\tstatic void CreatePolygonMesh(void* ptr, Point2d* points, int pointsCount, BOOL xz)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tBuildPolygonMesh<HalfedgeDS, K> builder;\n\t\tbuilder.vertices = points;\n\t\tbuilder.verticesCount = pointsCount;\n\t\tbuilder.xz = xz;\n\n\t\tpoly->model.delegate(builder);\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic PolygonalCount GetPolygonalCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint degenerate = 0;\n\t\tint three = 0;\n\t\tint four = 0;\n\t\tint five = 0;\n\t\tint six = 0;\n\t\tint greater = 0;\n\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) continue;\n\n\t\t\tint count = CountFaceVertices(*face);\n\n\t\t\tswitch (count)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tdegenerate++;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthree++;\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tfour++;\n\t\t\t\tbreak;\n\n\t\t\tcase 5:\n\t\t\t\tfive++;\n\t\t\t\tbreak;\n\n\t\t\tcase 6:\n\t\t\t\tsix++;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tgreater++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { degenerate, three, four, five, six, greater };\n\t}\n\n\tstatic PolygonalCount GetDualPolygonalCount(void* ptr)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tint degenerate = 0;\n\t\tint three = 0;\n\t\tint four = 0;\n\t\tint five = 0;\n\t\tint six = 0;\n\t\tint greater = 0;\n\n\t\tfor (auto vert = poly->model.vertices_begin(); vert != poly->model.vertices_end(); ++vert)\n\t\t{\n\t\t\tint count = 0;\n\t\t\tauto start = vert->vertex_begin(), end = start;\n\t\t\tCGAL_For_all(start, end)\n\t\t\t{\n\t\t\t\tcount++;\n\t\t\t\tif (count > 6) break;\n\t\t\t}\n\n\t\t\tswitch (count)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tdegenerate++;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthree++;\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tfour++;\n\t\t\t\tbreak;\n\n\t\t\tcase 5:\n\t\t\t\tfive++;\n\t\t\t\tbreak;\n\n\t\t\tcase 6:\n\t\t\t\tsix++;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tgreater++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { degenerate, three, four, five, six, greater };\n\t}\n\n\tstatic void CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tBuildPolygonalMesh<HalfedgeDS, K> builder;\n\t\tbuilder.vertices = points;\n\t\tbuilder.verticesCount = pointsCount;\n\t\tbuilder.triangles = triangles;\n\t\tbuilder.triangleCount = triangleCount;\n\t\tbuilder.quads = quads;\n\t\tbuilder.quadCount = quadCount;\n\t\tbuilder.pentagons = pentagons;\n\t\tbuilder.pentagonCount = pentagonCount;\n\t\tbuilder.hexagons = hexagons;\n\t\tbuilder.hexagonCount = hexagonCount;\n\n\t\tpoly->model.delegate(builder);\n\t\tpoly->OnModelChanged();\n\t}\n\n\tstatic void GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->map.BuildVertexMaps(poly->model);\n\n\t\tint triangleIndex = 0;\n\t\tint quadIndex = 0;\n\t\tint pentagonIndex = 0;\n\t\tint hexagonIndex = 0;\n\n\t\tfor (auto face = poly->model.facets_begin(); face != poly->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (face->halfedge() == nullptr) continue;\n\n\t\t\tint count = CountFaceVertices(*face);\n\n\t\t\tif (count == 3 && triangleIndex * 3 < triangleCount)\n\t\t\t{\n\t\t\t\tauto e0 = face->halfedge();\n\t\t\t\tauto e1 = e0->next();\n\t\t\t\tauto e2 = e1->next();\n\n\t\t\t\tint i0 = poly->FindVertexIndex(e0->vertex());\n\t\t\t\tint i1 = poly->FindVertexIndex(e1->vertex());\n\t\t\t\tint i2 = poly->FindVertexIndex(e2->vertex());\n\n\t\t\t\ttriangles[triangleIndex * 3 + 0] = i0;\n\t\t\t\ttriangles[triangleIndex * 3 + 1] = i1;\n\t\t\t\ttriangles[triangleIndex * 3 + 2] = i2;\n\n\t\t\t\ttriangleIndex++;\n\t\t\t}\n\t\t\telse if (count == 4 && quadIndex * 4 < quadCount)\n\t\t\t{\n\t\t\t\tauto e0 = face->halfedge();\n\t\t\t\tauto e1 = e0->next();\n\t\t\t\tauto e2 = e1->next();\n\t\t\t\tauto e3 = e2->next();\n\n\t\t\t\tint i0 = poly->FindVertexIndex(e0->vertex());\n\t\t\t\tint i1 = poly->FindVertexIndex(e1->vertex());\n\t\t\t\tint i2 = poly->FindVertexIndex(e2->vertex());\n\t\t\t\tint i3 = poly->FindVertexIndex(e3->vertex());\n\n\t\t\t\tquads[quadIndex * 4 + 0] = i0;\n\t\t\t\tquads[quadIndex * 4 + 1] = i1;\n\t\t\t\tquads[quadIndex * 4 + 2] = i2;\n\t\t\t\tquads[quadIndex * 4 + 3] = i3;\n\n\t\t\t\tquadIndex++;\n\t\t\t}\n\t\t\telse if (count == 5 && pentagonIndex * 5 < pentagonCount)\n\t\t\t{\n\t\t\t\tauto e0 = face->halfedge();\n\t\t\t\tauto e1 = e0->next();\n\t\t\t\tauto e2 = e1->next();\n\t\t\t\tauto e3 = e2->next();\n\t\t\t\tauto e4 = e3->next();\n\n\t\t\t\tint i0 = poly->FindVertexIndex(e0->vertex());\n\t\t\t\tint i1 = poly->FindVertexIndex(e1->vertex());\n\t\t\t\tint i2 = poly->FindVertexIndex(e2->vertex());\n\t\t\t\tint i3 = poly->FindVertexIndex(e3->vertex());\n\t\t\t\tint i4 = poly->FindVertexIndex(e4->vertex());\n\n\t\t\t\tpentagons[pentagonIndex * 5 + 0] = i0;\n\t\t\t\tpentagons[pentagonIndex * 5 + 1] = i1;\n\t\t\t\tpentagons[pentagonIndex * 5 + 2] = i2;\n\t\t\t\tpentagons[pentagonIndex * 5 + 3] = i3;\n\t\t\t\tpentagons[pentagonIndex * 5 + 4] = i4;\n\n\t\t\t\tpentagonIndex++;\n\t\t\t}\n\t\t\telse if (count == 6 && hexagonIndex * 6 < hexagonCount)\n\t\t\t{\n\t\t\t\tauto e0 = face->halfedge();\n\t\t\t\tauto e1 = e0->next();\n\t\t\t\tauto e2 = e1->next();\n\t\t\t\tauto e3 = e2->next();\n\t\t\t\tauto e4 = e3->next();\n\t\t\t\tauto e5 = e4->next();\n\n\t\t\t\tint i0 = poly->FindVertexIndex(e0->vertex());\n\t\t\t\tint i1 = poly->FindVertexIndex(e1->vertex());\n\t\t\t\tint i2 = poly->FindVertexIndex(e2->vertex());\n\t\t\t\tint i3 = poly->FindVertexIndex(e3->vertex());\n\t\t\t\tint i4 = poly->FindVertexIndex(e4->vertex());\n\t\t\t\tint i5 = poly->FindVertexIndex(e5->vertex());\n\n\t\t\t\thexagons[hexagonIndex * 6 + 0] = i0;\n\t\t\t\thexagons[hexagonIndex * 6 + 1] = i1;\n\t\t\t\thexagons[hexagonIndex * 6 + 2] = i2;\n\t\t\t\thexagons[hexagonIndex * 6 + 3] = i3;\n\t\t\t\thexagons[hexagonIndex * 6 + 4] = i4;\n\t\t\t\thexagons[hexagonIndex * 6 + 5] = i5;\n\n\t\t\t\thexagonIndex++;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\t\tpoly->map.BuildFaceMaps(poly->model);\n\n\t\tint triangleIndex = 0;\n\t\tint quadIndex = 0;\n\t\tint pentagonIndex = 0;\n\t\tint hexagonIndex = 0;\n\t\tint indices[6];\n\n\t\tfor (auto vert = poly->model.vertices_begin(); vert != poly->model.vertices_end(); ++vert)\n\t\t{\n\t\t\tint count = 0;\n\t\t\tauto start = vert->vertex_begin(), end = start;\n\t\t\tCGAL_For_all(start, end)\n\t\t\t{\n\t\t\t\tauto face = start->face();\n\t\t\t\tindices[count++] = poly->FindFaceIndex(face);\n\t\t\t\tif (count >= 6) break;\n\t\t\t}\n\n\t\t\tif (count == 3 && triangleIndex * 3 < triangleCount)\n\t\t\t{\n\t\t\t\ttriangles[triangleIndex * 3 + 0] = indices[2];\n\t\t\t\ttriangles[triangleIndex * 3 + 1] = indices[1];\n\t\t\t\ttriangles[triangleIndex * 3 + 2] = indices[0];\n\n\t\t\t\ttriangleIndex++;\n\t\t\t}\n\t\t\telse if (count == 4 && quadIndex * 4 < quadCount)\n\t\t\t{\n\t\t\t\tquads[quadIndex * 4 + 0] = indices[3];\n\t\t\t\tquads[quadIndex * 4 + 1] = indices[2];\n\t\t\t\tquads[quadIndex * 4 + 2] = indices[1];\n\t\t\t\tquads[quadIndex * 4 + 3] = indices[0];\n\n\t\t\t\tquadIndex++;\n\t\t\t}\n\t\t\telse if (count == 5 && pentagonIndex * 5 < pentagonCount)\n\t\t\t{\n\t\t\t\tpentagons[pentagonIndex * 5 + 0] = indices[4];\n\t\t\t\tpentagons[pentagonIndex * 5 + 1] = indices[3];\n\t\t\t\tpentagons[pentagonIndex * 5 + 2] = indices[2];\n\t\t\t\tpentagons[pentagonIndex * 5 + 3] = indices[1];\n\t\t\t\tpentagons[pentagonIndex * 5 + 4] = indices[0];\n\n\t\t\t\tpentagonIndex++;\n\t\t\t}\n\t\t\telse if (count == 6 && hexagonIndex * 6 < hexagonCount)\n\t\t\t{\n\t\t\t\thexagons[hexagonIndex * 6 + 0] = indices[5];\n\t\t\t\thexagons[hexagonIndex * 6 + 1] = indices[4];\n\t\t\t\thexagons[hexagonIndex * 6 + 2] = indices[3];\n\t\t\t\thexagons[hexagonIndex * 6 + 3] = indices[2];\n\t\t\t\thexagons[hexagonIndex * 6 + 4] = indices[1];\n\t\t\t\thexagons[hexagonIndex * 6 + 5] = indices[0];\n\n\t\t\t\thexagonIndex++;\n\t\t\t}\n\n\t\t}\n\t}\n\n\tstatic int AddFacetToBorder(void* ptr, int h, int g)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\n\t\tif (eh == nullptr || eg == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.add_facet_to_border(*eh, *eg);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int AddVertexAndFacetToBorder(void* ptr, int h, int g)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\n\t\tif (eh == nullptr || eg == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.add_vertex_and_facet_to_border(*eh, *eg);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int CreateCenterVertex(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.create_center_vertex(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int EraseCenterVertex(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.erase_center_vertex(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic BOOL EraseConnectedComponent(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn FALSE;\n\n\t\tpoly->model.erase_connected_component(*eh);\n\n\t\tpoly->OnModelChanged();\n\n\t\treturn TRUE;\n\t}\n\n\tstatic BOOL EraseFacet(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn FALSE;\n\n\t\tpoly->model.erase_facet(*eh);\n\n\t\tpoly->OnModelChanged();\n\n\t\treturn TRUE;\n\t}\n\n\tstatic int FillHole(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.fill_hole(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int FlipEdge(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.flip_edge(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int JoinFacet(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.join_facet(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int JoinLoop(void* ptr, int h, int g)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\n\t\tif (eh == nullptr || eg == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.join_loop(*eh, *eg);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int JoinVertex(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.join_vertex(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int MakeHole(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.make_hole(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int SplitEdge(void* ptr, int h)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\n\t\tif (eh == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.split_edge(*eh);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int SplitFacet(void* ptr, int h, int g)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\n\t\tif (eh == nullptr || eg == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.split_facet(*eh, *eg);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int SplitLoop(void* ptr, int h, int g, int k)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\t\tauto ek = poly->FindHalfedgeIter(k);\n\n\t\tif (eh == nullptr || eg == nullptr || ek == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.split_loop(*eh, *eg, *ek);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n\tstatic int SplitVertex(void* ptr, int h, int g)\n\t{\n\t\tauto poly = CastToPolyhedron(ptr);\n\n\t\tauto eh = poly->FindHalfedgeIter(h);\n\t\tauto eg = poly->FindHalfedgeIter(g);\n\n\t\tif (eh == nullptr || eg == nullptr)\n\t\t\treturn NULL_INDEX;\n\n\t\tauto e = poly->model.split_vertex(*eh, *eg);\n\n\t\tpoly->OnModelChanged();\n\t\tpoly->map.BuildHalfedgeMaps(poly->model);\n\n\t\treturn poly->FindHalfedgeIndex(e);\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/Polyhedron3_EEK.cpp",
    "content": "#include \"Polyhedron3_EEK.h\"\n\n#include \"Polyhedron3.h\"\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n\nvoid* Polyhedron3_EEK_Create()\n{\n\treturn Polyhedron3<EEK>::NewPolyhedron();\n}\n\nvoid Polyhedron3_EEK_Release(void* ptr)\n{\n\tPolyhedron3<EEK>::DeletePolyhedron(ptr);\n}\n\nint Polyhedron3_EEK_GetBuildStamp(void* ptr)\n{\n\treturn Polyhedron3<EEK>::GetBuildStamp(ptr);\n}\n\nvoid Polyhedron3_EEK_Clear(void* ptr)\n{\n\tPolyhedron3<EEK>::Clear(ptr);\n}\n\nvoid Polyhedron3_EEK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges)\n{\n\tPolyhedron3<EEK>::ClearIndexMaps(ptr, vertices, faces, edges);\n}\n\nvoid Polyhedron3_EEK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n{\n\tPolyhedron3<EEK>::ClearNormalMaps(ptr, vertices, faces);\n}\n\nvoid Polyhedron3_EEK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL force)\n{\n\tPolyhedron3<EEK>::BuildIndices(ptr, vertices, faces, edges, force);\n}\n\nvoid* Polyhedron3_EEK_Copy(void* ptr)\n{\n\treturn Polyhedron3<EEK>::Copy(ptr);\n}\n\nint Polyhedron3_EEK_VertexCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::VertexCount(ptr);\n}\n\nint Polyhedron3_EEK_FaceCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::FaceCount(ptr);\n}\n\nint Polyhedron3_EEK_HalfEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::HalfEdgeCount(ptr);\n}\n\nint Polyhedron3_EEK_BorderEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::BorderEdgeCount(ptr);\n}\n\nint Polyhedron3_EEK_BorderHalfEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::BorderHalfEdgeCount(ptr);\n}\n\nBOOL Polyhedron3_EEK_IsValid(void* ptr, int level)\n{\n\treturn Polyhedron3<EEK>::IsValid(ptr, level);\n}\n\nBOOL Polyhedron3_EEK_IsClosed(void* ptr)\n{\n\treturn Polyhedron3<EEK>::IsClosed(ptr);\n}\n\nBOOL Polyhedron3_EEK_IsPureBivalent(void* ptr)\n{\n\treturn Polyhedron3<EEK>::IsPureBivalent(ptr);\n}\n\nBOOL Polyhedron3_EEK_IsPureTrivalent(void* ptr)\n{\n\treturn Polyhedron3<EEK>::IsPureTrivalent(ptr);\n}\n\nBOOL Polyhedron3_EEK_IsPureTriangle(void* ptr)\n{\n\treturn Polyhedron3<EEK>::IsPureTriangle(ptr);\n}\n\nBOOL Polyhedron3_EEK_IsPureQuad(void* ptr)\n{\n\treturn Polyhedron3<EEK>::IsPureQuad(ptr);\n}\n\nBox3d Polyhedron3_EEK_GetBoundingBox(void* ptr)\n{\n\treturn Polyhedron3<EEK>::GetBoundingBox(ptr);\n}\n\nint Polyhedron3_EEK_MakeTetrahedron(void* ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n{\n\treturn Polyhedron3<EEK>::MakeTetrahedron(ptr, p1, p2, p3, p4);\n}\n\nint Polyhedron3_EEK_MakeTriangle(void* ptr, Point3d p1, Point3d p2, Point3d p3)\n{\n\treturn Polyhedron3<EEK>::MakeTriangle(ptr, p1, p2, p3);\n}\n\nPoint3d Polyhedron3_EEK_GetPoint(void* ptr, int index)\n{\n\treturn Polyhedron3<EEK>::GetPoint(ptr, index);\n}\n\nvoid Polyhedron3_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\treturn Polyhedron3<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyhedron3_EEK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tPolyhedron3<EEK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyhedron3_EEK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyhedron3<EEK>::SetPoints(ptr, points, count);\n}\n\nBOOL Polyhedron3_EEK_GetSegment(void* ptr, int index, Segment3d& segment)\n{\n\treturn Polyhedron3<EEK>::GetSegment(ptr, index, segment);\n}\n\nBOOL Polyhedron3_EEK_GetTriangle(void* ptr, int index, Triangle3d& tri)\n{\n\treturn Polyhedron3<EEK>::GetTriangle(ptr, index, tri);\n}\n\nBOOL Polyhedron3_EEK_GetVertex(void* ptr, int index, MeshVertex3& vert)\n{\n\treturn Polyhedron3<EEK>::GetVertex(ptr, index, vert);\n}\n\nBOOL Polyhedron3_EEK_GetFace(void* ptr, int index, MeshFace3& face)\n{\n\treturn Polyhedron3<EEK>::GetFace(ptr, index, face);\n}\n\nBOOL Polyhedron3_EEK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n{\n\treturn Polyhedron3<EEK>::GetHalfedge(ptr, index, edge);\n}\n\n\nvoid Polyhedron3_EEK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tPolyhedron3<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyhedron3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tPolyhedron3<EEK>::GetTriangles(ptr, triangles, count);\n}\n\nvoid Polyhedron3_EEK_GetVertices(void* ptr, MeshVertex3* vertices, int count)\n{\n\tPolyhedron3<EEK>::GetVertices(ptr, vertices, count);\n}\n\nvoid Polyhedron3_EEK_GetFaces(void* ptr, MeshFace3* faces, int count)\n{\n\tPolyhedron3<EEK>::GetFaces(ptr, faces, count);\n}\n\nvoid Polyhedron3_EEK_GetHalfedges(void* ptr, MeshHalfedge3* edges, int count)\n{\n\tPolyhedron3<EEK>::GetHalfedges(ptr, edges, count);\n}\n\nvoid Polyhedron3_EEK_Transform(void* ptr, Matrix4x4d matrix)\n{\n\tPolyhedron3<EEK>::Transform(ptr, matrix);\n}\n\nvoid Polyhedron3_EEK_InsideOut(void* ptr)\n{\n\tPolyhedron3<EEK>::InsideOut(ptr);\n}\n\nvoid Polyhedron3_EEK_Triangulate(void* ptr)\n{\n\tPolyhedron3<EEK>::Triangulate(ptr);\n}\n\nvoid Polyhedron3_EEK_NormalizeBorder(void* ptr)\n{\n\tPolyhedron3<EEK>::NormalizeBorder(ptr);\n}\n\nBOOL Polyhedron3_EEK_NormalizedBorderIsValid(void* ptr)\n{\n\treturn Polyhedron3<EEK>::NormalizedBorderIsValid(ptr);\n}\n\nCGAL::Bounded_side Polyhedron3_EEK_SideOfTriangleMesh(void* ptr, const Point3d& point)\n{\n\treturn Polyhedron3<EEK>::SideOfTriangleMesh(ptr, point);\n}\n\nBOOL Polyhedron3_EEK_DoesSelfIntersect(void* ptr)\n{\n\treturn Polyhedron3<EEK>::DoesSelfIntersect(ptr);\n}\n\ndouble Polyhedron3_EEK_Area(void* ptr)\n{\n\treturn Polyhedron3<EEK>::Area(ptr);\n}\n\nPoint3d Polyhedron3_EEK_Centroid(void* ptr)\n{\n\treturn Polyhedron3<EEK>::Centroid(ptr);\n}\n\ndouble Polyhedron3_EEK_Volume(void* ptr)\n{\n\treturn Polyhedron3<EEK>::Volume(ptr);\n}\n\nBOOL Polyhedron3_EEK_DoesBoundAVolume(void* ptr)\n{\n\treturn Polyhedron3<EEK>::DoesBoundAVolume(ptr);\n}\n\nvoid Polyhedron3_EEK_BuildAABBTree(void* ptr)\n{\n\tPolyhedron3<EEK>::BuildAABBTree(ptr);\n}\n\nvoid Polyhedron3_EEK_ReleaseAABBTree(void* ptr)\n{\n\tPolyhedron3<EEK>::ReleaseAABBTree(ptr);\n}\n\nBOOL Polyhedron3_EEK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n{\n\treturn Polyhedron3<EEK>::DoIntersects(ptr, otherPtr, test_bounded_sides);\n}\n\nvoid Polyhedron3_EEK_ReadOFF(void* ptr, const char* filename)\n{\n\tPolyhedron3<EEK>::ReadOFF(ptr, filename);\n}\n\nvoid Polyhedron3_EEK_WriteOFF(void* ptr, const char* filename)\n{\n\tPolyhedron3<EEK>::WriteOFF(ptr, filename);\n}\n\nvoid Polyhedron3_EEK_GetCentroids(void* ptr, Point3d* points, int count)\n{\n\tPolyhedron3<EEK>::GetCentroids(ptr, points, count);\n}\n\nvoid Polyhedron3_EEK_ComputeVertexNormals(void* ptr)\n{\n\tPolyhedron3<EEK>::ComputeVertexNormals(ptr);\n}\n\nvoid Polyhedron3_EEK_ComputeFaceNormals(void* ptr)\n{\n\tPolyhedron3<EEK>::ComputeFaceNormals(ptr);\n}\n\nvoid Polyhedron3_EEK_GetVertexNormals(void* ptr, Vector3d* normals, int count)\n{\n\tPolyhedron3<EEK>::GetVertexNormals(ptr, normals, count);\n}\n\nvoid Polyhedron3_EEK_GetFaceNormals(void* ptr, Vector3d* normals, int count)\n{\n\tPolyhedron3<EEK>::GetFaceNormals(ptr, normals, count);\n}\n\nvoid Polyhedron3_EEK_CreatePolygonMesh(void* ptr, Point2d* points, int pointsCount, BOOL xz)\n{\n\tPolyhedron3<EEK>::CreatePolygonMesh(ptr, points, pointsCount, xz);\n}\n\nPolygonalCount Polyhedron3_EEK_GetPolygonalCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::GetPolygonalCount(ptr);\n}\n\nPolygonalCount Polyhedron3_EEK_GetDualPolygonalCount(void* ptr)\n{\n\treturn Polyhedron3<EEK>::GetDualPolygonalCount(ptr);\n}\n\nvoid Polyhedron3_EEK_CreatePolygonalMesh(void* ptr,\n\tPoint3d* points, int pointsCount,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EEK>::CreatePolygonalMesh(ptr, \n\t\tpoints, pointsCount, \n\t\ttriangles, triangleCount, \n\t\tquads, quadCount, \n\t\tpentagons, pentagonCount, \n\t\thexagons, hexagonCount);\n}\n\nvoid Polyhedron3_EEK_GetPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EEK>::GetPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid Polyhedron3_EEK_GetDualPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EEK>::GetDualPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nint Polyhedron3_EEK_AddFacetToBorder(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EEK>::AddFacetToBorder(ptr, h, g);\n}\n\nint Polyhedron3_EEK_AddVertexAndFacetToBorder(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EEK>::AddVertexAndFacetToBorder(ptr, h, g);\n}\n\nint Polyhedron3_EEK_CreateCenterVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::CreateCenterVertex(ptr, h);\n}\n\nint Polyhedron3_EEK_EraseCenterVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::EraseCenterVertex( ptr, h);\n}\n\nBOOL Polyhedron3_EEK_EraseConnectedComponent(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::EraseConnectedComponent(ptr, h);\n}\n\nBOOL Polyhedron3_EEK_EraseFacet(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::EraseFacet(ptr, h);\n}\n\nint Polyhedron3_EEK_FillHole(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::FillHole(ptr, h);\n}\n\nint Polyhedron3_EEK_FlipEdge(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::FlipEdge(ptr, h);\n}\n\nint Polyhedron3_EEK_JoinFacet(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::JoinFacet(ptr, h);\n}\n\nint Polyhedron3_EEK_JoinLoop(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EEK>::JoinLoop(ptr, h, g);\n}\n\nint Polyhedron3_EEK_JoinVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::JoinVertex(ptr, h);\n}\n\nint Polyhedron3_EEK_MakeHole(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::MakeHole(ptr, h);\n}\n\nint Polyhedron3_EEK_SplitEdge(void* ptr, int h)\n{\n\treturn Polyhedron3<EEK>::SplitEdge(ptr, h);\n}\n\nint Polyhedron3_EEK_SplitFacet(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EEK>::SplitFacet(ptr, h, g);\n}\n\nint Polyhedron3_EEK_SplitLoop(void* ptr, int h, int g, int k)\n{\n\treturn Polyhedron3<EEK>::SplitLoop(ptr, h, g, k);\n}\n\nint Polyhedron3_EEK_SplitVertex(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EEK>::SplitVertex(ptr, h, g);\n}\n\n/*\ntypedef typename EEK::FT FT;\ntypedef typename EEK::Point_3 Point;\ntypedef typename EEK::Vector_3 Vector;\ntypedef CGAL::Polyhedron_3<EEK, CGAL::Polyhedron_items_with_id_3> Polyhedron;\ntypedef typename Polyhedron::HalfedgeDS HalfedgeDS;\ntypedef typename HalfedgeDS::Vertex Vertex;\ntypedef typename HalfedgeDS::Face Face;\ntypedef typename HalfedgeDS::Halfedge Halfedge;\n\n//typedef typename boost::graph_traits<Polyhedron>::vertex_descriptor\tVertex_Des;\ntypedef typename boost::graph_traits<Polyhedron>::face_descriptor Face_Des;\ntypedef typename boost::graph_traits<Polyhedron>::edge_descriptor Edge_Des;\ntypedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor Halfedge_Des;\n\ntypedef typename HalfedgeDS::Vertex_iterator Vertex_Iter;\n\nvoid Test()\n{\n\n\tPolyhedron model;\n\n}\n*/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/Polyhedron3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"PolygonalCount.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\t\n\tCGALWRAPPER_API void* Polyhedron3_EEK_Create();\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL force);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_GetBuildStamp(void* ptr);\n\n\tCGALWRAPPER_API void* Polyhedron3_EEK_Copy(void* ptr);\n\t\n\tCGALWRAPPER_API int Polyhedron3_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_HalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_BorderEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_BorderHalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsClosed(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsPureBivalent(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsPureTrivalent(void* ptr);\n\t\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsPureTriangle(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_IsPureQuad(void* ptr);\n\n\tCGALWRAPPER_API Box3d Polyhedron3_EEK_GetBoundingBox(void* ptr);\n\t\n\tCGALWRAPPER_API int Polyhedron3_EEK_MakeTetrahedron(void* ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_MakeTriangle(void* ptr, Point3d p1, Point3d p2, Point3d p3);\n\n\tCGALWRAPPER_API Point3d Polyhedron3_EEK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetSegment(void* ptr, int index, Segment3d& segment);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetVertex(void* ptr, int index, MeshVertex3& vert);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetFace(void* ptr, int index, MeshFace3& face);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetVertices(void* ptr, MeshVertex3* vertices, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetFaces(void* ptr, MeshFace3* faces, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetHalfedges(void* ptr, MeshHalfedge3* edges, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_Transform(void* ptr, Matrix4x4d matrix);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_InsideOut(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_Triangulate(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_NormalizeBorder(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_NormalizedBorderIsValid(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Polyhedron3_EEK_SideOfTriangleMesh(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_DoesSelfIntersect(void* ptr);\n\n\tCGALWRAPPER_API double Polyhedron3_EEK_Area(void* ptr);\n\n\tCGALWRAPPER_API Point3d Polyhedron3_EEK_Centroid(void* ptr);\n\n\tCGALWRAPPER_API double Polyhedron3_EEK_Volume(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_DoesBoundAVolume(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_BuildAABBTree(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ReleaseAABBTree(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ReadOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_WriteOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetCentroids(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ComputeVertexNormals(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_ComputeFaceNormals(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetVertexNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetFaceNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_CreatePolygonMesh(void* ptr, Point2d* points, int pointsCount, BOOL xz);\n\n\tCGALWRAPPER_API PolygonalCount Polyhedron3_EEK_GetPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API PolygonalCount Polyhedron3_EEK_GetDualPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void Polyhedron3_EEK_GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_AddFacetToBorder(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_AddVertexAndFacetToBorder(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_CreateCenterVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_EraseCenterVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_EraseConnectedComponent(void* ptr, int h);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EEK_EraseFacet(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_FillHole(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_FlipEdge(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_JoinFacet(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_JoinLoop(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_JoinVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_MakeHole(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_SplitEdge(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_SplitFacet(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_SplitLoop(void* ptr, int h, int g, int k);\n\n\tCGALWRAPPER_API int Polyhedron3_EEK_SplitVertex(void* ptr, int h, int g);\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/Polyhedron3_EIK.cpp",
    "content": "#include \"Polyhedron3_EIK.h\"\n\n#include \"Polyhedron3.h\"\n\nvoid* Polyhedron3_EIK_Create()\n{\n\treturn Polyhedron3<EIK>::NewPolyhedron();\n}\n\nvoid Polyhedron3_EIK_Release(void* ptr)\n{\n\tPolyhedron3<EIK>::DeletePolyhedron(ptr);\n}\n\nint Polyhedron3_EIK_GetBuildStamp(void* ptr)\n{\n\treturn Polyhedron3<EIK>::GetBuildStamp(ptr);\n}\n\nvoid Polyhedron3_EIK_Clear(void* ptr)\n{\n\tPolyhedron3<EIK>::Clear(ptr);\n}\n\nvoid Polyhedron3_EIK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges)\n{\n\tPolyhedron3<EIK>::ClearIndexMaps(ptr, vertices, faces, edges);\n}\n\nvoid Polyhedron3_EIK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n{\n\tPolyhedron3<EIK>::ClearNormalMaps(ptr, vertices, faces);\n}\n\nvoid Polyhedron3_EIK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL force)\n{\n\tPolyhedron3<EIK>::BuildIndices(ptr, vertices, faces, edges, force);\n}\n\nvoid* Polyhedron3_EIK_Copy(void* ptr)\n{\n\treturn Polyhedron3<EIK>::Copy(ptr);\n}\n\nint Polyhedron3_EIK_VertexCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::VertexCount(ptr);\n}\n\nint Polyhedron3_EIK_FaceCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::FaceCount(ptr);\n}\n\nint Polyhedron3_EIK_HalfEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::HalfEdgeCount(ptr);\n}\n\nint Polyhedron3_EIK_BorderEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::BorderEdgeCount(ptr);\n}\n\nint Polyhedron3_EIK_BorderHalfEdgeCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::BorderHalfEdgeCount(ptr);\n}\n\nBOOL Polyhedron3_EIK_IsValid(void* ptr, int level)\n{\n\treturn Polyhedron3<EIK>::IsValid(ptr, level);\n}\n\nBOOL Polyhedron3_EIK_IsClosed(void* ptr)\n{\n\treturn Polyhedron3<EIK>::IsClosed(ptr);\n}\n\nBOOL Polyhedron3_EIK_IsPureBivalent(void* ptr)\n{\n\treturn Polyhedron3<EIK>::IsPureBivalent(ptr);\n}\n\nBOOL Polyhedron3_EIK_IsPureTrivalent(void* ptr)\n{\n\treturn Polyhedron3<EIK>::IsPureTrivalent(ptr);\n}\n\nBOOL Polyhedron3_EIK_IsPureTriangle(void* ptr)\n{\n\treturn Polyhedron3<EIK>::IsPureTriangle(ptr);\n}\n\nBOOL Polyhedron3_EIK_IsPureQuad(void* ptr)\n{\n\treturn Polyhedron3<EIK>::IsPureQuad(ptr);\n}\n\nBox3d Polyhedron3_EIK_GetBoundingBox(void* ptr)\n{\n\treturn Polyhedron3<EIK>::GetBoundingBox(ptr);\n}\n\nint Polyhedron3_EIK_MakeTetrahedron(void* ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4)\n{\n\treturn Polyhedron3<EIK>::MakeTetrahedron(ptr, p1, p2, p3, p4);\n}\n\nint Polyhedron3_EIK_MakeTriangle(void* ptr, Point3d p1, Point3d p2, Point3d p3)\n{\n\treturn Polyhedron3<EIK>::MakeTriangle(ptr, p1, p2, p3);\n}\n\nPoint3d Polyhedron3_EIK_GetPoint(void* ptr, int index)\n{\n\treturn Polyhedron3<EIK>::GetPoint(ptr, index);\n}\n\nvoid Polyhedron3_EIK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\treturn Polyhedron3<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyhedron3_EIK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tPolyhedron3<EIK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyhedron3_EIK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyhedron3<EIK>::SetPoints(ptr, points, count);\n}\n\nBOOL Polyhedron3_EIK_GetSegment(void* ptr, int index, Segment3d& segment)\n{\n\treturn Polyhedron3<EIK>::GetSegment(ptr, index, segment);\n}\n\nBOOL Polyhedron3_EIK_GetTriangle(void* ptr, int index, Triangle3d& tri)\n{\n\treturn Polyhedron3<EIK>::GetTriangle(ptr, index, tri);\n}\n\nBOOL Polyhedron3_EIK_GetVertex(void* ptr, int index, MeshVertex3& vert)\n{\n\treturn Polyhedron3<EIK>::GetVertex(ptr, index, vert);\n}\n\nBOOL Polyhedron3_EIK_GetFace(void* ptr, int index, MeshFace3& face)\n{\n\treturn Polyhedron3<EIK>::GetFace(ptr, index, face);\n}\n\nBOOL Polyhedron3_EIK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n{\n\treturn Polyhedron3<EIK>::GetHalfedge(ptr, index, edge);\n}\n\n\nvoid Polyhedron3_EIK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tPolyhedron3<EIK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyhedron3_EIK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tPolyhedron3<EIK>::GetTriangles(ptr, triangles, count);\n}\n\nvoid Polyhedron3_EIK_GetVertices(void* ptr, MeshVertex3* vertices, int count)\n{\n\tPolyhedron3<EIK>::GetVertices(ptr, vertices, count);\n}\n\nvoid Polyhedron3_EIK_GetFaces(void* ptr, MeshFace3* faces, int count)\n{\n\tPolyhedron3<EIK>::GetFaces(ptr, faces, count);\n}\n\nvoid Polyhedron3_EIK_GetHalfedges(void* ptr, MeshHalfedge3* edges, int count)\n{\n\tPolyhedron3<EIK>::GetHalfedges(ptr, edges, count);\n}\n\nvoid Polyhedron3_EIK_Transform(void* ptr, Matrix4x4d matrix)\n{\n\tPolyhedron3<EIK>::Transform(ptr, matrix);\n}\n\nvoid Polyhedron3_EIK_InsideOut(void* ptr)\n{\n\tPolyhedron3<EIK>::InsideOut(ptr);\n}\n\nvoid Polyhedron3_EIK_Triangulate(void* ptr)\n{\n\tPolyhedron3<EIK>::Triangulate(ptr);\n}\n\nvoid Polyhedron3_EIK_NormalizeBorder(void* ptr)\n{\n\tPolyhedron3<EIK>::NormalizeBorder(ptr);\n}\n\nBOOL Polyhedron3_EIK_NormalizedBorderIsValid(void* ptr)\n{\n\treturn Polyhedron3<EIK>::NormalizedBorderIsValid(ptr);\n}\n\nCGAL::Bounded_side Polyhedron3_EIK_SideOfTriangleMesh(void* ptr, const Point3d& point)\n{\n\treturn Polyhedron3<EIK>::SideOfTriangleMesh(ptr, point);\n}\n\nBOOL Polyhedron3_EIK_DoesSelfIntersect(void* ptr)\n{\n\treturn Polyhedron3<EIK>::DoesSelfIntersect(ptr);\n}\n\ndouble Polyhedron3_EIK_Area(void* ptr)\n{\n\treturn Polyhedron3<EIK>::Area(ptr);\n}\n\nPoint3d Polyhedron3_EIK_Centroid(void* ptr)\n{\n\treturn Polyhedron3<EIK>::Centroid(ptr);\n}\n\ndouble Polyhedron3_EIK_Volume(void* ptr)\n{\n\treturn Polyhedron3<EIK>::Volume(ptr);\n}\n\nBOOL Polyhedron3_EIK_DoesBoundAVolume(void* ptr)\n{\n\treturn Polyhedron3<EIK>::DoesBoundAVolume(ptr);\n}\n\nvoid Polyhedron3_EIK_BuildAABBTree(void* ptr)\n{\n\tPolyhedron3<EIK>::BuildAABBTree(ptr);\n}\n\nvoid Polyhedron3_EIK_ReleaseAABBTree(void* ptr)\n{\n\tPolyhedron3<EIK>::ReleaseAABBTree(ptr);\n}\n\nBOOL Polyhedron3_EIK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n{\n\treturn Polyhedron3<EIK>::DoIntersects(ptr, otherPtr, test_bounded_sides);\n}\n\nvoid Polyhedron3_EIK_ReadOFF(void* ptr, const char* filename)\n{\n\tPolyhedron3<EIK>::ReadOFF(ptr, filename);\n}\n\nvoid Polyhedron3_EIK_WriteOFF(void* ptr, const char* filename)\n{\n\tPolyhedron3<EIK>::WriteOFF(ptr, filename);\n}\n\nvoid Polyhedron3_EIK_GetCentroids(void* ptr, Point3d* points, int count)\n{\n\tPolyhedron3<EIK>::GetCentroids(ptr, points, count);\n}\n\nvoid Polyhedron3_EIK_ComputeVertexNormals(void* ptr)\n{\n\tPolyhedron3<EIK>::ComputeVertexNormals(ptr);\n}\n\nvoid Polyhedron3_EIK_ComputeFaceNormals(void* ptr)\n{\n\tPolyhedron3<EIK>::ComputeFaceNormals(ptr);\n}\n\nvoid Polyhedron3_EIK_GetVertexNormals(void* ptr, Vector3d* normals, int count)\n{\n\tPolyhedron3<EIK>::GetVertexNormals(ptr, normals, count);\n}\n\nvoid Polyhedron3_EIK_GetFaceNormals(void* ptr, Vector3d* normals, int count)\n{\n\tPolyhedron3<EIK>::GetFaceNormals(ptr, normals, count);\n}\n\nvoid Polyhedron3_EIK_CreatePolygonMesh(void* ptr, Point2d* points, int pointsCount, BOOL xz)\n{\n\tPolyhedron3<EIK>::CreatePolygonMesh(ptr, points, pointsCount, xz);\n}\n\nPolygonalCount Polyhedron3_EIK_GetPolygonalCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::GetPolygonalCount(ptr);\n}\n\nPolygonalCount Polyhedron3_EIK_GetDualPolygonalCount(void* ptr)\n{\n\treturn Polyhedron3<EIK>::GetDualPolygonalCount(ptr);\n}\n\nvoid Polyhedron3_EIK_CreatePolygonalMesh(void* ptr,\n\tPoint3d* points, int pointsCount,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EIK>::CreatePolygonalMesh(ptr,\n\t\tpoints, pointsCount,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid Polyhedron3_EIK_GetPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EIK>::GetPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid Polyhedron3_EIK_GetDualPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tPolyhedron3<EIK>::GetDualPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nint Polyhedron3_EIK_AddFacetToBorder(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EIK>::AddFacetToBorder(ptr, h, g);\n}\n\nint Polyhedron3_EIK_AddVertexAndFacetToBorder(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EIK>::AddVertexAndFacetToBorder(ptr, h, g);\n}\n\nint Polyhedron3_EIK_CreateCenterVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::CreateCenterVertex(ptr, h);\n}\n\nint Polyhedron3_EIK_EraseCenterVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::EraseCenterVertex(ptr, h);\n}\n\nBOOL Polyhedron3_EIK_EraseConnectedComponent(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::EraseConnectedComponent(ptr, h);\n}\n\nBOOL Polyhedron3_EIK_EraseFacet(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::EraseFacet(ptr, h);\n}\n\nint Polyhedron3_EIK_FillHole(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::FillHole(ptr, h);\n}\n\nint Polyhedron3_EIK_FlipEdge(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::FlipEdge(ptr, h);\n}\n\nint Polyhedron3_EIK_JoinFacet(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::JoinFacet(ptr, h);\n}\n\nint Polyhedron3_EIK_JoinLoop(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EIK>::JoinLoop(ptr, h, g);\n}\n\nint Polyhedron3_EIK_JoinVertex(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::JoinVertex(ptr, h);\n}\n\nint Polyhedron3_EIK_MakeHole(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::MakeHole(ptr, h);\n}\n\nint Polyhedron3_EIK_SplitEdge(void* ptr, int h)\n{\n\treturn Polyhedron3<EIK>::SplitEdge(ptr, h);\n}\n\nint Polyhedron3_EIK_SplitFacet(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EIK>::SplitFacet(ptr, h, g);\n}\n\nint Polyhedron3_EIK_SplitLoop(void* ptr, int h, int g, int k)\n{\n\treturn Polyhedron3<EIK>::SplitLoop(ptr, h, g, k);\n}\n\nint Polyhedron3_EIK_SplitVertex(void* ptr, int h, int g)\n{\n\treturn Polyhedron3<EIK>::SplitVertex(ptr, h, g);\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/Polyhedron3_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"PolygonalCount.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Polyhedron3_EIK_Create();\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL force);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_GetBuildStamp(void* ptr);\n\n\tCGALWRAPPER_API void* Polyhedron3_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_HalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_BorderEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_BorderHalfEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsClosed(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsPureBivalent(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsPureTrivalent(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsPureTriangle(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_IsPureQuad(void* ptr);\n\n\tCGALWRAPPER_API Box3d Polyhedron3_EIK_GetBoundingBox(void* ptr);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_MakeTetrahedron(void* ptr, Point3d p1, Point3d p2, Point3d p3, Point3d p4);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_MakeTriangle(void* ptr, Point3d p1, Point3d p2, Point3d p3);\n\n\tCGALWRAPPER_API Point3d Polyhedron3_EIK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetSegment(void* ptr, int index, Segment3d& segment);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetVertex(void* ptr, int index, MeshVertex3& vert);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetFace(void* ptr, int index, MeshFace3& face);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetVertices(void* ptr, MeshVertex3* vertices, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetFaces(void* ptr, MeshFace3* faces, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetHalfedges(void* ptr, MeshHalfedge3* edges, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_Transform(void* ptr, Matrix4x4d matrix);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_InsideOut(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_Triangulate(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_NormalizeBorder(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_NormalizedBorderIsValid(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side Polyhedron3_EIK_SideOfTriangleMesh(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_DoesSelfIntersect(void* ptr);\n\n\tCGALWRAPPER_API double Polyhedron3_EIK_Area(void* ptr);\n\n\tCGALWRAPPER_API Point3d Polyhedron3_EIK_Centroid(void* ptr);\n\n\tCGALWRAPPER_API double Polyhedron3_EIK_Volume(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_DoesBoundAVolume(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_BuildAABBTree(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ReleaseAABBTree(void* ptr);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ReadOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_WriteOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetCentroids(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ComputeVertexNormals(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_ComputeFaceNormals(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetVertexNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetFaceNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_CreatePolygonMesh(void* ptr, Point2d* points, int pointsCount, BOOL xz);\n\n\tCGALWRAPPER_API PolygonalCount Polyhedron3_EIK_GetPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API PolygonalCount Polyhedron3_EIK_GetDualPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void Polyhedron3_EIK_GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_AddFacetToBorder(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_AddVertexAndFacetToBorder(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_CreateCenterVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_EraseCenterVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_EraseConnectedComponent(void* ptr, int h);\n\n\tCGALWRAPPER_API BOOL Polyhedron3_EIK_EraseFacet(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_FillHole(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_FlipEdge(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_JoinFacet(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_JoinLoop(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_JoinVertex(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_MakeHole(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_SplitEdge(void* ptr, int h);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_SplitFacet(void* ptr, int h, int g);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_SplitLoop(void* ptr, int h, int g, int k);\n\n\tCGALWRAPPER_API int Polyhedron3_EIK_SplitVertex(void* ptr, int h, int g);\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/PolyhedronMap.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"Polyhedron3.h\"\n\n#include <vector>\n#include <unordered_map>\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n\ntemplate<class K>\nclass PolyhedronMap\n{\nprivate:\n\n\ttypedef typename K::Point_3 Point;\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\t//typedef CGAL::Polyhedron_3<K, CGAL::Polyhedron_items_with_id_3> Polyhedron;\n\t//typedef typename boost::graph_traits<Polyhedron>::vertex_descriptor\tVertex_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::face_descriptor Face_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::edge_descriptor Edge_Des;\n\t//typedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor Halfedge_Des;\n\n\ttypedef typename Polyhedron::HalfedgeDS HalfedgeDS;\n\ttypedef typename HalfedgeDS::Vertex Vertex;\n\ttypedef typename HalfedgeDS::Face Face;\n\ttypedef typename HalfedgeDS::Halfedge Halfedge;\n\n\ttypedef typename HalfedgeDS::Vertex_iterator Vertex_Iter;\n\ttypedef typename HalfedgeDS::Face_iterator Face_Iter;\n\ttypedef typename HalfedgeDS::Halfedge_iterator Halfedge_Iter;\n\n\tint buildStamp = 1;\n\n\tstd::unordered_map<Vertex_Iter, int> vertexIndexMap;\n\t//std::vector<Vertex> vertexMap;\n\tstd::vector<Vertex_Iter> vertexIterMap;\n\tbool rebuildVertexIndexMap = true;\n\n\tstd::unordered_map<Face_Iter, int> faceIndexMap;\n\tstd::vector<Face_Iter> faceIterMap;\n\tbool rebuildFaceIndexMap = true;\n\n\tstd::unordered_map<Halfedge_Iter, int> halfedgeIndexMap;\n\tstd::vector<Halfedge_Iter> halfedgeIterMap;\n\tbool rebuildHalfedgeIndexMap = true;\n\npublic:\n\n\tint BuildStamp()\n\t{\n\t\treturn buildStamp;\n\t}\n\n\tvoid OnVerticesChanged()\n\t{\n\t\tvertexIterMap.clear();\n\t\tvertexIterMap.reserve(0);\n\t\t//vertexIndexMap.clear();\n\t\trebuildVertexIndexMap = true;\n\t}\n\n\tvoid OnFacesChanged()\n\t{\n\t\tfaceIterMap.clear();\n\t\tfaceIterMap.reserve(0);\n\t\t//faceIndexMap.clear();\n\t\trebuildFaceIndexMap = true;\n\t}\n\n\tvoid OnHalfedgesChanged()\n\t{\n\t\thalfedgeIterMap.clear();\n\t\thalfedgeIterMap.reserve(0);\n\t\t//halfedgeIndexMap.clear();\n\t\trebuildHalfedgeIndexMap = true;\n\t}\n\n\tvoid Clear()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t\tOnHalfedgesChanged();\n\t}\n\n\tvoid BuildVertexMaps(Polyhedron& model, bool force = false)\n\t{\n\t\t\n\t\tif (!force && !rebuildVertexIndexMap) return;\n\t\trebuildVertexIndexMap = false;\n\n\t\tauto count = model.size_of_vertices();\n\t\t//vertexMap.reserve(count);\n\t\tvertexIterMap.reserve(count);\n\t\tvertexIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t{\n\t\t\t//vert->id() = index;\n\t\t\t//vertexMap.push_back(*vert);\n\t\t\tvertexIterMap.push_back(vert);\n\t\t\tvertexIndexMap.insert(std::pair<Vertex_Iter, int>(vert, index));\n\t\t\tindex++;\n\t\t}\n\t\t\n\t}\n\n\tvoid BuildFaceMaps(Polyhedron& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildFaceIndexMap) return;\n\t\trebuildFaceIndexMap = false;\n\n\t\tauto count = model.size_of_facets();\n\t\tfaceIterMap.reserve(count);\n\t\tfaceIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (Face_Iter face = model.facets_begin(); face != model.facets_end(); ++face)\n\t\t{\n\t\t\t//face->id() = index;\n\t\t\tfaceIterMap.push_back(face);\n\t\t\tfaceIndexMap.insert(std::pair<Face_Iter, int>(face, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tvoid BuildHalfedgeMaps(Polyhedron& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildHalfedgeIndexMap) return;\n\t\trebuildHalfedgeIndexMap = false;\n\n\t\tauto count = model.size_of_halfedges();\n\t\thalfedgeIterMap.reserve(count);\n\t\thalfedgeIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (Halfedge_Iter hedge = model.halfedges_begin(); hedge != model.halfedges_end(); ++hedge)\n\t\t{\n\t\t\t//hedge->id() = index;\n\t\t\thalfedgeIterMap.push_back(hedge);\n\t\t\thalfedgeIndexMap.insert(std::pair<Halfedge_Iter, int>(hedge, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tint FindVertexIndex(Polyhedron& model, Vertex_Iter v)\n\t{\n\t\t//return v->id();\n\n\t\t/*\n\t\tint i = 0;\n\t\tfor (Vertex_Iter vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t{\n\t\t\tif (v == vert) return i;\n\t\t\ti++;\n\t\t}\n\n\t\t*/\n\n\t\tauto item = vertexIndexMap.find(v);\n\t\tif (item != vertexIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tVertex_Iter* FindVertexIter(Polyhedron& model, int index)\n\t{\n\t\t/*\n\t\tint i = 0;\n\t\tfor (Vertex_Iter vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t{\n\t\t\tif (i == index) return &vert;\n\t\t\ti++;\n\t\t}\n\n\t\treturn nullptr;\n\t\t*/\n\n\t\tint count = (int)vertexIterMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn nullptr;\n\n\t\treturn &vertexIterMap[index];\n\n\t}\n\n\tVertex* FindVertex(Polyhedron& model, int index)\n\t{\n\t\tint count = (int)model.size_of_vertices();\n\n\t\tint i = 0;\n\t\tfor (Vertex_Iter vert = model.vertices_begin(); vert != model.vertices_end(); ++vert)\n\t\t{\n\t\t\tif (i == index) return &(*vert);\n\t\t\ti++;\n\t\t}\n\n\t\treturn nullptr;\n\n\t\t/*\n\t\tint count = (int)vertexMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn nullptr;\n\n\t\treturn &vertexMap[index];\n\t\t*/\n\t}\n\n\tint FindFaceIndex(Face_Iter face)\n\t{\n\t\t//return face->id();\n\n\t\tauto item = faceIndexMap.find(face);\n\t\tif (item != faceIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tFace_Iter* FindFaceIter(int index)\n\t{\n\t\tint count = (int)faceIterMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn nullptr;\n\n\t\treturn &faceIterMap[index];\n\t}\n\n\tint FindHalfedgeIndex(Halfedge_Iter edge)\n\t{\n\t\t//return edge->id();\n\t\t\n\t\tauto item = halfedgeIndexMap.find(edge);\n\t\tif (item != halfedgeIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t\t\t\n\t}\n\n\tHalfedge_Iter* FindHalfedgeIter(int index)\n\t{\n\t\tint count = (int)halfedgeIterMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn nullptr;\n\n\t\treturn &halfedgeIterMap[index];\n\t}\n\n\tHalfedge_Iter GetHalfedgeIter(int index)\n\t{\n\t\treturn halfedgeIterMap[index];\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMesh3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"../Utility/ArrayUtil.h\"\n#include \"PolygonalCount.h\"\n#include \"SurfaceMeshMap.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\n#include <limits>\n#include <fstream>\n#include <iostream>\n#include <unordered_set>\n#include <unordered_map>\n\n#include <CGAL/Surface_mesh.h>\n#include <CGAL/Aff_transformation_3.h>\n#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>\n#include <CGAL/Side_of_triangle_mesh.h>\n#include <CGAL/Polygon_mesh_processing/orientation.h>\n#include <CGAL/Polygon_mesh_processing/self_intersections.h>\n#include <CGAL/Polygon_mesh_processing/measure.h>\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/Polygon_mesh_processing/locate.h>\n#include <CGAL/Polygon_mesh_processing/intersection.h>\n#include <CGAL/Polygon_mesh_processing/bbox.h>\n#include <CGAL/Bbox_3.h>\n\ntemplate<class K>\nclass SurfaceMesh3\n{\n\npublic:\n\n\tstatic constexpr const char* VERTEX_NORMAL_MAP_NAME = \"v:normal\";\n\tstatic constexpr const char* FACE_NORMAL_MAP_NAME = \"f:normal\";\n\n\ttypedef typename K::FT FT;\n\ttypedef typename K::Point_3 Point_3;\n\ttypedef typename K::Vector_3 Vector_3;\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Edge_index Edge;\n\ttypedef typename SurfaceMesh::Halfedge_index Halfedge;\n\ttypedef typename SurfaceMesh::Vertex_index Vertex;\n\ttypedef typename SurfaceMesh::Face_index Face;\n\n\ttypedef typename CGAL::AABB_face_graph_triangle_primitive<SurfaceMesh> AABB_face_graph_primitive;\n\ttypedef typename CGAL::AABB_traits<K, AABB_face_graph_primitive> AABB_face_graph_traits;\n\ttypedef typename CGAL::AABB_tree<AABB_face_graph_traits> AABBTree;\n\n\ttypedef typename boost::graph_traits<SurfaceMesh>::vertex_descriptor VertexDes;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor FaceDes;\n\n\t~SurfaceMesh3()\n\t{\n\t\tDeleteTree();\n\t}\n\n\tSurfaceMesh model;\n\n\tAABBTree* tree = nullptr;\n\n\tSurfaceMeshMap<K> map;\n\nprivate:\n\n\tbool vertexNormalsComputed = false;\n\n\tbool faceNormalsComputed = false;\n\npublic:\n\n\tinline static SurfaceMesh3* NewSurfaceMesh()\n\t{\n\t\treturn new SurfaceMesh3();\n\t}\n\n\tinline static void DeleteSurfaceMesh(void* ptr)\n\t{\n\t\tauto obj = static_cast<SurfaceMesh3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static SurfaceMesh3* CastToSurfaceMesh(void* ptr)\n\t{\n\t\treturn static_cast<SurfaceMesh3*>(ptr);\n\t}\n\n\tinline static Point3d NullPoint()\n\t{\n\t\treturn { 0, 0, 0 };\n\t}\n\n\tinline static Vertex NullVertex()\n\t{\n\t\treturn SurfaceMesh::null_vertex();\n\t}\n\n\tinline static Face NullFace()\n\t{\n\t\treturn SurfaceMesh::null_face();\n\t}\n\n\tinline static Edge NullEdge()\n\t{\n\t\treturn SurfaceMesh::null_edge();\n\t}\n\n\tinline static Halfedge NullHalfedge()\n\t{\n\t\treturn SurfaceMesh::null_halfedge();\n\t}\n\n\tvoid OnVertexNormalsChanged()\n\t{\n\t\tClearVertexNormalMap();\n\t\tvertexNormalsComputed = false;\n\t}\n\n\tvoid OnFaceNormalsChanged()\n\t{\n\t\tClearFaceNormalMap();\n\t\tfaceNormalsComputed = false;\n\t}\n\n\tvoid OnVerticesChanged()\n\t{\n\t\tOnVertexNormalsChanged();\n\t\tmap.OnVerticesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnFacesChanged()\n\t{\n\t\tOnFaceNormalsChanged();\n\t\tmap.OnFacesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnEdgesChanged()\n\t{\n\t\tmap.OnEdgesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnHalfedgesChanged()\n\t{\n\t\tmap.OnHalfedgesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid OnModelChanged()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t\tOnEdgesChanged();\n\t\tOnHalfedgesChanged();\n\t\tDeleteTree();\n\t}\n\n\tvoid BuildModel()\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\tmap.BuildFaceMaps(model);\n\t\tmap.BuildEdgeMaps(model);\n\t\tmap.BuildHalfedgeMaps(model);\n\t}\n\n\tvoid DeleteTree()\n\t{\n\t\tif (tree != nullptr)\n\t\t{\n\t\t\tdelete tree;\n\t\t\ttree = nullptr;\n\t\t}\n\t}\n\n\tvoid BuildAABBTree()\n\t{\n\t\tif (tree == nullptr)\n\t\t{\n\t\t\ttree = new AABBTree();\n\t\t\tCGAL::Polygon_mesh_processing::build_AABB_tree(model, *tree);\n\t\t}\n\t}\n\n\tvoid ClearVertexNormalMap()\n\t{\n\t\tauto pair = model.property_map<VertexDes, Vector_3>(VERTEX_NORMAL_MAP_NAME);\n\t\tmodel.remove_property_map(pair.first);\n\t\tvertexNormalsComputed = false;\n\t}\n\n\tvoid ClearFaceNormalMap()\n\t{\n\t\tauto pair = model.property_map<FaceDes, Vector_3>(FACE_NORMAL_MAP_NAME);\n\t\tmodel.remove_property_map(pair.first);\n\t\tfaceNormalsComputed = false;\n\t}\n\n\tauto AddScalarPropertyMap(const char* name)\n\t{\n\t\treturn model.add_property_map<VertexDes, double>(name, 0).first;\n\t}\n\n\tvoid ClearScalarPropertyMap(const char* name)\n\t{\n\t\tauto pair = model.property_map<VertexDes, double>(name);\n\t\tmodel.remove_property_map(pair.first);\n\t}\n\n\tint FindVertexIndex(Vertex vertex)\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\treturn map.FindVertexIndex(vertex);\n\t}\n\n\tVertex FindVertex(int index)\n\t{\n\t\tmap.BuildVertexMaps(model);\n\t\treturn map.FindVertex(index);\n\t}\n\n\tint FindFaceIndex(Face face)\n\t{\n\t\tmap.BuildFaceMaps(model);\n\t\treturn map.FindFaceIndex(face);\n\t}\n\n\tFace FindFace(int index)\n\t{\n\t\tmap.BuildFaceMaps(model);\n\t\treturn map.FindFace(index);\n\t}\n\n\tint FindEdgeIndex(Edge edge)\n\t{\n\t\tmap.BuildEdgeMaps(model);\n\t\treturn map.FindEdgeIndex(edge);\n\t}\n\n\tEdge FindEdge(int index)\n\t{\n\t\tmap.BuildEdgeMaps(model);\n\t\treturn map.FindEdge(index);\n\t}\n\n\tint FindHalfedgeIndex(Halfedge edge)\n\t{\n\t\tmap.BuildHalfedgeMaps(model);\n\t\treturn map.FindHalfedgeIndex(edge);\n\t}\n\n\tHalfedge FindHalfedge(int index)\n\t{\n\t\tmap.BuildHalfedgeMaps(model);\n\t\treturn map.FindHalfedge(index);\n\t}\n\n\tstatic int GetBuildStamp(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn mesh->map.BuildStamp();\n\t}\n\n\tvoid Clear()\n\t{\n\t\tmodel.clear();\n\t\tmodel.collect_garbage();\n\t\tOnModelChanged();\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->Clear();\n\t}\n\n\tstatic void ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tif (vertices) mesh->map.OnVerticesChanged();\n\t\tif (faces) mesh->map.OnFacesChanged();\n\t\tif (edges) mesh->map.OnEdgesChanged();\n\t\tif (halfedges) mesh->map.OnEdgesChanged();\n\t}\n\n\tstatic void ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tif (vertices) mesh->OnVertexNormalsChanged();\n\t\tif (faces) mesh->OnFaceNormalsChanged();\n\t}\n\n\tstatic void ClearProperyMaps(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->ClearVertexNormalMap();\n\t\tmesh->ClearFaceNormalMap();\n\t\tmesh->model.remove_all_property_maps();\n\t}\n\n\tstatic void BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tif (vertices) mesh->map.BuildVertexMaps(mesh->model, force);\n\t\tif (faces) mesh->map.BuildFaceMaps(mesh->model, force);\n\t\tif (edges) mesh->map.BuildEdgeMaps(mesh->model, force);\n\t\tif (halfedges) mesh->map.BuildHalfedgeMaps(mesh->model, force);\n\t}\n\n\tstatic void PrintIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tBuildIndices(ptr, vertices, faces, edges, halfedges, force);\n\n\t\tif (vertices) mesh->map.PrintVertices(mesh->model);\n\t\tif (faces) mesh->map.PrintFaces(mesh->model);\n\t\tif (edges) mesh->map.PrintEdges(mesh->model);\n\t\tif (halfedges) mesh->map.PrintHalfedges(mesh->model);\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto copy = new SurfaceMesh3();\n\t\tcopy->model = mesh->model;\n\t\treturn copy;\n\t}\n\n\tstatic BOOL IsValid(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn mesh->model.is_valid(false);\n\t}\n\n\tstatic BOOL IsVertexValid(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\t\treturn mesh->model.is_valid(vertex);\n\t}\n\n\tstatic BOOL IsFaceValid(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto face = mesh->FindFace(index);\n\t\tif (face == NullFace()) return FALSE;\n\t\treturn mesh->model.is_valid(face);\n\t}\n\n\tstatic BOOL IsHalfedgeValid(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return FALSE;\n\t\treturn mesh->model.is_valid(hedge);\n\t}\n\n\tstatic BOOL IsEdgeValid(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto edge = mesh->FindEdge(index);\n\t\tif (edge == NullEdge()) return FALSE;\n\t\treturn mesh->model.is_valid(edge);\n\t}\n\n\tstatic int VertexCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_vertices();\n\t}\n\n\tstatic int HalfedgeCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_halfedges();\n\t}\n\n\tstatic int EdgeCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_edges();\n\t}\n\n\tstatic int FaceCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_faces();\n\t}\n\n\tstatic int RemovedVertexCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_removed_vertices();\n\t}\n\n\tstatic int RemovedHalfedgeCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_removed_halfedges();\n\t}\n\n\tstatic int RemovedEdgeCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_removed_edges();\n\t}\n\n\tstatic int RemovedFaceCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn (int)mesh->model.number_of_removed_faces();\n\t}\n\n\tstatic BOOL IsVertexRemoved(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->map.FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\t\treturn mesh->model.is_removed(vertex);\n\t}\n\n\tstatic BOOL IsFaceRemoved(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto face = mesh->FindFace(index);\n\t\tif (face == NullFace()) return FALSE;\n\t\treturn mesh->model.is_removed(face);\n\t}\n\n\tstatic BOOL IsHalfedgeRemoved(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return FALSE;\n\t\treturn mesh->model.is_removed(hedge);\n\t}\n\n\tstatic BOOL IsEdgeRemoved(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto edge = mesh->FindEdge(index);\n\t\tif (edge == NullEdge()) return FALSE;\n\t\treturn mesh->model.is_removed(edge);\n\t}\n\n\tstatic int AddVertex(void* ptr, Point3d point)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\t\treturn mesh->model.add_vertex(point.ToCGAL<K>());\n\t}\n\n\tstatic int AddEdge(void* ptr, int v0, int v1)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tauto vertex0 = mesh->FindVertex(v0);\n\t\tauto vertex1 = mesh->FindVertex(v1);\n\t\tif (vertex0 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex1 == NullVertex()) return NULL_INDEX;\n\n\t\tmesh->OnModelChanged();\n\t\treturn mesh->model.add_edge(vertex0, vertex1);\n\t}\n\n\tstatic int AddTriangle(void* ptr, int v0, int v1, int v2)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tauto vertex0 = mesh->FindVertex(v0);\n\t\tauto vertex1 = mesh->FindVertex(v1);\n\t\tauto vertex2 = mesh->FindVertex(v2);\n\t\tif (vertex0 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex1 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex2 == NullVertex()) return NULL_INDEX;\n\n\t\tmesh->OnModelChanged();\n\t\treturn mesh->model.add_face(vertex0, vertex1, vertex2);\n\t}\n\n\tstatic int AddQuad(void* ptr, int v0, int v1, int v2, int v3)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tauto vertex0 = mesh->FindVertex(v0);\n\t\tauto vertex1 = mesh->FindVertex(v1);\n\t\tauto vertex2 = mesh->FindVertex(v2);\n\t\tauto vertex3 = mesh->FindVertex(v3);\n\t\tif (vertex0 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex1 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex2 == NullVertex()) return NULL_INDEX;\n\t\tif (vertex3 == NullVertex()) return NULL_INDEX;\n\n\t\tmesh->OnModelChanged();\n\t\treturn mesh->model.add_face(vertex0, vertex1, vertex2, vertex3);\n\t}\n\n\tstatic int AddPentagon(void* ptr, int v0, int v1, int v2, int v3, int v4)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tstd::vector<Vertex> face(6);\n\t\tface[0] = mesh->FindVertex(v0); face[1] = mesh->FindVertex(v1);\n\t\tface[2] = mesh->FindVertex(v2); face[3] = mesh->FindVertex(v3);\n\t\tface[4] = mesh->FindVertex(v4);\n\n\t\tfor (auto v : face)\n\t\t\tif (v == NullVertex()) return NULL_INDEX;\n\n\t\treturn mesh->model.add_face(face);\n\t}\n\n\tstatic int AddHexagon(void* ptr, int v0, int v1, int v2, int v3, int v4, int v5)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tstd::vector<Vertex> face(6);\n\t\tface[0] = mesh->FindVertex(v0); face[1] = mesh->FindVertex(v1);\n\t\tface[2] = mesh->FindVertex(v2); face[3] = mesh->FindVertex(v3);\n\t\tface[4] = mesh->FindVertex(v4); face[5] = mesh->FindVertex(v5);\n\n\t\tfor (auto v : face)\n\t\t\tif (v == NullVertex()) return NULL_INDEX;\n\n\t\treturn mesh->model.add_face(face);\n\t}\n\n\tstatic int AddFace(void* ptr, int* indices, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tstd::vector<Vertex> face(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto vertex = mesh->FindVertex(indices[i]);\n\t\t\tif (vertex == NullVertex()) return NULL_INDEX;\n\t\t\tface[i] = vertex;\n\t\t}\n\t\t\t\n\t\treturn mesh->model.add_face(face);\n\t}\n\n\tstatic BOOL HasGarbage(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn mesh->model.has_garbage();\n\t}\n\n\tstatic void CollectGarbage(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->model.collect_garbage();\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void SetRecycleGarbage(void* ptr, BOOL collect)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->model.set_recycle_garbage(collect);\n\t}\n\n\tstatic BOOL DoesRecycleGarbage(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn mesh->model.does_recycle_garbage();\n\t}\n\n\tstatic int VertexDegree(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return NULL_INDEX;\n\t\treturn mesh->model.degree(vertex);\n\t}\n\n\tstatic int FaceDegree(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto face = mesh->FindFace(index);\n\t\tif (face == NullFace()) return FALSE;\n\t\treturn mesh->model.degree(face);\n\t}\n\n\tstatic BOOL VertexIsIsolated(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\t\treturn mesh->model.is_isolated(vertex);\n\t}\n\n\tstatic BOOL VertexIsBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\t\treturn mesh->model.is_border(vertex, check_all_incident_halfedges);\n\t}\n\n\tstatic BOOL EdgeIsBorder(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto edge = mesh->FindEdge(index);\n\t\tif (edge == NullEdge()) return FALSE;\n\t\treturn mesh->model.is_border(edge);\n\t}\n\n\tstatic int NextHalfedge(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.next(hedge);\n\t}\n\n\tstatic int PreviousHalfedge(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.prev(hedge);\n\t}\n\n\tstatic int OppositeHalfedge(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.opposite(hedge);\n\t}\n\n\tstatic int SourceVertex(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.source(hedge);\n\t}\n\n\tstatic int TargetVertex(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.target(hedge);\n\t}\n\n\tstatic int NextAroundSource(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.next_around_source(hedge);\n\t}\n\n\tstatic int NextAroundTarget(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.next_around_target(hedge);\n\t}\n\n\tstatic int PreviousAroundSource(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.prev_around_source(hedge);\n\t}\n\n\tstatic int PreviousAroundTarget(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.prev_around_target(hedge);\n\t}\n\n\tstatic int EdgesHalfedge(void* ptr, int edgeIndex, int halfedgeIndex)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tif (halfedgeIndex < 0) halfedgeIndex = 0;\n\t\tif (halfedgeIndex > 1) halfedgeIndex = 1;\n\n\t\tauto edge = mesh->FindEdge(edgeIndex);\n\t\tif (edge == NullEdge()) return FALSE;\n\n\t\treturn mesh->model.halfedge(edge, halfedgeIndex);\n\t}\n\n\tstatic int HalfedgesEdge(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.edge(hedge);\n\t}\n\n\tstatic BOOL RemoveVertex(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->map.BuildVertexMaps(mesh->model);\n\n\t\tVertex vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\n\t\tmesh->model.remove_vertex(vertex);\n\t\tmesh->OnModelChanged();\n\t\treturn TRUE;\n\t}\n\n\tstatic BOOL RemoveEdge(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->map.BuildEdgeMaps(mesh->model);\n\n\t\tEdge edge = mesh->map.FindEdge(index);\n\t\tif (edge == NullEdge()) return FALSE;\n\n\t\tmesh->model.remove_edge(edge);\n\t\tmesh->OnModelChanged();\n\t\treturn TRUE;\n\t}\n\n\tstatic BOOL RemoveFace(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->map.BuildFaceMaps(mesh->model);\n\n\t\tFace face = mesh->map.FindFace(index);\n\t\tif (face == NullFace()) return FALSE;\n\n\t\tmesh->model.remove_face(face);\n\t\tmesh->OnModelChanged();\n\t\treturn TRUE;\n\t}\n\n\tstatic Point3d GetPoint(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->map.BuildVertexMaps(mesh->model);\n\n\t\tif (index < 0 || index >= mesh->map.VertexCount())\n\t\t\treturn NullPoint();\n\n\t\tVertex v = mesh->map.GetVertex(index);\n\t\tif( v == NullVertex())\n\t\t\treturn NullPoint();\n\n\t\tauto point = mesh->model.point(v);\n\t\treturn Point3d::FromCGAL<K>(point);\n\t}\n\n\tstatic void GetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tmesh->map.BuildVertexMaps(mesh->model);\n\t\tint num_vertices = mesh->map.VertexCount();\n\t\tif (num_vertices == 0) return;\n\t\tif (num_vertices != count) return;\n\n\t\tfor (int i = 0; i < num_vertices; i++)\n\t\t{\n\t\t\tauto vertex = mesh->map.GetVertex(i);\n\t\t\tif (vertex == NullVertex())\n\t\t\t\tpoints[i] = NullPoint();\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto p = mesh->model.point(vertex);\n\t\t\t\tpoints[i] = Point3d::FromCGAL<K>(p);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void SetPoint(void* ptr, int index, const Point3d& point)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tmesh->map.BuildVertexMaps(mesh->model);\n\t\tif (index < 0 || index >= mesh->map.VertexCount())\n\t\t\treturn;\n\n\t\tauto vertex = mesh->map.GetVertex(index);\n\t\tauto point_map = mesh->model.points();\n\t\tpoint_map[vertex] = point.ToCGAL<K>();\n\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void SetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tmesh->map.BuildVertexMaps(mesh->model);\n\t\tint num_vertices = mesh->map.VertexCount();\n\t\tif (num_vertices == 0) return;\n\t\tif (num_vertices != count) return;\n\n\t\tauto point_map = mesh->model.points();\n\n\t\tfor (int i = 0; i < num_vertices; i++)\n\t\t{\n\t\t\tauto vertex = mesh->map.GetVertex(i);\n\n\t\t\tif(vertex != NullVertex())\n\t\t\t\tpoint_map[vertex] = points[i].ToCGAL<K>();\n\t\t}\n\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic BOOL GetSegment(void* ptr, int index, Segment3d& segment)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tauto edge = mesh->FindHalfedge(index);\n\t\tif (edge != NullHalfedge())\n\t\t{\n\t\t\tauto a = mesh->model.point(mesh->model.source(edge));\n\t\t\tauto b = mesh->model.point(mesh->model.target(edge));\n\n\t\t\tsegment.a = Point3d::FromCGAL<K>(a);\n\t\t\tsegment.b = Point3d::FromCGAL<K>(b);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment3d* segments, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto edge : halfedges(mesh->model))\n\t\t{\n\t\t\tauto a = mesh->model.point(mesh->model.source(edge));\n\t\t\tauto b = mesh->model.point(mesh->model.target(edge));\n\n\t\t\tSegment3d seg;\n\t\t\tseg.a = Point3d::FromCGAL<K>(a);\n\t\t\tseg.b = Point3d::FromCGAL<K>(b);\n\n\t\t\tsegments[i++] = seg;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetTriangle(void* ptr, int index, Triangle3d& tri)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tauto face = mesh->FindFace(index);\n\t\tif (face != NullFace())\n\t\t{\n\t\t\tauto edge = mesh->model.halfedge(face);\n\t\t\tauto prev = mesh->model.prev(edge);\n\t\t\tauto next = mesh->model.next(edge);\n\n\t\t\tauto a = mesh->model.point(mesh->model.source(prev));\n\t\t\tauto b = mesh->model.point(mesh->model.source(edge));\n\t\t\tauto c = mesh->model.point(mesh->model.source(next));\n\n\t\t\ttri.a = Point3d::FromCGAL<K>(a);\n\t\t\ttri.b = Point3d::FromCGAL<K>(b);\n\t\t\ttri.c = Point3d::FromCGAL<K>(c);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetTriangles(void* ptr, Triangle3d* triangles, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto face : faces(mesh->model))\n\t\t{\n\t\t\tauto edge = mesh->model.halfedge(face);\n\t\t\tauto prev = mesh->model.prev(edge);\n\t\t\tauto next = mesh->model.next(edge);\n\n\t\t\tauto a = mesh->model.point(mesh->model.source(prev));\n\t\t\tauto b = mesh->model.point(mesh->model.source(edge));\n\t\t\tauto c = mesh->model.point(mesh->model.source(next));\n\n\t\t\tTriangle3d tri;\n\t\t\ttri.a = Point3d::FromCGAL<K>(a);\n\t\t\ttri.b = Point3d::FromCGAL<K>(b);\n\t\t\ttri.c = Point3d::FromCGAL<K>(c);\n\n\t\t\ttriangles[i++] = tri;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetVertex(void* ptr, int index, MeshVertex3& vert)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tvert = MeshVertex3::NullVertex();\n\n\t\tauto v = mesh->FindVertex(index);\n\t\tif (v != NullVertex())\n\t\t{\n\t\t\tvert.Index = v;\n\t\t\tvert.Point = Point3d::FromCGAL<K>(mesh->model.point(v));\n\t\t\tvert.Halfedge = mesh->FindHalfedgeIndex(mesh->model.halfedge(v));\n\t\t\tvert.Degree = mesh->model.degree(v);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic void GetVertices(void* ptr, MeshVertex3* vertexArray, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto v : vertices(mesh->model))\n\t\t{\n\t\t\tMeshVertex3 vert = MeshVertex3::NullVertex();\n\t\t\tvert.Index = v;\n\t\t\tvert.Point = Point3d::FromCGAL<K>(mesh->model.point(v));\n\t\t\tvert.Halfedge = mesh->FindHalfedgeIndex(mesh->model.halfedge(v));\n\t\t\tvert.Degree = mesh->model.degree(v);\n\n\t\t\tvertexArray[i++] = vert;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetFace(void* ptr, int index, MeshFace3& face)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tface = MeshFace3::NullFace();\n\n\t\tauto f = mesh->FindFace(index);\n\t\tif (f != SurfaceMesh3<K>::NullFace())\n\t\t{\n\t\t\tface.Index = index;\n\t\t\tface.Halfedge = mesh->FindHalfedgeIndex(mesh->model.halfedge(f));\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic void GetFaces(void* ptr, MeshFace3* faceArray, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto f : faces(mesh->model))\n\t\t{\n\t\t\tMeshFace3 face = MeshFace3::NullFace();\n\t\t\tface.Index = i;\n\t\t\tface.Halfedge = mesh->FindHalfedgeIndex(mesh->model.halfedge(f));\n\n\t\t\tfaceArray[i++] = face;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic BOOL GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tedge = MeshHalfedge3::NullHalfedge();\n\n\t\tauto e = mesh->FindHalfedge(index);\n\t\tif (e != NullHalfedge())\n\t\t{\n\t\t\tedge.Index = index;\n\t\t\tedge.Source = mesh->FindVertexIndex(mesh->model.source(e));\n\t\t\tedge.Target = mesh->FindVertexIndex(mesh->model.target(e));\n\t\t\tedge.Opposite = mesh->FindHalfedgeIndex(mesh->model.opposite(e));\n\t\t\tedge.Next = mesh->FindHalfedgeIndex(mesh->model.next(e));\n\t\t\tedge.Previous = mesh->FindHalfedgeIndex(mesh->model.prev(e));\n\t\t\tedge.Face = mesh->FindFaceIndex(mesh->model.face(e));\n\t\t\tedge.IsBorder = mesh->model.is_border(e);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic void GetHalfedges(void* ptr, MeshHalfedge3* edgeArray, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint i = 0;\n\t\tfor (auto e : halfedges(mesh->model))\n\t\t{\n\t\t\tMeshHalfedge3 edge = MeshHalfedge3::NullHalfedge();\n\t\t\tedge.Index = i;\n\t\t\tedge.Source = mesh->FindVertexIndex(mesh->model.source(e));\n\t\t\tedge.Target = mesh->FindVertexIndex(mesh->model.target(e));\n\t\t\tedge.Opposite = mesh->FindHalfedgeIndex(mesh->model.opposite(e));\n\t\t\tedge.Next = mesh->FindHalfedgeIndex(mesh->model.next(e));\n\t\t\tedge.Previous = mesh->FindHalfedgeIndex(mesh->model.prev(e));\n\t\t\tedge.Face = mesh->FindFaceIndex(mesh->model.face(e));\n\t\t\tedge.IsBorder = mesh->model.is_border(e);\n\n\t\t\tedgeArray[i++] = edge;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tstatic void Transform(void* ptr, const Matrix4x4d& matrix)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto m = matrix.ToCGAL<K>();\n\n\t\tmesh->OnModelChanged();\n\t\tstd::transform(mesh->model.points().begin(), mesh->model.points().end(), mesh->model.points().begin(), m);\n\t}\n\n\tstatic BOOL IsVertexBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto vertex = mesh->FindVertex(index);\n\t\tif (vertex == NullVertex()) return FALSE;\n\t\treturn mesh->model.is_border(vertex, check_all_incident_halfedges);\n\t}\n\n\tstatic BOOL IsHalfedgeBorder(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge == NullHalfedge()) return NULL_INDEX;\n\t\treturn mesh->model.is_border(hedge);\n\t}\n\n\tstatic BOOL IsEdgeBorder(void* ptr, int index)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto edge = mesh->FindEdge(index);\n\t\tif (edge == NullEdge()) return FALSE;\n\t\treturn mesh->model.is_border(edge);\n\t}\n\n\tstatic int BorderEdgeCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint count = 0;\n\t\tfor (auto edge : mesh->model.edges())\n\t\t{\n\t\t\tif (mesh->model.is_border(edge)) count++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic BOOL IsClosed(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tfor (auto edge : mesh->model.edges())\n\t\t{\n\t\t\tif (mesh->model.is_border(edge)) return FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\tstatic BOOL CheckFaceVertexCount(void* ptr, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tfor (auto face : mesh->model.faces())\n\t\t{\n\t\t\tint i = mesh->model.degree(face);\n\t\t\tif (i != count) return FALSE;\n\t\t}\n\n\t\treturn TRUE;\n\t}\n\n\tstatic void Join(void* ptr, void* otherPtr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto other = CastToSurfaceMesh(otherPtr);\n\t\tmesh->model.join(other->model);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void BuildAABBTree(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->BuildAABBTree();\n\t}\n\n\tstatic void ReleaseAABBTree(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->DeleteTree();\n\t}\n\n\tstatic Box3d GetBoundingBox(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tif (mesh->tree != nullptr)\n\t\t{\n\t\t\tauto box = mesh->tree->root_node()->bbox();\n\t\t\treturn Box3d::FromCGAL<K>(box);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tauto box = CGAL::Polygon_mesh_processing::bbox(mesh->model);\n\t\t\treturn Box3d::FromCGAL<K>(box);\n\t\t}\n\t}\n\n\tstatic void ReadOFF(void* ptr, const char* filename)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tstd::ifstream i(filename);\n\t\ti >> mesh->model;\n\t}\n\n\tstatic void WriteOFF(void* ptr, const char* filename)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tstd::ofstream o(filename);\n\t\to << mesh->model;\n\t}\n\n\tstatic void Triangulate(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tCGAL::Polygon_mesh_processing::triangulate_faces(mesh->model);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic BOOL DoesSelfIntersect(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn CGAL::Polygon_mesh_processing::does_self_intersect(mesh->model);\n\t}\n\n\tstatic double Area(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn CGAL::to_double(CGAL::Polygon_mesh_processing::area(mesh->model));\n\t}\n\n\tstatic Point3d Centroid(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto p = CGAL::Polygon_mesh_processing::centroid(mesh->model);\n\t\treturn Point3d::FromCGAL<K>(p);\n\t}\n\n\tstatic double Volume(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn CGAL::to_double(CGAL::Polygon_mesh_processing::volume(mesh->model));\n\t}\n\n\tstatic BOOL DoesBoundAVolume(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn CGAL::Polygon_mesh_processing::does_bound_a_volume(mesh->model);\n\t}\n\n\tstatic CGAL::Bounded_side SideOfTriangleMesh(void* ptr, const Point3d& point)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->BuildAABBTree();\n\t\tCGAL::Side_of_triangle_mesh<SurfaceMesh, K> inside(*mesh->tree);\n\t\treturn inside(point.ToCGAL<K>());\n\t}\n\n\tstatic BOOL DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tauto other = CastToSurfaceMesh(otherPtr);\n\t\tauto param = CGAL::parameters::do_overlap_test_of_bounded_sides(test_bounded_sides);\n\n\t\treturn CGAL::Polygon_mesh_processing::do_intersect(mesh->model, other->model, param, param);\n\t}\n\n\tstatic void GetCentroids(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tint numFaces = (int)mesh->model.number_of_faces();\n\n\t\tint index = 0;\n\t\tfor (auto face : mesh->model.faces())\n\t\t{\n\t\t\tpoints[index] = Point3d::FromCGAL<K>(ComputeCentroid(mesh->model, face));\n\n\t\t\tindex++;\n\n\t\t\tif (index >= numFaces || index >= count)\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tstatic int PropertyMapCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\treturn 0;\n\t\t//return (int)mesh->model.properties<SurfaceMesh>().size();\n\t}\n\n\tstatic void ComputeVertexNormals(void* ptr)\n\t{\n\t\ttypedef K::Vector_3 Vector;\n\t\ttypedef boost::graph_traits<SurfaceMesh3<K>::SurfaceMesh>::vertex_descriptor VertexDes;\n\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tif (mesh->vertexNormalsComputed) return;\n\t\tmesh->vertexNormalsComputed = true;\n\n\t\tstd::string key = VERTEX_NORMAL_MAP_NAME;\n\t\tauto normals = mesh->model.add_property_map<VertexDes, Vector>(key, CGAL::NULL_VECTOR).first;\n\t\tCGAL::Polygon_mesh_processing::compute_vertex_normals(mesh->model, normals);\n\t}\n\n\tstatic void ComputeFaceNormals(void* ptr)\n\t{\n\t\ttypedef K::Vector_3 Vector;\n\t\ttypedef boost::graph_traits<SurfaceMesh3<K>::SurfaceMesh>::face_descriptor FaceDes;\n\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tif (mesh->faceNormalsComputed) return;\n\t\tmesh->faceNormalsComputed = true;\n\n\t\tstd::string key = FACE_NORMAL_MAP_NAME;\n\t\tauto normals = mesh->model.add_property_map<FaceDes, Vector>(key, CGAL::NULL_VECTOR).first;\n\t\tCGAL::Polygon_mesh_processing::compute_face_normals(mesh->model, normals);\n\t}\n\n\tstatic void GetVertexNormals(void* ptr, Vector3d* normals, int count)\n\t{\n\t\ttypedef K::Vector_3 Vector;\n\t\ttypedef boost::graph_traits<SurfaceMesh3<K>::SurfaceMesh>::vertex_descriptor VertexDes;\n\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tComputeVertexNormals(ptr);\n\n\t\tauto pair = mesh->model.property_map<VertexDes, Vector>(VERTEX_NORMAL_MAP_NAME);\n\t\tif (!pair.second) return;\n\n\t\tfor (auto vd : vertices(mesh->model))\n\t\t{\n\t\t\tint index = vd;\n\n\t\t\tif (index < count)\n\t\t\t{\n\t\t\t\tauto n = pair.first[vd];\n\t\t\t\tnormals[index] = Vector3d::FromCGAL<K>(n);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void GetFaceNormals(void* ptr, Vector3d* normals, int count)\n\t{\n\t\ttypedef K::Vector_3 Vector;\n\t\ttypedef boost::graph_traits<SurfaceMesh3<K>::SurfaceMesh>::face_descriptor FaceDes;\n\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tComputeFaceNormals(ptr);\n\n\t\tauto pair = mesh->model.property_map<FaceDes, Vector>(FACE_NORMAL_MAP_NAME);\n\t\tif (!pair.second) return;\n\n\t\tfor (auto fd : faces(mesh->model))\n\t\t{\n\t\t\tint index = fd;\n\n\t\t\tif (index < count)\n\t\t\t{\n\t\t\t\tauto n = pair.first[fd];\n\t\t\t\tnormals[index] = Vector3d::FromCGAL<K>(n);\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic PolygonalCount GetPolygonalCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint degenerate = 0;\n\t\tint three = 0;\n\t\tint four = 0;\n\t\tint five = 0;\n\t\tint six = 0;\n\t\tint greater = 0;\n\n\t\tfor (auto face : mesh->model.faces())\n\t\t{\n\t\t\tint count = mesh->model.degree(face);\n\n\t\t\tswitch (count)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tdegenerate++;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthree++;\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tfour++;\n\t\t\t\tbreak;\n\n\t\t\tcase 5:\n\t\t\t\tfive++;\n\t\t\t\tbreak;\n\n\t\t\tcase 6:\n\t\t\t\tsix++;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tgreater++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { degenerate, three, four, five, six, greater };\n\t}\n\n\tstatic PolygonalCount GetDualPolygonalCount(void* ptr)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tint degenerate = 0;\n\t\tint three = 0;\n\t\tint four = 0;\n\t\tint five = 0;\n\t\tint six = 0;\n\t\tint greater = 0;\n\n\t\tfor (auto vert : mesh->model.vertices())\n\t\t{\n\t\t\tint count = mesh->model.degree(vert);\n\n\t\t\tswitch (count)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tdegenerate++;\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthree++;\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tfour++;\n\t\t\t\tbreak;\n\n\t\t\tcase 5:\n\t\t\t\tfive++;\n\t\t\t\tbreak;\n\n\t\t\tcase 6:\n\t\t\t\tsix++;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tgreater++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn { degenerate, three, four, five, six, greater };\n\t}\n\n\tstatic void CreatePolygonMesh(void* ptr, Point2d* points, int count, BOOL xz)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tstd::vector<Vertex> face(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (xz)\n\t\t\t{\n\t\t\t\tauto p = points[i].ToCGAL3XZ<K>();\n\t\t\t\tface[i] = mesh->model.add_vertex(p);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto p = points[i].ToCGAL3<K>();\n\t\t\t\tface[i] = mesh->model.add_vertex(p);\n\t\t\t}\n\t\t}\n\n\t\tmesh->model.add_face(face);\n\t}\n\n\tstatic void CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int trianglesCount, \n\t\tint* quads, int quadsCount,\n\t\tint* pentagons, int pentagonsCount,\n\t\tint* hexagons, int hexagonsCount)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\n\t\tmesh->Clear();\n\t\tmesh->OnModelChanged();\n\n\t\tArrayUtil::MakeOutOfBoundsNull(triangles, trianglesCount, pointsCount);\n\t\tArrayUtil::MakeOutOfBoundsNull(quads, quadsCount, pointsCount);\n\t\tArrayUtil::MakeOutOfBoundsNull(pentagons, pentagonsCount, pointsCount);\n\t\tArrayUtil::MakeOutOfBoundsNull(hexagons, hexagonsCount, pointsCount);\n\n\t\tstd::vector<Vertex> list;\n\n\t\tfor (int i = 0; i < pointsCount; i++)\n\t\t\tmesh->model.add_vertex(points[i].ToCGAL<K>());\n\n\t\tif (trianglesCount > 0)\n\t\t{\n\t\t\tfor (int i = 0; i < trianglesCount / 3; i++)\n\t\t\t{\n\t\t\t\tint i0 = triangles[i * 3 + 0];\n\t\t\t\tint i1 = triangles[i * 3 + 1];\n\t\t\t\tint i2 = triangles[i * 3 + 2];\n\n\t\t\t\tif (i0 == NULL_INDEX || i1 == NULL_INDEX || i2 == NULL_INDEX)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlist.clear();\n\t\t\t\tlist.push_back(Vertex(i0));\n\t\t\t\tlist.push_back(Vertex(i1));\n\t\t\t\tlist.push_back(Vertex(i2));\n\t\t\t\tmesh->model.add_face(list);\n\t\t\t}\n\t\t}\n\n\t\tif (quadsCount > 0)\n\t\t{\n\t\t\tfor (int i = 0; i < quadsCount / 4; i++)\n\t\t\t{\n\t\t\t\tint i0 = quads[i * 4 + 0];\n\t\t\t\tint i1 = quads[i * 4 + 1];\n\t\t\t\tint i2 = quads[i * 4 + 2];\n\t\t\t\tint i3 = quads[i * 4 + 3];\n\n\t\t\t\tif (i0 == NULL_INDEX || i1 == NULL_INDEX || i2 == NULL_INDEX || \n\t\t\t\t\ti3 == NULL_INDEX)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlist.clear();\n\t\t\t\tlist.push_back(Vertex(i0));\n\t\t\t\tlist.push_back(Vertex(i1));\n\t\t\t\tlist.push_back(Vertex(i2));\n\t\t\t\tlist.push_back(Vertex(i3));\n\t\t\t\tmesh->model.add_face(list);\n\t\t\t}\n\t\t}\n\n\t\tif (pentagonsCount > 0)\n\t\t{\n\t\t\tfor (int i = 0; i < pentagonsCount / 5; i++)\n\t\t\t{\n\t\t\t\tint i0 = pentagons[i * 5 + 0];\n\t\t\t\tint i1 = pentagons[i * 5 + 1];\n\t\t\t\tint i2 = pentagons[i * 5 + 2];\n\t\t\t\tint i3 = pentagons[i * 5 + 3];\n\t\t\t\tint i4 = pentagons[i * 5 + 4];\n\n\t\t\t\tif (i0 == NULL_INDEX || i1 == NULL_INDEX || i2 == NULL_INDEX ||\n\t\t\t\t\ti3 == NULL_INDEX || i4 == NULL_INDEX)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlist.clear();\n\t\t\t\tlist.push_back(Vertex(pentagons[i * 5 + 0]));\n\t\t\t\tlist.push_back(Vertex(pentagons[i * 5 + 1]));\n\t\t\t\tlist.push_back(Vertex(pentagons[i * 5 + 2]));\n\t\t\t\tlist.push_back(Vertex(pentagons[i * 5 + 3]));\n\t\t\t\tlist.push_back(Vertex(pentagons[i * 5 + 4]));\n\t\t\t\tmesh->model.add_face(list);\n\t\t\t}\n\t\t}\n\n\t\tif (hexagonsCount > 0)\n\t\t{\n\t\t\tfor (int i = 0; i < hexagonsCount / 6; i++)\n\t\t\t{\n\t\t\t\tint i0 = hexagons[i * 6 + 0];\n\t\t\t\tint i1 = hexagons[i * 6 + 1];\n\t\t\t\tint i2 = hexagons[i * 6 + 2];\n\t\t\t\tint i3 = hexagons[i * 6 + 3];\n\t\t\t\tint i4 = hexagons[i * 6 + 4];\n\t\t\t\tint i5 = hexagons[i * 6 + 5];\n\n\t\t\t\tif (i0 == NULL_INDEX || i1 == NULL_INDEX || i2 == NULL_INDEX ||\n\t\t\t\t\ti3 == NULL_INDEX || i4 == NULL_INDEX || i5 == NULL_INDEX)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlist.clear();\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 0]));\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 1]));\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 2]));\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 3]));\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 4]));\n\t\t\t\tlist.push_back(Vertex(hexagons[i * 6 + 6]));\n\t\t\t\tmesh->model.add_face(list);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tstatic void GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount)\n\t{\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->BuildModel();\n\n\t\tint triangleIndex = 0;\n\t\tint quadIndex = 0;\n\t\tint pentagonIndex = 0;\n\t\tint hexagonIndex = 0;\n\t\tint indices[6];\n\n\t\tArrayUtil::FillWithNull(triangles, triangleCount);\n\t\tArrayUtil::FillWithNull(quads, quadCount);\n\t\tArrayUtil::FillWithNull(pentagons, pentagonCount);\n\t\tArrayUtil::FillWithNull(hexagons, hexagonCount);\n\n\t\tfor (auto face : mesh->model.faces())\n\t\t{\n\t\t\tint count = mesh->model.degree(face);\n\t\t\tif (count < 3 || count > 6) continue;\n\n\t\t\tauto hedge = mesh->model.halfedge(face);\n\t\t\tfor (int i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tauto vertex = mesh->model.source(hedge);\n\t\t\t\tindices[i] = mesh->FindVertexIndex(vertex);\n\t\t\t\thedge = mesh->model.next(hedge);\n\t\t\t}\n\n\t\t\tif (count == 3 && triangleIndex < triangleCount)\n\t\t\t{\n\t\t\t\ttriangles[triangleIndex * 3 + 0] = indices[0];\n\t\t\t\ttriangles[triangleIndex * 3 + 1] = indices[1];\n\t\t\t\ttriangles[triangleIndex * 3 + 2] = indices[2];\n\t\t\t\ttriangleIndex++;\n\t\t\t}\n\t\t\telse if (count == 4 && quadIndex < quadCount)\n\t\t\t{\n\t\t\t\tquads[quadIndex * 4 + 0] = indices[0];\n\t\t\t\tquads[quadIndex * 4 + 1] = indices[1];\n\t\t\t\tquads[quadIndex * 4 + 2] = indices[2];\n\t\t\t\tquads[quadIndex * 4 + 3] = indices[3];\n\t\t\t\tquadIndex++;\n\t\t\t}\n\t\t\telse if (count == 5 && pentagonIndex < pentagonCount)\n\t\t\t{\n\t\t\t\tpentagons[pentagonIndex * 5 + 0] = indices[0];\n\t\t\t\tpentagons[pentagonIndex * 5 + 1] = indices[1];\n\t\t\t\tpentagons[pentagonIndex * 5 + 2] = indices[2];\n\t\t\t\tpentagons[pentagonIndex * 5 + 3] = indices[3];\n\t\t\t\tpentagons[pentagonIndex * 5 + 4] = indices[4];\n\t\t\t\tpentagonIndex++;\n\t\t\t}\n\t\t\telse if (count == 6 && hexagonIndex < hexagonCount)\n\t\t\t{\n\t\t\t\thexagons[hexagonIndex * 6 + 0] = indices[0];\n\t\t\t\thexagons[hexagonIndex * 6 + 1] = indices[1];\n\t\t\t\thexagons[hexagonIndex * 6 + 2] = indices[2];\n\t\t\t\thexagons[hexagonIndex * 6 + 3] = indices[3];\n\t\t\t\thexagons[hexagonIndex * 6 + 4] = indices[4];\n\t\t\t\thexagons[hexagonIndex * 6 + 5] = indices[5];\n\t\t\t\thexagonIndex++;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount)\n\t{\n\n\t\tauto mesh = CastToSurfaceMesh(ptr);\n\t\tmesh->BuildModel();\n\n\t\tint triangleIndex = 0;\n\t\tint quadIndex = 0;\n\t\tint pentagonIndex = 0;\n\t\tint hexagonIndex = 0;\n\t\tint indices[6];\n\n\t\tArrayUtil::FillWithNull(triangles, triangleCount);\n\t\tArrayUtil::FillWithNull(quads, quadCount);\n\t\tArrayUtil::FillWithNull(pentagons, pentagonCount);\n\t\tArrayUtil::FillWithNull(hexagons, hexagonCount);\n\n\t\t//Not workinng\n\n\t\tfor (auto vert : mesh->model.vertices())\n\t\t{\n\t\t\tint count = mesh->model.degree(vert);\n\t\t\tif (count < 3 || count > 6) continue;\n\n\t\t\tauto hedge = mesh->model.halfedge(vert);\n\t\t\tfor (int i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\tauto face = mesh->model.face(hedge);\n\t\t\t\tindices[i] = mesh->FindFaceIndex(face);\n\t\t\t\thedge = mesh->model.next_around_source(hedge);\n\t\t\t}\n\n\t\t\tif (count == 3 && triangleIndex < triangleCount)\n\t\t\t{\n\t\t\t\ttriangles[triangleIndex * 3 + 0] = indices[0];\n\t\t\t\ttriangles[triangleIndex * 3 + 1] = indices[1];\n\t\t\t\ttriangles[triangleIndex * 3 + 2] = indices[2];\n\t\t\t\ttriangleIndex++;\n\t\t\t}\n\t\t\telse if (count == 4 && quadIndex < quadCount)\n\t\t\t{\n\t\t\t\tquads[quadIndex * 4 + 0] = indices[0];\n\t\t\t\tquads[quadIndex * 4 + 1] = indices[1];\n\t\t\t\tquads[quadIndex * 4 + 2] = indices[2];\n\t\t\t\tquads[quadIndex * 4 + 3] = indices[3];\n\t\t\t\tquadIndex++;\n\t\t\t}\n\t\t\telse if (count == 5 && pentagonIndex < pentagonCount)\n\t\t\t{\n\t\t\t\tpentagons[pentagonIndex * 5 + 0] = indices[0];\n\t\t\t\tpentagons[pentagonIndex * 5 + 1] = indices[1];\n\t\t\t\tpentagons[pentagonIndex * 5 + 2] = indices[2];\n\t\t\t\tpentagons[pentagonIndex * 5 + 3] = indices[3];\n\t\t\t\tpentagons[pentagonIndex * 5 + 4] = indices[4];\n\t\t\t\tpentagonIndex++;\n\t\t\t}\n\t\t\telse if (count == 6 && hexagonIndex < hexagonCount)\n\t\t\t{\n\t\t\t\thexagons[hexagonIndex * 6 + 0] = indices[0];\n\t\t\t\thexagons[hexagonIndex * 6 + 1] = indices[1];\n\t\t\t\thexagons[hexagonIndex * 6 + 2] = indices[2];\n\t\t\t\thexagons[hexagonIndex * 6 + 3] = indices[3];\n\t\t\t\thexagons[hexagonIndex * 6 + 4] = indices[4];\n\t\t\t\thexagons[hexagonIndex * 6 + 5] = indices[5];\n\t\t\t\thexagonIndex++;\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\n\nprivate:\n\n\tstatic Point_3 ComputeCentroid(const SurfaceMesh& mesh, const Face& face)\n\t{\n\t\tint num = 0;\n\t\t\n\t\tFT x = 0;\n\t\tFT y = 0;\n\t\tFT z = 0;\n\n\t\tfor (auto vert : mesh.vertices_around_face(mesh.halfedge(face)))\n\t\t{\n\t\t\tauto p = mesh.point(vert);\n\t\t\tx += p.x();\n\t\t\ty += p.y();\n\t\t\tz += p.z();\n\t\t\tnum++;\n\t\t}\n\n\t\tif (num != 0)\n\t\t{\n\t\t\tx /= num;\n\t\t\ty /= num;\n\t\t\tz /= num;\n\t\t}\n\n\t\treturn { x, y, z };\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMesh3_EEK.cpp",
    "content": "#include \"SurfaceMesh3_EEK.h\"\n#include \"SurfaceMesh3.h\"\n\n#include <string>\n\n\nvoid* SurfaceMesh3_EEK_Create()\n{\n\treturn SurfaceMesh3<EEK>::NewSurfaceMesh();\n}\n\nvoid SurfaceMesh3_EEK_Release(void* ptr)\n{\n\tSurfaceMesh3<EEK>::DeleteSurfaceMesh(ptr);\n}\n\nint SurfaceMesh3_EEK_GetBuildStamp(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::GetBuildStamp(ptr);\n}\n\nvoid SurfaceMesh3_EEK_Clear(void* ptr)\n{\n\tSurfaceMesh3<EEK>::Clear(ptr);\n}\n\nvoid SurfaceMesh3_EEK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges)\n{\n\tSurfaceMesh3<EEK>::ClearIndexMaps(ptr, vertices, faces, edges, halfedges);\n}\n\nvoid SurfaceMesh3_EEK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n{\n\tSurfaceMesh3<EEK>::ClearNormalMaps(ptr, vertices, faces);\n}\n\nvoid SurfaceMesh3_EEK_ClearProperyMaps(void* ptr)\n{\n\tSurfaceMesh3<EEK>::ClearProperyMaps(ptr);\n}\n\nvoid SurfaceMesh3_EEK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n{\n\tSurfaceMesh3<EEK>::BuildIndices(ptr, vertices, faces, edges, halfedges, force);\n}\n\nvoid SurfaceMesh3_EEK_PrintIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n{\n\tSurfaceMesh3<EEK>::PrintIndices(ptr, vertices, faces, edges, halfedges, force);\n}\n\nvoid* SurfaceMesh3_EEK_Copy(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::Copy(ptr);\n}\n\nBOOL SurfaceMesh3_EEK_IsValid(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::IsValid(ptr);\n}\n\nint SurfaceMesh3_EEK_VertexCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::VertexCount(ptr);\n}\n\nint SurfaceMesh3_EEK_HalfedgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::HalfedgeCount(ptr);\n}\n\nint SurfaceMesh3_EEK_EdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::EdgeCount(ptr);\n}\n\nint SurfaceMesh3_EEK_FaceCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::FaceCount(ptr);\n}\n\nint SurfaceMesh3_EEK_RemovedVertexCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::RemovedVertexCount(ptr);\n}\n\nint SurfaceMesh3_EEK_RemovedHalfedgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::RemovedHalfedgeCount(ptr);\n}\n\nint SurfaceMesh3_EEK_RemovedEdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::RemovedEdgeCount(ptr);\n}\n\nint SurfaceMesh3_EEK_RemovedFaceCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::RemovedFaceCount(ptr);\n}\n\nBOOL SurfaceMesh3_EEK_IsVertexRemoved(void* ptr, int index) \n{\n\treturn SurfaceMesh3<EEK>::IsVertexRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsFaceRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsFaceRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsHalfedgeRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsHalfedgeRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsEdgeRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsEdgeRemoved(ptr, index);\n}\n\nint SurfaceMesh3_EEK_AddVertex(void* ptr, Point3d point)\n{\n\treturn SurfaceMesh3<EEK>::AddVertex(ptr, point);\n}\n\nint SurfaceMesh3_EEK_AddEdge(void* ptr, int v0, int v1)\n{\n\treturn SurfaceMesh3<EEK>::AddEdge(ptr, v0, v1);\n}\n\nint SurfaceMesh3_EEK_AddTriangle(void* ptr, int v0, int v1, int v2)\n{\n\treturn SurfaceMesh3<EEK>::AddTriangle(ptr, v0, v1, v2);\n}\n\nint SurfaceMesh3_EEK_AddQuad(void* ptr, int v0, int v1, int v2, int v3)\n{\n\treturn SurfaceMesh3<EEK>::AddQuad(ptr, v0, v1, v2, v3);\n}\n\nint SurfaceMesh3_EEK_AddPentagon(void* ptr, int v0, int v1, int v2, int v3, int v4)\n{\n\treturn SurfaceMesh3<EEK>::AddPentagon(ptr, v0, v1, v2, v3, v4);\n}\n\nint SurfaceMesh3_EEK_AddHexagon(void* ptr, int v0, int v1, int v2, int v3, int v4, int v5)\n{\n\treturn SurfaceMesh3<EEK>::AddHexagon(ptr, v0, v1, v2, v3, v4, v5);\n}\n\nint SurfaceMesh3_EEK_AddFace(void* ptr, int* indices, int count)\n{\n\treturn SurfaceMesh3<EEK>::AddFace(ptr, indices, count);\n}\n\nBOOL SurfaceMesh3_EEK_HasGarbage(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::HasGarbage(ptr);\n}\n\nvoid SurfaceMesh3_EEK_CollectGarbage(void* ptr)\n{\n\tSurfaceMesh3<EEK>::CollectGarbage(ptr);\n}\n\nvoid SurfaceMesh3_EEK_SetRecycleGarbage(void* ptr, BOOL collect)\n{\n\tSurfaceMesh3<EEK>::SetRecycleGarbage(ptr, collect);\n}\n\nBOOL SurfaceMesh3_EEK_DoesRecycleGarbage(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::DoesRecycleGarbage(ptr);\n}\n\nint SurfaceMesh3_EEK_VertexDegree(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::VertexDegree(ptr, index);\n}\n\nint SurfaceMesh3_EEK_FaceDegree(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::FaceDegree(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_VertexIsIsolated(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::VertexIsIsolated(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_VertexIsBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n{\n\treturn SurfaceMesh3<EEK>::VertexIsBorder(ptr, index, check_all_incident_halfedges);\n}\n\nBOOL SurfaceMesh3_EEK_EdgeIsBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::EdgeIsBorder(ptr, index);\n}\n\nint SurfaceMesh3_EEK_NextHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::NextHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EEK_PreviousHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::PreviousHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EEK_OppositeHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::OppositeHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EEK_SourceVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::SourceVertex(ptr, index);\n}\n\nint SurfaceMesh3_EEK_TargetVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::TargetVertex(ptr, index);\n}\n\nint SurfaceMesh3_EEK_NextAroundSource(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::NextAroundSource(ptr, index);\n}\n\nint SurfaceMesh3_EEK_NextAroundTarget(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::NextAroundTarget(ptr, index);\n}\n\nint SurfaceMesh3_EEK_PreviousAroundSource(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::PreviousAroundSource(ptr, index);\n}\n\nint SurfaceMesh3_EEK_PreviousAroundTarget(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::PreviousAroundTarget(ptr, index);\n}\n\nint SurfaceMesh3_EEK_EdgesHalfedge(void* ptr, int edgeIndex, int halfedgeIndex)\n{\n\treturn SurfaceMesh3<EEK>::EdgesHalfedge(ptr, edgeIndex, halfedgeIndex);\n}\n\nint SurfaceMesh3_EEK_HalfedgesEdge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::HalfedgesEdge(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_RemoveVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::RemoveVertex(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_RemoveEdge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::RemoveEdge(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_RemoveFace(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::RemoveFace(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsVertexValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsVertexValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsEdgeValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsEdgeValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsHalfedgeValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsHalfedgeValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsFaceValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsFaceValid(ptr, index);\n}\n\nPoint3d SurfaceMesh3_EEK_GetPoint(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::GetPoint(ptr, index);\n}\n\nvoid SurfaceMesh3_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid SurfaceMesh3_EEK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tSurfaceMesh3<EEK>::SetPoint(ptr, index, point);\n}\n\nvoid SurfaceMesh3_EEK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EEK>::SetPoints(ptr, points, count);\n}\n\nBOOL SurfaceMesh3_EEK_GetSegment(void* ptr, int index, Segment3d& segment)\n{\n\treturn SurfaceMesh3<EEK>::GetSegment(ptr,index, segment);\n}\n\nvoid SurfaceMesh3_EEK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tSurfaceMesh3<EEK>::GetSegments(ptr, segments, count);\n}\n\nBOOL SurfaceMesh3_EEK_GetTriangle(void* ptr, int index, Triangle3d& tri)\n{\n\treturn SurfaceMesh3<EEK>::GetTriangle(ptr, index, tri);\n}\n\nvoid SurfaceMesh3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tSurfaceMesh3<EEK>::GetTriangles(ptr, triangles, count);\n}\n\nBOOL SurfaceMesh3_EEK_GetVertex(void* ptr, int index, MeshVertex3& vert)\n{\n\treturn SurfaceMesh3<EEK>::GetVertex(ptr, index, vert);\n}\n\nvoid SurfaceMesh3_EEK_GetVertices(void* ptr, MeshVertex3* vertexArray, int count)\n{\n\tSurfaceMesh3<EEK>::GetVertices(ptr, vertexArray, count);\n}\n\nBOOL SurfaceMesh3_EEK_GetFace(void* ptr, int index, MeshFace3& face)\n{\n\treturn SurfaceMesh3<EEK>::GetFace(ptr, index, face);\n}\n\nvoid SurfaceMesh3_EEK_GetFaces(void* ptr, MeshFace3* faceArray, int count)\n{\n\tSurfaceMesh3<EEK>::GetFaces(ptr, faceArray, count);\n}\n\nBOOL SurfaceMesh3_EEK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n{\n\treturn SurfaceMesh3<EEK>::GetHalfedge(ptr, index, edge);\n}\n\nvoid SurfaceMesh3_EEK_GetHalfedges(void* ptr, MeshHalfedge3* edgeArray, int count)\n{\n\tSurfaceMesh3<EEK>::GetHalfedges(ptr, edgeArray, count);\n}\n\nvoid SurfaceMesh3_EEK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tSurfaceMesh3<EEK>::Transform(ptr, matrix);\n}\n\nBOOL SurfaceMesh3_EEK_IsVertexBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n{\n\treturn SurfaceMesh3<EEK>::IsVertexBorder(ptr, index, check_all_incident_halfedges);\n}\n\nBOOL SurfaceMesh3_EEK_IsHalfedgeBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsHalfedgeBorder(ptr, index);\n}\n\nBOOL SurfaceMesh3_EEK_IsEdgeBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EEK>::IsEdgeBorder(ptr, index);\n}\n\nint SurfaceMesh3_EEK_BorderEdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::BorderEdgeCount(ptr);\n}\n\nBOOL SurfaceMesh3_EEK_IsClosed(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::IsClosed(ptr);\n}\n\nvoid SurfaceMesh3_EEK_Join(void* ptr, void* otherPtr)\n{\n\tSurfaceMesh3<EEK>::Join(ptr, otherPtr);\n}\n\nvoid SurfaceMesh3_EEK_BuildAABBTree(void* ptr)\n{\n\tSurfaceMesh3<EEK>::BuildAABBTree(ptr);\n}\n\nvoid SurfaceMesh3_EEK_ReleaseAABBTree(void* ptr)\n{\n\tSurfaceMesh3<EEK>::ReleaseAABBTree(ptr);\n}\n\nBox3d SurfaceMesh3_EEK_GetBoundingBox(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::GetBoundingBox(ptr);\n}\n\nvoid SurfaceMesh3_EEK_ReadOFF(void* ptr, const char* filename)\n{\n\tSurfaceMesh3<EEK>::ReadOFF(ptr, filename);\n}\n\nvoid SurfaceMesh3_EEK_WriteOFF(void* ptr, const char* filename)\n{\n\tSurfaceMesh3<EEK>::WriteOFF(ptr, filename);\n}\n\nvoid SurfaceMesh3_EEK_Triangulate(void* ptr)\n{\n\tSurfaceMesh3<EEK>::Triangulate(ptr);\n}\n\nBOOL SurfaceMesh3_EEK_DoesSelfIntersect(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::DoesSelfIntersect(ptr);\n}\n\ndouble SurfaceMesh3_EEK_Area(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::Area(ptr);\n}\n\nPoint3d SurfaceMesh3_EEK_Centroid(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::Centroid(ptr);\n}\n\ndouble SurfaceMesh3_EEK_Volume(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::Volume(ptr);\n}\n\nBOOL SurfaceMesh3_EEK_DoesBoundAVolume(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::DoesBoundAVolume(ptr);\n}\n\nCGAL::Bounded_side SurfaceMesh3_EEK_SideOfTriangleMesh(void* ptr, const Point3d& point)\n{\n\treturn SurfaceMesh3<EEK>::SideOfTriangleMesh(ptr, point);\n}\n\nBOOL SurfaceMesh3_EEK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n{\n\treturn SurfaceMesh3<EEK>::DoIntersects(ptr, otherPtr, test_bounded_sides);\n }\n\nvoid SurfaceMesh3_EEK_GetCentroids(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EEK>::GetCentroids(ptr, points, count);\n}\n\nint SurfaceMesh3_EEK_PropertyMapCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::PropertyMapCount(ptr);\n}\n\nvoid SurfaceMesh3_EEK_ComputeVertexNormals(void* ptr)\n{\n\tSurfaceMesh3<EEK>::ComputeVertexNormals(ptr);\n}\n\nvoid SurfaceMesh3_EEK_ComputeFaceNormals(void* ptr)\n{\n\tSurfaceMesh3<EEK>::ComputeFaceNormals(ptr);\n}\n\nvoid SurfaceMesh3_EEK_GetVertexNormals(void* ptr, Vector3d* normals, int count)\n{\n\tSurfaceMesh3<EEK>::GetVertexNormals(ptr, normals, count);\n}\n\nvoid SurfaceMesh3_EEK_GetFaceNormals(void* ptr, Vector3d* normals, int count)\n{\n\tSurfaceMesh3<EEK>::GetFaceNormals(ptr, normals, count);\n}\n\nBOOL SurfaceMesh3_EEK_CheckFaceVertexCount(void* ptr, int count)\n{\n\treturn SurfaceMesh3<EEK>::CheckFaceVertexCount(ptr, count);\n}\n\nPolygonalCount SurfaceMesh3_EEK_GetPolygonalCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::GetPolygonalCount(ptr);\n}\n\nPolygonalCount SurfaceMesh3_EEK_GetDualPolygonalCount(void* ptr)\n{\n\treturn SurfaceMesh3<EEK>::GetDualPolygonalCount(ptr);\n}\n\nvoid SurfaceMesh3_EEK_CreatePolygonMesh(void* ptr, Point2d* points, int count, BOOL xz)\n{\n\tSurfaceMesh3<EEK>::CreatePolygonMesh(ptr, points, count, xz);\n}\n\nvoid SurfaceMesh3_EEK_CreatePolygonalMesh(void* ptr,\n\tPoint3d* points, int pointsCount,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EEK>::CreatePolygonalMesh(ptr,\n\t\tpoints, pointsCount,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid SurfaceMesh3_EEK_GetPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EEK>::GetPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid SurfaceMesh3_EEK_GetDualPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EEK>::GetDualPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nstatic void GetDualPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\n\ttypedef typename EEK::FT FT;\n\ttypedef typename EEK::Point_3 Point_3;\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Edge_index Edge;\n\ttypedef typename SurfaceMesh::Halfedge_index Halfedge;\n\ttypedef typename SurfaceMesh::Vertex_index Vertex;\n\ttypedef typename SurfaceMesh::Face_index Face;\n\n\tauto mesh = SurfaceMesh3<EEK>::CastToSurfaceMesh(ptr);\n\tmesh->BuildModel();\n\n\tint triangleIndex = 0;\n\tint quadIndex = 0;\n\tint pentagonIndex = 0;\n\tint hexagonIndex = 0;\n\tint indices[6];\n\n\tArrayUtil::FillWithNull(triangles, triangleCount);\n\tArrayUtil::FillWithNull(quads, quadCount);\n\tArrayUtil::FillWithNull(pentagons, pentagonCount);\n\tArrayUtil::FillWithNull(hexagons, hexagonCount);\n\n\n\tfor (auto face : mesh->model.faces())\n\t{\n\n\t\tint count = mesh->model.degree(face);\n\n\t\tif (count < 3 || count > 6) continue;\n\n\t\tauto hedge = mesh->model.halfedge(face);\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto face = mesh->model.face(hedge);\n\t\t\tindices[i] = mesh->FindFaceIndex(face);\n\t\t\thedge = mesh->model.next_around_source(hedge);\n\t\t}\n\n\t\tif (count == 3 && triangleIndex < triangleCount)\n\t\t{\n\t\t\ttriangles[triangleIndex * 3 + 0] = indices[0];\n\t\t\ttriangles[triangleIndex * 3 + 1] = indices[1];\n\t\t\ttriangles[triangleIndex * 3 + 2] = indices[2];\n\t\t\ttriangleIndex++;\n\t\t}\n\t\telse if (count == 4 && quadIndex < quadCount)\n\t\t{\n\t\t\tquads[quadIndex * 4 + 0] = indices[0];\n\t\t\tquads[quadIndex * 4 + 1] = indices[1];\n\t\t\tquads[quadIndex * 4 + 2] = indices[2];\n\t\t\tquads[quadIndex * 4 + 3] = indices[3];\n\t\t\tquadIndex++;\n\t\t}\n\t\telse if (count == 5 && pentagonIndex < pentagonCount)\n\t\t{\n\t\t\tpentagons[pentagonIndex * 5 + 0] = indices[0];\n\t\t\tpentagons[pentagonIndex * 5 + 1] = indices[1];\n\t\t\tpentagons[pentagonIndex * 5 + 2] = indices[2];\n\t\t\tpentagons[pentagonIndex * 5 + 3] = indices[3];\n\t\t\tpentagons[pentagonIndex * 5 + 4] = indices[4];\n\t\t\tpentagonIndex++;\n\t\t}\n\t\telse if (count == 6 && hexagonIndex < hexagonCount)\n\t\t{\n\t\t\thexagons[hexagonIndex * 6 + 0] = indices[0];\n\t\t\thexagons[hexagonIndex * 6 + 1] = indices[1];\n\t\t\thexagons[hexagonIndex * 6 + 2] = indices[2];\n\t\t\thexagons[hexagonIndex * 6 + 3] = indices[3];\n\t\t\thexagons[hexagonIndex * 6 + 4] = indices[4];\n\t\t\thexagons[hexagonIndex * 6 + 5] = indices[5];\n\t\t\thexagonIndex++;\n\t\t}\n\n\t}\n\n}\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMesh3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"PolygonalCount.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SurfaceMesh3_EEK_Create();\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_GetBuildStamp(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces);\n\n\tCGALWRAPPER_API\tvoid SurfaceMesh3_EEK_ClearProperyMaps(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_PrintIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force);\n\n\tCGALWRAPPER_API void* SurfaceMesh3_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsValid(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsVertexValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsFaceValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsHalfedgeValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsEdgeValid(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_HalfedgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_RemovedVertexCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_RemovedHalfedgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_RemovedEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_RemovedFaceCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsVertexRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsFaceRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsHalfedgeRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsEdgeRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddVertex(void* ptr, Point3d point);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddEdge(void* ptr, int v0, int v1);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddTriangle(void* ptr, int v0, int v1, int v2);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddQuad(void* ptr, int v0, int v1, int v2, int v3);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddPentagon(void* ptr, int v0, int v1, int v2, int v3, int v4);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddHexagon(void* ptr, int v0, int v1, int v2, int v3, int v4, int v5);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_AddFace(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_HasGarbage(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_CollectGarbage(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_SetRecycleGarbage(void* ptr, BOOL collect);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_DoesRecycleGarbage(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_VertexDegree(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_FaceDegree(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_VertexIsIsolated(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_VertexIsBorder(void* ptr, int index, BOOL check_all_incident_halfedges);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_EdgeIsBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_NextHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_PreviousHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_OppositeHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_SourceVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_TargetVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_NextAroundSource(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_NextAroundTarget(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_PreviousAroundSource(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_PreviousAroundTarget(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_EdgesHalfedge(void* ptr, int edgeIndex, int halfedgeIndex);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_HalfedgesEdge(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_RemoveEdge(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_RemoveFace(void* ptr, int index);\n\n\tCGALWRAPPER_API Point3d SurfaceMesh3_EEK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_GetSegment(void* ptr, int index, Segment3d& segment);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_GetVertex(void* ptr, int index, MeshVertex3& vert);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetVertices(void* ptr, MeshVertex3* vertexArray, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_GetFace(void* ptr, int index, MeshFace3& face);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetFaces(void* ptr, MeshFace3* faceArray, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetHalfedges(void* ptr, MeshHalfedge3* edgeArray, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsVertexBorder(void* ptr, int index, BOOL check_all_incident_halfedges);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsHalfedgeBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_IsEdgeBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_BorderEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_IsClosed(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_CheckFaceVertexCount(void* ptr, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_Join(void* ptr, void* otherPtr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_BuildAABBTree(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ReleaseAABBTree(void* ptr);\n\n\tCGALWRAPPER_API Box3d SurfaceMesh3_EEK_GetBoundingBox(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ReadOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_WriteOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_Triangulate(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_DoesSelfIntersect(void* ptr);\n\n\tCGALWRAPPER_API double SurfaceMesh3_EEK_Area(void* ptr);\n\n\tCGALWRAPPER_API Point3d SurfaceMesh3_EEK_Centroid(void* ptr);\n\n\tCGALWRAPPER_API double SurfaceMesh3_EEK_Volume(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_DoesBoundAVolume(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side SurfaceMesh3_EEK_SideOfTriangleMesh(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EEK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetCentroids(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EEK_PropertyMapCount(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ComputeVertexNormals(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_ComputeFaceNormals(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetVertexNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetFaceNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API PolygonalCount SurfaceMesh3_EEK_GetPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API PolygonalCount SurfaceMesh3_EEK_GetDualPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_CreatePolygonMesh(void* ptr, Point2d* points, int count, BOOL xz);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EEK_GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMesh3_EIK.cpp",
    "content": "#include \"SurfaceMesh3_EIK.h\"\n#include \"SurfaceMesh3.h\"\n\n#include <string>\n\nvoid* SurfaceMesh3_EIK_Create()\n{\n\treturn SurfaceMesh3<EIK>::NewSurfaceMesh();\n}\n\nvoid SurfaceMesh3_EIK_Release(void* ptr)\n{\n\tSurfaceMesh3<EIK>::DeleteSurfaceMesh(ptr);\n}\n\nint SurfaceMesh3_EIK_GetBuildStamp(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::GetBuildStamp(ptr);\n}\n\nvoid SurfaceMesh3_EIK_Clear(void* ptr)\n{\n\tSurfaceMesh3<EIK>::Clear(ptr);\n}\n\nvoid SurfaceMesh3_EIK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges)\n{\n\tSurfaceMesh3<EIK>::ClearIndexMaps(ptr, vertices, faces, edges, halfedges);\n}\n\nvoid SurfaceMesh3_EIK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces)\n{\n\tSurfaceMesh3<EIK>::ClearNormalMaps(ptr, vertices, faces);\n}\n\nvoid SurfaceMesh3_EIK_ClearProperyMaps(void* ptr)\n{\n\tSurfaceMesh3<EIK>::ClearProperyMaps(ptr);\n}\n\nvoid SurfaceMesh3_EIK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n{\n\tSurfaceMesh3<EIK>::BuildIndices(ptr, vertices, faces, edges, halfedges, force);\n}\n\nvoid SurfaceMesh3_EIK_PrintIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force)\n{\n\tSurfaceMesh3<EIK>::PrintIndices(ptr, vertices, faces, edges, halfedges, force);\n}\n\nvoid* SurfaceMesh3_EIK_Copy(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::Copy(ptr);\n}\n\nBOOL SurfaceMesh3_EIK_IsValid(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::IsValid(ptr);\n}\n\nint SurfaceMesh3_EIK_VertexCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::VertexCount(ptr);\n}\n\nint SurfaceMesh3_EIK_HalfedgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::HalfedgeCount(ptr);\n}\n\nint SurfaceMesh3_EIK_EdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::EdgeCount(ptr);\n}\n\nint SurfaceMesh3_EIK_FaceCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::FaceCount(ptr);\n}\n\nint SurfaceMesh3_EIK_RemovedVertexCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::RemovedVertexCount(ptr);\n}\n\nint SurfaceMesh3_EIK_RemovedHalfedgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::RemovedHalfedgeCount(ptr);\n}\n\nint SurfaceMesh3_EIK_RemovedEdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::RemovedEdgeCount(ptr);\n}\n\nint SurfaceMesh3_EIK_RemovedFaceCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::RemovedFaceCount(ptr);\n}\n\nBOOL SurfaceMesh3_EIK_IsVertexRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsVertexRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsFaceRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsFaceRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsHalfedgeRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsHalfedgeRemoved(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsEdgeRemoved(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsEdgeRemoved(ptr, index);\n}\n\nint SurfaceMesh3_EIK_AddVertex(void* ptr, Point3d point)\n{\n\treturn SurfaceMesh3<EIK>::AddVertex(ptr, point);\n}\n\nint SurfaceMesh3_EIK_AddEdge(void* ptr, int v0, int v1)\n{\n\treturn SurfaceMesh3<EIK>::AddEdge(ptr, v0, v1);\n}\n\nint SurfaceMesh3_EIK_AddTriangle(void* ptr, int v0, int v1, int v2)\n{\n\treturn SurfaceMesh3<EIK>::AddTriangle(ptr, v0, v1, v2);\n}\n\nint SurfaceMesh3_EIK_AddQuad(void* ptr, int v0, int v1, int v2, int v3)\n{\n\treturn SurfaceMesh3<EIK>::AddQuad(ptr, v0, v1, v2, v3);\n}\n\nint SurfaceMesh3_EIK_AddPentagon(void* ptr, int v0, int v1, int v2, int v3, int v4)\n{\n\treturn SurfaceMesh3<EIK>::AddPentagon(ptr, v0, v1, v2, v3, v4);\n}\n\nint SurfaceMesh3_EIK_AddHexagon(void* ptr, int v0, int v1, int v2, int v3, int v4, int v5)\n{\n\treturn SurfaceMesh3<EIK>::AddHexagon(ptr, v0, v1, v2, v3, v4, v5);\n}\n\nint SurfaceMesh3_EIK_AddFace(void* ptr, int* indices, int count)\n{\n\treturn SurfaceMesh3<EIK>::AddFace(ptr, indices, count);\n}\n\nBOOL SurfaceMesh3_EIK_HasGarbage(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::HasGarbage(ptr);\n}\n\nvoid SurfaceMesh3_EIK_CollectGarbage(void* ptr)\n{\n\tSurfaceMesh3<EIK>::CollectGarbage(ptr);\n}\n\nvoid SurfaceMesh3_EIK_SetRecycleGarbage(void* ptr, BOOL collect)\n{\n\tSurfaceMesh3<EIK>::SetRecycleGarbage(ptr, collect);\n}\n\nBOOL SurfaceMesh3_EIK_DoesRecycleGarbage(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::DoesRecycleGarbage(ptr);\n}\n\nint SurfaceMesh3_EIK_VertexDegree(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::VertexDegree(ptr, index);\n}\n\nint SurfaceMesh3_EIK_FaceDegree(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::FaceDegree(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_VertexIsIsolated(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::VertexIsIsolated(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_VertexIsBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n{\n\treturn SurfaceMesh3<EIK>::VertexIsBorder(ptr, index, check_all_incident_halfedges);\n}\n\nBOOL SurfaceMesh3_EIK_EdgeIsBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::EdgeIsBorder(ptr, index);\n}\n\nint SurfaceMesh3_EIK_NextHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::NextHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EIK_PreviousHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::PreviousHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EIK_OppositeHalfedge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::OppositeHalfedge(ptr, index);\n}\n\nint SurfaceMesh3_EIK_SourceVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::SourceVertex(ptr, index);\n}\n\nint SurfaceMesh3_EIK_TargetVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::TargetVertex(ptr, index);\n}\n\nint SurfaceMesh3_EIK_NextAroundSource(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::NextAroundSource(ptr, index);\n}\n\nint SurfaceMesh3_EIK_NextAroundTarget(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::NextAroundTarget(ptr, index);\n}\n\nint SurfaceMesh3_EIK_PreviousAroundSource(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::PreviousAroundSource(ptr, index);\n}\n\nint SurfaceMesh3_EIK_PreviousAroundTarget(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::PreviousAroundTarget(ptr, index);\n}\n\nint SurfaceMesh3_EIK_EdgesHalfedge(void* ptr, int edgeIndex, int halfedgeIndex)\n{\n\treturn SurfaceMesh3<EIK>::EdgesHalfedge(ptr, edgeIndex, halfedgeIndex);\n}\n\nint SurfaceMesh3_EIK_HalfedgesEdge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::HalfedgesEdge(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_RemoveVertex(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::RemoveVertex(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_RemoveEdge(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::RemoveEdge(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_RemoveFace(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::RemoveFace(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsVertexValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsVertexValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsEdgeValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsEdgeValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsHalfedgeValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsHalfedgeValid(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsFaceValid(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsFaceValid(ptr, index);\n}\n\nPoint3d SurfaceMesh3_EIK_GetPoint(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::GetPoint(ptr, index);\n}\n\nvoid SurfaceMesh3_EIK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid SurfaceMesh3_EIK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tSurfaceMesh3<EIK>::SetPoint(ptr, index, point);\n}\n\nvoid SurfaceMesh3_EIK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EIK>::SetPoints(ptr, points, count);\n}\n\nBOOL SurfaceMesh3_EIK_GetSegment(void* ptr, int index, Segment3d& segment)\n{\n\treturn SurfaceMesh3<EIK>::GetSegment(ptr, index, segment);\n}\n\nvoid SurfaceMesh3_EIK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tSurfaceMesh3<EIK>::GetSegments(ptr, segments, count);\n}\n\nBOOL SurfaceMesh3_EIK_GetTriangle(void* ptr, int index, Triangle3d& tri)\n{\n\treturn SurfaceMesh3<EIK>::GetTriangle(ptr, index, tri);\n}\n\nvoid SurfaceMesh3_EIK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tSurfaceMesh3<EIK>::GetTriangles(ptr, triangles, count);\n}\n\nBOOL SurfaceMesh3_EIK_GetVertex(void* ptr, int index, MeshVertex3& vert)\n{\n\treturn SurfaceMesh3<EIK>::GetVertex(ptr, index, vert);\n}\n\nvoid SurfaceMesh3_EIK_GetVertices(void* ptr, MeshVertex3* vertexArray, int count)\n{\n\tSurfaceMesh3<EIK>::GetVertices(ptr, vertexArray, count);\n}\n\nBOOL SurfaceMesh3_EIK_GetFace(void* ptr, int index, MeshFace3& face)\n{\n\treturn SurfaceMesh3<EIK>::GetFace(ptr, index, face);\n}\n\nvoid SurfaceMesh3_EIK_GetFaces(void* ptr, MeshFace3* faceArray, int count)\n{\n\tSurfaceMesh3<EIK>::GetFaces(ptr, faceArray, count);\n}\n\nBOOL SurfaceMesh3_EIK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge)\n{\n\treturn SurfaceMesh3<EIK>::GetHalfedge(ptr, index, edge);\n}\n\nvoid SurfaceMesh3_EIK_GetHalfedges(void* ptr, MeshHalfedge3* edgeArray, int count)\n{\n\tSurfaceMesh3<EIK>::GetHalfedges(ptr, edgeArray, count);\n}\n\nvoid SurfaceMesh3_EIK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tSurfaceMesh3<EIK>::Transform(ptr, matrix);\n}\n\nBOOL SurfaceMesh3_EIK_IsVertexBorder(void* ptr, int index, BOOL check_all_incident_halfedges)\n{\n\treturn SurfaceMesh3<EIK>::IsVertexBorder(ptr, index, check_all_incident_halfedges);\n}\n\nBOOL SurfaceMesh3_EIK_IsHalfedgeBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsHalfedgeBorder(ptr, index);\n}\n\nBOOL SurfaceMesh3_EIK_IsEdgeBorder(void* ptr, int index)\n{\n\treturn SurfaceMesh3<EIK>::IsEdgeBorder(ptr, index);\n}\n\nint SurfaceMesh3_EIK_BorderEdgeCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::BorderEdgeCount(ptr);\n}\n\nBOOL SurfaceMesh3_EIK_IsClosed(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::IsClosed(ptr);\n}\n\nvoid SurfaceMesh3_EIK_Join(void* ptr, void* otherPtr)\n{\n\tSurfaceMesh3<EIK>::Join(ptr, otherPtr);\n}\n\nvoid SurfaceMesh3_EIK_BuildAABBTree(void* ptr)\n{\n\tSurfaceMesh3<EIK>::BuildAABBTree(ptr);\n}\n\nvoid SurfaceMesh3_EIK_ReleaseAABBTree(void* ptr)\n{\n\tSurfaceMesh3<EIK>::ReleaseAABBTree(ptr);\n}\n\nBox3d SurfaceMesh3_EIK_GetBoundingBox(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::GetBoundingBox(ptr);\n}\n\nvoid SurfaceMesh3_EIK_ReadOFF(void* ptr, const char* filename)\n{\n\tSurfaceMesh3<EIK>::ReadOFF(ptr, filename);\n}\n\nvoid SurfaceMesh3_EIK_WriteOFF(void* ptr, const char* filename)\n{\n\tSurfaceMesh3<EIK>::WriteOFF(ptr, filename);\n}\n\nvoid SurfaceMesh3_EIK_Triangulate(void* ptr)\n{\n\tSurfaceMesh3<EIK>::Triangulate(ptr);\n}\n\nBOOL SurfaceMesh3_EIK_DoesSelfIntersect(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::DoesSelfIntersect(ptr);\n}\n\ndouble SurfaceMesh3_EIK_Area(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::Area(ptr);\n}\n\nPoint3d SurfaceMesh3_EIK_Centroid(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::Centroid(ptr);\n}\n\ndouble SurfaceMesh3_EIK_Volume(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::Volume(ptr);\n}\n\nBOOL SurfaceMesh3_EIK_DoesBoundAVolume(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::DoesBoundAVolume(ptr);\n}\n\nCGAL::Bounded_side SurfaceMesh3_EIK_SideOfTriangleMesh(void* ptr, const Point3d& point)\n{\n\treturn SurfaceMesh3<EIK>::SideOfTriangleMesh(ptr, point);\n}\n\nBOOL SurfaceMesh3_EIK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides)\n{\n\treturn SurfaceMesh3<EIK>::DoIntersects(ptr, otherPtr, test_bounded_sides);\n}\n\nvoid SurfaceMesh3_EIK_GetCentroids(void* ptr, Point3d* points, int count)\n{\n\tSurfaceMesh3<EIK>::GetCentroids(ptr, points, count);\n}\n\nint SurfaceMesh3_EIK_PropertyMapCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::PropertyMapCount(ptr);\n}\n\nvoid SurfaceMesh3_EIK_ComputeVertexNormals(void* ptr)\n{\n\tSurfaceMesh3<EIK>::ComputeVertexNormals(ptr);\n}\n\nvoid SurfaceMesh3_EIK_ComputeFaceNormals(void* ptr)\n{\n\tSurfaceMesh3<EIK>::ComputeFaceNormals(ptr);\n}\n\nvoid SurfaceMesh3_EIK_GetVertexNormals(void* ptr, Vector3d* normals, int count)\n{\n\tSurfaceMesh3<EIK>::GetVertexNormals(ptr, normals, count);\n}\n\nvoid SurfaceMesh3_EIK_GetFaceNormals(void* ptr, Vector3d* normals, int count)\n{\n\tSurfaceMesh3<EIK>::GetFaceNormals(ptr, normals, count);\n}\n\nBOOL SurfaceMesh3_EIK_CheckFaceVertexCount(void* ptr, int count)\n{\n\treturn SurfaceMesh3<EIK>::CheckFaceVertexCount(ptr, count);\n}\n\nPolygonalCount SurfaceMesh3_EIK_GetPolygonalCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::GetPolygonalCount(ptr);\n}\n\nPolygonalCount SurfaceMesh3_EIK_GetDualPolygonalCount(void* ptr)\n{\n\treturn SurfaceMesh3<EIK>::GetDualPolygonalCount(ptr);\n}\n\nvoid SurfaceMesh3_EIK_CreatePolygonMesh(void* ptr, Point2d* points, int count, BOOL xz)\n{\n\tSurfaceMesh3<EIK>::CreatePolygonMesh(ptr, points, count, xz);\n}\n\nvoid SurfaceMesh3_EIK_CreatePolygonalMesh(void* ptr,\n\tPoint3d* points, int pointsCount,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EIK>::CreatePolygonalMesh(ptr,\n\t\tpoints, pointsCount,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid SurfaceMesh3_EIK_GetPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EIK>::GetPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\nvoid SurfaceMesh3_EIK_GetDualPolygonalIndices(void* ptr,\n\tint* triangles, int triangleCount,\n\tint* quads, int quadCount,\n\tint* pentagons, int pentagonCount,\n\tint* hexagons, int hexagonCount)\n{\n\tSurfaceMesh3<EIK>::GetDualPolygonalIndices(ptr,\n\t\ttriangles, triangleCount,\n\t\tquads, quadCount,\n\t\tpentagons, pentagonCount,\n\t\thexagons, hexagonCount);\n}\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMesh3_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"../Geometry/MinMax.h\"\n#include \"PolygonalCount.h\"\n#include \"MeshVertex3.h\"\n#include \"MeshFace3.h\"\n#include \"MeshHalfedge3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SurfaceMesh3_EIK_Create();\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_GetBuildStamp(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ClearIndexMaps(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ClearNormalMaps(void* ptr, BOOL vertices, BOOL faces);\n\n\tCGALWRAPPER_API\tvoid SurfaceMesh3_EIK_ClearProperyMaps(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_BuildIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_PrintIndices(void* ptr, BOOL vertices, BOOL faces, BOOL edges, BOOL halfedges, BOOL force);\n\n\tCGALWRAPPER_API void* SurfaceMesh3_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsValid(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsVertexValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsFaceValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsHalfedgeValid(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsEdgeValid(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_HalfedgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_RemovedVertexCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_RemovedHalfedgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_RemovedEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_RemovedFaceCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsVertexRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsFaceRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsHalfedgeRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsEdgeRemoved(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddVertex(void* ptr, Point3d point);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddEdge(void* ptr, int v0, int v1);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddTriangle(void* ptr, int v0, int v1, int v2);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddQuad(void* ptr, int v0, int v1, int v2, int v3);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddPentagon(void* ptr, int v0, int v1, int v2, int v3, int v4);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddHexagon(void* ptr, int v0, int v1, int v2, int v3, int v4, int v5);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_AddFace(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_HasGarbage(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_CollectGarbage(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_SetRecycleGarbage(void* ptr, BOOL collect);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_DoesRecycleGarbage(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_VertexDegree(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_FaceDegree(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_VertexIsIsolated(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_VertexIsBorder(void* ptr, int index, BOOL check_all_incident_halfedges);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_EdgeIsBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_NextHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_PreviousHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_OppositeHalfedge(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_SourceVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_TargetVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_NextAroundSource(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_NextAroundTarget(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_PreviousAroundSource(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_PreviousAroundTarget(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_EdgesHalfedge(void* ptr, int edgeIndex, int halfedgeIndex);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_HalfedgesEdge(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_RemoveEdge(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_RemoveFace(void* ptr, int index);\n\n\tCGALWRAPPER_API Point3d SurfaceMesh3_EIK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_GetSegment(void* ptr, int index, Segment3d& segment);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_GetTriangle(void* ptr, int index, Triangle3d& tri);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_GetVertex(void* ptr, int index, MeshVertex3& vert);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetVertices(void* ptr, MeshVertex3* vertexArray, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_GetFace(void* ptr, int index, MeshFace3& face);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetFaces(void* ptr, MeshFace3* faceArray, int count);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_GetHalfedge(void* ptr, int index, MeshHalfedge3& edge);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetHalfedges(void* ptr, MeshHalfedge3* edgeArray, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsVertexBorder(void* ptr, int index, BOOL check_all_incident_halfedges);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsHalfedgeBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_IsEdgeBorder(void* ptr, int index);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_BorderEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_IsClosed(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_CheckFaceVertexCount(void* ptr, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_Join(void* ptr, void* otherPtr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_BuildAABBTree(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ReleaseAABBTree(void* ptr);\n\n\tCGALWRAPPER_API Box3d SurfaceMesh3_EIK_GetBoundingBox(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ReadOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_WriteOFF(void* ptr, const char* filename);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_Triangulate(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_DoesSelfIntersect(void* ptr);\n\n\tCGALWRAPPER_API double SurfaceMesh3_EIK_Area(void* ptr);\n\n\tCGALWRAPPER_API Point3d SurfaceMesh3_EIK_Centroid(void* ptr);\n\n\tCGALWRAPPER_API double SurfaceMesh3_EIK_Volume(void* ptr);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_DoesBoundAVolume(void* ptr);\n\n\tCGALWRAPPER_API CGAL::Bounded_side SurfaceMesh3_EIK_SideOfTriangleMesh(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API BOOL SurfaceMesh3_EIK_DoIntersects(void* ptr, void* otherPtr, BOOL test_bounded_sides);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetCentroids(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API int SurfaceMesh3_EIK_PropertyMapCount(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ComputeVertexNormals(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_ComputeFaceNormals(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetVertexNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetFaceNormals(void* ptr, Vector3d* normals, int count);\n\n\tCGALWRAPPER_API PolygonalCount SurfaceMesh3_EIK_GetPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API PolygonalCount SurfaceMesh3_EIK_GetDualPolygonalCount(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_CreatePolygonMesh(void* ptr, Point2d* points, int count, BOOL xz);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_CreatePolygonalMesh(void* ptr,\n\t\tPoint3d* points, int pointsCount,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\tCGALWRAPPER_API void SurfaceMesh3_EIK_GetDualPolygonalIndices(void* ptr,\n\t\tint* triangles, int triangleCount,\n\t\tint* quads, int quadCount,\n\t\tint* pentagons, int pentagonCount,\n\t\tint* hexagons, int hexagonCount);\n\n\n}"
  },
  {
    "path": "CGALWrapper/Polyhedra/SurfaceMeshMap.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"SurfaceMesh3.h\"\n\n#include <unordered_map>\n#include <CGAL/Surface_mesh.h>\n\ntemplate<class K>\nclass SurfaceMeshMap\n{\nprivate:\n\n\ttypedef typename K::Point_3 Point_3;\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Edge_index Edge;\n\ttypedef typename SurfaceMesh::Halfedge_index Halfedge;\n\ttypedef typename SurfaceMesh::Vertex_index Vertex;\n\ttypedef typename SurfaceMesh::Face_index Face;\n\n\tint buildStamp = 1;\n\n\tstd::unordered_map<Vertex, int> vertexIndexMap;\n\tstd::vector<Vertex> vertexMap;\n\tbool rebuildVertexIndexMap = true;\n\n\tstd::unordered_map<Face, int> faceIndexMap;\n\tstd::vector<Face> faceMap;\n\tbool rebuildFaceIndexMap = true;\n\n\tstd::unordered_map<Edge, int> edgeIndexMap;\n\tstd::vector<Edge> edgeMap;\n\tbool rebuildEdgeIndexMap = true;\n\n\tstd::unordered_map<Halfedge, int> halfedgeIndexMap;\n\tstd::vector<Halfedge> halfedgeMap;\n\tbool rebuildHalfedgeIndexMap = true;\n\npublic:\n\n\tint VertexCount()\n\t{\n\t\treturn (int)vertexMap.size();\n\t}\n\n\tint FaceCount()\n\t{\n\t\treturn (int)faceMap.size();\n\t}\n\n\tint EdgeCount()\n\t{\n\t\treturn (int)edgeMap.size();\n\t}\n\n\tint HalfedgeCount()\n\t{\n\t\treturn (int)halfedgeMap.size();\n\t}\n\n\tint BuildStamp()\n\t{\n\t\treturn buildStamp;\n\t}\n\n\tvoid OnVerticesChanged()\n\t{\n\t\tvertexMap.clear();\n\t\tvertexMap.reserve(0);\n\t\tvertexIndexMap.clear();\n\t\tvertexIndexMap.reserve(0);\n\t\trebuildVertexIndexMap = true;\n\t\tbuildStamp++;\n\t}\n\n\tvoid OnFacesChanged()\n\t{\n\t\tfaceMap.clear();\n\t\tfaceMap.reserve(0);\n\t\tfaceIndexMap.clear();\n\t\tfaceIndexMap.reserve(0);\n\t\trebuildFaceIndexMap = true;\n\t\tbuildStamp++;\n\t}\n\n\tvoid OnEdgesChanged()\n\t{\n\t\tedgeMap.clear();\n\t\tedgeMap.reserve(0);\n\t\tedgeIndexMap.clear();\n\t\tedgeIndexMap.reserve(0);\n\t\trebuildEdgeIndexMap = true;\n\t\tbuildStamp++;\n\t}\n\n\tvoid OnHalfedgesChanged()\n\t{\n\t\thalfedgeMap.clear();\n\t\thalfedgeMap.reserve(0);\n\t\thalfedgeIndexMap.clear();\n\t\thalfedgeIndexMap.reserve(0);\n\t\trebuildHalfedgeIndexMap = true;\n\t\tbuildStamp++;\n\t}\n\n\tvoid Clear()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t\tOnEdgesChanged();\n\t\tOnHalfedgesChanged();\n\t}\n\n\tvoid BuildVertexMaps(const SurfaceMesh& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildVertexIndexMap) return;\n\t\trebuildVertexIndexMap = false;\n\n\t\tvertexMap.clear();\n\t\tvertexMap.reserve(model.number_of_vertices());\n\t\tvertexIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto vertex : model.vertices())\n\t\t{\n\t\t\t//std::cout << \"Vetex = \" << vertex<< \" Index \" << index << std::endl;\n\t\t\tvertexMap.push_back(vertex);\n\t\t\tvertexIndexMap.insert(std::pair<Vertex, int>(vertex, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tvoid BuildFaceMaps(const SurfaceMesh& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildFaceIndexMap) return;\n\t\trebuildFaceIndexMap = false;\n\n\t\tfaceMap.clear();\n\t\tfaceMap.reserve(model.number_of_faces());\n\t\tfaceIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto face : model.faces())\n\t\t{\n\t\t\t//std::cout << \"Face = \" << face << \" Index \" << index << std::endl;\n\t\t\tfaceMap.push_back(face);\n\t\t\tfaceIndexMap.insert(std::pair<Face, int>(face, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tvoid BuildEdgeMaps(const SurfaceMesh& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildEdgeIndexMap) return;\n\t\trebuildEdgeIndexMap = false;\n\n\t\tedgeMap.clear();\n\t\tedgeMap.reserve(model.number_of_edges());\n\t\tedgeIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto edge : model.edges())\n\t\t{\n\t\t\t//std::cout << \"Edge = \" << edge << \" Index \" << index << std::endl;\n\t\t\tedgeMap.push_back(edge);\n\t\t\tedgeIndexMap.insert(std::pair<Edge, int>(edge, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tvoid BuildHalfedgeMaps(const SurfaceMesh& model, bool force = false)\n\t{\n\t\tif (!force && !rebuildHalfedgeIndexMap) return;\n\t\trebuildHalfedgeIndexMap = false;\n\n\t\thalfedgeMap.clear();\n\t\thalfedgeMap.reserve(model.number_of_halfedges());\n\t\thalfedgeIndexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto edge : model.halfedges())\n\t\t{\n\t\t\t//std::cout << \"Halfedge = \" << edge << \" Index \" << index << std::endl;\n\t\t\thalfedgeMap.push_back(edge);\n\t\t\thalfedgeIndexMap.insert(std::pair<Halfedge, int>(edge, index));\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tint FindVertexIndex(Vertex vertex)\n\t{\n\t\tauto item = vertexIndexMap.find(vertex);\n\t\tif (item != vertexIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tVertex FindVertex(int index)\n\t{\n\t\tint count = (int)vertexMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn SurfaceMesh::null_vertex();\n\n\t\treturn Vertex(vertexMap[index]);\n\t}\n\n\tVertex GetVertex(int index)\n\t{\n\t\treturn Vertex(vertexMap[index]);\n\t}\n\n\tint FindFaceIndex(Face face)\n\t{\n\t\tauto item = faceIndexMap.find(face);\n\t\tif (item != faceIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tFace FindFace(int index)\n\t{\n\t\tint count = (int)faceMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn SurfaceMesh::null_face();\n\n\t\treturn Face(faceMap[index]);\n\t}\n\n\tFace GetFace(int index)\n\t{\n\t\treturn Face(faceMap[index]);\n\t}\n\n\tint FindEdgeIndex(Edge edge)\n\t{\n\t\tauto item = edgeIndexMap.find(edge);\n\t\tif (item != edgeIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tEdge FindEdge(int index)\n\t{\n\t\tint count = (int)edgeMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn SurfaceMesh::null_edge();\n\n\t\treturn Edge(edgeMap[index]);\n\t}\n\n\tEdge GetEdge(int index)\n\t{\n\t\treturn Edge(edgeMap[index]);\n\t}\n\n\tint FindHalfedgeIndex(Halfedge edge)\n\t{\n\t\tauto item = halfedgeIndexMap.find(edge);\n\t\tif (item != halfedgeIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tHalfedge FindHalfedge(int index)\n\t{\n\t\tint count = (int)halfedgeMap.size();\n\t\tif (index < 0 || index >= count)\n\t\t\treturn SurfaceMesh::null_halfedge();\n\n\t\treturn Halfedge(halfedgeMap[index]);\n\t}\n\n\tHalfedge GetHalfedge(int index)\n\t{\n\t\treturn Halfedge(halfedgeMap[index]);\n\t}\n\n\tvoid PrintVertices(const SurfaceMesh& model)\n\t{\n\t\tstd::cout << \"Vertex indices\" << std::endl;\n\t\tfor (auto vertex : model.vertices())\n\t\t{\n\t\t\tint index = FindVertexIndex(vertex);\n\t\t\tif (index == NULL_INDEX)\n\t\t\t{\n\t\t\t\tstd::cout << \"Vertex = \" << vertex\n\t\t\t\t\t<< \", Index = \" << index << std::endl;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto point = model.point(vertex);\n\t\t\t\tstd::cout << \"Vertex = \" << vertex\n\t\t\t\t\t<< \", Index = \" << index\n\t\t\t\t\t<< \", Point = \" << point << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid PrintFaces(const SurfaceMesh& model)\n\t{\n\t\tstd::cout << \"Face indices\" << std::endl;\n\t\tfor (auto face : model.faces())\n\t\t{\n\t\t\tstd::cout << \"Face = \" << face\n\t\t\t\t<< \", Index = \" << FindFaceIndex(face) << std::endl;\n\t\t}\n\t}\n\n\tvoid PrintEdges(const SurfaceMesh& model)\n\t{\n\t\tstd::cout << \"Edges indices\" << std::endl;\n\t\tfor (auto edge : model.edges())\n\t\t{\n\t\t\tstd::cout << \"Edge = \" << edge\n\t\t\t\t<< \", Index = \" << FindEdgeIndex(edge) << std::endl;\n\t\t}\n\t}\n\n\tvoid PrintHalfedges(const SurfaceMesh& model)\n\t{\n\t\tstd::cout << \"Halfedges indices\" << std::endl;\n\t\tfor (auto edge : model.halfedges())\n\t\t{\n\t\t\tstd::cout << \"Halfedge = \" << edge\n\t\t\t\t<< \", Index = \" << FindHalfedgeIndex(edge) << std::endl;\n\t\t}\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include <vector>\n#include <algorithm>\n#include <CGAL/enum.h> \n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntemplate<class K>\nclass Polyline2\n{\n\npublic:\n\n\tPolyline2()\n\t{\n\n\t}\n\n\tPolyline2(int count)\n\t{\n\t\tpoints.resize(count);\n\t}\n\n\ttypedef CGAL::Point_2<K> Point_2;\n\ttypedef CGAL::Segment_2<K> Segment_2;\n\ttypedef CGAL::Aff_transformation_2<K> Transformation_2;\n\t\n\tstd::vector<Point_2> points;\n\n\tinline static Polyline2* NewPolyline2()\n\t{\n\t\treturn new Polyline2();\n\n\t}\n\n\tinline static Polyline2* NewPolyline2(int count)\n\t{\n\t\treturn new Polyline2(count);\n\t}\n\n\tinline static void DeletePolyline2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Polyline2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Polyline2* CastToPolyline2(void* ptr)\n\t{\n\t\treturn static_cast<Polyline2*>(ptr);\n\t}\n\n\tinline bool OutOfRange(int index)\n\t{\n\t\tif (index < 0 || index >= points.size())\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tauto copy = new Polyline2();\n\t\tcopy->points = polyline->points;\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tauto count = polyline->points.size();\n\n\t\tauto polyline2 = new Polyline2<K2>();\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto p = convert(polyline->points[i]);\n\t\t\tpolyline2->points.push_back(p);\n\t\t}\n\n\t\treturn polyline2;\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tpolyline->points.clear();\n\t}\n\n\tstatic int Count(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\treturn (int)polyline->points.size();\n\t}\n\n\tstatic int Capacity(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\treturn (int)polyline->points.capacity();\n\t}\n\n\tstatic void Resize(void* ptr, int count)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tpolyline->points.resize(count);\n\t}\n\n\tstatic void Reverse(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tstd::reverse(polyline->points.begin(), polyline->points.end());\n\t}\n\n\tstatic void ShrinkToFit(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tpolyline->points.shrink_to_fit();\n\t}\n\n\tstatic void Erase(void* ptr, int index)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points.erase(polyline->points.begin() + index);\n\t}\n\n\tstatic void Erase(void* ptr, int start, int count)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(start) ||\n\t\t\tpolyline->OutOfRange(start + count))\n\t\t\treturn;\n\n\t\tpolyline->points.erase(polyline->points.begin() + start, polyline->points.begin() + count);\n\t}\n\n\tstatic void Insert(void* ptr, int index, Point2d point)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points.insert(polyline->points.begin() + index, point.ToCGAL<K>());\n\t}\n\n\tstatic void Insert(void* ptr, int start, int count, Point2d* points)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(start))\n\t\t\treturn;\n\n\t\tstd::vector<Point_2> tmp(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\ttmp.push_back(points[i].ToCGAL<K>());\n\n\t\tpolyline->points.insert(polyline->points.begin() + start, tmp.begin(), tmp.end());\n\t}\n\n\tstatic BOOL IsClosed(void* ptr, double threshold)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\t\n\t\tauto size = polyline->points.size();\n\t\tif (size < 2)\n\t\t\treturn false;\n\n\t\tauto start = polyline->points[0];\n\t\tauto end = polyline->points[size - 1];\n\n\t\tauto sqdist = CGAL::to_double(CGAL::squared_distance(start, end));\n\t\tauto sqthreshold = threshold * threshold;\n\n\t\treturn sqdist <= sqthreshold;\n\t}\n\n\tstatic double SqLength(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tauto count = polyline->points.size();\n\t\tif (count < 2) return 0;\n\n\t\tauto sum = CGAL::squared_distance(polyline->points[0], polyline->points[1]);\n\t\n\t\tfor (auto i = 1; i < count - 1; i++)\n\t\t\tsum += CGAL::squared_distance(polyline->points[i], polyline->points[i + 1]);\n\n\t\treturn CGAL::to_double(sum);\n\t}\n\n\tstatic Point2d GetPoint(void* ptr, int index)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn { 0, 0 };\n\n\t\tauto point = polyline->points[index];\n\t\treturn Point2d::FromCGAL<K>(point);\n\t}\n\n\tstatic void GetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tauto size = polyline->points.size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polyline->points[i];\n\t\t\tpoints[i] = Point2d::FromCGAL<K>(point);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void GetPoints(Polyline2* polyline, std::vector<Point2d>& points)\n\t{\n\t\tint count = (int)polyline->points.size();\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polyline->points[i];\n\t\t\tpoints.push_back(Point2d::FromCGAL<K>(point));\n\t\t}\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment2d* segments, int count)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tauto size = polyline->points.size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count-1; i++)\n\t\t{\n\t\t\tauto v0 = polyline->points[i];\n\t\t\tauto v1 = polyline->points[i+1];\n\n\t\t\tsegments[i].a = Point2d::FromCGAL<K>(v0);\n\t\t\tsegments[i].b = Point2d::FromCGAL<K>(v1);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void SetPoint(void* ptr, int index, const Point2d& point)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points[index] = point.ToCGAL<K>();\n\t}\n\n\tstatic void SetPoints(void* ptr, Point2d* points, int count)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tauto size = polyline->points.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (i < size)\n\t\t\t\tpolyline->points[i] = points[i].ToCGAL<K>();\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Adding more points than polyline currently contains\n\t\t\t\t//so push back instead.\n\t\t\t\tpolyline->points.push_back(points[i].ToCGAL<K>());\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void Translate(void* ptr, const Point2d& translation)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tTransformation_2 transformation(CGAL::TRANSLATION, translation.ToVector<K>());\n\n\t\tfor(int i = 0; i < polyline->points.size(); i++)\n\t\t\tpolyline->points[i] = transformation(polyline->points[i]);\n\t}\n\n\tstatic void Rotate(void* ptr, double rotation)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tTransformation_2 transformation(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\t\n\t\tfor (int i = 0; i < polyline->points.size(); i++)\n\t\t\tpolyline->points[i] = transformation(polyline->points[i]);\n\t}\n\n\tstatic void Scale(void* ptr, double scale)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\t\tTransformation_2 transformation(CGAL::SCALING, scale);\n\t\t\n\t\tfor (int i = 0; i < polyline->points.size(); i++)\n\t\t\tpolyline->points[i] = transformation(polyline->points[i]);\n\t}\n\n\tstatic void Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n\t{\n\t\tauto polyline = CastToPolyline2(ptr);\n\n\t\tTransformation_2 T(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\tTransformation_2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\tTransformation_2 S(CGAL::SCALING, scale);\n\t\tTransformation_2 transformation = T * R * S;\n\n\t\tfor (int i = 0; i < polyline->points.size(); i++)\n\t\t\tpolyline->points[i] = transformation(polyline->points[i]);\n\t}\n\n};\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline2_EEK.cpp",
    "content": "\n#include \"Polyline2_EEK.h\"\n#include \"Polyline2.h\"\n\nvoid* Polyline2_EEK_Create()\n{\n\treturn Polyline2<EEK>::NewPolyline2();\n\n}\nvoid* Polyline2_EEK_CreateWithCount(int count)\n{\n\treturn Polyline2<EEK>::NewPolyline2(count);\n}\n\nvoid Polyline2_EEK_Release(void* ptr)\n{\n\tPolyline2<EEK>::DeletePolyline2(ptr);\n}\n\nint Polyline2_EEK_Count(void* ptr)\n{\n\treturn Polyline2<EEK>::Count(ptr);\n}\n\nvoid* Polyline2_EEK_Copy(void* ptr)\n{\n\treturn Polyline2<EEK>::Copy(ptr);\n}\n\nvoid* Polyline2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polyline2<EEK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polyline2<EEK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polyline2<EEK>::Convert<EEK>(ptr);\n\t}\n}\n\nvoid Polyline2_EEK_Clear(void* ptr)\n{\n\tPolyline2<EEK>::Clear(ptr);\n}\n\nint Polyline2_EEK_Capacity(void* ptr)\n{\n\treturn Polyline2<EEK>::Capacity(ptr);\n}\n\nvoid Polyline2_EEK_Resize(void* ptr, int count)\n{\n\tPolyline2<EEK>::Resize(ptr, count);\n}\n\nvoid Polyline2_EEK_Reverse(void* ptr)\n{\n\tPolyline2<EEK>::Reverse(ptr);\n}\n\nvoid Polyline2_EEK_ShrinkToFit(void* ptr)\n{\n\tPolyline2<EEK>::ShrinkToFit(ptr);\n}\n\nvoid Polyline2_EEK_Erase(void* ptr, int index) \n{\n\tPolyline2<EEK>::Erase(ptr, index);\n}\n\nvoid Polyline2_EEK_EraseRange(void* ptr, int start, int count)\n{\n\tPolyline2<EEK>::Erase(ptr, start, count);\n}\n\nvoid Polyline2_EEK_Insert(void* ptr, int index, Point2d point)\n{\n\tPolyline2<EEK>::Insert(ptr, index, point);\n}\n\nvoid Polyline2_EEK_InsertRange(void* ptr, int start, int count, Point2d* points)\n{\n\tPolyline2<EEK>::Insert(ptr, start, count, points);\n}\n\nBOOL Polyline2_EEK_IsClosed(void* ptr, double threshold)\n{\n\treturn Polyline2<EEK>::IsClosed(ptr, threshold);\n}\n\ndouble Polyline2_EEK_SqLength(void* ptr)\n{\n\treturn Polyline2<EEK>::SqLength(ptr);\n}\n\nPoint2d Polyline2_EEK_GetPoint(void* ptr, int index)\n{\n\treturn Polyline2<EEK>::GetPoint(ptr, index);\n}\n\nvoid Polyline2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolyline2<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyline2_EEK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolyline2<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyline2_EEK_SetPoint(void* ptr, int index, const Point2d& point)\n{\n\tPolyline2<EEK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyline2_EEK_SetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolyline2<EEK>::SetPoints(ptr, points, count);\n}\n\nvoid Polyline2_EEK_Translate(void* ptr, const Point2d& translation)\n{\n\tPolyline2<EEK>::Translate(ptr, translation);\n}\n\nvoid Polyline2_EEK_Rotate(void* ptr, double rotation)\n{\n\tPolyline2<EEK>::Rotate(ptr, rotation);\n}\n\nvoid Polyline2_EEK_Scale(void* ptr, double scale)\n{\n\tPolyline2<EEK>::Scale(ptr, scale);\n}\n\nvoid Polyline2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tPolyline2<EEK>::Transform(ptr, translation, rotation, scale);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Polyline2_EEK_Create();\n\n\tCGALWRAPPER_API void* Polyline2_EEK_CreateWithCount(int count);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polyline2_EEK_Count(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API  int Polyline2_EEK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline2_EEK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API  void Polyline2_EEK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API void Polyline2_EEK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline2_EEK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API  void Polyline2_EEK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Insert(void* ptr, int index, Point2d point);\n\n\tCGALWRAPPER_API void Polyline2_EEK_InsertRange(void* ptr, int start, int count, Point2d* points);\n\n\tCGALWRAPPER_API BOOL Polyline2_EEK_IsClosed(void* ptr, double threshold);\n\n\tCGALWRAPPER_API double Polyline2_EEK_SqLength(void* ptr);\n\n\tCGALWRAPPER_API Point2d Polyline2_EEK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyline2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polyline2_EEK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void Polyline2_EEK_SetPoint(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API void Polyline2_EEK_SetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Translate(void* ptr, const Point2d& translation);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Rotate(void* ptr, double rotation);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Scale(void* ptr, double scale);\n\n\tCGALWRAPPER_API void Polyline2_EEK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline2_EIK.cpp",
    "content": "\n#include \"Polyline2_EIK.h\"\n#include \"Polyline2.h\"\n\nvoid* Polyline2_EIK_Create()\n{\n\treturn Polyline2<EIK>::NewPolyline2();\n\n}\nvoid* Polyline2_EIK_CreateWithCount(int count)\n{\n\treturn Polyline2<EIK>::NewPolyline2(count);\n}\n\nvoid Polyline2_EIK_Release(void* ptr)\n{\n\tPolyline2<EIK>::DeletePolyline2(ptr);\n}\n\nint Polyline2_EIK_Count(void* ptr)\n{\n\treturn Polyline2<EIK>::Count(ptr);\n}\n\nvoid* Polyline2_EIK_Copy(void* ptr)\n{\n\treturn Polyline2<EIK>::Copy(ptr);\n}\n\nvoid* Polyline2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polyline2<EIK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polyline2<EIK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polyline2<EIK>::Convert<EIK>(ptr);\n\t}\n}\n\nvoid Polyline2_EIK_Clear(void* ptr)\n{\n\tPolyline2<EIK>::Clear(ptr);\n}\n\nint Polyline2_EIK_Capacity(void* ptr)\n{\n\treturn Polyline2<EIK>::Capacity(ptr);\n}\n\nvoid Polyline2_EIK_Resize(void* ptr, int count)\n{\n\tPolyline2<EIK>::Resize(ptr, count);\n}\n\nvoid Polyline2_EIK_Reverse(void* ptr)\n{\n\tPolyline2<EIK>::Reverse(ptr);\n}\n\nvoid Polyline2_EIK_ShrinkToFit(void* ptr)\n{\n\tPolyline2<EIK>::ShrinkToFit(ptr);\n}\n\nvoid Polyline2_EIK_Erase(void* ptr, int index)\n{\n\tPolyline2<EIK>::Erase(ptr, index);\n}\n\nvoid Polyline2_EIK_EraseRange(void* ptr, int start, int count)\n{\n\tPolyline2<EIK>::Erase(ptr, start, count);\n}\n\nvoid Polyline2_EIK_Insert(void* ptr, int index, Point2d point)\n{\n\tPolyline2<EIK>::Insert(ptr, index, point);\n}\n\nvoid Polyline2_EIK_InsertRange(void* ptr, int start, int count, Point2d* points)\n{\n\tPolyline2<EIK>::Insert(ptr, start, count, points);\n}\n\nBOOL Polyline2_EIK_IsClosed(void* ptr, double threshold)\n{\n\treturn Polyline2<EIK>::IsClosed(ptr, threshold);\n}\n\ndouble Polyline2_EIK_SqLength(void* ptr)\n{\n\treturn Polyline2<EIK>::SqLength(ptr);\n}\n\nPoint2d Polyline2_EIK_GetPoint(void* ptr, int index)\n{\n\treturn Polyline2<EIK>::GetPoint(ptr, index);\n}\n\nvoid Polyline2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolyline2<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyline2_EIK_GetSegments(void* ptr, Segment2d* segments, int count)\n{\n\tPolyline2<EIK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyline2_EIK_SetPoint(void* ptr, int index, const Point2d& point)\n{\n\tPolyline2<EIK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyline2_EIK_SetPoints(void* ptr, Point2d* points, int count)\n{\n\tPolyline2<EIK>::SetPoints(ptr, points, count);\n}\n\nvoid Polyline2_EIK_Translate(void* ptr, const Point2d& translation)\n{\n\tPolyline2<EIK>::Translate(ptr, translation);\n}\n\nvoid Polyline2_EIK_Rotate(void* ptr, double rotation)\n{\n\tPolyline2<EIK>::Rotate(ptr, rotation);\n}\n\nvoid Polyline2_EIK_Scale(void* ptr, double scale)\n{\n\tPolyline2<EIK>::Scale(ptr, scale);\n}\n\nvoid Polyline2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale)\n{\n\tPolyline2<EIK>::Transform(ptr, translation, rotation, scale);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Polyline2_EIK_Create();\n\n\tCGALWRAPPER_API void* Polyline2_EIK_CreateWithCount(int count);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polyline2_EIK_Count(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API  int Polyline2_EIK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline2_EIK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API  void Polyline2_EIK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API void Polyline2_EIK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline2_EIK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API  void Polyline2_EIK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Insert(void* ptr, int index, Point2d point);\n\n\tCGALWRAPPER_API void Polyline2_EIK_InsertRange(void* ptr, int start, int count, Point2d* points);\n\n\tCGALWRAPPER_API BOOL Polyline2_EIK_IsClosed(void* ptr, double threshold);\n\n\tCGALWRAPPER_API double Polyline2_EIK_SqLength(void* ptr);\n\n\tCGALWRAPPER_API Point2d Polyline2_EIK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyline2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polyline2_EIK_GetSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void Polyline2_EIK_SetPoint(void* ptr, int index, const Point2d& point);\n\n\tCGALWRAPPER_API void Polyline2_EIK_SetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Translate(void* ptr, const Point2d& translation);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Rotate(void* ptr, double rotation);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Scale(void* ptr, double scale);\n\n\tCGALWRAPPER_API void Polyline2_EIK_Transform(void* ptr, const Point2d& translation, double rotation, double scale);\n\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n\n#include <vector>\n#include <algorithm>\n#include <CGAL/enum.h> \n#include <CGAL/Aff_transformation_3.h>\n#include <CGAL/Cartesian_converter.h>\n\ntemplate<class K>\nclass Polyline3\n{\n\npublic:\n\n\ttypedef CGAL::Point_3<K> Point_3;\n\ttypedef CGAL::Segment_3<K> Segment_3;\n\n\tPolyline3()\n\t{\n\n\t}\n\n\tPolyline3(int count)\n\t{\n\t\tpoints.resize(count);\n\t}\n\n\tPolyline3(const std::vector<Point_3>& points)\n\t{\n\t\tthis->points = points;\n\t}\n\n\tstd::vector<Point_3> points;\n\n\tinline static Polyline3* NewPolyline3()\n\t{\n\t\treturn new Polyline3();\n\n\t}\n\n\tinline static Polyline3* NewPolyline3(int count)\n\t{\n\t\treturn new Polyline3(count);\n\t}\n\n\tinline static Polyline3* NewPolyline3(const std::vector<Point_3>& points)\n\t{\n\t\treturn new Polyline3(points);\n\t}\n\n\tinline static void DeletePolyline3(void* ptr)\n\t{\n\t\tauto obj = static_cast<Polyline3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Polyline3* CastToPolyline3(void* ptr)\n\t{\n\t\treturn static_cast<Polyline3*>(ptr);\n\t}\n\n\tinline bool OutOfRange(int index)\n\t{\n\t\tif (index < 0 || index >= points.size())\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tstatic void* Copy(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tauto copy = new Polyline3();\n\t\tcopy->points = polyline->points;\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tauto count = polyline->points.size();\n\n\t\tauto polyline2 = new Polyline3<K2>();\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto p = convert(polyline->points[i]);\n\t\t\tpolyline2->points.push_back(p);\n\t\t}\n\n\t\treturn polyline2;\n\t}\n\n\tstatic void Clear(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tpolyline->points.clear();\n\t}\n\n\tstatic int Count(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\treturn (int)polyline->points.size();\n\t}\n\n\tstatic int Capacity(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\treturn (int)polyline->points.capacity();\n\t}\n\n\tstatic void Resize(void* ptr, int count)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tpolyline->points.resize(count);\n\t}\n\n\tstatic void Reverse(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tstd::reverse(polyline->points.begin(), polyline->points.end());\n\t}\n\n\tstatic void ShrinkToFit(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tpolyline->points.shrink_to_fit();\n\t}\n\n\tstatic void Erase(void* ptr, int index)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points.erase(polyline->points.begin() + index);\n\t}\n\n\tstatic void Erase(void* ptr, int start, int count)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(start) ||\n\t\t\tpolyline->OutOfRange(start + count))\n\t\t\treturn;\n\n\t\tpolyline->points.erase(polyline->points.begin() + start, polyline->points.begin() + count);\n\t}\n\n\tstatic void Insert(void* ptr, int index, Point3d point)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points.insert(polyline->points.begin() + index, point.ToCGAL<K>());\n\t}\n\n\tstatic void Insert(void* ptr, int start, int count, Point3d* points)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(start))\n\t\t\treturn;\n\n\t\tstd::vector<Point_3> tmp(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\ttmp.push_back(points[i].ToCGAL<K>());\n\n\t\tpolyline->points.insert(polyline->points.begin() + start, tmp.begin(), tmp.end());\n\t}\n\n\tstatic BOOL IsClosed(void* ptr, double threshold)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tauto size = polyline->points.size();\n\t\tif (size < 2)\n\t\t\treturn false;\n\n\t\tauto start = polyline->points[0];\n\t\tauto end = polyline->points[size - 1];\n\n\t\tauto sqdist = CGAL::to_double(CGAL::squared_distance(start, end));\n\t\tauto sqthreshold = threshold * threshold;\n\n\t\treturn sqdist <= sqthreshold;\n\t}\n\n\tstatic double SqLength(void* ptr)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tauto count = polyline->points.size();\n\t\tif (count < 2) return 0;\n\n\t\tauto sum = CGAL::squared_distance(polyline->points[0], polyline->points[1]);\n\n\t\tfor (auto i = 1; i < count - 1; i++)\n\t\t\tsum += CGAL::squared_distance(polyline->points[i], polyline->points[i + 1]);\n\n\t\treturn CGAL::to_double(sum);\n\t}\n\n\tstatic Point3d GetPoint(void* ptr, int index)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn { 0, 0 };\n\n\t\tauto point = polyline->points[index];\n\t\treturn Point3d::FromCGAL<K>(point);\n\t}\n\n\tstatic void GetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tauto size = polyline->points.size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polyline->points[i];\n\t\t\tpoints[i] = Point3d::FromCGAL<K>(point);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void GetPoints(Polyline3* polyline, std::vector<Point3d>& points)\n\t{\n\t\tint count = (int)polyline->points.size();\n\t\tfor (auto i = 0; i < count; i++)\n\t\t{\n\t\t\tauto point = polyline->points[i];\n\t\t\tpoints.push_back(Point3d::FromCGAL<K>(point));\n\t\t}\n\t}\n\n\tstatic void GetSegments(void* ptr, Segment3d* segments, int count)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tauto size = polyline->points.size();\n\t\tif (size == 0) return;\n\n\t\tfor (auto i = 0; i < count - 1; i++)\n\t\t{\n\t\t\tauto v0 = polyline->points[i];\n\t\t\tauto v1 = polyline->points[i + 1];\n\n\t\t\tsegments[i].a = Point3d::FromCGAL<K>(v0);\n\t\t\tsegments[i].b = Point3d::FromCGAL<K>(v1);\n\n\t\t\tif (i >= size) return;\n\t\t}\n\t}\n\n\tstatic void SetPoint(void* ptr, int index, const Point3d& point)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\n\t\tif (polyline->OutOfRange(index))\n\t\t\treturn;\n\n\t\tpolyline->points[index] = point.ToCGAL<K>();\n\t}\n\n\tstatic void SetPoints(void* ptr, Point3d* points, int count)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tauto size = polyline->points.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (i < size)\n\t\t\t\tpolyline->points[i] = points[i].ToCGAL<K>();\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Adding more points than polyline currently contains\n\t\t\t\t//so push back instead.\n\t\t\t\tpolyline->points.push_back(points[i].ToCGAL<K>());\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic void Transform(void* ptr, const Matrix4x4d& matrix)\n\t{\n\t\tauto polyline = CastToPolyline3(ptr);\n\t\tauto m = matrix.ToCGAL<K>();\n\n\t\tstd::transform(polyline->points.begin(), polyline->points.end(), polyline->points.begin(), m);\n\t}\n\n};\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline3_EEK.cpp",
    "content": "\n#include \"Polyline3_EEK.h\"\n#include \"Polyline3.h\"\n\nvoid* Polyline3_EEK_Create()\n{\n\treturn Polyline3<EEK>::NewPolyline3();\n\n}\nvoid* Polyline3_EEK_CreateWithCount(int count)\n{\n\treturn Polyline3<EEK>::NewPolyline3(count);\n}\n\nvoid Polyline3_EEK_Release(void* ptr)\n{\n\tPolyline3<EEK>::DeletePolyline3(ptr);\n}\n\nint Polyline3_EEK_Count(void* ptr)\n{\n\treturn Polyline3<EEK>::Count(ptr);\n}\n\nvoid* Polyline3_EEK_Copy(void* ptr)\n{\n\treturn Polyline3<EEK>::Copy(ptr);\n}\n\nvoid* Polyline3_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polyline3<EEK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polyline3<EEK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polyline3<EEK>::Convert<EEK>(ptr);\n\t}\n}\n\nvoid Polyline3_EEK_Clear(void* ptr)\n{\n\tPolyline3<EEK>::Clear(ptr);\n}\n\nint Polyline3_EEK_Capacity(void* ptr)\n{\n\treturn Polyline3<EEK>::Capacity(ptr);\n}\n\nvoid Polyline3_EEK_Resize(void* ptr, int count)\n{\n\tPolyline3<EEK>::Resize(ptr, count);\n}\n\nvoid Polyline3_EEK_Reverse(void* ptr)\n{\n\tPolyline3<EEK>::Reverse(ptr);\n}\n\nvoid Polyline3_EEK_ShrinkToFit(void* ptr)\n{\n\tPolyline3<EEK>::ShrinkToFit(ptr);\n}\n\nvoid Polyline3_EEK_Erase(void* ptr, int index)\n{\n\tPolyline3<EEK>::Erase(ptr, index);\n}\n\nvoid Polyline3_EEK_EraseRange(void* ptr, int start, int count)\n{\n\tPolyline3<EEK>::Erase(ptr, start, count);\n}\n\nvoid Polyline3_EEK_Insert(void* ptr, int index, Point3d point)\n{\n\tPolyline3<EEK>::Insert(ptr, index, point);\n}\n\nvoid Polyline3_EEK_InsertRange(void* ptr, int start, int count, Point3d* points)\n{\n\tPolyline3<EEK>::Insert(ptr, start, count, points);\n}\n\nBOOL Polyline3_EEK_IsClosed(void* ptr, double threshold)\n{\n\treturn Polyline3<EEK>::IsClosed(ptr, threshold);\n}\n\ndouble Polyline3_EEK_SqLength(void* ptr)\n{\n\treturn Polyline3<EEK>::SqLength(ptr);\n}\n\nPoint3d Polyline3_EEK_GetPoint(void* ptr, int index)\n{\n\treturn Polyline3<EEK>::GetPoint(ptr, index);\n}\n\nvoid Polyline3_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyline3<EEK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyline3_EEK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tPolyline3<EEK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyline3_EEK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tPolyline3<EEK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyline3_EEK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyline3<EEK>::SetPoints(ptr, points, count);\n}\n\nvoid Polyline3_EEK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tPolyline3<EEK>::Transform(ptr, matrix);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Polyline3_EEK_Create();\n\n\tCGALWRAPPER_API void* Polyline3_EEK_CreateWithCount(int count);\n\n\tCGALWRAPPER_API void Polyline3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polyline3_EEK_Count(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline3_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline3_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polyline3_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API  int Polyline3_EEK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline3_EEK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API  void Polyline3_EEK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API void Polyline3_EEK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline3_EEK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API  void Polyline3_EEK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polyline3_EEK_Insert(void* ptr, int index, Point3d point);\n\n\tCGALWRAPPER_API void Polyline3_EEK_InsertRange(void* ptr, int start, int count, Point3d* points);\n\n\tCGALWRAPPER_API BOOL Polyline3_EEK_IsClosed(void* ptr, double threshold);\n\n\tCGALWRAPPER_API double Polyline3_EEK_SqLength(void* ptr);\n\n\tCGALWRAPPER_API Point3d Polyline3_EEK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyline3_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyline3_EEK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API void Polyline3_EEK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void Polyline3_EEK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyline3_EEK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline3_EIK.cpp",
    "content": "\n#include \"Polyline3_EIK.h\"\n#include \"Polyline3.h\"\n\nvoid* Polyline3_EIK_Create()\n{\n\treturn Polyline3<EIK>::NewPolyline3();\n\n}\nvoid* Polyline3_EIK_CreateWithCount(int count)\n{\n\treturn Polyline3<EIK>::NewPolyline3(count);\n}\n\nvoid Polyline3_EIK_Release(void* ptr)\n{\n\tPolyline3<EIK>::DeletePolyline3(ptr);\n}\n\nint Polyline3_EIK_Count(void* ptr)\n{\n\treturn Polyline3<EIK>::Count(ptr);\n}\n\nvoid* Polyline3_EIK_Copy(void* ptr)\n{\n\treturn Polyline3<EIK>::Copy(ptr);\n}\n\nvoid* Polyline3_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Polyline3<EIK>::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Polyline3<EIK>::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Polyline3<EIK>::Convert<EIK>(ptr);\n\t}\n}\n\nvoid Polyline3_EIK_Clear(void* ptr)\n{\n\tPolyline3<EIK>::Clear(ptr);\n}\n\nint Polyline3_EIK_Capacity(void* ptr)\n{\n\treturn Polyline3<EIK>::Capacity(ptr);\n}\n\nvoid Polyline3_EIK_Resize(void* ptr, int count)\n{\n\tPolyline3<EIK>::Resize(ptr, count);\n}\n\nvoid Polyline3_EIK_Reverse(void* ptr)\n{\n\tPolyline3<EIK>::Reverse(ptr);\n}\n\nvoid Polyline3_EIK_ShrinkToFit(void* ptr)\n{\n\tPolyline3<EIK>::ShrinkToFit(ptr);\n}\n\nvoid Polyline3_EIK_Erase(void* ptr, int index)\n{\n\tPolyline3<EIK>::Erase(ptr, index);\n}\n\nvoid Polyline3_EIK_EraseRange(void* ptr, int start, int count)\n{\n\tPolyline3<EIK>::Erase(ptr, start, count);\n}\n\nvoid Polyline3_EIK_Insert(void* ptr, int index, Point3d point)\n{\n\tPolyline3<EIK>::Insert(ptr, index, point);\n}\n\nvoid Polyline3_EIK_InsertRange(void* ptr, int start, int count, Point3d* points)\n{\n\tPolyline3<EIK>::Insert(ptr, start, count, points);\n}\n\nBOOL Polyline3_EIK_IsClosed(void* ptr, double threshold)\n{\n\treturn Polyline3<EIK>::IsClosed(ptr, threshold);\n}\n\ndouble Polyline3_EIK_SqLength(void* ptr)\n{\n\treturn Polyline3<EIK>::SqLength(ptr);\n}\n\nPoint3d Polyline3_EIK_GetPoint(void* ptr, int index)\n{\n\treturn Polyline3<EIK>::GetPoint(ptr, index);\n}\n\nvoid Polyline3_EIK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyline3<EIK>::GetPoints(ptr, points, count);\n}\n\nvoid Polyline3_EIK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tPolyline3<EIK>::GetSegments(ptr, segments, count);\n}\n\nvoid Polyline3_EIK_SetPoint(void* ptr, int index, const Point3d& point)\n{\n\tPolyline3<EIK>::SetPoint(ptr, index, point);\n}\n\nvoid Polyline3_EIK_SetPoints(void* ptr, Point3d* points, int count)\n{\n\tPolyline3<EIK>::SetPoints(ptr, points, count);\n}\n\nvoid Polyline3_EIK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tPolyline3<EIK>::Transform(ptr, matrix);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Polylines/Polyline3_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include <CGAL/enum.h>\n\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API void* Polyline3_EIK_Create();\n\n\tCGALWRAPPER_API void* Polyline3_EIK_CreateWithCount(int count);\n\n\tCGALWRAPPER_API void Polyline3_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API int Polyline3_EIK_Count(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline3_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Polyline3_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Polyline3_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API  int Polyline3_EIK_Capacity(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline3_EIK_Resize(void* ptr, int count);\n\n\tCGALWRAPPER_API  void Polyline3_EIK_Reverse(void* ptr);\n\n\tCGALWRAPPER_API void Polyline3_EIK_ShrinkToFit(void* ptr);\n\n\tCGALWRAPPER_API  void Polyline3_EIK_Erase(void* ptr, int index);\n\n\tCGALWRAPPER_API  void Polyline3_EIK_EraseRange(void* ptr, int start, int count);\n\n\tCGALWRAPPER_API void Polyline3_EIK_Insert(void* ptr, int index, Point3d point);\n\n\tCGALWRAPPER_API void Polyline3_EIK_InsertRange(void* ptr, int start, int count, Point3d* points);\n\n\tCGALWRAPPER_API BOOL Polyline3_EIK_IsClosed(void* ptr, double threshold);\n\n\tCGALWRAPPER_API double Polyline3_EIK_SqLength(void* ptr);\n\n\tCGALWRAPPER_API Point3d Polyline3_EIK_GetPoint(void* ptr, int index);\n\n\tCGALWRAPPER_API void Polyline3_EIK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyline3_EIK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API void Polyline3_EIK_SetPoint(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API void Polyline3_EIK_SetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Polyline3_EIK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Processing/HeatMethod.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <boost/unordered_map.hpp>\n#include <CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h>\n\n\ntemplate<class K>\nclass HeatMethod\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point3;\n\t\n\ttypedef typename CGAL::Surface_mesh<Point3>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSurfaceMesh;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::vertex_descriptor\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSVertexDes;\n\ttypedef typename CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<SurfaceMesh, CGAL::Heat_method_3::Intrinsic_Delaunay>   SHeat_method_idt;\n\ttypedef typename CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<SurfaceMesh, CGAL::Heat_method_3::Direct>\t\t\t\tSHeat_method;\n\n\ttypedef typename CGAL::Polyhedron_3<K>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPolyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::vertex_descriptor\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPVertexDes;\n\ttypedef typename CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<Polyhedron, CGAL::Heat_method_3::Intrinsic_Delaunay>    PHeat_method_idt;\n\ttypedef typename CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3<Polyhedron, CGAL::Heat_method_3::Direct>\t\t\t\tPHeat_method;\n\n\tstd::vector<double> distances;\n\n\tinline static HeatMethod* NewHeatMethod()\n\t{\n\t\treturn new HeatMethod();\n\t}\n\n\tinline static void DeleteHeatMethod(void* ptr)\n\t{\n\t\tauto obj = static_cast<HeatMethod*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static HeatMethod* CastToHeatMethod(void* ptr)\n\t{\n\t\treturn static_cast<HeatMethod*>(ptr);\n\t}\n\n\tstatic double GetDistance(void* ptr, int index)\n\t{\n\t\tauto method = CastToHeatMethod(ptr);\n\t\treturn method->distances[index];\n\t}\n\n\tstatic void ClearDistances(void* ptr)\n\t{\n\t\tauto method = CastToHeatMethod(ptr);\n\t\tmethod->distances.clear();\n\t}\n\n\tstatic int EstimateGeodesicDistances_SM(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n\t{\n\t\tauto method = CastToHeatMethod(ptr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tauto distMap = mesh->AddScalarPropertyMap(\"v:distance\");\n\t\tauto source = mesh->FindVertex(vertexIndex);\n\n\t\tif (useIDT)\n\t\t{\n\t\t\tSHeat_method_idt hm(mesh->model);\n\t\t\thm.add_source(source);\n\t\t\thm.estimate_geodesic_distances(distMap);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSHeat_method hm(mesh->model);\n\t\t\thm.add_source(source);\n\t\t\thm.estimate_geodesic_distances(distMap);\n\t\t}\n\n\t\tmethod->distances.clear();\n\n\t\tfor (auto vd : vertices(mesh->model))\n\t\t{\n\t\t\tdouble dist = get(distMap, vd);\n\t\t\tmethod->distances.push_back(dist);\n\t\t}\n\n\t\tmesh->ClearScalarPropertyMap(\"v:distance\");\n\n\t\treturn (int)method->distances.size();\n\t}\n\t\n\tstatic int EstimateGeodesicDistances_PH(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n\t{\n\t\tauto method = CastToHeatMethod(ptr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tboost::unordered_map<PVertexDes, double> distMap;\n\t\tauto source = mesh->FindVertex(vertexIndex);\n\n\t\t//if (useIDT)\n\t\t//{\n\t\t\tCGAL::Heat_method_3::estimate_geodesic_distances(mesh->model,\n\t\t\t\tboost::make_assoc_property_map(distMap),\n\t\t\t\tsource);\n\n\t\t//}\n\t\t//else\n\t\t//{\n\t\t//\tCGAL::Heat_method_3::estimate_geodesic_distances(mesh->model,\n\t\t//\t\tboost::make_assoc_property_map(distMap),\n\t\t//\t\tsource);\n\t\t//}\n\n\t\tmethod->distances.clear();\n\n\t\tfor (auto vd : vertices(mesh->model))\n\t\t{\n\t\t\tdouble dist = distMap[vd];\n\t\t\tmethod->distances.push_back(dist);\n\t\t}\n\n\t\treturn (int)method->distances.size();\n\t}\n\t\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/HeatMethod_EEK.cpp",
    "content": "#include \"HeatMethod_EEK.h\"\n#include \"HeatMethod.h\"\n\nvoid* HeatMethod_EEK_Create()\n{\n\treturn HeatMethod<EEK>::NewHeatMethod();\n}\n\nvoid HeatMethod_EEK_Release(void* ptr)\n{\n\tHeatMethod<EEK>::DeleteHeatMethod(ptr);\n}\n\ndouble HeatMethod_EEK_GetDistance(void* ptr, int index)\n{\n\treturn HeatMethod<EEK>::GetDistance(ptr, index);\n}\n\nvoid HeatMethod_EEK_ClearDistances(void* ptr)\n{\n\tHeatMethod<EEK>::ClearDistances(ptr);\n}\n\nint HeatMethod_EEK_EstimateGeodesicDistances_SM(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n{\n\treturn HeatMethod<EEK>::EstimateGeodesicDistances_SM(ptr, meshPtr, vertexIndex, useIDT);\n}\n\nint HeatMethod_EEK_EstimateGeodesicDistances_PH(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n{\n\treturn HeatMethod<EEK>::EstimateGeodesicDistances_PH(ptr, meshPtr, vertexIndex, useIDT);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/HeatMethod_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* HeatMethod_EEK_Create();\n\n\tCGALWRAPPER_API void HeatMethod_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API double HeatMethod_EEK_GetDistance(void* ptr, int index);\n\n\tCGALWRAPPER_API void HeatMethod_EEK_ClearDistances(void* ptr);\n\n\tCGALWRAPPER_API int HeatMethod_EEK_EstimateGeodesicDistances_SM(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT);\n\n\tCGALWRAPPER_API int HeatMethod_EEK_EstimateGeodesicDistances_PH(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/HeatMethod_EIK.cpp",
    "content": "#include \"HeatMethod_EIK.h\"\n#include \"HeatMethod.h\"\n\nvoid* HeatMethod_EIK_Create()\n{\n\treturn HeatMethod<EIK>::NewHeatMethod();\n}\n\nvoid HeatMethod_EIK_Release(void* ptr)\n{\n\tHeatMethod<EIK>::DeleteHeatMethod(ptr);\n}\n\ndouble HeatMethod_EIK_GetDistance(void* ptr, int index)\n{\n\treturn HeatMethod<EIK>::GetDistance(ptr, index);\n}\n\nvoid HeatMethod_EIK_ClearDistances(void* ptr)\n{\n\tHeatMethod<EIK>::ClearDistances(ptr);\n}\n\nint HeatMethod_EIK_EstimateGeodesicDistances_SM(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n{\n\treturn HeatMethod<EIK>::EstimateGeodesicDistances_SM(ptr, meshPtr, vertexIndex, useIDT);\n}\n\nint HeatMethod_EIK_EstimateGeodesicDistances_PH(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT)\n{\n\treturn HeatMethod<EIK>::EstimateGeodesicDistances_PH(ptr, meshPtr, vertexIndex, useIDT);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/HeatMethod_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* HeatMethod_EIK_Create();\n\n\tCGALWRAPPER_API void HeatMethod_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API double HeatMethod_EIK_GetDistance(void* ptr, int index);\n\n\tCGALWRAPPER_API void HeatMethod_EIK_ClearDistances(void* ptr);\n\n\tCGALWRAPPER_API int HeatMethod_EIK_EstimateGeodesicDistances_SM(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT);\n\n\tCGALWRAPPER_API int HeatMethod_EIK_EstimateGeodesicDistances_PH(void* ptr, void* meshPtr, int vertexIndex, BOOL useIDT);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingBoolean.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <vector>\n#include <CGAL/Plane_3.h>\n#include <CGAL/Iso_cuboid_3.h>\n#include <CGAL/Polygon_mesh_processing/corefinement.h>\n#include <CGAL/Polygon_mesh_processing/clip.h>\n#include <CGAL/Polygon_mesh_processing/intersection.h>\n\ntemplate<class K>\nclass MeshProcessingBoolean\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point;\n\ttypedef typename CGAL::Iso_cuboid_3<K> IsoCube3;\n\ttypedef typename CGAL::Plane_3<K> Plane3;\n\ttypedef typename std::vector<Point> Polyline;\n\n\tinline static MeshProcessingBoolean* NewMeshProcessingBoolean()\n\t{\n\t\treturn new MeshProcessingBoolean();\n\t}\n\n\tinline static void DeleteMeshProcessingBoolean(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingBoolean*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingBoolean* CastToMeshProcessingBoolean(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingBoolean*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstatic BOOL Union_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_union(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Difference_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_difference(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Intersection_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_intersection(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Clip_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\n\t\t/*\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL PlaneClip_PH(void* meshPtr1, Plane3d plane, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, plane.ToCGAL<K, Plane3>(), result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL BoxClip_PH(void* meshPtr1, Box3d box, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto result = Polyhedron3<K>::NewPolyhedron();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, box.ToCGAL<K, IsoCube3>(), result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL SurfaceIntersection_PH(void* meshPtr1, void* meshPtr2)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\n\t\tstd::vector<Polyline> lines;\n\n\t\tif (CGAL::Polygon_mesh_processing::surface_intersection(mesh1->model, mesh2->model, std::back_inserter(lines)))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\t//Surface Mesh\n\n\tstatic BOOL Union_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto mesh2 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr2);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_union(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Difference_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto mesh2 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr2);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_difference(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Intersection_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto mesh2 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr2);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::corefine_and_compute_intersection(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tstatic BOOL Clip_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto mesh2 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr2);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, mesh2->model, result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL PlaneClip_SM(void* meshPtr1, Plane3d plane, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, plane.ToCGAL<K, Plane3>(), result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL BoxClip_SM(void* meshPtr1, Box3d box, void** resultPtr)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr1);\n\t\tauto result = SurfaceMesh3<K>::NewSurfaceMesh();\n\n\t\tif (CGAL::Polygon_mesh_processing::clip(mesh1->model, box.ToCGAL<K, IsoCube3>(), result->model))\n\t\t{\n\t\t\t*resultPtr = result;\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdelete result;\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\tstatic BOOL SurfaceIntersection_SM(void* meshPtr1, void* meshPtr2)\n\t{\n\t\treturn FALSE;\n\t\t/*\n\t\tauto mesh1 = Polyhedron3<K>::CastToPolyhedron(meshPtr1);\n\t\tauto mesh2 = Polyhedron3<K>::CastToPolyhedron(meshPtr2);\n\n\t\tstd::vector<Polyline> lines;\n\n\t\tif (CGAL::Polygon_mesh_processing::surface_intersection(mesh1->model, mesh2->model, std::back_inserter(lines)))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t\t*/\n\t}\n\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingBoolean_EEK.cpp",
    "content": "#include \"MeshProcessingBoolean_EEK.h\"\n#include \"MeshProcessingBoolean.h\"\n\nvoid* MeshProcessingBoolean_EEK_Create()\n{\n\treturn MeshProcessingBoolean<EEK>::NewMeshProcessingBoolean();\n}\n\nvoid MeshProcessingBoolean_EEK_Release(void* ptr)\n{\n\tMeshProcessingBoolean<EEK>::DeleteMeshProcessingBoolean(ptr);\n}\n\n//Polyhedron\n\nBOOL MeshProcessingBoolean_EEK_Union_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Union_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Difference_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Difference_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Intersection_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Intersection_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Clip_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Clip_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_PlaneClip_PH(void* meshPtr1, Plane3d plane, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::PlaneClip_PH(meshPtr1, plane, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_BoxClip_PH(void* meshPtr1, Box3d box, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::BoxClip_PH(meshPtr1, box, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_SurfaceIntersection_PH(void* meshPtr1, void* meshPtr2)\n{\n\treturn MeshProcessingBoolean<EEK>::SurfaceIntersection_PH(meshPtr1, meshPtr2);\n}\n\n//Surface Mesh\n\nBOOL MeshProcessingBoolean_EEK_Union_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Union_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Difference_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Difference_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Intersection_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Intersection_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_Clip_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::Clip_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_PlaneClip_SM(void* meshPtr1, Plane3d plane, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::PlaneClip_SM(meshPtr1, plane, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_BoxClip_SM(void* meshPtr1, Box3d box, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EEK>::BoxClip_SM(meshPtr1, box, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EEK_SurfaceIntersection_SM(void* meshPtr1, void* meshPtr2)\n{\n\treturn MeshProcessingBoolean<EEK>::SurfaceIntersection_SM(meshPtr1, meshPtr2);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingBoolean_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingBoolean_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingBoolean_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Union_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Difference_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Intersection_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Clip_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_PlaneClip_PH(void* meshPtr1, Plane3d plane, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_BoxClip_PH(void* meshPtr1, Box3d box, void** resultPtr);\n\n\tCGALWRAPPER_API  BOOL MeshProcessingBoolean_EEK_SurfaceIntersection_PH(void* meshPtr1, void* meshPtr2);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Union_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Difference_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Intersection_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_Clip_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_PlaneClip_SM(void* meshPtr1, Plane3d plane, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EEK_BoxClip_SM(void* meshPtr1, Box3d box, void** resultPtr);\n\n\tCGALWRAPPER_API  BOOL MeshProcessingBoolean_EEK_SurfaceIntersection_SM(void* meshPtr1, void* meshPtr2);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingBoolean_EIK.cpp",
    "content": "#include \"MeshProcessingBoolean_EIK.h\"\n#include \"MeshProcessingBoolean.h\"\n\nvoid* MeshProcessingBoolean_EIK_Create()\n{\n\treturn MeshProcessingBoolean<EIK>::NewMeshProcessingBoolean();\n}\n\nvoid MeshProcessingBoolean_EIK_Release(void* ptr)\n{\n\tMeshProcessingBoolean<EIK>::DeleteMeshProcessingBoolean(ptr);\n}\n\n//Polyhedron\n\nBOOL MeshProcessingBoolean_EIK_Union_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Union_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Difference_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Difference_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Intersection_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Intersection_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Clip_PH(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Clip_PH(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_PlaneClip_PH(void* meshPtr1, Plane3d plane, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::PlaneClip_PH(meshPtr1, plane, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_BoxClip_PH(void* meshPtr1, Box3d box, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::BoxClip_PH(meshPtr1, box, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_SurfaceIntersection_PH(void* meshPtr1, void* meshPtr2)\n{\n\treturn MeshProcessingBoolean<EIK>::SurfaceIntersection_PH(meshPtr1, meshPtr2);\n}\n\n//Surface Mesh\n\nBOOL MeshProcessingBoolean_EIK_Union_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Union_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Difference_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Difference_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Intersection_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Intersection_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_Clip_SM(void* meshPtr1, void* meshPtr2, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::Clip_SM(meshPtr1, meshPtr2, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_PlaneClip_SM(void* meshPtr1, Plane3d plane, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::PlaneClip_SM(meshPtr1, plane, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_BoxClip_SM(void* meshPtr1, Box3d box, void** resultPtr)\n{\n\treturn MeshProcessingBoolean<EIK>::BoxClip_SM(meshPtr1, box, resultPtr);\n}\n\nBOOL MeshProcessingBoolean_EIK_SurfaceIntersection_SM(void* meshPtr1, void* meshPtr2)\n{\n\treturn MeshProcessingBoolean<EIK>::SurfaceIntersection_SM(meshPtr1, meshPtr2);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingBoolean_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingBoolean_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingBoolean_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Union_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Difference_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Intersection_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Clip_PH(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_PlaneClip_PH(void* meshPtr1, Plane3d plane, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_BoxClip_PH(void* meshPtr1, Box3d box, void** resultPtr);\n\n\tCGALWRAPPER_API  BOOL MeshProcessingBoolean_EIK_SurfaceIntersection_PH(void* meshPtr1, void* meshPtr2);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Union_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Difference_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Intersection_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_Clip_SM(void* meshPtr1, void* meshPtr2, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_PlaneClip_SM(void* meshPtr1, Plane3d plane, void** resultPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingBoolean_EIK_BoxClip_SM(void* meshPtr1, Box3d box, void** resultPtr);\n\n\tCGALWRAPPER_API  BOOL MeshProcessingBoolean_EIK_SurfaceIntersection_SM(void* meshPtr1, void* meshPtr2);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingConnections.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <vector>\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Surface_mesh.h>\n#include <CGAL/Polygon_mesh_processing/connected_components.h>\n#include <CGAL/boost/graph/Face_filtered_graph.h>\n#include <boost/property_map/property_map.hpp>\n#include <boost/iterator/function_output_iterator.hpp>\n\ntemplate<class K>\nclass MeshProcessingConnections\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point_3;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::face_descriptor PFace_Des;\n\ttypedef typename boost::graph_traits<Polyhedron>::faces_size_type PFaces_Size;\n\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Face_index SFace;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor SFace_Des;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::faces_size_type SFaces_Size;\n\n\t//CGAL::Polygon_mesh_processing::parameters::all_default()\n\t\n\tstd::vector<Polyhedron> polyhedron_buffer;\n\n\tstd::vector<SurfaceMesh> surface_mesh_buffer;\n\n\tstd::vector<PFace_Des> polyhedron_face_buffer;\n\n\tstd::vector<SFace_Des> surface_face_buffer;\n\npublic:\n\n\tinline static MeshProcessingConnections* NewMeshProcessingConnections()\n\t{\n\t\treturn new MeshProcessingConnections();\n\t}\n\n\tinline static void DeleteMeshProcessingConnections(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingConnections*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingConnections* CastToMeshProcessingConnections(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingConnections*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstatic int ConnectedComponents_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\t//auto fccmap = mesh->model.add_property_map<PFace_Des, std::size_t>(\"f:CC\").first;\n\t\t//std::size_t num = CGAL::Polygon_mesh_processing::connected_components(mesh->model, fccmap);\n\n\t\treturn 0;\n\t}\n\n\tstatic int ConnectedComponent_PH(void* ptr, void* meshPtr, int index)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tauto face = mesh->FindFaceIter(index);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tcon->polyhedron_face_buffer.clear();\n\t\t\tauto ins = std::back_inserter(con->polyhedron_face_buffer);\n\t\t\tCGAL::Polygon_mesh_processing::connected_component(*face, mesh->model, ins);\n\n\t\t\treturn (int)con->polyhedron_face_buffer.size();\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic void GetConnectedComponentFaceIndex_PH(void* ptr, void* meshPtr, int* indices, int count)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tint size = (int)con->polyhedron_face_buffer.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto face = con->polyhedron_face_buffer[i];\n\t\t\tint index = mesh->FindFaceIndex(face);\n\t\t\tindices[i] = index;\n\t\t\t\n\t\t\tif (i >= size) break;\n\t\t}\n\n\t\tcon->polyhedron_face_buffer.clear();\n\t}\n\n\tstatic int SplitConnectedComponents_PH(void* ptr, void* meshPtr)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tcon->polyhedron_buffer.clear();\n\t\tCGAL::Polygon_mesh_processing::split_connected_components(mesh->model, con->polyhedron_buffer);\n\n\t\treturn (int)con->polyhedron_buffer.size();\n\t}\n\n\tstatic void GetSplitConnectedComponents_PH(void* ptr, void** meshPtrs, int count)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tint size = (int)con->polyhedron_buffer.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto mesh = Polyhedron3<K>::NewPolyhedron();\n\t\t\tmesh->model = con->polyhedron_buffer[i];\n\t\t\tmeshPtrs[i] = mesh;\n\n\t\t\tif (i >= size) break;\n\t\t}\n\n\t\tcon->polyhedron_buffer.clear();\n\t}\n\n\tstatic int KeepLargeConnectedComponents_PH(void* meshPtr, int threshold_value)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\treturn (int)CGAL::Polygon_mesh_processing::keep_large_connected_components(mesh->model, threshold_value);\n\t}\n\n\tstatic int KeepLargestConnectedComponents_PH(void* meshPtr, int nb_components_to_keep)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\treturn (int)CGAL::Polygon_mesh_processing::keep_largest_connected_components(mesh->model, nb_components_to_keep);;\n\t}\n\n\t//Surface Mesh\n\n\tstatic int ConnectedComponents_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\t//auto pair = mesh->model.property_map<SFace_Des, std::size_t>(\"f:CC\");\n\t\t//auto map = pair.first;\n\n\t\tauto map = mesh->model.add_property_map<SFace_Des, std::size_t>(\"f:CC\").first;\n\t\tauto num = CGAL::Polygon_mesh_processing::connected_components(mesh->model, map);\n\t\tmesh->model.remove_property_map(map);\n\t\t\n\t\treturn (int)num;\n\t}\n\n\tstatic int ConnectedComponent_SM(void* ptr, void* meshPtr, int index)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tauto face = mesh->FindFace(index);\n\t\tif (face != SurfaceMesh3<K>::NullFace())\n\t\t{\n\t\t\tcon->surface_face_buffer.clear();\n\t\t\tauto ins = std::back_inserter(con->surface_face_buffer);\n\t\t\tCGAL::Polygon_mesh_processing::connected_component(face, mesh->model, ins);\n\n\t\t\treturn (int)con->surface_face_buffer.size();\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic void GetConnectedComponentFaceIndex_SM(void* ptr, void* meshPtr, int* indices, int count)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tint size = (int)con->surface_face_buffer.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto face = con->surface_face_buffer[i];\n\t\t\tindices[i] = face;\n\n\t\t\tif (i >= size) break;\n\t\t}\n\n\t\tcon->surface_face_buffer.clear();\n\t}\n\n\tstatic int SplitConnectedComponents_SM(void* ptr, void* meshPtr)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tcon->surface_mesh_buffer.clear();\n\t\tCGAL::Polygon_mesh_processing::split_connected_components(mesh->model, con->surface_mesh_buffer);\n\n\t\treturn (int)con->surface_mesh_buffer.size();\n\t}\n\n\tstatic void GetSplitConnectedComponents_SM(void* ptr, void** meshPtrs, int count)\n\t{\n\t\tauto con = CastToMeshProcessingConnections(ptr);\n\t\tint size = (int)con->surface_mesh_buffer.size();\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto mesh = SurfaceMesh3<K>::NewSurfaceMesh();\n\t\t\tmesh->model = con->surface_mesh_buffer[i];\n\t\t\tmeshPtrs[i] = mesh;\n\n\t\t\tif (i >= size) break;\n\t\t}\n\n\t\tcon->surface_mesh_buffer.clear();\n\t}\n\n\tstatic int KeepLargeConnectedComponents_SM(void* meshPtr, int threshold_value)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tmesh->OnModelChanged();\n\t\treturn (int)CGAL::Polygon_mesh_processing::keep_large_connected_components(mesh->model, threshold_value);\n\t}\n\n\tstatic int KeepLargestConnectedComponents_SM(void* meshPtr, int nb_components_to_keep)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tmesh->OnModelChanged();\n\t\treturn (int)CGAL::Polygon_mesh_processing::keep_largest_connected_components(mesh->model, nb_components_to_keep);\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingConnections_EEK.cpp",
    "content": "#include \"MeshProcessingConnections_EEK.h\"\n#include \"MeshProcessingConnections.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Surface_mesh.h>\n#include <CGAL/Polygon_mesh_processing/connected_components.h>\n#include <CGAL/boost/graph/Face_filtered_graph.h>\n#include <boost/property_map/property_map.hpp>\n#include <boost/iterator/function_output_iterator.hpp>\n\nvoid* MeshProcessingConnections_EEK_Create()\n{\n\treturn MeshProcessingConnections<EEK>::NewMeshProcessingConnections();\n}\n\nvoid MeshProcessingConnections_EEK_Release(void* ptr)\n{\n\tMeshProcessingConnections<EEK>::DeleteMeshProcessingConnections(ptr);\n}\n\n//Polyhedron\n\nint MeshProcessingConnections_EEK_ConnectedComponents_PH(void* meshPtr)\n{\n\treturn MeshProcessingConnections<EEK>::ConnectedComponents_PH(meshPtr);\n}\n\nint MeshProcessingConnections_EEK_ConnectedComponent_PH(void* ptr, void* meshPtr, int index)\n{\n\treturn MeshProcessingConnections<EEK>::ConnectedComponent_PH(ptr, meshPtr, index);\n}\n\nvoid MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_PH(void* ptr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingConnections<EEK>::GetConnectedComponentFaceIndex_PH(ptr, meshPtr, indices, count);\n}\n\nint MeshProcessingConnections_EEK_SplitConnectedComponents_PH(void* ptr, void* meshPtr)\n{\n\treturn MeshProcessingConnections<EEK>::SplitConnectedComponents_PH(ptr, meshPtr);\n}\n\nvoid MeshProcessingConnections_EEK_GetSplitConnectedComponents_PH(void* ptr, void** meshPtrs, int count)\n{\n\tMeshProcessingConnections<EEK>::GetSplitConnectedComponents_PH(ptr, meshPtrs, count);\n}\n\nint MeshProcessingConnections_EEK_KeepLargeConnectedComponents_PH(void* meshPtr, int threshold_value)\n{\n\treturn MeshProcessingConnections<EEK>::KeepLargeConnectedComponents_PH(meshPtr, threshold_value);\n}\n\nint MeshProcessingConnections_EEK_KeepLargestConnectedComponents_PH(void* meshPtr, int nb_components_to_keep)\n{\n\treturn MeshProcessingConnections<EEK>::KeepLargestConnectedComponents_PH(meshPtr, nb_components_to_keep);\n}\n\n//Surface Mesh\n\nint MeshProcessingConnections_EEK_ConnectedComponents_SM(void* meshPtr)\n{\n\treturn MeshProcessingConnections<EEK>::ConnectedComponents_SM(meshPtr);\n}\n\nint MeshProcessingConnections_EEK_ConnectedComponent_SM(void* ptr, void* meshPtr, int index)\n{\n\treturn MeshProcessingConnections<EEK>::ConnectedComponent_SM(ptr, meshPtr, index);\n}\n\nvoid MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_SM(void* ptr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingConnections<EEK>::GetConnectedComponentFaceIndex_SM(ptr, meshPtr, indices, count);\n}\n\nint MeshProcessingConnections_EEK_SplitConnectedComponents_SM(void* ptr, void* meshPtr)\n{\n\treturn MeshProcessingConnections<EEK>::SplitConnectedComponents_SM(ptr, meshPtr);\n}\n\nvoid MeshProcessingConnections_EEK_GetSplitConnectedComponents_SM(void* ptr, void** meshPtrs, int count)\n{\n\tMeshProcessingConnections<EEK>::GetSplitConnectedComponents_SM(ptr, meshPtrs, count);\n}\n\nint MeshProcessingConnections_EEK_KeepLargeConnectedComponents_SM(void* meshPtr, int threshold_value)\n{\n\treturn MeshProcessingConnections<EEK>::KeepLargeConnectedComponents_SM(meshPtr, threshold_value);\n}\n\nint MeshProcessingConnections_EEK_KeepLargestConnectedComponents_SM(void* meshPtr, int nb_components_to_keep)\n{\n\treturn MeshProcessingConnections<EEK>::KeepLargestConnectedComponents_SM(meshPtr, nb_components_to_keep);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingConnections_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingConnections_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EEK_Release(void* ptr);\n\n\t//Polyhedron \n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_ConnectedComponents_PH(void* meshPtr);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_ConnectedComponent_PH(void* ptr, void* meshPtr, int index);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_PH(void* ptr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_SplitConnectedComponents_PH(void* ptr, void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EEK_GetSplitConnectedComponents_PH(void* ptr, void** meshPtrs, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_KeepLargeConnectedComponents_PH(void* meshPtr, int threshold_value);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_KeepLargestConnectedComponents_PH(void* meshPtr, int nb_components_to_keep);\n\n\t//Surface Mesh\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_ConnectedComponents_SM(void* meshPtr);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_ConnectedComponent_SM(void* ptr, void* meshPtr, int index);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EEK_GetConnectedComponentsFaceIndex_SM(void* ptr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_SplitConnectedComponents_SM(void* ptr, void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EEK_GetSplitConnectedComponents_SM(void* ptr, void** meshPtrs, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_KeepLargeConnectedComponents_SM(void* meshPtr, int threshold_value);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EEK_KeepLargestConnectedComponents_SM(void* meshPtr, int nb_components_to_keep);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingConnections_EIK.cpp",
    "content": "#include \"MeshProcessingConnections_EIK.h\"\n#include \"MeshProcessingConnections.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Surface_mesh.h>\n#include <CGAL/Polygon_mesh_processing/connected_components.h>\n#include <CGAL/boost/graph/Face_filtered_graph.h>\n#include <boost/property_map/property_map.hpp>\n#include <boost/iterator/function_output_iterator.hpp>\n\nvoid* MeshProcessingConnections_EIK_Create()\n{\n\treturn MeshProcessingConnections<EIK>::NewMeshProcessingConnections();\n}\n\nvoid MeshProcessingConnections_EIK_Release(void* ptr)\n{\n\tMeshProcessingConnections<EIK>::DeleteMeshProcessingConnections(ptr);\n}\n\n//Polyhedron\n\nint MeshProcessingConnections_EIK_ConnectedComponents_PH(void* meshPtr)\n{\n\treturn MeshProcessingConnections<EIK>::ConnectedComponents_PH(meshPtr);\n}\n\nint MeshProcessingConnections_EIK_ConnectedComponent_PH(void* ptr, void* meshPtr, int index)\n{\n\treturn MeshProcessingConnections<EIK>::ConnectedComponent_PH(ptr, meshPtr, index);\n}\n\nvoid MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_PH(void* ptr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingConnections<EIK>::GetConnectedComponentFaceIndex_PH(ptr, meshPtr, indices, count);\n}\n\nint MeshProcessingConnections_EIK_SplitConnectedComponents_PH(void* ptr, void* meshPtr)\n{\n\treturn MeshProcessingConnections<EIK>::SplitConnectedComponents_PH(ptr, meshPtr);\n}\n\nvoid MeshProcessingConnections_EIK_GetSplitConnectedComponents_PH(void* ptr, void** meshPtrs, int count)\n{\n\tMeshProcessingConnections<EIK>::GetSplitConnectedComponents_PH(ptr, meshPtrs, count);\n}\n\nint MeshProcessingConnections_EIK_KeepLargeConnectedComponents_PH(void* meshPtr, int threshold_value)\n{\n\treturn MeshProcessingConnections<EIK>::KeepLargeConnectedComponents_PH(meshPtr, threshold_value);\n}\n\nint MeshProcessingConnections_EIK_KeepLargestConnectedComponents_PH(void* meshPtr, int nb_components_to_keep)\n{\n\treturn MeshProcessingConnections<EIK>::KeepLargestConnectedComponents_PH(meshPtr, nb_components_to_keep);\n}\n\n//Surface Mesh\n\nint MeshProcessingConnections_EIK_ConnectedComponents_SM(void* meshPtr)\n{\n\treturn MeshProcessingConnections<EIK>::ConnectedComponents_SM(meshPtr);\n}\n\nint MeshProcessingConnections_EIK_ConnectedComponent_SM(void* ptr, void* meshPtr, int index)\n{\n\treturn MeshProcessingConnections<EIK>::ConnectedComponent_SM(ptr, meshPtr, index);\n}\n\nvoid MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_SM(void* ptr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingConnections<EIK>::GetConnectedComponentFaceIndex_SM(ptr, meshPtr, indices, count);\n}\n\nint MeshProcessingConnections_EIK_SplitConnectedComponents_SM(void* ptr, void* meshPtr)\n{\n\treturn MeshProcessingConnections<EIK>::SplitConnectedComponents_SM(ptr, meshPtr);\n}\n\nvoid MeshProcessingConnections_EIK_GetSplitConnectedComponents_SM(void* ptr, void** meshPtrs, int count)\n{\n\tMeshProcessingConnections<EIK>::GetSplitConnectedComponents_SM(ptr, meshPtrs, count);\n}\n\nint MeshProcessingConnections_EIK_KeepLargeConnectedComponents_SM(void* meshPtr, int threshold_value)\n{\n\treturn MeshProcessingConnections<EIK>::KeepLargeConnectedComponents_SM(meshPtr, threshold_value);\n}\n\nint MeshProcessingConnections_EIK_KeepLargestConnectedComponents_SM(void* meshPtr, int nb_components_to_keep)\n{\n\treturn MeshProcessingConnections<EIK>::KeepLargestConnectedComponents_SM(meshPtr, nb_components_to_keep);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingConnections_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingConnections_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EIK_Release(void* ptr);\n\n\t//Polyhedron \n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_ConnectedComponents_PH(void* meshPtr);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_ConnectedComponent_PH(void* ptr, void* meshPtr, int index);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_PH(void* ptr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_SplitConnectedComponents_PH(void* ptr, void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EIK_GetSplitConnectedComponents_PH(void* ptr, void** meshPtrs, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_KeepLargeConnectedComponents_PH(void* meshPtr, int threshold_value);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_KeepLargestConnectedComponents_PH(void* meshPtr, int nb_components_to_keep);\n\n\t//Surface Mesh\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_ConnectedComponents_SM(void* meshPtr);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_ConnectedComponent_SM(void* ptr, void* meshPtr, int index);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EIK_GetConnectedComponentsFaceIndex_SM(void* ptr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_SplitConnectedComponents_SM(void* ptr, void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingConnections_EIK_GetSplitConnectedComponents_SM(void* ptr, void** meshPtrs, int count);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_KeepLargeConnectedComponents_SM(void* meshPtr, int threshold_value);\n\n\tCGALWRAPPER_API int MeshProcessingConnections_EIK_KeepLargestConnectedComponents_SM(void* meshPtr, int nb_components_to_keep);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingFeatures.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Index.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n#include \"../Geometry/MinMax.h\"\n\n#include <limits>\n#include <CGAL/Polygon_mesh_processing/detect_features.h>\n\ntemplate<class K>\nclass MeshProcessingFeatures\n{\n\npublic:\n\n\ttypedef typename K::FT FT;\n\ttypedef typename K::Point_3 Point_3;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::edge_descriptor PEdge_Des;\n\ttypedef typename boost::graph_traits<Polyhedron>::face_descriptor PFace_Des;\n\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Face_index SFace;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::edge_descriptor SEdge_Des;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor SFace_Des;\n\n\tstd::vector<PEdge_Des> polyhedron_edge_buffer;\n\n\tstd::vector<SEdge_Des> surface_edge_buffer;\n\n\tstd::unordered_map<int, std::vector<int>> polyhedron_patch_buffer;\n\n\tstd::unordered_map<int, std::vector<int>> surface_patch_buffer;\n\n\tinline static MeshProcessingFeatures* NewMeshProcessingFeatures()\n\t{\n\t\treturn new MeshProcessingFeatures();\n\t}\n\n\tinline static void DeleteMeshProcessingFeatures(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingFeatures*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingFeatures* CastToMeshProcessingFeatures(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingFeatures*>(ptr);\n\t}\n\n\tvoid AddSurfaceFaceToPatchBuffer(SFace face, int patch)\n\t{\n\t\tauto list = surface_patch_buffer.find(patch);\n\t\tif (list != surface_patch_buffer.end())\n\t\t{\n\t\t\tlist->second.push_back(face);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::pair<int, std::vector<int>> pair;\n\t\t\tpair.first = patch;\n\t\t\tpair.second.push_back(face);\n\t\t\tsurface_patch_buffer.insert(pair);\n\t\t}\n\t}\n\n\t//Polyhedron\n\n\tstatic int DetectSharpEdges_PH(void* feaPtr, void* meshPtr, double feature_angle)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tstd::unordered_map<PEdge_Des, bool> map;\n\t\tCGAL::Polygon_mesh_processing::detect_sharp_edges(mesh->model, feature_angle, boost::make_assoc_property_map(map));\n\n\t\tfea->polyhedron_edge_buffer.clear();\n\t\tfor(auto& pair : map)\n\t\t{\n\t\t\tif (pair.second)\n\t\t\t\tfea->polyhedron_edge_buffer.push_back(pair.first);\n\t\t}\n\n\t\treturn (int)fea->polyhedron_edge_buffer.size();\n\t}\n\n\tstatic void GetSharpEdges_PH(void* feaPtr, void* meshPtr, int* indices, int count)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tint index = 0;\n\t\tfor (auto edge : fea->polyhedron_edge_buffer)\n\t\t{\n\t\t\tauto hedge = edge.halfedge();\n\t\t\tindices[index++] = mesh->FindHalfedgeIndex(hedge);\n\n\t\t\tif (index >= count)\n\t\t\t\tbreak;\n\t\t}\n\t\n\t\tfea->polyhedron_edge_buffer.clear();\n\t}\n\n\tstatic Index2 SharpEdgesSegmentation_PH(void* feaPtr, void* meshPtr, double feature_angle)\n\t{\n\t\treturn { 0, 0 };\n\t}\n\n\tstatic void ClearPatchBuffer_PH(void* feaPtr)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tfea->polyhedron_patch_buffer.clear();\n\t}\n\n\tstatic int GetPatchBufferFaceCount_PH(void* feaPtr, int patchIndex)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\n\t\tauto list = fea->polyhedron_patch_buffer.find(patchIndex);\n\t\tif (list != fea->polyhedron_patch_buffer.end())\n\t\t{\n\t\t\treturn (int)list->second.size();\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic int GetPatchBufferFaceIndex_PH(void* feaPtr, int patchIndex, int faceIndex)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\n\t\tauto list = fea->polyhedron_patch_buffer.find(patchIndex);\n\t\tif (list != fea->polyhedron_patch_buffer.end())\n\t\t{\n\t\t\tif (faceIndex < 0 || faceIndex >= (int)list->second.size())\n\t\t\t\treturn NULL_INDEX;\n\n\t\t\treturn list->second[faceIndex];\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic MinMaxAvg EdgeLengthMinMaxAvg_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tconstexpr double MAX = std::numeric_limits<double>::max();\n\n\t\tFT min = MAX;\n\t\tFT max = 0;\n\t\tFT avg = 0;\n\n\t\tint count = 0;\n\t\tfor (auto halfedge = mesh->model.halfedges_begin(); halfedge != mesh->model.halfedges_end(); ++halfedge)\n\t\t{\n\t\t\tauto len = CGAL::Polygon_mesh_processing::edge_length(halfedge, mesh->model);\n\n\t\t\tcount++;\n\t\t\tavg += len;\n\n\t\t\tif (len < min) min = len;\n\t\t\tif (len > max) max = len;\n\t\t}\n\n\t\tif (min == MAX)\n\t\t\tmin = 0;\n\n\t\tif (count != 0)\n\t\t\tavg /= count;\n\n\t\tMinMaxAvg m;\n\t\tm.min = CGAL::to_double(min);\n\t\tm.max = CGAL::to_double(max);\n\t\tm.avg = CGAL::to_double(avg);\n\n\t\treturn m;\n\t}\n\n\tstatic MinMaxAvg FaceAreaMinMaxAvg_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tconstexpr double MAX = std::numeric_limits<double>::max();\n\n\t\tFT min = MAX;\n\t\tFT max = 0;\n\t\tFT avg = 0;\n\n\t\tint count = 0;\n\t\tfor (auto face = mesh->model.facets_begin(); face != mesh->model.facets_end(); ++face)\n\t\t{\n\t\t\tauto area = CGAL::Polygon_mesh_processing::face_area(face, mesh->model);\n\n\t\t\tcount++;\n\t\t\tavg += area;\n\n\t\t\tif (area < min) min = area;\n\t\t\tif (area > max) max = area;\n\t\t}\n\n\t\tif (min == MAX)\n\t\t\tmin = 0;\n\n\t\tif (count != 0)\n\t\t\tavg /= count;\n\n\t\tMinMaxAvg m;\n\t\tm.min = CGAL::to_double(min);\n\t\tm.max = CGAL::to_double(max);\n\t\tm.avg = CGAL::to_double(avg);\n\n\t\treturn m;\n\t}\n\n\t//SurfaceMesh\n\n\tstatic int DetectSharpEdges_SM(void* feaPtr, void* meshPtr, double feature_angle)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tstd::unordered_map<SEdge_Des, bool> map;\n\t\tCGAL::Polygon_mesh_processing::detect_sharp_edges(mesh->model, feature_angle, boost::make_assoc_property_map(map));\n\n\t\tfea->surface_edge_buffer.clear();\n\t\tfor (auto& pair : map)\n\t\t{\n\t\t\tif (pair.second)\n\t\t\t\tfea->surface_edge_buffer.push_back(pair.first);\n\t\t}\n\n\t\treturn (int)fea->surface_edge_buffer.size();\n\t}\n\n\tstatic void GetSharpEdges_SM(void* feaPtr, void* meshPtr, int* indices, int count)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tint index = 0;\n\t\tfor (auto edge : fea->surface_edge_buffer)\n\t\t{\n\t\t\tauto hedge = edge.halfedge();\n\t\t\tindices[index++] = mesh->FindHalfedgeIndex(hedge);\n\n\t\t\tif (index >= count)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tfea->surface_edge_buffer.clear();\n\t}\n\n\tstatic Index2 SharpEdgesSegmentation_SM(void* feaPtr, void* meshPtr, double feature_angle)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\ttypedef boost::property_map<SurfaceMesh, CGAL::edge_is_feature_t>::type EIFMap;\n\t\ttypedef boost::property_map<SurfaceMesh, CGAL::face_patch_id_t<int> >::type PIMap;\n\t\ttypedef boost::property_map<SurfaceMesh, CGAL::vertex_incident_patches_t<int> >::type VIMap;\n\t\tnamespace PMP = CGAL::Polygon_mesh_processing;\n\n\t\tEIFMap eif = get(CGAL::edge_is_feature, mesh->model);\n\t\tPIMap pid = get(CGAL::face_patch_id_t<int>(), mesh->model);\n\t\tVIMap vip = get(CGAL::vertex_incident_patches_t<int>(), mesh->model);\n\n\t\tauto param = PMP::parameters::vertex_incident_patches_map(vip);\n\t\tauto number_of_patches = PMP::sharp_edges_segmentation(mesh->model, feature_angle, eif, pid, param);\n\n\t\tfea->surface_edge_buffer.clear();\n\t\tfea->surface_patch_buffer.clear();\n\n\t\tint index = 0;\n\t\tfor (auto edge : edges(mesh->model))\n\t\t{\n\t\t\tif (get(eif, edge))\n\t\t\t{\n\t\t\t\tfea->surface_edge_buffer.push_back(edge);\n\t\t\t}\n\t\t}\n\n\t\tfor (auto face : faces(mesh->model))\n\t\t{\n\t\t\tif (get(pid, face))\n\t\t\t{\n\t\t\t\tint patch = pid[face];\n\t\t\t\tfea->AddSurfaceFaceToPatchBuffer(face, patch);\n\t\t\t}\n\t\t}\n\n\t\treturn { (int)fea->surface_edge_buffer.size(), (int)number_of_patches };\n\t}\n\n\tstatic void ClearPatchBuffer_SM(void* feaPtr)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\t\tfea->surface_patch_buffer.clear();\n\t}\n\n\tstatic int GetPatchBufferFaceCount_SM(void* feaPtr, int patchIndex)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\n\t\tauto list = fea->surface_patch_buffer.find(patchIndex);\n\t\tif (list != fea->surface_patch_buffer.end())\n\t\t{\n\t\t\treturn (int)list->second.size();\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic int GetPatchBufferFaceIndex_SM(void* feaPtr, int patchIndex, int faceIndex)\n\t{\n\t\tauto fea = CastToMeshProcessingFeatures(feaPtr);\n\n\t\tauto list = fea->surface_patch_buffer.find(patchIndex);\n\t\tif (list != fea->surface_patch_buffer.end())\n\t\t{\n\t\t\tif (faceIndex < 0 || faceIndex >= (int)list->second.size())\n\t\t\t\treturn NULL_INDEX;\n\n\t\t\treturn list->second[faceIndex];\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tstatic MinMaxAvg EdgeLengthMinMaxAvg_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tconstexpr double MAX = std::numeric_limits<double>::max();\n\n\t\tFT min = MAX;\n\t\tFT max = 0;\n\t\tFT avg = 0;\n\n\t\tint count = 0;\n\t\tfor (auto halfedge : mesh->model.halfedges())\n\t\t{\n\t\t\tauto len = CGAL::Polygon_mesh_processing::edge_length(halfedge, mesh->model);\n\n\t\t\tcount++;\n\t\t\tavg += len;\n\n\t\t\tif (len < min) min = len;\n\t\t\tif (len > max) max = len;\n\t\t}\n\n\t\tif (min == MAX)\n\t\t\tmin = 0;\n\n\t\tif (count != 0)\n\t\t\tavg /= count;\n\n\t\tMinMaxAvg m;\n\t\tm.min = CGAL::to_double(min);\n\t\tm.max = CGAL::to_double(max);\n\t\tm.avg = CGAL::to_double(avg);\n\n\t\treturn m;\n\t}\n\n\tstatic MinMaxAvg FaceAreaMinMaxAvg_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tconstexpr double MAX = std::numeric_limits<double>::max();\n\n\t\tFT min = MAX;\n\t\tFT max = 0;\n\t\tFT avg = 0;\n\n\t\tint count = 0;\n\t\tfor (auto face : mesh->model.faces())\n\t\t{\n\t\t\tauto area = CGAL::Polygon_mesh_processing::face_area(face, mesh->model);\n\n\t\t\tcount++;\n\t\t\tavg += area;\n\n\t\t\tif (area < min) min = area;\n\t\t\tif (area > max) max = area;\n\t\t}\n\n\t\tif (min == MAX)\n\t\t\tmin = 0;\n\n\t\tif (count != 0)\n\t\t\tavg /= count;\n\n\t\tMinMaxAvg m;\n\t\tm.min = CGAL::to_double(min);\n\t\tm.max = CGAL::to_double(max);\n\t\tm.avg = CGAL::to_double(avg);\n\n\t\treturn m;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingFeatures_EEK.cpp",
    "content": "#include \"MeshProcessingFeatures_EEK.h\"\n#include \"MeshProcessingFeatures.h\"\n\nvoid* MeshProcessingFeatures_EEK_Create()\n{\n\treturn MeshProcessingFeatures<EEK>::NewMeshProcessingFeatures();\n}\n\nvoid MeshProcessingFeatures_EEK_Release(void* ptr)\n{\n\tMeshProcessingFeatures<EEK>::DeleteMeshProcessingFeatures(ptr);\n}\n\n//Polyhedron \n\nint MeshProcessingFeatures_EEK_DetectSharpEdges_PH(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EEK>::DetectSharpEdges_PH(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EEK_GetSharpEdges_PH(void* feaPtr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingFeatures<EEK>::GetSharpEdges_PH(feaPtr, meshPtr, indices, count);\n}\n\nIndex2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_PH(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EEK>::SharpEdgesSegmentation_PH(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EEK_ClearPatchBuffer_PH(void* feaPtr)\n{\n\tMeshProcessingFeatures<EEK>::ClearPatchBuffer_PH(feaPtr);\n}\n\nint MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_PH(void* feaPtr, int patchIndex)\n{\n\treturn MeshProcessingFeatures<EEK>::GetPatchBufferFaceCount_PH(feaPtr, patchIndex);\n}\n\nint MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_PH(void* feaPtr, int patchIndex, int faceIndex)\n{\n\treturn MeshProcessingFeatures<EEK>::GetPatchBufferFaceIndex_PH(feaPtr, patchIndex, faceIndex);\n}\n\nMinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_PH(void* ptr)\n{\n\treturn MeshProcessingFeatures<EEK>::EdgeLengthMinMaxAvg_PH(ptr);\n}\n\nMinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_PH(void* ptr)\n{\n\treturn MeshProcessingFeatures<EEK>::FaceAreaMinMaxAvg_PH(ptr);\n}\n\n//Surface Mesh\n\nint MeshProcessingFeatures_EEK_DetectSharpEdges_SM(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EEK>::DetectSharpEdges_SM(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EEK_GetSharpEdges_SM(void* feaPtr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingFeatures<EEK>::GetSharpEdges_SM(feaPtr, meshPtr, indices, count);\n}\n\nIndex2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_SM(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EEK>::SharpEdgesSegmentation_SM(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EEK_ClearPatchBuffer_SM(void* feaPtr)\n{\n\tMeshProcessingFeatures<EEK>::ClearPatchBuffer_SM(feaPtr);\n}\n\nint MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_SM(void* feaPtr, int patchIndex)\n{\n\treturn MeshProcessingFeatures<EEK>::GetPatchBufferFaceCount_SM(feaPtr, patchIndex);\n}\n\nint MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_SM(void* feaPtr, int patchIndex, int faceIndex)\n{\n\treturn MeshProcessingFeatures<EEK>::GetPatchBufferFaceIndex_SM(feaPtr, patchIndex, faceIndex);\n}\n\nMinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_SM(void* ptr)\n{\n\treturn MeshProcessingFeatures<EEK>::EdgeLengthMinMaxAvg_SM(ptr);\n}\n\nMinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_SM(void* ptr)\n{\n\treturn MeshProcessingFeatures<EEK>::FaceAreaMinMaxAvg_SM(ptr);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingFeatures_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Index.h\"\n#include \"../Geometry/MinMax.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingFeatures_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API  int MeshProcessingFeatures_EEK_DetectSharpEdges_PH(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EEK_GetSharpEdges_PH(void* feaPtr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API Index2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_PH(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EEK_ClearPatchBuffer_PH(void* feaPtr);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_PH(void* feaPtr, int patchIndex);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_PH(void* feaPtr, int patchIndex, int faceIndex);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_PH(void* ptr);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_PH(void* ptr);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API  int MeshProcessingFeatures_EEK_DetectSharpEdges_SM(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EEK_GetSharpEdges_SM(void* feaPtr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API Index2 MeshProcessingFeatures_EEK_SharpEdgesSegmentation_SM(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EEK_ClearPatchBuffer_SM(void* feaPtr);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EEK_GetPatchBufferFaceCount_SM(void* feaPtr, int patchIndex);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EEK_GetPatchBufferFaceIndex_SM(void* feaPtr, int patchIndex, int faceIndex);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EEK_EdgeLengthMinMaxAvg_SM(void* ptr);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EEK_FaceAreaMinMaxAvg_SM(void* ptr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingFeatures_EIK.cpp",
    "content": "#include \"MeshProcessingFeatures_EIK.h\"\n#include \"MeshProcessingFeatures.h\"\n\nvoid* MeshProcessingFeatures_EIK_Create()\n{\n\treturn MeshProcessingFeatures<EIK>::NewMeshProcessingFeatures();\n}\n\nvoid MeshProcessingFeatures_EIK_Release(void* ptr)\n{\n\tMeshProcessingFeatures<EIK>::DeleteMeshProcessingFeatures(ptr);\n}\n\n//Polyhedron \n\nint MeshProcessingFeatures_EIK_DetectSharpEdges_PH(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EIK>::DetectSharpEdges_PH(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EIK_GetSharpEdges_PH(void* feaPtr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingFeatures<EIK>::GetSharpEdges_PH(feaPtr, meshPtr, indices, count);\n}\n\nIndex2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_PH(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EIK>::SharpEdgesSegmentation_PH(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EIK_ClearPatchBuffer_PH(void* feaPtr)\n{\n\tMeshProcessingFeatures<EIK>::ClearPatchBuffer_PH(feaPtr);\n}\n\nint MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_PH(void* feaPtr, int patchIndex)\n{\n\treturn MeshProcessingFeatures<EIK>::GetPatchBufferFaceCount_PH(feaPtr, patchIndex);\n}\n\nint MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_PH(void* feaPtr, int patchIndex, int faceIndex)\n{\n\treturn MeshProcessingFeatures<EIK>::GetPatchBufferFaceIndex_PH(feaPtr, patchIndex, faceIndex);\n}\n\nMinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_PH(void* ptr)\n{\n\treturn MeshProcessingFeatures<EIK>::EdgeLengthMinMaxAvg_PH(ptr);\n}\n\nMinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_PH(void* ptr)\n{\n\treturn MeshProcessingFeatures<EIK>::FaceAreaMinMaxAvg_PH(ptr);\n}\n\n//Surface Mesh\n\nint MeshProcessingFeatures_EIK_DetectSharpEdges_SM(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EIK>::DetectSharpEdges_SM(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EIK_GetSharpEdges_SM(void* feaPtr, void* meshPtr, int* indices, int count)\n{\n\tMeshProcessingFeatures<EIK>::GetSharpEdges_SM(feaPtr, meshPtr, indices, count);\n}\n\nIndex2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_SM(void* feaPtr, void* meshPtr, double feature_angle)\n{\n\treturn MeshProcessingFeatures<EIK>::SharpEdgesSegmentation_SM(feaPtr, meshPtr, feature_angle);\n}\n\nvoid MeshProcessingFeatures_EIK_ClearPatchBuffer_SM(void* feaPtr)\n{\n\tMeshProcessingFeatures<EIK>::ClearPatchBuffer_SM(feaPtr);\n}\n\nint MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_SM(void* feaPtr, int patchIndex)\n{\n\treturn MeshProcessingFeatures<EIK>::GetPatchBufferFaceCount_SM(feaPtr, patchIndex);\n}\n\nint MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_SM(void* feaPtr, int patchIndex, int faceIndex)\n{\n\treturn MeshProcessingFeatures<EIK>::GetPatchBufferFaceIndex_SM(feaPtr, patchIndex, faceIndex);\n}\n\nMinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_SM(void* ptr)\n{\n\treturn MeshProcessingFeatures<EIK>::EdgeLengthMinMaxAvg_SM(ptr);\n}\n\nMinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_SM(void* ptr)\n{\n\treturn MeshProcessingFeatures<EIK>::FaceAreaMinMaxAvg_SM(ptr);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingFeatures_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Index.h\"\n#include \"../Geometry/MinMax.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingFeatures_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API  int MeshProcessingFeatures_EIK_DetectSharpEdges_PH(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EIK_GetSharpEdges_PH(void* feaPtr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API Index2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_PH(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EIK_ClearPatchBuffer_PH(void* feaPtr);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_PH(void* feaPtr, int patchIndex);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_PH(void* feaPtr, int patchIndex, int faceIndex);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_PH(void* ptr);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_PH(void* ptr);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API  int MeshProcessingFeatures_EIK_DetectSharpEdges_SM(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EIK_GetSharpEdges_SM(void* feaPtr, void* meshPtr, int* indices, int count);\n\n\tCGALWRAPPER_API Index2 MeshProcessingFeatures_EIK_SharpEdgesSegmentation_SM(void* feaPtr, void* meshPtr, double feature_angle);\n\n\tCGALWRAPPER_API void MeshProcessingFeatures_EIK_ClearPatchBuffer_SM(void* feaPtr);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EIK_GetPatchBufferFaceCount_SM(void* feaPtr, int patchIndex);\n\n\tCGALWRAPPER_API int MeshProcessingFeatures_EIK_GetPatchBufferFaceIndex_SM(void* feaPtr, int patchIndex, int faceIndex);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EIK_EdgeLengthMinMaxAvg_SM(void* ptr);\n\n\tCGALWRAPPER_API MinMaxAvg MeshProcessingFeatures_EIK_FaceAreaMinMaxAvg_SM(void* ptr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingLocate.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Index.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n#include \"../Polyhedra/MeshHitResult.h\"\n\n#include <CGAL/Polygon_mesh_processing/locate.h>\n#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>\n#include <CGAL/AABB_face_graph_triangle_primitive.h>\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n#include <CGAL/boost/graph/helpers.h>\n#include <CGAL/Dynamic_property_map.h>\n\nnamespace CP = CGAL::parameters;\nnamespace PMP = CGAL::Polygon_mesh_processing;\n\ntemplate<class K>\nclass MeshProcessingLocate\n{\n\npublic:\n\n\ttypedef typename K::FT\t\t\tFT;\n\ttypedef typename K::Point_2     Point_2;\n\ttypedef typename K::Ray_2       Ray_2;\n\ttypedef typename K::Point_3     Point_3;\n\ttypedef typename K::Ray_3       Ray_3;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::edge_descriptor PEdge_Des;\n\ttypedef typename boost::graph_traits<Polyhedron>::face_descriptor PFace_Des;\n\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Face_index SFace;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::edge_descriptor SEdge_Des;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor SFace_Des;\n\n\ttypedef PMP::Barycentric_coordinates<FT>\t\tBarycentric_coordinates;\n\ttypedef PMP::Face_location<Polyhedron, FT>\t\tPFace_location;\n\ttypedef PMP::Face_location<SurfaceMesh, FT>\t\tSFace_location;\n\n\tinline static MeshProcessingLocate* NewMeshProcessingLocate()\n\t{\n\t\treturn new MeshProcessingLocate();\n\t}\n\n\tinline static void DeleteMeshProcessingLocate(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingLocate*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingLocate* CastToMeshProcessingLocate(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingLocate*>(ptr);\n\t}\n\n\tstatic Point3d ToPoint3d(const Barycentric_coordinates& coord)\n\t{\n\t\tdouble x = CGAL::to_double(coord[0]);\n\t\tdouble y = CGAL::to_double(coord[1]);\n\t\tdouble z = CGAL::to_double(coord[2]);\n\t\treturn { x, y, z };\n\t}\n\n\t//Polyhedron\n\n\tstatic Point3d RandomLocationOnMesh_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tauto location = PMP::random_location_on_mesh<FT>(mesh->model);\n\t\t//auto face = location.first;\n\t\t//auto coordinates = location.second;\n\n\t\tauto point = PMP::construct_point(location, mesh->model);\n\n\t\treturn Point3d::FromCGAL<K>(point);\n\t}\n\n\tstatic MeshHitResult LocateFace_PH(void* ptr, const Ray3d& ray)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\tmesh->BuildAABBTree();\n\n\t\tauto pos = ray.position.ToCGAL<K>();\n\t\tauto dir = ray.direction.ToCGAL<K>();\n\t\tRay_3 r(pos, dir);\n\n\t\tauto location = PMP::locate_with_AABB_tree(r, *mesh->tree, mesh->model);\n\t\tauto face = location.first;\n\t\tauto coord = location.second;\n\n\t\tMeshHitResult result;\n\t\tresult.face = mesh->FindFaceIndex(face);\n\n\t\tif (result.face != NULL_INDEX)\n\t\t{\n\t\t\tresult.point = Point3d::FromCGAL(PMP::construct_point(location, mesh->model));\n\t\t\tresult.coord = ToPoint3d(coord);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.point = { 0,0,0 };\n\t\t\tresult.coord = { 0,0,0 };\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tstatic MeshHitResult LocateFace_PH(void* ptr, const Point3d& point)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\tmesh->BuildAABBTree();\n\n\t\tauto location = PMP::locate_with_AABB_tree(point.ToCGAL<K>(), *mesh->tree, mesh->model);\n\t\tauto face = location.first;\n\t\tauto coord = location.second;\n\n\t\tMeshHitResult result;\n\t\tresult.face = mesh->FindFaceIndex(face);\n\n\t\tif (result.face != NULL_INDEX)\n\t\t{\n\t\t\tresult.point = Point3d::FromCGAL(PMP::construct_point(location, mesh->model));\n\t\t\tresult.coord = ToPoint3d(coord);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.point = { 0,0,0 };\n\t\t\tresult.coord = { 0,0,0 };\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t//SurfaceMesh\n\n\tstatic Point3d RandomLocationOnMesh_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tauto location = PMP::random_location_on_mesh<FT>(mesh->model);\n\t\t//auto face = location.first;\n\t\t//auto coordinates = location.second;\n\n\t\tauto point = PMP::construct_point(location, mesh->model);\n\n\t\treturn Point3d::FromCGAL<K>(point);\n\t}\n\n\tstatic MeshHitResult LocateFace_SM(void* ptr, const Ray3d& ray)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\t\tmesh->BuildAABBTree();\n\n\t\tauto pos = ray.position.ToCGAL<K>();\n\t\tauto dir = ray.direction.ToCGAL<K>();\n\t\tRay_3 r(pos, dir);\n\n\t\tauto location = PMP::locate_with_AABB_tree(r, *mesh->tree, mesh->model);\n\t\tauto face = location.first;\n\t\tauto coord = location.second;\n\n\t\tMeshHitResult result;\n\t\tresult.face = mesh->FindFaceIndex(face);\n\n\t\tif (result.face != NULL_INDEX)\n\t\t{\n\t\t\tresult.point = Point3d::FromCGAL(PMP::construct_point(location, mesh->model));\n\t\t\tresult.coord = ToPoint3d(coord);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.point = { 0,0,0 };\n\t\t\tresult.coord = { 0,0,0 };\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tstatic MeshHitResult LocateFace_SM(void* ptr, const Point3d& point)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\t\tmesh->BuildAABBTree();\n\n\t\tauto location = PMP::locate_with_AABB_tree(point.ToCGAL<K>(), *mesh->tree, mesh->model);\n\t\tauto face = location.first;\n\t\tauto coord = location.second;\n\n\t\tMeshHitResult result;\n\t\tresult.face = mesh->FindFaceIndex(face);\n\n\t\tif (result.face != NULL_INDEX)\n\t\t{\n\t\t\tresult.point = Point3d::FromCGAL(PMP::construct_point(location, mesh->model));\n\t\t\tresult.coord = ToPoint3d(coord);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.point = { 0,0,0 };\n\t\t\tresult.coord = { 0,0,0 };\n\t\t}\n\n\t\treturn result;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingLocate_EEK.cpp",
    "content": "#include \"MeshProcessingLocate_EEK.h\"\n#include \"MeshProcessingLocate.h\"\n\nvoid* MeshProcessingLocate_EEK_Create()\n{\n\treturn MeshProcessingLocate<EEK>::NewMeshProcessingLocate();\n}\n\nvoid MeshProcessingLocate_EEK_Release(void* ptr)\n{\n\tMeshProcessingLocate<EEK>::DeleteMeshProcessingLocate(ptr);\n}\n\n//Polyhedron\n\nPoint3d MeshProcessingLocate_EEK_RandomLocationOnMesh_PH(void* ptr)\n{\n\treturn MeshProcessingLocate<EEK>::RandomLocationOnMesh_PH(ptr);\n}\n\nMeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_PH(void* ptr, const Ray3d& ray)\n{\n\treturn MeshProcessingLocate<EEK>::LocateFace_PH(ptr, ray);\n}\n\nMeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_PH(void* ptr, const Point3d& point)\n{\n\treturn MeshProcessingLocate<EEK>::LocateFace_PH(ptr, point);\n}\n\n//SurfaceMesh\n\nPoint3d MeshProcessingLocate_EEK_RandomLocationOnMesh_SM(void* ptr)\n{\n\treturn MeshProcessingLocate<EEK>::RandomLocationOnMesh_SM(ptr);\n}\n\nMeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_SM(void* ptr, const Ray3d& ray)\n{\n\treturn MeshProcessingLocate<EEK>::LocateFace_SM(ptr, ray);\n}\n\nMeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_SM(void* ptr, const Point3d& point)\n{\n\treturn MeshProcessingLocate<EEK>::LocateFace_SM(ptr, point);\n}"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingLocate_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra/MeshHitResult.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingLocate_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingLocate_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API Point3d MeshProcessingLocate_EEK_RandomLocationOnMesh_PH(void* ptr);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_PH(void* ptr, const Ray3d& ray);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_PH(void* ptr, const Point3d& point);\n\n\t//SurfaceMesh\n\n\tCGALWRAPPER_API Point3d MeshProcessingLocate_EEK_RandomLocationOnMesh_SM(void* ptr);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EEK_LocateFaceRay_SM(void* ptr, const Ray3d& ray);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EEK_LocateFacePoint_SM(void* ptr, const Point3d& point);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingLocate_EIK.cpp",
    "content": "#include \"MeshProcessingLocate_EIK.h\"\n#include \"MeshProcessingLocate.h\"\n\nvoid* MeshProcessingLocate_EIK_Create()\n{\n\treturn MeshProcessingLocate<EIK>::NewMeshProcessingLocate();\n}\n\nvoid MeshProcessingLocate_EIK_Release(void* ptr)\n{\n\tMeshProcessingLocate<EIK>::DeleteMeshProcessingLocate(ptr);\n}\n\n//Polyhedron\n\nPoint3d MeshProcessingLocate_EIK_RandomLocationOnMesh_PH(void* ptr)\n{\n\treturn MeshProcessingLocate<EIK>::RandomLocationOnMesh_PH(ptr);\n}\n\nMeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_PH(void* ptr, const Ray3d& ray)\n{\n\treturn MeshProcessingLocate<EIK>::LocateFace_PH(ptr, ray);\n}\n\nMeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_PH(void* ptr, const Point3d& point)\n{\n\treturn MeshProcessingLocate<EIK>::LocateFace_PH(ptr, point);\n}\n\n//SurfaceMesh\n\nPoint3d MeshProcessingLocate_EIK_RandomLocationOnMesh_SM(void* ptr)\n{\n\treturn MeshProcessingLocate<EIK>::RandomLocationOnMesh_SM(ptr);\n}\n\nMeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_SM(void* ptr, const Ray3d& ray)\n{\n\treturn MeshProcessingLocate<EIK>::LocateFace_SM(ptr, ray);\n}\n\nMeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_SM(void* ptr, const Point3d& point)\n{\n\treturn MeshProcessingLocate<EIK>::LocateFace_SM(ptr, point);\n}"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingLocate_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Polyhedra/MeshHitResult.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingLocate_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingLocate_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API Point3d MeshProcessingLocate_EIK_RandomLocationOnMesh_PH(void* ptr);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_PH(void* ptr, const Ray3d& ray);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_PH(void* ptr, const Point3d& point);\n\n\t//SurfaceMesh\n\n\tCGALWRAPPER_API Point3d MeshProcessingLocate_EIK_RandomLocationOnMesh_SM(void* ptr);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EIK_LocateFaceRay_SM(void* ptr, const Ray3d& ray);\n\n\tCGALWRAPPER_API MeshHitResult MeshProcessingLocate_EIK_LocateFacePoint_SM(void* ptr, const Point3d& point);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingMeshing.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n#include \"../Geometry/Index.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Polygon_mesh_processing/extrude.h>\n#include <CGAL/Polygon_mesh_processing/fair.h>\n#include <CGAL/Polygon_mesh_processing/refine.h>\n#include <CGAL/Polygon_mesh_processing/remesh.h>\n#include <CGAL/Polygon_mesh_processing/random_perturbation.h>\n#include <CGAL/Polygon_mesh_processing/smooth_mesh.h>\n#include <CGAL/Polygon_mesh_processing/smooth_shape.h>\n#include <CGAL/Polygon_mesh_processing/detect_features.h>\n#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>\n\ntemplate<class K>\nclass MeshProcessingMeshing\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point_3;\n\ttypedef typename K::Vector_3 Vector_3;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::edge_descriptor PEdge_Des;\n\ttypedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor PHalfedge_Des;\n\ttypedef typename boost::graph_traits<Polyhedron>::face_descriptor PFace_Des;\n\ttypedef typename Polyhedron::Vertex_handle PVertex_Handle;\n\n\ttypedef typename CGAL::Surface_mesh<Point_3> SurfaceMesh;\n\ttypedef typename SurfaceMesh::Face_index SFace;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::edge_descriptor SEdge_Des;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::halfedge_descriptor SHalfedge_Des;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor SFace_Des;\n\ttypedef typename SurfaceMesh::Vertex_index SVertex_Index;\n\n\tinline static MeshProcessingMeshing* NewMeshProcessingMeshing()\n\t{\n\t\treturn new MeshProcessingMeshing();\n\t}\n\n\tinline static void DeleteMeshProcessingMeshing(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingMeshing*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingMeshing* CastToMeshProcessingMeshing(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingMeshing*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstruct HalfedgeToEdge_PM\n\t{\n\t\tHalfedgeToEdge_PM(const Polyhedron& m, std::vector<PEdge_Des>& edges)\n\t\t\t: m_mesh(m), m_edges(edges)\n\t\t{}\n\n\t\tvoid operator()(const PHalfedge_Des& h) const\n\t\t{\n\t\t\tm_edges.push_back(edge(h, m_mesh));\n\t\t}\n\n\t\tconst Polyhedron& m_mesh;\n\t\tstd::vector<PEdge_Des>& m_edges;\n\t};\n\n\t// extract vertices which are at most k (inclusive)\n\t// far from vertex v in the graph of edges\n\tstatic void ExtractKRing_PH(PVertex_Handle v, int k, std::vector<PVertex_Handle>& qv)\n\t{\n\t\tstd::map<PVertex_Handle, int>  D;\n\t\tqv.push_back(v);\n\t\tD[v] = 0;\n\t\tstd::size_t current_index = 0;\n\t\tint dist_v;\n\t\twhile (current_index < qv.size() && (dist_v = D[qv[current_index]]) < k)\n\t\t{\n\t\t\tv = qv[current_index++];\n\t\t\tauto e(v->vertex_begin()), e_end(e);\n\n\t\t\tdo \n\t\t\t{\n\t\t\t\tPVertex_Handle new_v = e->opposite()->vertex();\n\n\t\t\t\tif (D.insert(std::make_pair(new_v, dist_v + 1)).second)\n\t\t\t\t\tqv.push_back(new_v);\n\t\t\t} \n\t\t\twhile (++e != e_end);\n\t\t}\n\t}\n\n\tstatic void* Extrude_PH(void* meshPtr, Vector3d dir)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\t\n\t\tauto extruded = Polyhedron3<K>::NewPolyhedron();\n\t\tCGAL::Polygon_mesh_processing::extrude_mesh(mesh->model, extruded->model, dir.ToCGAL<K>());\n\n\t\treturn extruded;\n\t}\n\n\tstatic Index2 Fair_PH(void* meshPtr, int index, int k_ring)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tint count = (int)mesh->model.size_of_facets();\n\t\tif (k_ring <= 0 || index < 0 || index >= count)\n\t\t\treturn { FALSE, 0 };\n\n\t\tauto v = mesh->model.vertices_begin();\n\t\tstd::advance(v, index);\n\t\tstd::vector<PVertex_Handle> region;\n\n\t\tExtractKRing_PH(v, k_ring, region);\n\n\t\t//If whole mesh is select result will be degenerate.\n\t\t//All vertices will collapse to origin.\n\t\tif(region.size() >= (int)mesh->model.size_of_vertices())\n\t\t\treturn { FALSE, (int)region.size() };\n\n\t\tBOOL successful = CGAL::Polygon_mesh_processing::fair(mesh->model, region);\n\n\t\tif(successful)\n\t\t\tmesh->OnModelChanged();\n\n\t\treturn { successful, (int)region.size() };\n\t}\n\n\tstatic Index2 Refine_PH(void* meshPtr, double density_control_factor)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tstd::vector<Polyhedron::Facet_handle>  new_facets;\n\t\tstd::vector<Polyhedron::Vertex_handle> new_vertices;\n\n\t\tauto param = CGAL::parameters::density_control_factor(density_control_factor);\n\n\t\tCGAL::Polygon_mesh_processing::refine(mesh->model, faces(mesh->model),\n\t\t\tstd::back_inserter(new_facets),\n\t\t\tstd::back_inserter(new_vertices),\n\t\t\tparam);\n\n\t\tmesh->OnModelChanged();\n\n\t\treturn { (int)new_vertices.size(), (int)new_facets.size() };\n\t}\n\n\tstatic int IsotropicRemeshing_PH(void* meshPtr, int iterations, double target_edge_length)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tint count_before = (int)mesh->model.size_of_vertices();\n\n\t\tstd::vector<PEdge_Des> border;\n\t\tauto it = boost::make_function_output_iterator(HalfedgeToEdge_PM(mesh->model, border));\n\t\tCGAL::Polygon_mesh_processing::border_halfedges(faces(mesh->model), mesh->model, it);\n\t\tCGAL::Polygon_mesh_processing::split_long_edges(border, target_edge_length, mesh->model);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::\n\t\t\tnumber_of_iterations(iterations)\n\t\t\t.protect_constraints(true);\n\n\t\tCGAL::Polygon_mesh_processing::isotropic_remeshing(faces(mesh->model), target_edge_length, mesh->model, param);\n\n\t\tmesh->OnModelChanged();\n\n\t\treturn (int)mesh->model.size_of_vertices() - count_before;\n\t}\n\n\tstatic void RandomPerturbation_PH(void* meshPtr, double perturbation_max_size)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tCGAL::Polygon_mesh_processing::random_perturbation(vertices(mesh->model), mesh->model, perturbation_max_size);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void SmoothMesh_PH(void* meshPtr, double featureAngle, int iterations)\n\t{\n\t\t/*\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\ttypedef boost::property_map<Polyhedron, CGAL::edge_is_feature_t>::type FeatureMap;\n\t\tFeatureMap map = get(CGAL::edge_is_feature, mesh->model);\n\n\t\tCGAL::Polygon_mesh_processing::detect_sharp_edges(mesh->model, featureAngle, map);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::number_of_iterations(iterations).\n\t\t\tuse_safety_constraints(false).\n\t\t\tedge_is_constrained_map(map);\n\n\t\tCGAL::Polygon_mesh_processing::smooth_mesh(faces(mesh->model), mesh->model, param);\n\n\t\tmesh->OnModelChanged();\n\t\t*/\n\t}\n\n\tstatic void SmoothShape_PH(void* meshPtr, double timeStep, int iterations)\n\t{\n\t\t/*\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tstd::set<Polyhedron::Vertex_handle> constrained_vertices;\n\n\t\tfor (auto v : vertices(mesh->model))\n\t\t{\n\t\t\tif (is_border(v, mesh->model))\n\t\t\t\tconstrained_vertices.insert(v);\n\t\t}\n\n\t\tCGAL::Boolean_property_map<std::set<Polyhedron::Vertex_handle> > map(constrained_vertices);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::\n\t\t\tnumber_of_iterations(iterations)\n\t\t\t.vertex_is_constrained_map(map);\n\n\t\tCGAL::Polygon_mesh_processing::smooth_shape(mesh->model, timeStep, param);\n\n\t\tmesh->OnModelChanged();\n\t\t*/\n\t}\n\n\tstatic int SplitLongEdges_PH(void* meshPtr, double target_edge_length)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tint count_before = (int)mesh->model.size_of_halfedges();\n\n\t\t//std::vector<PEdge_Des> border;\n\t\t//CGAL::Polygon_mesh_processing::border_halfedges(faces(mesh->model), mesh->model,\n\t\t//\tboost::make_function_output_iterator(HalfedgeToEdge_PM(mesh->model, border)));\n\t\t//CGAL::Polygon_mesh_processing::split_long_edges(border, target_edge_length, mesh->model);\n\n\t\tCGAL::Polygon_mesh_processing::split_long_edges(edges(mesh->model), target_edge_length, mesh->model);\n\n\t\treturn (int)mesh->model.size_of_halfedges() - count_before;\n\t}\n\n\tstatic BOOL TriangulateFace_PH(void* meshPtr, int index)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tauto face = mesh->FindFaceIter(index);\n\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tstd::vector<PFace_Des> faces;\n\t\t\tfaces.push_back(*face);\n\t\t\treturn CGAL::Polygon_mesh_processing::triangulate_faces(faces, mesh->model);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic BOOL TriangulateFaces_PH(void* meshPtr, int* faces, int count)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tstd::vector<PFace_Des> _faces;\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto face = mesh->FindFaceIter(faces[i]);\n\t\t\tif (face != nullptr)\n\t\t\t\t_faces.push_back(*face);\n\t\t}\n\n\t\tif (_faces.size() == 0)\n\t\t\treturn FALSE;\n\n\t\treturn CGAL::Polygon_mesh_processing::triangulate_faces(_faces, mesh->model);\n\t}\n\n\t//Surface Mesh\n\n\tstruct HalfedgeToEdge_SM\n\t{\n\t\tHalfedgeToEdge_SM(const SurfaceMesh& m, std::vector<SEdge_Des>& edges)\n\t\t\t: m_mesh(m), m_edges(edges)\n\t\t{}\n\n\t\tvoid operator()(const SHalfedge_Des& h) const\n\t\t{\n\t\t\tm_edges.push_back(edge(h, m_mesh));\n\t\t}\n\n\t\tconst SurfaceMesh& m_mesh;\n\t\tstd::vector<SEdge_Des>& m_edges;\n\t};\n\n\t// extract vertices which are at most k (inclusive)\n\t// far from vertex v in the graph of edges\n\tstatic void ExtractKRing_SM(SVertex_Index v, int k, std::vector<SVertex_Index>& qv)\n\t{\n\t\tstd::map<SVertex_Index, int>  D;\n\t\tqv.push_back(v);\n\t\t/*\n\t\tD[v] = 0;\n\t\tstd::size_t current_index = 0;\n\t\tint dist_v;\n\t\twhile (current_index < qv.size() && (dist_v = D[qv[current_index]]) < k)\n\t\t{\n\t\t\tv = qv[current_index++];\n\t\t\tauto e(v->vertex_begin()), e_end(e);\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tPVertex_Handle new_v = e->opposite()->vertex();\n\n\t\t\t\tif (D.insert(std::make_pair(new_v, dist_v + 1)).second)\n\t\t\t\t\tqv.push_back(new_v);\n\t\t\t} while (++e != e_end);\n\t\t}\n\t\t*/\n\t}\n\n\tstatic void* Extrude_SM(void* meshPtr, Vector3d dir)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tauto extruded = SurfaceMesh3<K>::NewSurfaceMesh();\n\t\tCGAL::Polygon_mesh_processing::extrude_mesh(mesh->model, extruded->model, dir.ToCGAL<K>());\n\n\t\treturn extruded;\n\t}\n\n\tstatic Index2 Fair_SM(void* meshPtr, int index, int k_ring)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tint count = (int)mesh->model.number_of_faces();\n\t\tif (k_ring <= 0 || index < 0 || index >= count)\n\t\t\treturn { FALSE, 0 };\n\n\t\tstd::vector<SVertex_Index> region;\n\t\tExtractKRing_SM(SVertex_Index(index), k_ring, region);\n\n\t\t//If whole mesh is select result will be degenerate.\n\t\t//All vertices will collapse to origin.\n\t\tif (region.size() >= (int)mesh->model.number_of_vertices())\n\t\t\treturn { FALSE, (int)region.size() };\n\n\t\tBOOL successful = CGAL::Polygon_mesh_processing::fair(mesh->model, region);\n\n\t\tif (successful)\n\t\t\tmesh->OnModelChanged();\n\n\t\treturn { successful, (int)region.size() };\n\t}\n\n\tstatic Index2 Refine_SM(void* meshPtr, double density_control_factor)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tstd::vector<SurfaceMesh::Face_index>  new_facets;\n\t\tstd::vector<SurfaceMesh::Vertex_index> new_vertices;\n\n\t\tauto param = CGAL::parameters::density_control_factor(density_control_factor);\n\n\t\tCGAL::Polygon_mesh_processing::refine(mesh->model, faces(mesh->model),\n\t\t\tstd::back_inserter(new_facets),\n\t\t\tstd::back_inserter(new_vertices),\n\t\t\tparam);\n\n\t\tmesh->OnModelChanged();\n\n\t\treturn { (int)new_vertices.size(), (int)new_facets.size() };\n\t}\n\n\tstatic int IsotropicRemeshing_SM(void* meshPtr, int iterations, double target_edge_length)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tint count_before = (int)mesh->model.number_of_vertices();\n\n\t\tstd::vector<SEdge_Des> border;\n\t\tauto it = boost::make_function_output_iterator(HalfedgeToEdge_SM(mesh->model, border));\n\t\tCGAL::Polygon_mesh_processing::border_halfedges(faces(mesh->model), mesh->model, it);\n\t\tCGAL::Polygon_mesh_processing::split_long_edges(border, target_edge_length, mesh->model);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::\n\t\t\tnumber_of_iterations(iterations)\n\t\t\t.protect_constraints(true);\n\n\t\tCGAL::Polygon_mesh_processing::isotropic_remeshing(faces(mesh->model), target_edge_length, mesh->model, param);\n\n\t\tmesh->OnModelChanged();\n\n\t\treturn (int)mesh->model.number_of_vertices() - count_before;\n\t}\n\n\tstatic void RandomPerturbation_SM(void* meshPtr, double perturbation_max_size)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tCGAL::Polygon_mesh_processing::random_perturbation(vertices(mesh->model), mesh->model, perturbation_max_size);\n\t\tmesh->OnModelChanged();\n\t\t\n\t}\n\n\tstatic void SmoothMesh_SM(void* meshPtr, double featureAngle, int iterations)\n\t{\n\t\t\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\ttypedef boost::property_map<SurfaceMesh, CGAL::edge_is_feature_t>::type FeatureMap;\n\t\tFeatureMap map = get(CGAL::edge_is_feature, mesh->model);\n\n\t\tCGAL::Polygon_mesh_processing::detect_sharp_edges(mesh->model, featureAngle, map);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::\n\t\t\tnumber_of_iterations(iterations).\n\t\t\tuse_safety_constraints(false).\n\t\t\tedge_is_constrained_map(map);\n\n\t\tCGAL::Polygon_mesh_processing::smooth_mesh(faces(mesh->model), mesh->model, param);\n\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void SmoothShape_SM(void* meshPtr, double timeStep, int iterations)\n\t{\n\t\t/*\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tstd::set<SVertex_Index> constrained_vertices;\n\n\t\tfor (auto v : vertices(mesh->model))\n\t\t{\n\t\t\tif (is_border(v, mesh->model))\n\t\t\t\tconstrained_vertices.insert(v);\n\t\t}\n\n\t\tCGAL::Boolean_property_map<std::set<SVertex_Index>> map(constrained_vertices);\n\n\t\tauto param = CGAL::Polygon_mesh_processing::parameters::\n\t\t\tnumber_of_iterations(iterations)\n\t\t\t.vertex_is_constrained_map(map);\n\n\t\tCGAL::Polygon_mesh_processing::smooth_shape(mesh->model, timeStep, param);\n\n\t\tmesh->OnModelChanged();\n\t\t*/\n\t}\n\n\tstatic int SplitLongEdges_SM(void* meshPtr, double target_edge_length)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tint count_before = (int)mesh->model.number_of_halfedges();\n\n\t\t//std::vector<SEdge_Des> border;\n\t\t//auto it = boost::make_function_output_iterator(HalfedgeToEdge_SM(mesh->model, border));\n\t\t//CGAL::Polygon_mesh_processing::border_halfedges(faces(mesh->model), mesh->model, it);\n\t\t//CGAL::Polygon_mesh_processing::split_long_edges(border, target_edge_length, mesh->model);\n\n\t\tCGAL::Polygon_mesh_processing::split_long_edges(edges(mesh->model),  target_edge_length, mesh->model);\n\n\t\treturn (int)mesh->model.number_of_halfedges() - count_before;\n\t}\n\n\tstatic BOOL TriangulateFace_SM(void* meshPtr, int index)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tauto face = mesh->FindFace(index);\n\n\t\tif (face != SurfaceMesh3<K>::NullFace())\n\t\t{\n\t\t\tstd::vector<SFace> faces;\n\t\t\tfaces.push_back(face);\n\t\t\treturn CGAL::Polygon_mesh_processing::triangulate_faces(faces, mesh->model);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\n\t}\n\n\tstatic BOOL TriangulateFaces_SM(void* meshPtr, int* faces, int count)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tstd::vector<SFace> _faces;\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tauto face = mesh->FindFace(faces[i]);\n\t\t\tif (face != SurfaceMesh3<K>::NullFace())\n\t\t\t\t_faces.push_back(face);\n\t\t}\n\n\t\tif (_faces.size() == 0)\n\t\t\treturn FALSE;\n\n\t\treturn CGAL::Polygon_mesh_processing::triangulate_faces(_faces, mesh->model);\n\t}\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingMeshing_EEK.cpp",
    "content": "#include \"MeshProcessingMeshing_EEK.h\"\n#include \"MeshProcessingMeshing.h\"\n\nvoid* MeshProcessingMeshing_EEK_Create()\n{\n\treturn MeshProcessingMeshing<EEK>::NewMeshProcessingMeshing();\n}\n\nvoid MeshProcessingMeshing_EEK_Release(void* ptr)\n{\n\tMeshProcessingMeshing<EEK>::DeleteMeshProcessingMeshing(ptr);\n}\n\n//Polyhedron\n\nvoid* MeshProcessingMeshing_EEK_Extrude_PH(void* meshPtr, Vector3d dir)\n{\n\treturn MeshProcessingMeshing<EEK>::Extrude_PH(meshPtr, dir);\n}\n\nIndex2 MeshProcessingMeshing_EEK_Fair_PH(void* meshPtr, int index, int k_ring)\n{\n\treturn MeshProcessingMeshing<EEK>::Fair_PH(meshPtr, index, k_ring);\n}\n\nIndex2 MeshProcessingMeshing_EEK_Refine_PH(void* meshPtr, double density_control_factor)\n{\n\treturn MeshProcessingMeshing<EEK>::Refine_PH(meshPtr, density_control_factor);\n}\n\nint MeshProcessingMeshing_EEK_IsotropicRemeshing_PH(void* meshPtr, int iterations, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EEK>::IsotropicRemeshing_PH(meshPtr, iterations, target_edge_length);\n}\n\nvoid MeshProcessingMeshing_EEK_RandomPerturbation_PH(void* meshPtr, double perturbation_max_size)\n{\n\tMeshProcessingMeshing<EEK>::RandomPerturbation_PH(meshPtr, perturbation_max_size);\n}\n\nvoid MeshProcessingMeshing_EEK_SmoothMesh_PH(void* meshPtr, double featureAngle, int iterations)\n{\n\tMeshProcessingMeshing<EEK>::SmoothMesh_PH(meshPtr, featureAngle, iterations);\n}\n\nvoid MeshProcessingMeshing_EEK_SmoothShape_PH(void* meshPtr, double timeStep, int iterations)\n{\n\tMeshProcessingMeshing<EEK>::SmoothShape_PH(meshPtr, timeStep, iterations);\n}\n\nint MeshProcessingMeshing_EEK_SplitLongEdges_PH(void* meshPtr, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EEK>::SplitLongEdges_PH(meshPtr, target_edge_length);\n}\n\nBOOL MeshProcessingMeshing_EEK_TriangulateFace_PH(void* meshPtr, int index)\n{\n\treturn MeshProcessingMeshing<EEK>::TriangulateFace_PH(meshPtr, index);\n}\n\nBOOL MeshProcessingMeshing_EEK_TriangulateFaces_PH(void* meshPtr, int* faces, int count)\n{\n\treturn MeshProcessingMeshing<EEK>::TriangulateFaces_PH(meshPtr, faces, count);\n}\n\n//Surface Mesh\n\nvoid* MeshProcessingMeshing_EEK_Extrude_SM(void* meshPtr, Vector3d dir)\n{\n\treturn MeshProcessingMeshing<EEK>::Extrude_SM(meshPtr, dir);\n}\n\nIndex2 MeshProcessingMeshing_EEK_Fair_SM(void* meshPtr, int index, int k_ring)\n{\n\treturn MeshProcessingMeshing<EEK>::Fair_SM(meshPtr, index, k_ring);\n}\n\nIndex2 MeshProcessingMeshing_EEK_Refine_SM(void* meshPtr, double density_control_factor)\n{\n\treturn MeshProcessingMeshing<EEK>::Refine_SM(meshPtr, density_control_factor);\n}\n\nint MeshProcessingMeshing_EEK_IsotropicRemeshing_SM(void* meshPtr, int iterations, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EEK>::IsotropicRemeshing_SM(meshPtr, iterations, target_edge_length);\n}\n\nvoid MeshProcessingMeshing_EEK_RandomPerturbation_SM(void* meshPtr, double perturbation_max_size)\n{\n\tMeshProcessingMeshing<EEK>::RandomPerturbation_SM(meshPtr, perturbation_max_size);\n}\n\nvoid MeshProcessingMeshing_EEK_SmoothMesh_SM(void* meshPtr, double featureAngle, int iterations)\n{\n\tMeshProcessingMeshing<EEK>::SmoothMesh_SM(meshPtr, featureAngle, iterations);\n}\n\nvoid MeshProcessingMeshing_EEK_SmoothShape_SM(void* meshPtr, double timeStep, int iterations)\n{\n\tMeshProcessingMeshing<EEK>::SmoothShape_SM(meshPtr, timeStep, iterations);\n}\n\nint MeshProcessingMeshing_EEK_SplitLongEdges_SM(void* meshPtr, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EEK>::SplitLongEdges_SM(meshPtr, target_edge_length);\n}\n\nBOOL MeshProcessingMeshing_EEK_TriangulateFace_SM(void* meshPtr, int index)\n{\n\treturn MeshProcessingMeshing<EEK>::TriangulateFace_SM(meshPtr, index);\n}\n\nBOOL MeshProcessingMeshing_EEK_TriangulateFaces_SM(void* meshPtr, int* faces, int count)\n{\n\treturn MeshProcessingMeshing<EEK>::TriangulateFaces_SM(meshPtr, faces, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingMeshing_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Index.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EEK_Extrude_PH(void* meshPtr, Vector3d dir);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EEK_Fair_PH(void* meshPtr, int index, int k_ring);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EEK_Refine_PH(void* meshPtr, double density_control_factor);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EEK_IsotropicRemeshing_PH(void* meshPtr, int iterations, double target_edge_length);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_RandomPerturbation_PH(void* meshPtr, double perturbation_max_size);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_SmoothMesh_PH(void* meshPtr, double featureAngle, int iterations);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_SmoothShape_PH(void* meshPtr, double timeStep, int iterations);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EEK_SplitLongEdges_PH(void* meshPtr, double target_edge_length);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EEK_TriangulateFace_PH(void* meshPtr, int index);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EEK_TriangulateFaces_PH(void* meshPtr, int* faces, int count);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EEK_Extrude_SM(void* meshPtr, Vector3d dir);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EEK_Fair_SM(void* meshPtr, int index, int k_ring);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EEK_Refine_SM(void* meshPtr, double density_control_factor);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EEK_IsotropicRemeshing_SM(void* meshPtr, int iterations, double target_edge_length);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_RandomPerturbation_SM(void* meshPtr, double perturbation_max_size);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_SmoothMesh_SM(void* meshPtr, double featureAngle, int iterations);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EEK_SmoothShape_SM(void* meshPtr, double timeStep, int iterations);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EEK_SplitLongEdges_SM(void* meshPtr, double target_edge_length);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EEK_TriangulateFace_SM(void* meshPtr, int index);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EEK_TriangulateFaces_SM(void* meshPtr, int* faces, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingMeshing_EIK.cpp",
    "content": "#include \"MeshProcessingMeshing_EIK.h\"\n#include \"MeshProcessingMeshing.h\"\n\nvoid* MeshProcessingMeshing_EIK_Create()\n{\n\treturn MeshProcessingMeshing<EIK>::NewMeshProcessingMeshing();\n}\n\nvoid MeshProcessingMeshing_EIK_Release(void* ptr)\n{\n\tMeshProcessingMeshing<EIK>::DeleteMeshProcessingMeshing(ptr);\n}\n\n//Polyhedron\n\nvoid* MeshProcessingMeshing_EIK_Extrude_PH(void* meshPtr, Vector3d dir)\n{\n\treturn MeshProcessingMeshing<EIK>::Extrude_PH(meshPtr, dir);\n}\n\nIndex2 MeshProcessingMeshing_EIK_Fair_PH(void* meshPtr, int index, int k_ring)\n{\n\treturn MeshProcessingMeshing<EIK>::Fair_PH(meshPtr, index, k_ring);\n}\n\nIndex2 MeshProcessingMeshing_EIK_Refine_PH(void* meshPtr, double density_control_factor)\n{\n\treturn MeshProcessingMeshing<EIK>::Refine_PH(meshPtr, density_control_factor);\n}\n\nint MeshProcessingMeshing_EIK_IsotropicRemeshing_PH(void* meshPtr, int iterations, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EIK>::IsotropicRemeshing_PH(meshPtr, iterations, target_edge_length);\n}\n\nvoid MeshProcessingMeshing_EIK_RandomPerturbation_PH(void* meshPtr, double perturbation_max_size)\n{\n\tMeshProcessingMeshing<EIK>::RandomPerturbation_PH(meshPtr, perturbation_max_size);\n}\n\nvoid MeshProcessingMeshing_EIK_SmoothMesh_PH(void* meshPtr, double featureAngle, int iterations)\n{\n\tMeshProcessingMeshing<EIK>::SmoothMesh_PH(meshPtr, featureAngle, iterations);\n}\n\nvoid MeshProcessingMeshing_EIK_SmoothShape_PH(void* meshPtr, double timeStep, int iterations)\n{\n\tMeshProcessingMeshing<EIK>::SmoothShape_PH(meshPtr, timeStep, iterations);\n}\n\nint MeshProcessingMeshing_EIK_SplitLongEdges_PH(void* meshPtr, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EIK>::SplitLongEdges_PH(meshPtr, target_edge_length);\n}\n\nBOOL MeshProcessingMeshing_EIK_TriangulateFace_PH(void* meshPtr, int index)\n{\n\treturn MeshProcessingMeshing<EIK>::TriangulateFace_PH(meshPtr, index);\n}\n\nBOOL MeshProcessingMeshing_EIK_TriangulateFaces_PH(void* meshPtr, int* faces, int count)\n{\n\treturn MeshProcessingMeshing<EIK>::TriangulateFaces_PH(meshPtr, faces, count);\n}\n\n//Surface Mesh\n\nvoid* MeshProcessingMeshing_EIK_Extrude_SM(void* meshPtr, Vector3d dir)\n{\n\treturn MeshProcessingMeshing<EIK>::Extrude_SM(meshPtr, dir);\n}\n\nIndex2 MeshProcessingMeshing_EIK_Fair_SM(void* meshPtr, int index, int k_ring)\n{\n\treturn MeshProcessingMeshing<EIK>::Fair_SM(meshPtr, index, k_ring);\n}\n\nIndex2 MeshProcessingMeshing_EIK_Refine_SM(void* meshPtr, double density_control_factor)\n{\n\treturn MeshProcessingMeshing<EIK>::Refine_SM(meshPtr, density_control_factor);\n}\n\nint MeshProcessingMeshing_EIK_IsotropicRemeshing_SM(void* meshPtr, int iterations, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EIK>::IsotropicRemeshing_SM(meshPtr, iterations, target_edge_length);\n}\n\nvoid MeshProcessingMeshing_EIK_RandomPerturbation_SM(void* meshPtr, double perturbation_max_size)\n{\n\tMeshProcessingMeshing<EIK>::RandomPerturbation_SM(meshPtr, perturbation_max_size);\n}\n\nvoid MeshProcessingMeshing_EIK_SmoothMesh_SM(void* meshPtr, double featureAngle, int iterations)\n{\n\tMeshProcessingMeshing<EIK>::SmoothMesh_SM(meshPtr, featureAngle, iterations);\n}\n\nvoid MeshProcessingMeshing_EIK_SmoothShape_SM(void* meshPtr, double timeStep, int iterations)\n{\n\tMeshProcessingMeshing<EIK>::SmoothShape_SM(meshPtr, timeStep, iterations);\n}\n\nint MeshProcessingMeshing_EIK_SplitLongEdges_SM(void* meshPtr, double target_edge_length)\n{\n\treturn MeshProcessingMeshing<EIK>::SplitLongEdges_SM(meshPtr, target_edge_length);\n}\n\nBOOL MeshProcessingMeshing_EIK_TriangulateFace_SM(void* meshPtr, int index)\n{\n\treturn MeshProcessingMeshing<EIK>::TriangulateFace_SM(meshPtr, index);\n}\n\nBOOL MeshProcessingMeshing_EIK_TriangulateFaces_SM(void* meshPtr, int* faces, int count)\n{\n\treturn MeshProcessingMeshing<EIK>::TriangulateFaces_SM(meshPtr, faces, count);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingMeshing_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Index.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EIK_Extrude_PH(void* meshPtr, Vector3d dir);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EIK_Fair_PH(void* meshPtr, int index, int k_ring);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EIK_Refine_PH(void* meshPtr, double density_control_factor);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EIK_IsotropicRemeshing_PH(void* meshPtr, int iterations, double target_edge_length);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_RandomPerturbation_PH(void* meshPtr, double perturbation_max_size);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_SmoothMesh_PH(void* meshPtr, double featureAngle, int iterations);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_SmoothShape_PH(void* meshPtr, double timeStep, int iterations);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EIK_SplitLongEdges_PH(void* meshPtr, double target_edge_length);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EIK_TriangulateFace_PH(void* meshPtr, int index);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EIK_TriangulateFaces_PH(void* meshPtr, int* faces, int count);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API void* MeshProcessingMeshing_EIK_Extrude_SM(void* meshPtr, Vector3d dir);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EIK_Fair_SM(void* meshPtr, int index, int k_ring);\n\n\tCGALWRAPPER_API Index2 MeshProcessingMeshing_EIK_Refine_SM(void* meshPtr, double density_control_factor);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EIK_IsotropicRemeshing_SM(void* meshPtr, int iterations, double target_edge_length);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_RandomPerturbation_SM(void* meshPtr, double perturbation_max_size);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_SmoothMesh_SM(void* meshPtr, double featureAngle, int iterations);\n\n\tCGALWRAPPER_API void MeshProcessingMeshing_EIK_SmoothShape_SM(void* meshPtr, double timeStep, int iterations);\n\n\tCGALWRAPPER_API int MeshProcessingMeshing_EIK_SplitLongEdges_SM(void* meshPtr, double target_edge_length);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EIK_TriangulateFace_SM(void* meshPtr, int index);\n\n\tCGALWRAPPER_API BOOL MeshProcessingMeshing_EIK_TriangulateFaces_SM(void* meshPtr, int* faces, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingOrientation.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <CGAL/Polygon_mesh_processing/orientation.h>\n\ntemplate<class K>\nclass MeshProcessingOrientation\n{\n\npublic:\n\n\tinline static MeshProcessingOrientation* NewMeshProcessingOrientation()\n\t{\n\t\treturn new MeshProcessingOrientation();\n\t}\n\n\tinline static void DeleteMeshProcessingOrientation(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingOrientation*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingOrientation* CastToMeshProcessingOrientation(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingOrientation*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstatic BOOL DoesBoundAVolume_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\treturn CGAL::Polygon_mesh_processing::does_bound_a_volume(mesh->model);\n\t}\n\n\tstatic BOOL IsOutwardOriented_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);;\n\t\treturn CGAL::Polygon_mesh_processing::is_outward_oriented(mesh->model);\n\t}\n\n\tstatic void Orient_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::orient(mesh->model);\n\t}\n\n\tstatic void OrientToBoundAVolume_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::orient_to_bound_a_volume(mesh->model);\n\t}\n\n\tstatic void ReverseFaceOrientations_PH(void* meshPtr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::reverse_face_orientations(mesh->model);\n\t}\n\n\t//Surface Mesh\n\n\tstatic BOOL DoesBoundAVolume_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\treturn CGAL::Polygon_mesh_processing::does_bound_a_volume(mesh->model);\n\t}\n\n\tstatic BOOL IsOutwardOriented_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\treturn CGAL::Polygon_mesh_processing::is_outward_oriented(mesh->model);\n\t}\n\n\tstatic void Orient_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::orient(mesh->model);\n\t}\n\n\tstatic void OrientToBoundAVolume_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::orient_to_bound_a_volume(mesh->model);\n\t}\n\n\tstatic void ReverseFaceOrientations_SM(void* meshPtr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tmesh->OnFaceNormalsChanged();\n\t\treturn CGAL::Polygon_mesh_processing::reverse_face_orientations(mesh->model);\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingOrientation_EEK.cpp",
    "content": "#include \"MeshProcessingOrientation_EEK.h\"\n#include \"MeshProcessingOrientation.h\"\n\nvoid* MeshProcessingOrientation_EEK_Create()\n{\n\treturn MeshProcessingOrientation<EEK>::NewMeshProcessingOrientation();\n}\n\nvoid MeshProcessingOrientation_EEK_Release(void* ptr)\n{\n\tMeshProcessingOrientation<EEK>::DeleteMeshProcessingOrientation(ptr);\n}\n\n//Polyhedron\n\nBOOL MeshProcessingOrientation_EEK_DoesBoundAVolume_PH(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EEK>::DoesBoundAVolume_PH(meshPtr);\n}\n\nBOOL MeshProcessingOrientation_EEK_IsOutwardOriented_PH(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EEK>::IsOutwardOriented_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_Orient_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::Orient_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_OrientToBoundAVolume_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::OrientToBoundAVolume_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_ReverseFaceOrientations_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::ReverseFaceOrientations_PH(meshPtr);\n}\n\n//Surface Mesh\n\nBOOL MeshProcessingOrientation_EEK_DoesBoundAVolume_SM(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EEK>::DoesBoundAVolume_SM(meshPtr);\n}\n\nBOOL MeshProcessingOrientation_EEK_IsOutwardOriented_SM(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EEK>::IsOutwardOriented_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_Orient_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::Orient_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_OrientToBoundAVolume_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::OrientToBoundAVolume_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EEK_ReverseFaceOrientations_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EEK>::ReverseFaceOrientations_SM(meshPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingOrientation_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingOrientation_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EEK_DoesBoundAVolume_PH(void* meshPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EEK_IsOutwardOriented_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_Orient_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_OrientToBoundAVolume_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_ReverseFaceOrientations_PH(void* meshPtr);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EEK_DoesBoundAVolume_SM(void* meshPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EEK_IsOutwardOriented_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_Orient_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_OrientToBoundAVolume_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EEK_ReverseFaceOrientations_SM(void* meshPtr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingOrientation_EIK.cpp",
    "content": "#include \"MeshProcessingOrientation_EIK.h\"\n#include \"MeshProcessingOrientation.h\"\n\nvoid* MeshProcessingOrientation_EIK_Create()\n{\n\treturn MeshProcessingOrientation<EIK>::NewMeshProcessingOrientation();\n}\n\nvoid MeshProcessingOrientation_EIK_Release(void* ptr)\n{\n\tMeshProcessingOrientation<EIK>::DeleteMeshProcessingOrientation(ptr);\n}\n\n//Polyhedron\n\nBOOL MeshProcessingOrientation_EIK_DoesBoundAVolume_PH(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EIK>::DoesBoundAVolume_PH(meshPtr);\n}\n\nBOOL MeshProcessingOrientation_EIK_IsOutwardOriented_PH(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EIK>::IsOutwardOriented_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_Orient_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::Orient_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_OrientToBoundAVolume_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::OrientToBoundAVolume_PH(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_ReverseFaceOrientations_PH(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::ReverseFaceOrientations_PH(meshPtr);\n}\n\n//Surface Mesh\n\nBOOL MeshProcessingOrientation_EIK_DoesBoundAVolume_SM(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EIK>::DoesBoundAVolume_SM(meshPtr);\n}\n\nBOOL MeshProcessingOrientation_EIK_IsOutwardOriented_SM(void* meshPtr)\n{\n\treturn MeshProcessingOrientation<EIK>::IsOutwardOriented_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_Orient_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::Orient_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_OrientToBoundAVolume_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::OrientToBoundAVolume_SM(meshPtr);\n}\n\nvoid MeshProcessingOrientation_EIK_ReverseFaceOrientations_SM(void* meshPtr)\n{\n\tMeshProcessingOrientation<EIK>::ReverseFaceOrientations_SM(meshPtr);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingOrientation_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingOrientation_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EIK_DoesBoundAVolume_PH(void* meshPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EIK_IsOutwardOriented_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_Orient_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_OrientToBoundAVolume_PH(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_ReverseFaceOrientations_PH(void* meshPtr);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EIK_DoesBoundAVolume_SM(void* meshPtr);\n\n\tCGALWRAPPER_API BOOL MeshProcessingOrientation_EIK_IsOutwardOriented_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_Orient_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_OrientToBoundAVolume_SM(void* meshPtr);\n\n\tCGALWRAPPER_API void MeshProcessingOrientation_EIK_ReverseFaceOrientations_SM(void* meshPtr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingRepair.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Polygon_mesh_processing/repair.h>\n#include <CGAL/Polygon_mesh_processing/shape_predicates.h>\n#include <CGAL/Polygon_mesh_processing/manifoldness.h>\n#include <CGAL/Polygon_mesh_processing/repair_polygon_soup.h>\n#include <CGAL/Polygon_mesh_processing/orient_polygon_soup.h>\n#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>\n#include <CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h>\n#include <CGAL/Polygon_mesh_processing/stitch_borders.h>\n#include <CGAL/Polygon_mesh_processing/merge_border_vertices.h>\n\nnamespace PMP = CGAL::Polygon_mesh_processing;\nnamespace NP = CGAL::parameters;\n\ntemplate<class K>\nclass MeshProcessingRepair\n{\n\npublic:\n\n\ttypedef typename K::FT FT;\n\ttypedef typename K::Point_3 Point;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\ttypedef typename boost::graph_traits<Polyhedron>::face_descriptor PFace_Des;\n\n\ttypedef typename CGAL::Surface_mesh<Point> SurfaceMesh;\n\ttypedef typename boost::graph_traits<SurfaceMesh>::face_descriptor SFace_Des;\n\n\ttypedef typename std::vector<std::size_t> PolygonIndex;\n\n\n\tinline static MeshProcessingRepair* NewMeshProcessingRepair()\n\t{\n\t\treturn new MeshProcessingRepair();\n\t}\n\n\tinline static void DeleteMeshProcessingRepair(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingRepair*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingRepair* CastToMeshProcessingRepair(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingRepair*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstatic int DegenerateEdgeCount_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\t//int count = 0;\n\t\t//for (auto edge = mesh->model.edges_begin(); edge != mesh->model.edges_end(); ++edge)\n\t\t//{\n\t\t//\tif (PMP::is_degenerate_edge(edge, mesh->model))\n\t\t//\t\tcount++;\n\t\t//}\n\n\t\treturn 0;\n\t}\n\n\tstatic int DegenerateTriangleCount_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tint count = 0;\n\t\tfor (auto face = mesh->model.facets_begin(); face != mesh->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (PMP::is_degenerate_triangle_face(face, mesh->model))\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int NeedleTriangleCount_PH(void* ptr, double threshold)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tint count = 0;\n\t\tfor (auto face = mesh->model.facets_begin(); face != mesh->model.facets_end(); ++face)\n\t\t{\n\t\t\tif (PMP::is_needle_triangle_face(face, mesh->model, threshold) != nullptr)\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int NonManifoldVertexCount_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tint count = 0;\n\t\tfor (auto vert = mesh->model.vertices_begin(); vert != mesh->model.vertices_end(); ++vert)\n\t\t{\n\t\t\tif (PMP::is_non_manifold_vertex(vert, mesh->model))\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic void RepairPolygonSoup_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tstd::vector<Point> points;\n\t\tstd::vector<PolygonIndex> polygons;\n\n\t\tPMP::polygon_mesh_to_polygon_soup(mesh->model, points, polygons);\n\n\t\tPMP::repair_polygon_soup(points, polygons);\n\n\t\tmesh->model.clear();\n\t\tmesh->OnModelChanged();\n\t\tPMP::polygon_soup_to_polygon_mesh(points, polygons, mesh->model);\n\t}\n\n\tstatic int StitchBoundaryCycles_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::stitch_boundary_cycles(mesh->model);\n\t}\n\n\tstatic int StitchBorders_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::stitch_borders(mesh->model);\n\t}\n\n\tstatic int MergeDuplicatedVerticesInBoundaryCycle_PH(void* ptr, int index)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tint before = (int)mesh->model.size_of_halfedges();\n\n\t\tauto hedge = mesh->FindHalfedgeIter(index);\n\t\tif(hedge != nullptr)\n\t\t\tPMP::merge_duplicated_vertices_in_boundary_cycle(*hedge, mesh->model);\n\n\t\treturn before - (int)mesh->model.size_of_halfedges();\n\t}\n\n\tstatic int MergeDuplicatedVerticesInBoundaryCycles_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tint before = (int)mesh->model.size_of_halfedges();\n\n\t\tPMP::merge_duplicated_vertices_in_boundary_cycles(mesh->model);\n\n\t\treturn before - (int)mesh->model.size_of_halfedges();\n\t}\n\n\tstatic int RemoveIsolatedVertices_PH(void* ptr)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::remove_isolated_vertices(mesh->model);\n\t}\n\n\t//Surface Mesh\n\n\tstatic int DegenerateEdgeCount_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tint count = 0;\n\t\tfor (const auto edge : mesh->model.edges())\n\t\t{\n\t\t\tif (PMP::is_degenerate_edge(edge, mesh->model))\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int DegenerateTriangleCount_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tint count = 0;\n\t\tfor (const auto& face : mesh->model.faces())\n\t\t{\n\t\t\tif (PMP::is_degenerate_triangle_face(face, mesh->model))\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int NeedleTriangleCount_SM(void* ptr, double threshold)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tauto null_edge = SurfaceMesh3<K>::NullHalfedge();\n\n\t\tint count = 0;\n\t\tfor (const auto& face : mesh->model.faces())\n\t\t{\n\t\t\tif (PMP::is_needle_triangle_face(face, mesh->model, threshold) != null_edge)\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic int NonManifoldVertexCount_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tint count = 0;\n\t\tfor (const auto& vert : mesh->model.vertices())\n\t\t{\n\t\t\tif (PMP::is_non_manifold_vertex(vert, mesh->model))\n\t\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tstatic void RepairPolygonSoup_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tstd::vector<Point> points;\n\t\tstd::vector<PolygonIndex> polygons;\n\n\t\tPMP::polygon_mesh_to_polygon_soup(mesh->model, points, polygons);\n\n\t\tPMP::repair_polygon_soup(points, polygons);\n\n\t\tmesh->model.clear();\n\t\tmesh->OnModelChanged();\n\t\tPMP::polygon_soup_to_polygon_mesh(points, polygons, mesh->model);\n\t}\n\n\tstatic int StitchBoundaryCycles_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::stitch_boundary_cycles(mesh->model);\n\t}\n\n\tstatic int StitchBorders_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::stitch_borders(mesh->model);\n\t}\n\n\tstatic int MergeDuplicatedVerticesInBoundaryCycle_SM(void* ptr, int index)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tint before = (int)mesh->model.number_of_halfedges();\n\n\t\tauto hedge = mesh->FindHalfedge(index);\n\t\tif (hedge != SurfaceMesh3<K>::NullHalfedge())\n\t\t\tPMP::merge_duplicated_vertices_in_boundary_cycle(hedge, mesh->model);\n\n\t\treturn before - (int)mesh->model.number_of_halfedges();\n\t}\n\n\tstatic int MergeDuplicatedVerticesInBoundaryCycles_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\t\tmesh->OnModelChanged();\n\n\t\tint before = (int)mesh->model.number_of_halfedges();\n\n\t\tPMP::merge_duplicated_vertices_in_boundary_cycles(mesh->model);\n\n\t\treturn before - (int)mesh->model.number_of_halfedges();\n\t}\n\n\tstatic int RemoveIsolatedVertices_SM(void* ptr)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(ptr);\n\n\t\tmesh->OnModelChanged();\n\t\treturn (int)PMP::remove_isolated_vertices(mesh->model);\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingRepair_EEK.cpp",
    "content": "#include \"MeshProcessingRepair_EEK.h\"\n#include \"MeshProcessingRepair.h\"\n\nvoid* MeshProcessingRepair_EEK_Create()\n{\n\treturn MeshProcessingRepair<EEK>::NewMeshProcessingRepair();\n}\n\nvoid MeshProcessingRepair_EEK_Release(void* ptr)\n{\n\tMeshProcessingRepair<EEK>::DeleteMeshProcessingRepair(ptr);\n}\n\n//Polyhedron\n\nint MeshProcessingRepair_EEK_DegenerateEdgeCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::DegenerateEdgeCount_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_DegenerateTriangleCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::DegenerateTriangleCount_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_NeedleTriangleCount_PH(void* ptr, double threshold)\n{\n\treturn MeshProcessingRepair<EEK>::NeedleTriangleCount_PH(ptr, threshold);\n}\n\nint MeshProcessingRepair_EEK_NonManifoldVertexCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::NonManifoldVertexCount_PH(ptr);\n}\n\nvoid MeshProcessingRepair_EEK_RepairPolygonSoup_PH(void* ptr)\n{\n\tMeshProcessingRepair<EEK>::RepairPolygonSoup_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_StitchBoundaryCycles_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::StitchBoundaryCycles_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_StitchBorders_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::StitchBorders_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_PH(void* ptr, int index)\n{\n\treturn MeshProcessingRepair<EEK>::MergeDuplicatedVerticesInBoundaryCycle_PH(ptr, index);\n}\n\nint MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::MergeDuplicatedVerticesInBoundaryCycles_PH(ptr);\n}\n\nint MeshProcessingRepair_EEK_RemoveIsolatedVertices_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::RemoveIsolatedVertices_PH(ptr);\n}\n\n//SurfaceMesh\n\nint MeshProcessingRepair_EEK_DegenerateEdgeCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::DegenerateEdgeCount_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_DegenerateTriangleCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::DegenerateTriangleCount_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_NeedleTriangleCount_SM(void* ptr, double threshold)\n{\n\treturn MeshProcessingRepair<EEK>::NeedleTriangleCount_SM(ptr, threshold);\n}\n\nint MeshProcessingRepair_EEK_NonManifoldVertexCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::NonManifoldVertexCount_SM(ptr);\n}\n\nvoid MeshProcessingRepair_EEK_RepairPolygonSoup_SM(void* ptr)\n{\n\tMeshProcessingRepair<EEK>::RepairPolygonSoup_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_StitchBoundaryCycles_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::StitchBoundaryCycles_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_StitchBorders_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::StitchBorders_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_SM(void* ptr, int index)\n{\n\treturn MeshProcessingRepair<EEK>::MergeDuplicatedVerticesInBoundaryCycle_SM(ptr, index);\n}\n\nint MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::MergeDuplicatedVerticesInBoundaryCycles_SM(ptr);\n}\n\nint MeshProcessingRepair_EEK_RemoveIsolatedVertices_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EEK>::RemoveIsolatedVertices_SM(ptr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingRepair_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingRepair_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EEK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_DegenerateEdgeCount_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_DegenerateTriangleCount_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_NeedleTriangleCount_PH(void* ptr, double threshold);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_NonManifoldVertexCount_PH(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EEK_RepairPolygonSoup_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_StitchBoundaryCycles_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_StitchBorders_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_PH(void* ptr, int index);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_RemoveIsolatedVertices_PH(void* ptr);\n\n\t//SurfaceMesh\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_DegenerateEdgeCount_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_DegenerateTriangleCount_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_NeedleTriangleCount_SM(void* ptr, double threshold);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_NonManifoldVertexCount_SM(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EEK_RepairPolygonSoup_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_StitchBoundaryCycles_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_StitchBorders_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycle_SM(void* ptr, int index);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_MergeDuplicatedVerticesInBoundaryCycles_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EEK_RemoveIsolatedVertices_SM(void* ptr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingRepair_EIK.cpp",
    "content": "#include \"MeshProcessingRepair_EIK.h\"\n#include \"MeshProcessingRepair.h\"\n\nvoid* MeshProcessingRepair_EIK_Create()\n{\n\treturn MeshProcessingRepair<EIK>::NewMeshProcessingRepair();\n}\n\nvoid MeshProcessingRepair_EIK_Release(void* ptr)\n{\n\tMeshProcessingRepair<EIK>::DeleteMeshProcessingRepair(ptr);\n}\n\n//Polyhedron\n\nint MeshProcessingRepair_EIK_DegenerateEdgeCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::DegenerateEdgeCount_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_DegenerateTriangleCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::DegenerateTriangleCount_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_NeedleTriangleCount_PH(void* ptr, double threshold)\n{\n\treturn MeshProcessingRepair<EIK>::NeedleTriangleCount_PH(ptr, threshold);\n}\n\nint MeshProcessingRepair_EIK_NonManifoldVertexCount_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::NonManifoldVertexCount_PH(ptr);\n}\n\nvoid MeshProcessingRepair_EIK_RepairPolygonSoup_PH(void* ptr)\n{\n\tMeshProcessingRepair<EIK>::RepairPolygonSoup_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_StitchBoundaryCycles_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::StitchBoundaryCycles_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_StitchBorders_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::StitchBorders_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_PH(void* ptr, int index)\n{\n\treturn MeshProcessingRepair<EIK>::MergeDuplicatedVerticesInBoundaryCycle_PH(ptr, index);\n}\n\nint MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::MergeDuplicatedVerticesInBoundaryCycles_PH(ptr);\n}\n\nint MeshProcessingRepair_EIK_RemoveIsolatedVertices_PH(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::RemoveIsolatedVertices_PH(ptr);\n}\n\n//SurfaceMesh\n\nint MeshProcessingRepair_EIK_DegenerateEdgeCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::DegenerateEdgeCount_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_DegenerateTriangleCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::DegenerateTriangleCount_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_NeedleTriangleCount_SM(void* ptr, double threshold)\n{\n\treturn MeshProcessingRepair<EIK>::NeedleTriangleCount_SM(ptr, threshold);\n}\n\nint MeshProcessingRepair_EIK_NonManifoldVertexCount_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::NonManifoldVertexCount_SM(ptr);\n}\n\nvoid MeshProcessingRepair_EIK_RepairPolygonSoup_SM(void* ptr)\n{\n\tMeshProcessingRepair<EIK>::RepairPolygonSoup_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_StitchBoundaryCycles_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::StitchBoundaryCycles_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_StitchBorders_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::StitchBorders_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_SM(void* ptr, int index)\n{\n\treturn MeshProcessingRepair<EIK>::MergeDuplicatedVerticesInBoundaryCycle_SM(ptr, index);\n}\n\nint MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::MergeDuplicatedVerticesInBoundaryCycles_SM(ptr);\n}\n\nint MeshProcessingRepair_EIK_RemoveIsolatedVertices_SM(void* ptr)\n{\n\treturn MeshProcessingRepair<EIK>::RemoveIsolatedVertices_SM(ptr);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingRepair_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingRepair_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EIK_Release(void* ptr);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_DegenerateEdgeCount_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_DegenerateTriangleCount_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_NeedleTriangleCount_PH(void* ptr, double threshold);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_NonManifoldVertexCount_PH(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EIK_RepairPolygonSoup_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_StitchBoundaryCycles_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_StitchBorders_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_PH(void* ptr, int index);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_PH(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_RemoveIsolatedVertices_PH(void* ptr);\n\n\t//SurfaceMesh\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_DegenerateEdgeCount_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_DegenerateTriangleCount_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_NeedleTriangleCount_SM(void* ptr, double threshold);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_NonManifoldVertexCount_SM(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingRepair_EIK_RepairPolygonSoup_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_StitchBoundaryCycles_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_StitchBorders_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycle_SM(void* ptr, int index);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_MergeDuplicatedVerticesInBoundaryCycles_SM(void* ptr);\n\n\tCGALWRAPPER_API int MeshProcessingRepair_EIK_RemoveIsolatedVertices_SM(void* ptr);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingSlicer.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n#include \"../Polylines/Polyline3.h\"\n\n#include <vector>\n#include <list>\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Polygon_mesh_slicer.h>\n#include <CGAL/AABB_halfedge_graph_segment_primitive.h>\n#include <CGAL/AABB_tree.h>\n#include <CGAL/AABB_traits.h>\n\ntemplate<class K>\nclass MeshProcessingSlicer\n{\n\npublic:\n\n\ttypedef typename K::FT FT;\n\ttypedef typename K::Point_3 Point;\n\ttypedef typename K::Vector_3 Vector;\n\ttypedef typename K::Plane_3 Plane;\n\ttypedef typename std::vector<Point> PointList;\n\ttypedef typename std::vector<PointList> PolylineList;\n\n\ttypedef CGAL::Polyhedron_3<K> Polyhedron;\n\n\ttypedef CGAL::AABB_halfedge_graph_segment_primitive<Polyhedron> PHGSP;\n\ttypedef CGAL::AABB_traits<K, PHGSP> PAABB_traits;\n\ttypedef CGAL::AABB_tree<PAABB_traits> PAABB_tree;\n\n\ttypedef typename CGAL::Surface_mesh<Point> SurfaceMesh;\n\n\ttypedef CGAL::AABB_halfedge_graph_segment_primitive<SurfaceMesh> SHGSP;\n\ttypedef CGAL::AABB_traits<K, SHGSP> SAABB_traits;\n\ttypedef CGAL::AABB_tree<SAABB_traits> SAABB_tree;\n\nprivate:\n\n\tPolylineList lines;\n\npublic:\n\n\tinline static MeshProcessingSlicer* NewMeshProcessingSlicer()\n\t{\n\t\treturn new MeshProcessingSlicer();\n\t}\n\n\tinline static void DeleteMeshProcessingSlicer(void* ptr)\n\t{\n\t\tauto obj = static_cast<MeshProcessingSlicer*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static MeshProcessingSlicer* CastToMeshProcessingSlicer(void* ptr)\n\t{\n\t\treturn static_cast<MeshProcessingSlicer*>(ptr);\n\t}\n\n\tstatic void GetLines(void* slicerPtr, void** lines, int count)\n\t{\n\t\tauto slicer = CastToMeshProcessingSlicer(slicerPtr);\n\n\t\tauto size = slicer->lines.size();\n\t\tif (size == 0) return;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tlines[i] = Polyline3<K>::NewPolyline3(slicer->lines[i]);\n\t\t\n\t\t\tif (i >= size) break;\n\t\t}\n\n\t\tslicer->lines.clear();\n\t}\n\n\t//Polyhedron\n\n\tstatic int Polyhedron_Slice_PH(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n\t{\n\t\tauto scr = CastToMeshProcessingSlicer(slicerPtr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tscr->lines.clear();\n\n\t\tif (useTree)\n\t\t{\n\t\t\tPAABB_tree tree(edges(mesh->model).first, edges(mesh->model).second, mesh->model);\n\t\t\tCGAL::Polygon_mesh_slicer<Polyhedron, K> slicer_aabb(mesh->model, tree);\n\t\t\tslicer_aabb(plane.ToCGAL<K, Plane>(), std::back_inserter(scr->lines));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCGAL::Polygon_mesh_slicer<Polyhedron, K> slicer(mesh->model);\n\t\t\tslicer(plane.ToCGAL<K, Plane>(), std::back_inserter(scr->lines));\n\t\t}\n\n\t\treturn (int)scr->lines.size();\n\t}\n\n\tstatic int Polyhedron_Slice_PH(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n\t{\n\t\tif (increment <= 0)\n\t\t\treturn 0;\n\n\t\tauto scr = CastToMeshProcessingSlicer(slicerPtr);\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\n\t\tscr->lines.clear();\n\n\t\tauto s = start.ToCGAL<K>();\n\t\tauto e = end.ToCGAL<K>();\n\n\t\tauto sq = CGAL::squared_distance(s, e);\n\t\tif (sq == FT(0)) return 0;\n\n\t\tauto len = CGAL::approximate_sqrt(sq);\n\t\tauto inc = FT(increment);\n\n\t\tauto dir = (e - s) / len;\n\t\tauto current = FT(0);\n\n\t\tPAABB_tree tree(edges(mesh->model).first, edges(mesh->model).second, mesh->model);\n\t\tCGAL::Polygon_mesh_slicer<Polyhedron, K> slicer_aabb(mesh->model, tree);\n\n\t\twhile (current < len)\n\t\t{\n\t\t\tPoint p = s + dir * current;\n\t\t\tauto plane = Plane(p, dir);\n\n\t\t\tslicer_aabb(plane, std::back_inserter(scr->lines));\n\n\t\t\tcurrent += inc;\n\t\t}\n\n\t\treturn (int)scr->lines.size();\n\t}\n\n\t//SurfaceMesh\n\n\tstatic int Polyhedron_Slice_SM(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n\t{\n\t\tauto scr = CastToMeshProcessingSlicer(slicerPtr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tscr->lines.clear();\n\n\t\tif (useTree)\n\t\t{\n\t\t\tSAABB_tree tree(edges(mesh->model).first, edges(mesh->model).second, mesh->model);\n\t\t\tCGAL::Polygon_mesh_slicer<SurfaceMesh, K> slicer_aabb(mesh->model, tree);\n\t\t\tslicer_aabb(plane.ToCGAL<K, Plane>(), std::back_inserter(scr->lines));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCGAL::Polygon_mesh_slicer<SurfaceMesh, K> slicer(mesh->model);\n\t\t\tslicer(plane.ToCGAL<K, Plane>(), std::back_inserter(scr->lines));\n\t\t}\n\n\t\treturn (int)scr->lines.size();\n\t}\n\n\tstatic int Polyhedron_Slice_SM(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n\t{\n\t\tif (increment <= 0)\n\t\t\treturn 0;\n\n\t\tauto scr = CastToMeshProcessingSlicer(slicerPtr);\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\n\t\tscr->lines.clear();\n\n\t\tauto s = start.ToCGAL<K>();\n\t\tauto e = end.ToCGAL<K>();\n\n\t\tauto sq = CGAL::squared_distance(s, e);\n\t\tif (sq == FT(0)) return 0;\n\n\t\tauto len = CGAL::approximate_sqrt(sq);\n\t\tauto inc = FT(increment);\n\n\t\tauto dir = (e - s) / len;\n\t\tauto current = FT(0);\n\n\t\tSAABB_tree tree(edges(mesh->model).first, edges(mesh->model).second, mesh->model);\n\t\tCGAL::Polygon_mesh_slicer<SurfaceMesh, K> slicer_aabb(mesh->model, tree);\n\n\t\twhile (current < len)\n\t\t{\n\t\t\tPoint p = s + dir * current;\n\t\t\tauto plane = Plane(p, dir);\n\n\t\t\tslicer_aabb(plane, std::back_inserter(scr->lines));\n\n\t\t\tcurrent += inc;\n\t\t}\n\n\t\treturn (int)scr->lines.size();\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingSlicer_EEK.cpp",
    "content": "#include \"MeshProcessingSlicer_EEK.h\"\n#include \"MeshProcessingSlicer.h\"\n\nvoid* MeshProcessingSlicer_EEK_Create()\n{\n\treturn MeshProcessingSlicer<EEK>::NewMeshProcessingSlicer();\n}\n\nvoid MeshProcessingSlicer_EEK_Release(void* ptr)\n{\n\tMeshProcessingSlicer<EEK>::DeleteMeshProcessingSlicer(ptr);\n}\n\nvoid MeshProcessingSlicer_EEK_GetLines(void* slicerPtr, void** lines, int count)\n{\n\tMeshProcessingSlicer<EEK>::GetLines(slicerPtr, lines, count);\n}\n\n//Polyhedron\n\nint MeshProcessingSlicer_EEK_Slice_PH(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n{\n\treturn MeshProcessingSlicer<EEK>::Polyhedron_Slice_PH(slicerPtr, meshPtr, plane, useTree);\n}\n\nint MeshProcessingSlicer_EEK_IncrementalSlice_PH(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n{\n\treturn MeshProcessingSlicer<EEK>::Polyhedron_Slice_PH(slicerPtr, meshPtr, start, end, increment);\n}\n\n//SUrfaceMesh\n\nint MeshProcessingSlicer_EEK_Slice_SM(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n{\n\treturn MeshProcessingSlicer<EEK>::Polyhedron_Slice_SM(slicerPtr, meshPtr, plane, useTree);\n}\n\nint MeshProcessingSlicer_EEK_IncrementalSlice_SM(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n{\n\treturn MeshProcessingSlicer<EEK>::Polyhedron_Slice_SM(slicerPtr, meshPtr, start, end, increment);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingSlicer_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingSlicer_EEK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingSlicer_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingSlicer_EEK_GetLines(void* slicerPtr, void** lines, int count);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EEK_Slice_PH(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree);\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EEK_IncrementalSlice_PH(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EEK_Slice_SM(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree);\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EEK_IncrementalSlice_SM(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingSlicer_EIK.cpp",
    "content": "#include \"MeshProcessingSlicer_EIK.h\"\n#include \"MeshProcessingSlicer.h\"\n\nvoid* MeshProcessingSlicer_EIK_Create()\n{\n\treturn MeshProcessingSlicer<EIK>::NewMeshProcessingSlicer();\n}\n\nvoid MeshProcessingSlicer_EIK_Release(void* ptr)\n{\n\tMeshProcessingSlicer<EIK>::DeleteMeshProcessingSlicer(ptr);\n}\n\nvoid MeshProcessingSlicer_EIK_GetLines(void* slicerPtr, void** lines, int count)\n{\n\tMeshProcessingSlicer<EIK>::GetLines(slicerPtr, lines, count);\n}\n\n//Polyhedron\n\nint MeshProcessingSlicer_EIK_Slice_PH(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n{\n\treturn MeshProcessingSlicer<EIK>::Polyhedron_Slice_PH(slicerPtr, meshPtr, plane, useTree);\n}\n\nint MeshProcessingSlicer_EIK_IncrementalSlice_PH(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n{\n\treturn MeshProcessingSlicer<EIK>::Polyhedron_Slice_PH(slicerPtr, meshPtr, start, end, increment);\n}\n\n//SUrfaceMesh\n\nint MeshProcessingSlicer_EIK_Slice_SM(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree)\n{\n\treturn MeshProcessingSlicer<EIK>::Polyhedron_Slice_SM(slicerPtr, meshPtr, plane, useTree);\n}\n\nint MeshProcessingSlicer_EIK_IncrementalSlice_SM(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment)\n{\n\treturn MeshProcessingSlicer<EIK>::Polyhedron_Slice_SM(slicerPtr, meshPtr, start, end, increment);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/MeshProcessingSlicer_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* MeshProcessingSlicer_EIK_Create();\n\n\tCGALWRAPPER_API void MeshProcessingSlicer_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void MeshProcessingSlicer_EIK_GetLines(void* slicerPtr, void** lines, int count);\n\n\t//Polyhedron\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EIK_Slice_PH(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree);\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EIK_IncrementalSlice_PH(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment);\n\n\t//Surface Mesh\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EIK_Slice_SM(void* slicerPtr, void* meshPtr, const Plane3d& plane, BOOL useTree);\n\n\tCGALWRAPPER_API int MeshProcessingSlicer_EIK_IncrementalSlice_SM(void* slicerPtr, void* meshPtr, const Point3d& start, const Point3d& end, double increment);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSimplification.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Surface_mesh_simplification/edge_collapse.h>\n#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h>\n\ntemplate<class K>\nclass SurfaceSimplification\n{\n\npublic:\n\n\ttypedef typename K::Point_3 Point;\n\n\ttypedef CGAL::Polyhedron_3<K, CGAL::Polyhedron_items_with_id_3> Polyhedron;\n\n\ttypedef typename CGAL::Surface_mesh<Point> SurfaceMesh;\n\n\tinline static SurfaceSimplification* NewSimplification()\n\t{\n\t\treturn new SurfaceSimplification();\n\t}\n\n\tinline static void DeleteSurfaceSimplification(void* ptr)\n\t{\n\t\tauto obj = static_cast<SurfaceSimplification*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static SurfaceSimplification* CastToSimplification(void* ptr)\n\t{\n\t\treturn static_cast<SurfaceSimplification*>(ptr);\n\t}\n\n\n\tstatic void Simplify_PH(void* polyPtr, double stop_ratio)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(polyPtr);\n\n\t\tCGAL::Surface_mesh_simplification::Count_ratio_stop_predicate<Polyhedron> stop(stop_ratio);\n\t\tCGAL::Surface_mesh_simplification::edge_collapse(mesh->model, stop);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Simplify_SM(void* polyPtr, double stop_ratio)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(polyPtr);\n\n\t\tCGAL::Surface_mesh_simplification::Count_ratio_stop_predicate<SurfaceMesh> stop(stop_ratio);\n\t\tCGAL::Surface_mesh_simplification::edge_collapse(mesh->model, stop);\n\t\tmesh->OnModelChanged();\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSimplification_EIK.cpp",
    "content": "#include \"SurfaceSimplification_EIK.h\"\n#include \"SurfaceSimplification.h\"\n\nvoid* SurfaceSimplification_EIK_Create()\n{\n\treturn SurfaceSimplification<EIK>::NewSimplification();\n}\n\nvoid SurfaceSimplification_EIK_Release(void* ptr)\n{\n\tSurfaceSimplification<EIK>::DeleteSurfaceSimplification(ptr);\n}\n\nvoid SurfaceSimplification_EIK_Simplify_PH(void* meshPtr, double stop_ratio)\n{\n\tSurfaceSimplification<EIK>::Simplify_PH(meshPtr, stop_ratio);\n}\n\nvoid SurfaceSimplification_EIK_Simplify_SM(void* meshPtr, double stop_ratio)\n{\n\tSurfaceSimplification<EIK>::Simplify_SM(meshPtr, stop_ratio);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSimplification_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SurfaceSimplification_EIK_Create();\n\n\tCGALWRAPPER_API void SurfaceSimplification_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void SurfaceSimplification_EIK_Simplify_PH(void* meshPtr, double stop_ratio);\n\n\tCGALWRAPPER_API void SurfaceSimplification_EIK_Simplify_SM(void* meshPtr, double stop_ratio);\n}"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSubdivision.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Polyhedra/Polyhedron3.h\"\n#include \"../Polyhedra/SurfaceMesh3.h\"\n\n#include <CGAL/Polyhedron_3.h>\n#include <CGAL/Polyhedron_items_with_id_3.h>\n#include <CGAL/Subdivision_method_3/subdivision_methods_3.h>\n\ntemplate<class K>\nclass SurfaceSubdivision\n{\n\npublic:\n\n\tinline static SurfaceSubdivision* NewSurfaceSubdivision()\n\t{\n\t\treturn new SurfaceSubdivision();\n\t}\n\n\tinline static void DeleteSurfaceSubdivision(void* ptr)\n\t{\n\t\tauto obj = static_cast<SurfaceSubdivision*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static SurfaceSubdivision* CastToSurfaceSubdivision(void* ptr)\n\t{\n\t\treturn static_cast<SurfaceSubdivision*>(ptr);\n\t}\n\n\t//Polyhedron\n\n\tstatic void Subdive_CatmullClark_PH(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::CatmullClark_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_DooSabin_PH(void* meshPtr, int iterations)\n\t{\n\t\t//auto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\t//auto param = CGAL::parameters::number_of_iterations(iterations);\n\t\t//CGAL::Subdivision_method_3::DooSabin_subdivision(mesh->model, param);\n\t\t//mesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_Loop_PH(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::Loop_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_Sqrt3_PH(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = Polyhedron3<K>::CastToPolyhedron(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::Sqrt3_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\t//Surface mesh\n\n\tstatic void Subdive_CatmullClark_SM(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::CatmullClark_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_DooSabin_SM(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::DooSabin_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_Loop_SM(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::Loop_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n\tstatic void Subdive_Sqrt3_SM(void* meshPtr, int iterations)\n\t{\n\t\tauto mesh = SurfaceMesh3<K>::CastToSurfaceMesh(meshPtr);\n\t\tauto param = CGAL::parameters::number_of_iterations(iterations);\n\t\tCGAL::Subdivision_method_3::Sqrt3_subdivision(mesh->model, param);\n\t\tmesh->OnModelChanged();\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSubdivision_EEK.cpp",
    "content": "#include \"SurfaceSubdivision_EEK.h\"\n#include \"SurfaceSubdivision.h\"\n\nvoid* SurfaceSubdivision_EEK_Create()\n{\n\treturn SurfaceSubdivision<EEK>::NewSurfaceSubdivision();\n}\n\nvoid SurfaceSubdivision_EEK_Release(void* ptr)\n{\n\tSurfaceSubdivision<EEK>::DeleteSurfaceSubdivision(ptr);\n}\n\n//Polyhedron\n\nvoid SurfaceSubdivision_EEK_Subdive_CatmullClark_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_CatmullClark_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_Loop_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_Loop_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_Sqrt3_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_Sqrt3_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_DooSabin_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_DooSabin_PH(meshPtr, iterations);\n}\n\n//Surface Mesh\n\nvoid SurfaceSubdivision_EEK_Subdive_CatmullClark_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_CatmullClark_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_Loop_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_Sqrt3_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EEK_Subdive_DooSabin_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EEK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSubdivision_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SurfaceSubdivision_EEK_Create();\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Release(void* ptr);\n\n\t// Polyhedron\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_CatmullClark_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_DooSabin_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_Loop_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_Sqrt3_PH(void* meshPtr, int iterations);\n\n\t//Surface Mesh \n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_CatmullClark_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_DooSabin_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_Loop_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EEK_Subdive_Sqrt3_SM(void* meshPtr, int iterations);\n\n}"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSubdivision_EIK.cpp",
    "content": "#include \"SurfaceSubdivision_EIK.h\"\n#include \"SurfaceSubdivision.h\"\n\nvoid* SurfaceSubdivision_EIK_Create()\n{\n\treturn SurfaceSubdivision<EIK>::NewSurfaceSubdivision();\n}\n\nvoid SurfaceSubdivision_EIK_Release(void* ptr)\n{\n\tSurfaceSubdivision<EIK>::DeleteSurfaceSubdivision(ptr);\n}\n\n//Polyhedron\n\nvoid SurfaceSubdivision_EIK_Subdive_CatmullClark_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_CatmullClark_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_Loop_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_Loop_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_Sqrt3_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_Sqrt3_PH(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_DooSabin_PH(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_DooSabin_PH(meshPtr, iterations);\n}\n\n//Surface Mesh\n\nvoid SurfaceSubdivision_EIK_Subdive_CatmullClark_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_CatmullClark_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_Loop_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_Sqrt3_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n\nvoid SurfaceSubdivision_EIK_Subdive_DooSabin_SM(void* meshPtr, int iterations)\n{\n\tSurfaceSubdivision<EIK>::Subdive_Loop_SM(meshPtr, iterations);\n}\n"
  },
  {
    "path": "CGALWrapper/Processing/SurfaceSubdivision_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* SurfaceSubdivision_EIK_Create();\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Release(void* ptr);\n\n\t// Polyhedron\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_CatmullClark_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_DooSabin_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_Loop_PH(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_Sqrt3_PH(void* meshPtr, int iterations);\n\n\t//Surface Mesh \n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_CatmullClark_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_DooSabin_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_Loop_SM(void* meshPtr, int iterations);\n\n\tCGALWRAPPER_API void SurfaceSubdivision_EIK_Subdive_Sqrt3_SM(void* meshPtr, int iterations);\n\n}"
  },
  {
    "path": "CGALWrapper/Triangulations/BaseTriangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"TriUtil.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriEdge2.h\"\n#include \"TriangulationMap2.h\"\n\n#include <vector>\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Aff_transformation_2.h>\n#include <CGAL/Cartesian_converter.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass BaseTriangulation2\n{\n\npublic:\n\n\ttypedef typename K::Point_2 Point_2;\n\ttypedef CGAL::Aff_transformation_2<K> Transformation_2;\n\n\tTRI model;\n\n\tTriangulationMap2<K, VERT, FACE> map;\n\n\tvoid Clear()\n\t{\n\t\tmodel.clear();\n\t\tmap.ClearMaps();\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid SetIndices()\n\t{\n\t\tmap.OnModelChanged();\n\t\tmap.SetIndices(model);\n\t}\n\n\tint BuildStamp()\n\t{\n\t\treturn map.BuildStamp();\n\t}\n\n\tBOOL IsValid(int level)\n\t{\n\t\treturn model.is_valid(level);\n\t}\n\n\tint VertexCount()\n\t{\n\t\treturn (int)model.number_of_vertices();\n\t}\n\n\tint FaceCount()\n\t{\n\t\treturn (int)model.number_of_faces();\n\t}\n\n\tvoid InsertPoint(Point2d point)\n\t{\n\t\tmodel.insert(point.ToCGAL<K>());\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid InsertPoints(Point2d* points, int count)\n\t{\n\t\tstd::vector<Point_2> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\n\t\tmodel.insert(list.begin(), list.end());\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid InsertPolygon(void* polyPtr)\n\t{\n\t\tauto polygon = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\tmodel.insert(polygon->vertices_begin(), polygon->vertices_end());\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid InsertPolygonWithHoles(void* pwhPtr)\n\t{\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tmodel.insert(pwh->outer_boundary().vertices_begin(), pwh->outer_boundary().vertices_end());\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t\tmodel.insert(hole.vertices_begin(), hole.vertices_end());\n\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid InsertPoints(std::vector<Point_2>& points)\n\t{\n\t\tfor (auto iter = points.begin(); iter != points.end(); ++iter)\n\t\t\tmodel.insert(*iter);\n\n\t\tmap.OnModelChanged();\n\t}\n\n\tvoid GetPoints(std::vector<Point_2>& points)\n\t{\n\t\tfor (const auto& vert : model.finite_vertex_handles())\n\t\t\tpoints.push_back(vert->point());\n\t}\n\n\tvoid GetPoints(Point2d* points, int count)\n\t{\n\t\tint i = 0;\n\t\tfor (const auto& vert : model.finite_vertex_handles())\n\t\t\tpoints[i++] = Point2d::FromCGAL<K>(vert->point());\n\t}\n\n\tvoid GetIndices(int* indices, int count)\n\t{\n\t\tint index = 0;\n\t\tmap.SetVertexIndices(model);\n\n\t\tfor (auto& face : model.finite_face_handles())\n\t\t{\n\t\t\tindices[index * 3 + 0] = face->vertex(0)->info();\n\t\t\tindices[index * 3 + 1] = face->vertex(1)->info();\n\t\t\tindices[index * 3 + 2] = face->vertex(2)->info();\n\n\t\t\tindex++;\n\t\t}\n\t}\n\n\tBOOL GetVertex(int index, TriVertex2& triVert)\n\t{\n\t\tmap.SetIndices(model);\n\n\t\tauto vert = map.FindVertex(model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tint degree = TriUtil::Degree2(model, *vert);\n\t\t\ttriVert = TriVertex2::FromVertex<K>(model, *vert, degree);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriVert = TriVertex2::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetVertices(TriVertex2* vertices, int count)\n\t{\n\t\tint i = 0;\n\n\t\tmap.SetIndices(model);\n\n\t\tfor (const auto& vert : model.finite_vertex_handles())\n\t\t{\n\t\t\tint degree = TriUtil::Degree2(model, vert);\n\t\t\tvertices[i++] = TriVertex2::FromVertex<K>(model, vert, degree);\n\t\t}\n\t}\n\n\tBOOL GetFace(int index, TriFace2& triFace)\n\t{\n\t\tmap.SetIndices(model);\n\n\t\tauto face = map.FindFace(model, index);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\ttriFace = TriFace2::FromFace(model, *face);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriFace = TriFace2::NullFace();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetFaces(TriFace2* faces, int count)\n\t{\n\t\tint i = 0;\n\n\t\tmap.SetIndices(model);\n\n\t\tfor (const auto& face : model.finite_face_handles())\n\t\t\tfaces[i++] = TriFace2::FromFace(model, face);\n\t}\n\n\tBOOL GetSegment(int faceIndex, int neighbourIndex, Segment2d& segment)\n\t{\n\t\tif (neighbourIndex < 0 || neighbourIndex > 2)\n\t\t\treturn FALSE;\n\n\t\tauto face = map.FindFace(model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tif (model.is_infinite(*face))\n\t\t\t\treturn FALSE;\n\n\t\t\tauto seg = model.segment(*face, neighbourIndex);\n\t\t\tsegment = Segment2d::FromCGAL<K>(seg[0], seg[1]);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tsegment = {};\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tBOOL GetTriangle(int faceIndex, Triangle2d& triangle)\n\t{\n\t\tauto face = map.FindFace(model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tif (model.is_infinite(*face))\n\t\t\t\treturn FALSE;\n\n\t\t\tauto t = model.triangle(*face);\n\t\t\ttriangle = Triangle2d::FromCGAL<K>(t[0], t[1], t[2]);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriangle = {};\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetTriangles(Triangle2d* triangles, int count)\n\t{\n\t\tint i = 0;\n\t\tfor (const auto& face : model.finite_face_handles())\n\t\t{\n\t\t\tauto t = model.triangle(face);\n\t\t\ttriangles[i++] = Triangle2d::FromCGAL<K>(t[0], t[1], t[2]);\n\t\t}\n\t}\n\n\tBOOL GetCircumcenter(int faceIndex, Point2d& circumcenter)\n\t{\n\t\tauto face = map.FindFace(model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tif (model.is_infinite(*face))\n\t\t\t\treturn FALSE;\n\n\t\t\tauto c = model.circumcenter(*face);\n\t\t\tcircumcenter = Point2d::FromCGAL<K>(c);\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcircumcenter = { 0, 0 };\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetCircumcenters(Point2d* circumcenters, int count)\n\t{\n\t\tint i = 0;\n\t\tfor (const auto& face : model.finite_face_handles())\n\t\t{\n\t\t\tauto c = model.circumcenter(face);\n\t\t\tcircumcenters[i++] = Point2d::FromCGAL<K>(c);\n\t\t}\n\t}\n\n\tint NeighbourIndex(int faceIndex, int index)\n\t{\n\t\tif (index < 0 || index > 2)\n\t\t\treturn -1;\n\n\t\t map.SetFaceIndices( model);\n\n\t\tauto face =  map.FindFace( model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tauto neighbour = (*face)->neighbor(index);\n\n\t\t\tif (neighbour != nullptr)\n\t\t\t\treturn neighbour->info();\n\t\t\telse\n\t\t\t\treturn -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tBOOL LocateFace(Point2d point, TriFace2& triFace)\n\t{\n\t\t map.SetIndices( model);\n\n\t\tauto face =  model.locate(point.ToCGAL<K>());\n\t\tif (face != nullptr)\n\t\t{\n\t\t\ttriFace = TriFace2::FromFace( model, face);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriFace = TriFace2::NullFace();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tBOOL MoveVertex(int index, Point2d point, BOOL ifNoCollision, TriVertex2& triVert)\n\t{\n\t\tauto vert =  map.FindVertex( model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tVERT v;\n\n\t\t\tif (ifNoCollision)\n\t\t\t\tv =  model.move(*vert, point.ToCGAL<K>());\n\t\t\telse\n\t\t\t\tv =  model.move_if_no_collision(*vert, point.ToCGAL<K>());\n\n\t\t\tif (v != *vert)\n\t\t\t\t map.OnModelChanged();\n\n\t\t\tint degree = TriUtil::Degree2( model, v);\n\t\t\ttriVert = TriVertex2::FromVertex<K>( model, v, degree);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriVert = TriVertex2::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tBOOL RemoveVertex(int index)\n\t{\n\t\tauto vert =  map.FindVertex( model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\t model.remove(*vert);\n\t\t\t map.OnModelChanged();\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tBOOL FlipEdge(int faceIndex, int neighbourIndex)\n\t{\n\t\tif (neighbourIndex < 0 || neighbourIndex > 2)\n\t\t\treturn FALSE;\n\n\t\tauto face =  map.FindFace( model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tif ( model.is_infinite(*face))\n\t\t\t\treturn FALSE;\n\n\t\t\t model.flip(*face, neighbourIndex);\n\t\t\t map.OnModelChanged();\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid Transform(Point2d translation, double rotation, double scale)\n\t{\n\t\tTransformation_2 T(CGAL::TRANSLATION, translation.ToVector<K>());\n\t\tTransformation_2 R(CGAL::ROTATION, sin(rotation), cos(rotation));\n\t\tTransformation_2 S(CGAL::SCALING, scale);\n\n\t\tauto M = T * R * S;\n\t\tfor (auto& vert :  model.finite_vertex_handles())\n\t\t\tvert->point() = M(vert->point());\n\t}\n\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/BaseTriangulation3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"TriUtil.h\"\n#include \"TriVertex3.h\"\n#include \"TriCell3.h\"\n\n#include <vector>\n#include <unordered_map>\n#include \"CGAL/Point_3.h\"\n#include <CGAL/Triangulation_3.h>\n#include <CGAL/Triangulation_cell_base_with_info_3.h>\n#include <CGAL/Triangulation_vertex_base_with_info_3.h>\n#include <CGAL/Aff_transformation_3.h>\n#include <CGAL/Cartesian_converter.h>\n\ntemplate<class K, class TRI, class VERT, class CELL>\nclass BaseTriangulation3\n{\n\n\npublic:\n\n\ttypedef CGAL::Triangulation_vertex_base_with_info_3<int, K> Vb;\n\ttypedef CGAL::Triangulation_cell_base_with_info_3<int, K>\tCb;\n\ttypedef CGAL::Triangulation_data_structure_3<Vb, Cb>        Tds;\n\n\ttypedef CGAL::Triangulation_3<K, Tds>\t\t\t\t\t\tTriangulation_3;\n\n\ttypedef typename Triangulation_3::Point\t\t\t\t\t\tPoint_3;\n\ttypedef typename Triangulation_3::Cell_handle\t\t\t\tCell;\n\ttypedef typename Triangulation_3::Vertex_handle\t\t\t\tVertex;\n\ttypedef typename Triangulation_3::Edge\t\t\t\t\t\tEdge;\n\n\ttypedef typename K::Point_3 Point_3;\n\ttypedef CGAL::Aff_transformation_3<K> Transformation_3;\n\n\tTRI model;\n\n\tstd::unordered_map<CELL, int> cellIndexMap;\n\tstd::unordered_map<int, CELL> cellMap;\n\tbool cellIndexMapBuilt = false;\n\n\tstd::unordered_map<int, VERT> vertexMap;\n\tbool vertexIndexMapBuilt = false;\n\n\tint buildStamp = 1;\n\n\tvoid Clear()\n\t{\n\t\tmodel.clear();\n\t\tcellIndexMap.clear();\n\t\tvertexMap.clear();\n\t\tcellMap.clear();\n\t}\n\n\tint BuildStamp()\n\t{\n\t\treturn buildStamp;\n\t}\n\n\tvoid OnModelChanged()\n\t{\n\t\tcellIndexMapBuilt = false;\n\t\tvertexIndexMapBuilt = false;\n\t}\n\n\tvoid BuildVertexIndices()\n\t{\n\t\tif (vertexIndexMapBuilt) return;\n\n\t\tvertexMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto& vert : model.all_vertex_handles())\n\t\t{\n\t\t\t//if (model.is_infinite(vert))\n\t\t\t//{\n\t\t\t//\tvert->info() = NULL_INDEX;\n\t\t\t//}\n\t\t\t//else\n\t\t\t//{\n\t\t\t\tvert->info() = index;\n\t\t\t\tvertexMap.insert(std::pair<int, VERT>(index, vert));\n\t\t\t\tindex++;\n\t\t\t//}\n\n\t\t}\n\n\t\tbuildStamp++;\n\t\tvertexIndexMapBuilt = true;\n\t}\n\n\tvoid BuildCellIndices()\n\t{\n\t\tif (cellIndexMapBuilt) return;\n\n\t\tcellIndexMap.clear();\n\t\tcellMap.clear();\n\n\t\tint index = 0;\n\t\tfor (auto cell = model.all_cells_begin(); cell != model.all_cells_end(); ++cell)\n\t\t{\n\t\t\t//if (model.is_infinite(cell))\n\t\t\t//{\n\t\t\t//\tcellIndexMap.insert(std::pair<CELL, int>(cell, NULL_INDEX));\n\t\t\t//}\n\t\t\t//else\n\t\t\t//{\n\t\t\t\tcellMap.insert(std::pair<int, CELL>(index, cell));\n\t\t\t\tcellIndexMap.insert(std::pair<CELL, int>(cell, index));\n\t\t\t\tindex++;\n\t\t\t//}\n\t\t}\n\t\n\t\tbuildStamp++;\n\t\tcellIndexMapBuilt = true;\n\t}\n\n\tint GetCellIndex(CELL c)\n\t{\n\t\tBuildCellIndices();\n\n\t\tauto item = cellIndexMap.find(c);\n\t\tif (item != cellIndexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn NULL_INDEX;\n\t}\n\n\tCELL GetCell(int i)\n\t{\n\t\tBuildCellIndices();\n\n\t\tauto item = cellMap.find(i);\n\t\tif (item != cellMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\tVERT GetVertex(int i)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tauto item = vertexMap.find(i);\n\t\tif (item != vertexMap.end())\n\t\t\treturn item->second;\n\t\telse\n\t\t\treturn nullptr;\n\t}\n\n\tBOOL IsValid(BOOL verbose)\n\t{\n\t\treturn model.is_valid(verbose);\n\t}\n\n\tint Dimension()\n\t{\n\t\treturn model.dimension();\n\t}\n\n\tint VertexCount()\n\t{\n\t\tint count = 0;\n\t\tfor (const auto& vert : model.all_vertex_handles())\n\t\t\tcount++;\n\n\t\treturn count;\n\n\t\t//return (int)model.number_of_vertices();\n\t}\n\n\tint FiniteVertexCount()\n\t{\n\t\tint count = 0;\n\t\tfor (const auto& vert : model.all_vertex_handles())\n\t\t\tif (!model.is_infinite(vert))\n\t\t\t\tcount++;\n\n\t\treturn count;\n\t}\n\n\tint CellCount()\n\t{\n\t\tint count = 0;\n\t\tfor (const auto& cell : model.all_cell_handles())\n\t\t\tcount++;\n\n\t\treturn count;\n\n\t\t//return (int)model.number_of_cells();\n\t}\n\n\tint FiniteCellCount()\n\t{\n\t\tint count = 0;\n\t\tfor (const auto& cell : model.all_cell_handles())\n\t\t\tif (!model.is_infinite(cell))\n\t\t\t\tcount++;\n\n\t\treturn count;\n\n\t\t//return (int)model.number_of_finite_cells();\n\t}\n\n\tint EdgeCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto edge = model.all_edges_begin(); edge != model.all_edges_end(); ++edge)\n\t\t\tcount++;\n\n\t\treturn count;\n\n\t\t//return (int)model.number_of_edges();\n\t}\n\n\tint FiniteEdgeCount()\n\t{\n\t\t//int count = 0;\n\t\t//for (auto edge = model.all_edges_begin(); edge != model.all_edges_end(); ++edge)\n\t\t//\tif (!model.is_infinite(edge))\n\t\t//\t\tcount++;\n\n\t\t//return count;\n\n\t\treturn (int)model.number_of_finite_edges();\n\t}\n\n\tint FacetCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto face = model.all_facets_begin(); face != model.all_facets_end(); ++face)\n\t\t\tcount++;\n\n\t\treturn count;\n\n\t\t//return (int)model.number_of_facets();\n\t}\n\n\tint FiniteFacetCount()\n\t{\n\t\t//int count = 0;\n\t\t//for (auto face = model.all_facets_begin(); face != model.all_facets_end(); ++face)\n\t\t//\tif (!model.is_infinite(face))\n\t\t//\t\tcount++;\n\n\t\t//return count;\n\n\t\treturn (int)model.number_of_finite_facets();\n\t}\n\n\tvoid InsertPoint(const Point3d& point)\n\t{\n\t\tmodel.insert(point.ToCGAL<K>());\n\t\tOnModelChanged();\n\t}\n\n\tvoid InsertPoints(Point3d* points, int count)\n\t{\n\t\tstd::vector<Point_3> list(count);\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tlist[i] = points[i].ToCGAL<K>();\n\n\t\tmodel.insert(list.begin(), list.end());\n\t\tOnModelChanged();\n\t}\n\n\tvoid InsertInCell(int index, const Point3d& point)\n\t{\n\t\tauto c = GetCell(index);\n\t\tif (c != nullptr)\n\t\t{\n\t\t\tmodel.insert_in_cell(point.ToCGAL<K>(), c);\n\t\t\tOnModelChanged();\n\t\t}\n\t}\n\n\tint Locate(const Point3d& point)\n\t{\n\t\tauto cell = model.locate(point.ToCGAL<K>());\n\t\treturn GetCellIndex(cell);\n\t}\n\n\tvoid GetCircumcenters(Point3d* Circumcenters, int count)\n\t{\n\t\tint num = (int)model.number_of_cells();\n\n\t\tint i = 0;\n\t\tfor (auto cell = model.all_cells_begin(); cell != model.all_cells_end(); ++cell)\n\t\t{\n\t\t\tPoint3d c = { 0,0,0 };\n\n\t\t\tfor (int j = 0; j < 4; j++)\n\t\t\t{\n\t\t\t\tc = c + Point3d::FromCGAL<EEK>(cell->vertex(j)->point());\n\t\t\t}\n\n\t\t\tCircumcenters[i] = c / 4;\n\n\t\t\ti++;\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tvoid GetPoints(Point3d* points, int count)\n\t{\n\t\tconstexpr double inf = std::numeric_limits<double>::infinity();\n\n\t\tint i = 0;\n\t\tfor (const auto& vert : model.all_vertex_handles())\n\t\t{\n\t\t\tif (model.is_infinite(vert))\n\t\t\t\tpoints[i] = { inf, inf, inf };\n\t\t\telse\n\t\t\t\tpoints[i] = Point3d::FromCGAL<K>(vert->point());\n\n\t\t\ti++;\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tvoid GetVertices(TriVertex3* vertices, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tconstexpr double inf = std::numeric_limits<double>::infinity();\n\n\t\tint i = 0;\n\t\tfor (auto& vert : model.all_vertex_handles())\n\t\t{\n\t\t\tTriVertex3 v;\n\n\t\t\tif (model.is_infinite(vert))\n\t\t\t{\n\t\t\t\tv.Point = { inf, inf, inf };\n\t\t\t\tv.IsInfinite = TRUE;\n\t\t\t}\n\t\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tv.Point = Point3d::FromCGAL<K>(vert->point());\n\t\t\t\tv.IsInfinite = FALSE;\n\t\t\t}\n\n\t\t\tif (model.is_infinite(vert->cell()))\n\t\t\t\tResetCell(vert);\n\t\t\t\t\n\t\t\tv.Degree = Degree(vert);\n\t\t\tv.Index = vert->info();\n\t\t\tv.CellIndex = GetCellIndex(vert->cell());\n\n\t\t\tvertices[i++] = v;\n\t\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tBOOL GetVertex(int index, TriVertex3& v)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tconstexpr double inf = std::numeric_limits<double>::infinity();\n\n\t\tauto vert = GetVertex(index);\n\t\tif(vert != nullptr)\n\t\t{\n\t\t\tif (model.is_infinite(vert))\n\t\t\t{\n\t\t\t\tv.Point = { inf, inf, inf };\n\t\t\t\tv.IsInfinite = TRUE;\n\t\t\t}\n\n\t\t\telse\n\t\t\t{\n\t\t\t\tv.Point = Point3d::FromCGAL<K>(vert->point());\n\t\t\t\tv.IsInfinite = FALSE;\n\t\t\t}\n\n\t\t\tif (model.is_infinite(vert->cell()))\n\t\t\t\tResetCell(vert);\n\n\t\t\tv.Degree = Degree(vert);\n\t\t\tv.Index = vert->info();\n\t\t\tv.CellIndex = GetCellIndex(vert->cell());\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tv = TriVertex3::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetCells(TriCell3* cells, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint i = 0;\n\t\tfor (auto cell = model.all_cells_begin(); cell != model.all_cells_end(); ++cell)\n\t\t{\n\t\t\tTriCell3 c;\n\t\t\tc.IsInfinite = model.is_infinite(cell);\n\t\t\tc.Index = GetCellIndex(cell);\n\t\t\tc.VertexIndices[0] = cell->vertex(0)->info();\n\t\t\tc.VertexIndices[1] = cell->vertex(1)->info();\n\t\t\tc.VertexIndices[2] = cell->vertex(2)->info();\n\t\t\tc.VertexIndices[3] = cell->vertex(3)->info();\n\t\t\tc.NeighborIndices[0] = GetCellIndex(cell->neighbor(0));\n\t\t\tc.NeighborIndices[1] = GetCellIndex(cell->neighbor(1));\n\t\t\tc.NeighborIndices[2] = GetCellIndex(cell->neighbor(2));\n\t\t\tc.NeighborIndices[3] = GetCellIndex(cell->neighbor(3));\n\n\t\t\tcells[i++] = c;\n\n\t\t\tif (i >= count) return;\n\t\t}\n\t}\n\n\tBOOL GetCell(int index, TriCell3& cell)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tauto c = GetCell(index);\n\t\tif (c != nullptr)\n\t\t{\n\t\t\tcell.IsInfinite = model.is_infinite(c);\n\t\t\tcell.Index = GetCellIndex(c);\n\t\t\tcell.VertexIndices[0] = c->vertex(0)->info();\n\t\t\tcell.VertexIndices[1] = c->vertex(1)->info();\n\t\t\tcell.VertexIndices[2] = c->vertex(2)->info();\n\t\t\tcell.VertexIndices[3] = c->vertex(3)->info();\n\t\t\tcell.NeighborIndices[0] = GetCellIndex(c->neighbor(0));\n\t\t\tcell.NeighborIndices[1] = GetCellIndex(c->neighbor(1));\n\t\t\tcell.NeighborIndices[2] = GetCellIndex(c->neighbor(2));\n\t\t\tcell.NeighborIndices[3] = GetCellIndex(c->neighbor(3));\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcell = TriCell3::NullCell();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tvoid GetSegmentIndices(int* indices, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto edge = model.all_edges_begin(); edge != model.all_edges_end(); ++edge)\n\t\t{\n\t\t\tindices[index * 2 + 0] = edge->first->vertex(0)->info();\n\t\t\tindices[index * 2 + 1] = edge->first->vertex(1)->info();\n\n\t\t\tindex++;\n\t\t\tif (index * 2 >= count) return;\n\t\t}\n\t}\n\n\tvoid GetTriangleIndices(int* indices, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto face = model.all_facets_begin(); face != model.all_facets_end(); ++face)\n\t\t{\n\t\t\tindices[index * 3 + 0] = face->first->vertex(0)->info();\n\t\t\tindices[index * 3 + 1] = face->first->vertex(1)->info();\n\t\t\tindices[index * 3 + 2] = face->first->vertex(2)->info();\n\n\t\t\tindex++;\n\t\t\tif (index * 3 >= count) return;\n\t\t}\n\t}\n\n\tvoid GetTetrahedraIndices(int* indices, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto cell = model.all_cells_begin(); cell != model.all_cells_end(); ++cell)\n\t\t{\n\t\t\tindices[index * 4 + 0] = cell->vertex(0)->info();\n\t\t\tindices[index * 4 + 1] = cell->vertex(1)->info();\n\t\t\tindices[index * 4 + 2] = cell->vertex(2)->info();\n\t\t\tindices[index * 4 + 3] = cell->vertex(3)->info();\n\n\t\t\tindex++;\n\t\t\tif (index * 4 >= count) return;\n\t\t}\n\t}\n\n\tvoid GetSegments(Segment3d* segments, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto edge = model.all_edges_begin(); edge != model.all_edges_end(); ++edge)\n\t\t{\n\t\t\tauto a = edge->first->vertex(0)->point();\n\t\t\tauto b = edge->first->vertex(1)->point();\n\n\t\t\tsegments[index].a = Point3d::FromCGAL<K>(a);\n\t\t\tsegments[index].b = Point3d::FromCGAL<K>(b);\n\n\t\t\tindex++;\n\t\t\tif (index >= count) return;\n\t\t}\n\t}\n\n\tvoid GetTriangles(Triangle3d* triangles, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto face = model.all_facets_begin(); face != model.all_facets_end(); ++face)\n\t\t{\n\t\t\tauto a = face->first->vertex(0)->point();\n\t\t\tauto b = face->first->vertex(1)->point();\n\t\t\tauto c = face->first->vertex(2)->point();\n\n\t\t\ttriangles[index].a = Point3d::FromCGAL<K>(a);\n\t\t\ttriangles[index].b = Point3d::FromCGAL<K>(b);\n\t\t\ttriangles[index].c = Point3d::FromCGAL<K>(c);\n\n\t\t\tindex++;\n\t\t\tif (index >= count) return;\n\t\t}\n\t}\n\n\tvoid GetTetahedrons(Tetahedron3d* tetahedrons, int count)\n\t{\n\t\tBuildVertexIndices();\n\n\t\tint index = 0;\n\t\tfor (auto cell = model.all_cells_begin(); cell != model.all_cells_end(); ++cell)\n\t\t{\n\t\t\tauto a = cell->vertex(0)->point();\n\t\t\tauto b = cell->vertex(1)->point();\n\t\t\tauto c = cell->vertex(2)->point();\n\t\t\tauto d = cell->vertex(3)->point();\n\n\t\t\ttetahedrons[index].a = Point3d::FromCGAL<K>(a);\n\t\t\ttetahedrons[index].b = Point3d::FromCGAL<K>(b);\n\t\t\ttetahedrons[index].c = Point3d::FromCGAL<K>(c);\n\t\t\ttetahedrons[index].d = Point3d::FromCGAL<K>(d);\n\n\t\t\tindex++;\n\t\t\tif (index >= count) return;\n\t\t}\n\t}\n\n\tvoid Transform(const Matrix4x4d& matrix)\n\t{\n\t\tauto m = matrix.ToCGAL<K>();\n\n\t\tfor (auto vert = model.finite_vertices_begin(); vert != model.finite_vertices_end(); ++vert)\n\t\t{\n\t\t\tauto p = vert->point();\n\t\t\tvert->set_point(m.transform(p));\n\t\t}\n\t}\n\n\tvoid ResetCell(VERT& vert)\n\t{\n\t\tstd::vector<CELL> cells;\n\t\tmodel.incident_cells(vert, std::back_inserter(cells));\n\n\t\tfor (auto cell : cells)\n\t\t{\n\t\t\tif (!model.is_infinite(cell))\n\t\t\t{\n\t\t\t\tvert->set_cell(cell);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tint Degree(VERT& vert)\n\t{\n\t\tstd::vector<CELL> cells;\n\t\tmodel.incident_cells(vert, std::back_inserter(cells));\n\n\t\tint count = 0;\n\t\tfor (auto cell : cells)\n\t\t{\n\t\t\tif (!model.is_infinite(cell))\n\t\t\t{\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedDelaunayTriangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"BaseTriangulation2.h\"\n\n#include \"CGAL/Segment_2.h\"\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/Constrained_Delaunay_triangulation_face_base_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass ConstrainedDelaunayTriangulation2 : public BaseTriangulation2<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef typename K::Point_2 Point_2;\n\ttypedef CGAL::No_constraint_intersection_tag Tag1;\n\ttypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\n\ttypedef CGAL::Exact_predicates_tag Tag3;\n\ttypedef CGAL::Exact_intersections_tag Tag4;\n\n\ttypedef CGAL::Triangulation_vertex_base_with_info_2<int, K> Vb;\n\ttypedef CGAL::Constrained_Delaunay_triangulation_face_base_2<K> CFb;\n\ttypedef CGAL::Triangulation_face_base_with_info_2<int, K, CFb> Fb;\n\ttypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\n\ttypedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds, Tag4> Triangulation_2;\n\n\ttypedef typename Triangulation_2::Face_handle Face;\n\ttypedef typename Triangulation_2::Vertex_handle Vertex;\n\ttypedef typename Triangulation_2::Edge Edge;\n\npublic:\n\n\n\tinline static ConstrainedDelaunayTriangulation2* NewTriangulation2()\n\t{\n\t\treturn new ConstrainedDelaunayTriangulation2();\n\t}\n\n\tinline static void DeleteTriangulation2(void* ptr)\n\t{\n\t\tauto obj = static_cast<ConstrainedDelaunayTriangulation2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static ConstrainedDelaunayTriangulation2* CastToTriangulation2(void* ptr)\n\t{\n\t\treturn static_cast<ConstrainedDelaunayTriangulation2*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation2();\n\t\tcopy->model = this->model;\n\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto tri = NewTriangulation2();\n\t\tauto tri2 = new ConstrainedDelaunayTriangulation2<K2, Triangulation_2, Vertex, Face>();\n\n\t\tfor (const auto& vert : tri->model.finite_vertex_handles())\n\t\t{\n\t\t\tauto p = convert(vert->point());\n\t\t\t//tri2->model.insert(p);\n\t\t}\n\n\t\treturn tri2;\n\t}\n\n\tBOOL MoveVertex(int index, Point2d point, BOOL ifNoCollision, TriVertex2& triVert)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tVertex v;\n\n\t\t\t//if (ifNoCollision)\n\t\t\t//\tv = this->model.move(*vert, point.ToCGAL<K>());\n\t\t\t//else\n\t\t\tv = this->model.move_if_no_collision(*vert, point.ToCGAL<K>());\n\n\t\t\tif (v != *vert)\n\t\t\t\tthis->map.OnModelChanged();\n\n\t\t\tint degree = TriUtil::Degree2(this->model, v);\n\t\t\ttriVert = TriVertex2::FromVertex<K>(this->model, v, degree);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriVert = TriVertex2::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t//Constrained only\n\n\tint ConstrainedEdgesCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t\t++count;\n\n\t\treturn count;\n\t}\n\n\tBOOL HasIncidentConstraints(int index)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\n\t\tif (vert != nullptr)\n\t\t\treturn this->model.are_there_incident_constraints(*vert);\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\tint IncidentConstraintCount(int index)\n\t{\n\t\tint count = 0;\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tauto edge = (*vert)->incident_edges(), end(edge);\n\t\t\tif (edge != nullptr)\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (this->model.is_constrained(*edge))\n\t\t\t\t\t\t++count;\n\n\t\t\t\t} while (++edge != end);\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tvoid InsertSegmentConstraint(Point2d a, Point2d b)\n\t{\n\t\tif (a == b) return;\n\n\t\tthis->model.insert_constraint(a.ToCGAL<K>(), b.ToCGAL<K>());\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertSegmentConstraint(int vertIndex1, int vertIndex2)\n\t{\n\t\tauto vert1 = this->map.FindVertex(this->model, vertIndex1);\n\t\tauto vert2 = this->map.FindVertex(this->model, vertIndex2);\n\n\t\tif (vert1 != nullptr && vert2 != nullptr)\n\t\t{\n\t\t\tthis->model.insert_constraint(*vert1, *vert2);\n\t\t\tthis->map.OnModelChanged();\n\t\t}\n\n\t}\n\n\tvoid InsertSegmentConstraints(Segment2d* segments, int count)\n\t{\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (segments[i].a == segments[i].b)\n\t\t\t\tcontinue;\n\n\t\t\tauto a = segments[i].a.ToCGAL<K>();\n\t\t\tauto b = segments[i].b.ToCGAL<K>();\n\n\t\t\tthis->model.insert_constraint(a, b);\n\t\t}\n\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertPolygonConstraint(void* polyPtr)\n\t{\n\t\tauto polygon = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\tthis->model.insert_constraint(polygon->vertices_begin(), polygon->vertices_end(), true);\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertPolygonWithHolesConstraint(void* pwhPtr)\n\t{\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tthis->model.insert_constraint(pwh->outer_boundary().vertices_begin(), pwh->outer_boundary().vertices_end(), true);\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t\tthis->model.insert_constraint(hole.vertices_begin(), hole.vertices_end(), true);\n\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid GetConstraints(TriEdge2* constraints, int count)\n\t{\n\t\tthis->map.SetIndices(this->model);\n\n\t\tint i = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t{\n\t\t\tif (!this->model.is_infinite(edge->first))\n\t\t\t{\n\t\t\t\tconstraints[i].FaceIndex = edge->first->info();\n\t\t\t\tconstraints[i].NeighbourIndex = edge->second;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto neighbour = edge->first->neighbor(edge->second);\n\t\t\t\tauto n = neighbour->index(edge->first);\n\n\t\t\t\tif (!this->model.is_infinite(neighbour))\n\t\t\t\t\tconstraints[i].FaceIndex = neighbour->info();\n\t\t\t\telse\n\t\t\t\t\tconstraints[i].FaceIndex = NULL_INDEX;\n\n\t\t\t\tconstraints[i].NeighbourIndex = n;\n\t\t\t}\n\n\t\t\tif (i++ >= count) return;\n\t\t}\n\t}\n\n\tvoid GetConstraints(Segment2d* constraints, int count)\n\t{\n\t\tthis->map.SetIndices(this->model);\n\n\t\tint i = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t{\n\t\t\tauto seg = this->model.segment(edge->first, edge->second);\n\t\t\tconstraints[i] = Segment2d::FromCGAL<K>(seg[0], seg[1]);\n\n\t\t\tif (i++ >= count) return;\n\t\t}\n\t}\n\n\tvoid GetIncidentConstraints(int vertexIndex, TriEdge2* constraints, int count)\n\t{\n\t\tint i = 0;\n\t\tauto vert = this->map.FindVertex(this->model, vertexIndex);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tthis->map.SetVertexIndices(this->model);\n\t\t\tthis->map.SetFaceIndices(this->model);\n\n\t\t\tauto edge = (*vert)->incident_edges(), end(edge);\n\t\t\tif (edge != nullptr)\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (this->model.is_constrained(*edge))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!this->model.is_infinite(edge->first))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconstraints[i].FaceIndex = edge->first->info();\n\t\t\t\t\t\t\tconstraints[i].NeighbourIndex = edge->second;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto neighbour = edge->first->neighbor(edge->second);\n\t\t\t\t\t\t\tauto n = neighbour->index(edge->first);\n\n\t\t\t\t\t\t\tif (!this->model.is_infinite(neighbour))\n\t\t\t\t\t\t\t\tconstraints[i].FaceIndex = neighbour->info();\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tconstraints[i].FaceIndex = NULL_INDEX;\n\n\t\t\t\t\t\t\tconstraints[i].NeighbourIndex = n;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (i++ >= count) return;\n\t\t\t\t\t}\n\n\t\t\t\t} while (++edge != end);\n\t\t\t}\n\n\t\t}\n\t}\n\n\tvoid RemoveConstraint(int faceIndex, int neighbourIndex)\n\t{\n\t\tif (neighbourIndex < 0 || neighbourIndex > 2)\n\t\t\treturn;\n\n\t\tauto face = this->map.FindFace(this->model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tthis->model.remove_constraint(*face, neighbourIndex);\n\t\t}\n\t}\n\n\tvoid RemoveIncidentConstraints(int vertexIndex)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, vertexIndex);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tthis->model.remove_incident_constraints(*vert);\n\t\t}\n\t}\n\n\tint MarkDomains(int* indices, int count)\n\t{\n\t\tthis->map.SetVertexIndices(this->model);\n\n\t\t//Need each face to store its nesting level.\n\t\t//Use the faces info value and then reset after.\n\t\tthis->map.ForceSetFaceIndices(this->model, 0);\n\t\tthis->MarkDomains(this->model);\n\n\t\tint num = 0;\n\t\tint index = 0;\n\n\t\tfor (Face face : this->model.finite_face_handles())\n\t\t{\n\t\t\tif (face->info() % 2 == 1)\n\t\t\t{\n\t\t\t\tindices[index * 3 + 0] = face->vertex(0)->info();\n\t\t\t\tindices[index * 3 + 1] = face->vertex(1)->info();\n\t\t\t\tindices[index * 3 + 2] = face->vertex(2)->info();\n\n\t\t\t\tindex++;\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\n\t\t//Restore faces index value.\n\t\t//Face indices may have changed so \n\t\t//increment buildd stamp as well.\n\t\tthis->map.SetFaceIndices(this->model);\n\t\tthis->map.IncrementBuildStamp();\n\n\t\treturn num * 3;\n\t}\n\nprivate:\n\n\tvoid MarkDomains(Triangulation_2& ct, Face start, int index, std::list<Edge>& border)\n\t{\n\t\tif (start->info() != -1)\n\t\t\treturn;\n\n\t\tstd::list<Face> queue;\n\t\tqueue.push_back(start);\n\n\t\twhile (!queue.empty())\n\t\t{\n\t\t\tFace fh = queue.front();\n\t\t\tqueue.pop_front();\n\n\t\t\tif (fh->info() == -1)\n\t\t\t{\n\t\t\t\tfh->info() = index;\n\n\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t{\n\t\t\t\t\tEdge e(fh, i);\n\t\t\t\t\tFace n = fh->neighbor(i);\n\n\t\t\t\t\tif (n->info() == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ct.is_constrained(e))\n\t\t\t\t\t\t\tborder.push_back(e);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tqueue.push_back(n);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// explore set of facets connected with non constrained edges,\n\t/// and attribute to each such set a nesting level.\n\t/// We start from facets incident to the infinite vertex, with a nesting\n\t/// level of 0. Then we recursively consider the non-explored facets incident\n\t/// to constrained edges bounding the former set and increase the nesting level by 1.\n\t/// Facets in the domain are those with an odd nesting level.\n\t/// </summary>\n\t/// <param name=\"cdt\"></param>\n\tvoid MarkDomains(Triangulation_2& cdt)\n\t{\n\t\tfor (Face f : cdt.all_face_handles())\n\t\t\tf->info() = -1;\n\n\t\tstd::list<Edge> border;\n\t\tMarkDomains(cdt, cdt.infinite_face(), 0, border);\n\n\t\twhile (!border.empty())\n\t\t{\n\t\t\tEdge e = border.front();\n\t\t\tborder.pop_front();\n\t\t\tFace n = e.first->neighbor(e.second);\n\n\t\t\tif (n->info() == -1)\n\t\t\t{\n\t\t\t\tMarkDomains(cdt, n, e.first->info() + 1, border);\n\t\t\t}\n\t\t}\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedDelaunayTriangulation2_EEK.cpp",
    "content": "#pragma once\n\n#include \"ConstrainedDelaunayTriangulation2_EEK.h\"\n#include \"ConstrainedDelaunayTriangulation2.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriEDge2.h\"\n\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/Constrained_Delaunay_triangulation_face_base_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\ntypedef typename EEK::Point_2 Point_2;\ntypedef CGAL::No_constraint_intersection_tag Tag1;\ntypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\ntypedef CGAL::Exact_predicates_tag Tag3;\ntypedef CGAL::Exact_intersections_tag Tag4;\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EEK> Vb;\ntypedef CGAL::Constrained_Delaunay_triangulation_face_base_2<EEK> CFb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EEK, CFb> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Constrained_Delaunay_triangulation_2<EEK, Tds, Tag4> Triangulation_2;\n\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\ntypedef typename Triangulation_2::Edge Edge;\n\ntypedef ConstrainedDelaunayTriangulation2<EEK, Triangulation_2, Vertex, Face> Tri2;\n\n      \nvoid* ConstrainedDelaunayTriangulation2_EEK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* ConstrainedDelaunayTriangulation2_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* ConstrainedDelaunayTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\t}\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool ConstrainedDelaunayTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Constrained only\n\nint ConstrainedDelaunayTriangulation2_EEK_ConstrainedEdgesCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->ConstrainedEdgesCount();\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EEK_HasIncidentConstraints(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->HasIncidentConstraints(index);\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_IncidentConstraintCount(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IncidentConstraintCount(index);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(a, b);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(vertIndex1, vertIndex2);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraints(segments, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonConstraint(polyPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHolesConstraint(pwhPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIncidentConstraints(vertexIndex, constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveConstraint(faceIndex, neighbourIndex);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EEK_RemoveIncidentConstraints(void* ptr, int vertexIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveIncidentConstraints(vertexIndex);\n}\n\nint ConstrainedDelaunayTriangulation2_EEK_MarkDomains(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MarkDomains(indices, count);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedDelaunayTriangulation2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConstrainedDelaunayTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EEK_Create();\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool ConstrainedDelaunayTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Constrained only\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_ConstrainedEdgesCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EEK_HasIncidentConstraints(void* ptr, int index);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_IncidentConstraintCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EEK_RemoveIncidentConstraints(void* ptr, int vertexIndex);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EEK_MarkDomains(void* ptr, int* indices, int count);\n\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedDelaunayTriangulation2_EIK.cpp",
    "content": "#pragma once\n\n#include \"ConstrainedDelaunayTriangulation2_EIK.h\"\n#include \"ConstrainedDelaunayTriangulation2.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriEDge2.h\"\n\n#include <CGAL/Constrained_Delaunay_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/Constrained_Delaunay_triangulation_face_base_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\ntypedef typename EIK::Point_2 Point_2;\ntypedef CGAL::No_constraint_intersection_tag Tag1;\ntypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\ntypedef CGAL::Exact_predicates_tag Tag3;\ntypedef CGAL::Exact_intersections_tag Tag4;\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EIK> Vb;\ntypedef CGAL::Constrained_Delaunay_triangulation_face_base_2<EIK> CFb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EIK, CFb> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Constrained_Delaunay_triangulation_2<EIK, Tds, Tag4> Triangulation_2;\n\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\ntypedef typename Triangulation_2::Edge Edge;\n\ntypedef ConstrainedDelaunayTriangulation2<EIK, Triangulation_2, Vertex, Face> Tri2;\n\n\nvoid* ConstrainedDelaunayTriangulation2_EIK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* ConstrainedDelaunayTriangulation2_EIK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* ConstrainedDelaunayTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\t}\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool ConstrainedDelaunayTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Constrained only\n\nint ConstrainedDelaunayTriangulation2_EIK_ConstrainedEdgesCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->ConstrainedEdgesCount();\n}\n\nBOOL ConstrainedDelaunayTriangulation2_EIK_HasIncidentConstraints(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->HasIncidentConstraints(index);\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_IncidentConstraintCount(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IncidentConstraintCount(index);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(a, b);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(vertIndex1, vertIndex2);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraints(segments, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonConstraint(polyPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHolesConstraint(pwhPtr);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIncidentConstraints(vertexIndex, constraints, count);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveConstraint(faceIndex, neighbourIndex);\n}\n\nvoid ConstrainedDelaunayTriangulation2_EIK_RemoveIncidentConstraints(void* ptr, int vertexIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveIncidentConstraints(vertexIndex);\n}\n\nint ConstrainedDelaunayTriangulation2_EIK_MarkDomains(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MarkDomains(indices, count);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedDelaunayTriangulation2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConstrainedDelaunayTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EIK_Create();\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedDelaunayTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool ConstrainedDelaunayTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Constrained only\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_ConstrainedEdgesCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedDelaunayTriangulation2_EIK_HasIncidentConstraints(void* ptr, int index);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_IncidentConstraintCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex);\n\n\tCGALWRAPPER_API void ConstrainedDelaunayTriangulation2_EIK_RemoveIncidentConstraints(void* ptr, int vertexIndex);\n\n\tCGALWRAPPER_API int ConstrainedDelaunayTriangulation2_EIK_MarkDomains(void* ptr, int* indices, int count);\n\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedTriangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"BaseTriangulation2.h\"\n\n#include \"CGAL/Segment_2.h\"\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Constrained_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/Constrained_triangulation_face_base_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass ConstrainedTriangulation2 : public BaseTriangulation2<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef typename K::Point_2 Point_2;\n\ttypedef CGAL::No_constraint_intersection_tag Tag1;\n\ttypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\n\ttypedef CGAL::Exact_predicates_tag Tag3;\n\ttypedef CGAL::Exact_intersections_tag Tag4;\n\n\ttypedef CGAL::Triangulation_vertex_base_with_info_2<int, K> Vb;\n\ttypedef CGAL::Constrained_triangulation_face_base_2<K> CFb;\n\ttypedef CGAL::Triangulation_face_base_with_info_2<int, K, CFb> Fb;\n\ttypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\n\ttypedef CGAL::Constrained_triangulation_2<K, Tds, Tag4> Triangulation_2;\n\t\n\ttypedef typename Triangulation_2::Face_handle Face;\n\ttypedef typename Triangulation_2::Vertex_handle Vertex;\n\ttypedef typename Triangulation_2::Edge Edge;\n\npublic:\n\n\n\tinline static ConstrainedTriangulation2* NewTriangulation2()\n\t{\n\t\treturn new ConstrainedTriangulation2();\n\t}\n\n\tinline static void DeleteTriangulation2(void* ptr)\n\t{\n\t\tauto obj = static_cast<ConstrainedTriangulation2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static ConstrainedTriangulation2* CastToTriangulation2(void* ptr)\n\t{\n\t\treturn static_cast<ConstrainedTriangulation2*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation2();\n\t\tcopy->model = this->model;\n\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto tri = NewTriangulation2();\n\t\tauto tri2 = new ConstrainedTriangulation2<K2, Triangulation_2, Vertex, Face>();\n\n\t\tfor (const auto& vert : tri->model.finite_vertex_handles())\n\t\t{\n\t\t\tauto p = convert(vert->point());\n\t\t\t//tri2->model.insert(p);\n\t\t}\n\n\t\treturn tri2;\n\t}\n\n\tBOOL MoveVertex(int index, Point2d point, BOOL ifNoCollision, TriVertex2& triVert)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tVertex v;\n\n\t\t\t//if (ifNoCollision)\n\t\t\t//\tv = this->model.move(*vert, point.ToCGAL<K>());\n\t\t\t//else\n\t\t\t\tv = this->model.move_if_no_collision(*vert, point.ToCGAL<K>());\n\n\t\t\tif (v != *vert)\n\t\t\t\tthis->map.OnModelChanged();\n\n\t\t\tint degree = TriUtil::Degree2(this->model, v);\n\t\t\ttriVert = TriVertex2::FromVertex<K>(this->model, v, degree);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttriVert = TriVertex2::NullVertex();\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\t//Constrained only\n\n\tint ConstrainedEdgesCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t\t++count;\n\n\t\treturn count;\n\t}\n\n\tBOOL HasIncidentConstraints(int index)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\n\t\tif (vert != nullptr)\n\t\t\treturn this->model.are_there_incident_constraints(*vert);\n\t\telse\n\t\t\treturn FALSE;\n\t}\n\n\tint IncidentConstraintCount(int index)\n\t{\n\t\tint count = 0;\n\t\tauto vert = this->map.FindVertex(this->model, index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tauto edge = (*vert)->incident_edges(), end(edge);\n\t\t\tif (edge != nullptr)\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (this->model.is_constrained(*edge))\n\t\t\t\t\t\t++count;\n\n\t\t\t\t} while (++edge != end);\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tvoid InsertSegmentConstraint(Point2d a, Point2d b)\n\t{\n\t\tif (a == b) return;\n\n\t\tthis->model.insert_constraint(a.ToCGAL<K>(), b.ToCGAL<K>());\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertSegmentConstraint(int vertIndex1, int vertIndex2)\n\t{\n\t\tauto vert1 = this->map.FindVertex(this->model, vertIndex1);\n\t\tauto vert2 = this->map.FindVertex(this->model, vertIndex2);\n\n\t\tif (vert1 != nullptr && vert2 != nullptr)\n\t\t{\n\t\t\tthis->model.insert_constraint(*vert1, *vert2);\n\t\t\tthis->map.OnModelChanged();\n\t\t}\n\n\t}\n\n\tvoid InsertSegmentConstraints(Segment2d* segments, int count)\n\t{\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif (segments[i].a == segments[i].b)\n\t\t\t\tcontinue;\n\n\t\t\tauto a = segments[i].a.ToCGAL<K>();\n\t\t\tauto b = segments[i].b.ToCGAL<K>();\n\n\t\t\tthis->model.insert_constraint(a, b);\n\t\t}\n\t\t\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertPolygonConstraint(void* polyPtr)\n\t{\n\t\tauto polygon = Polygon2<K>::CastToPolygon2(polyPtr);\n\t\tthis->model.insert_constraint(polygon->vertices_begin(), polygon->vertices_end(), true);\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid InsertPolygonWithHolesConstraint(void* pwhPtr)\n\t{\n\t\tauto pwh = PolygonWithHoles2<K>::CastToPolygonWithHoles2(pwhPtr);\n\n\t\tif (!pwh->is_unbounded())\n\t\t\tthis->model.insert_constraint(pwh->outer_boundary().vertices_begin(), pwh->outer_boundary().vertices_end(), true);\n\n\t\tfor (auto& hole : pwh->holes())\n\t\t\tthis->model.insert_constraint(hole.vertices_begin(), hole.vertices_end(), true);\n\n\t\tthis->map.OnModelChanged();\n\t}\n\n\tvoid GetConstraints(TriEdge2* constraints, int count)\n\t{\n\t\tthis->map.SetIndices(this->model);\n\n\t\tint i = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t{\n\t\t\tif (!this->model.is_infinite(edge->first))\n\t\t\t{\n\t\t\t\tconstraints[i].FaceIndex = edge->first->info();\n\t\t\t\tconstraints[i].NeighbourIndex = edge->second;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tauto neighbour = edge->first->neighbor(edge->second);\n\t\t\t\tauto n = neighbour->index(edge->first);\n\n\t\t\t\tif (!this->model.is_infinite(neighbour))\n\t\t\t\t\tconstraints[i].FaceIndex = neighbour->info();\n\t\t\t\telse\n\t\t\t\t\tconstraints[i].FaceIndex = NULL_INDEX;\n\n\t\t\t\tconstraints[i].NeighbourIndex = n;\n\t\t\t}\n\n\t\t\tif (i++ >= count) return;\n\t\t}\n\t}\n\n\tvoid GetConstraints(Segment2d* constraints, int count)\n\t{\n\t\tthis->map.SetIndices(this->model);\n\n\t\tint i = 0;\n\t\tfor (auto edge = this->model.constrained_edges_begin(); edge != this->model.constrained_edges_end(); ++edge)\n\t\t{\n\t\t\tauto seg = this->model.segment(edge->first, edge->second);\n\t\t\tconstraints[i] = Segment2d::FromCGAL<K>(seg[0], seg[1]);\n\n\t\t\tif (i++ >= count) return;\n\t\t}\n\t}\n\n\tvoid GetIncidentConstraints(int vertexIndex,  TriEdge2* constraints, int count)\n\t{\n\t\tint i = 0;\n\t\tauto vert = this->map.FindVertex(this->model, vertexIndex);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tthis->map.SetVertexIndices(this->model);\n\t\t\tthis->map.SetFaceIndices(this->model);\n\n\t\t\tauto edge = (*vert)->incident_edges(), end(edge);\n\t\t\tif (edge != nullptr)\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (this->model.is_constrained(*edge))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!this->model.is_infinite(edge->first))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconstraints[i].FaceIndex = edge->first->info();\n\t\t\t\t\t\t\tconstraints[i].NeighbourIndex = edge->second;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tauto neighbour = edge->first->neighbor(edge->second);\n\t\t\t\t\t\t\tauto n = neighbour->index(edge->first);\n\n\t\t\t\t\t\t\tif (!this->model.is_infinite(neighbour))\n\t\t\t\t\t\t\t\tconstraints[i].FaceIndex = neighbour->info();\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tconstraints[i].FaceIndex = NULL_INDEX;\n\n\t\t\t\t\t\t\tconstraints[i].NeighbourIndex = n;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (i++ >= count) return;\n\t\t\t\t\t}\n\n\t\t\t\t} while (++edge != end);\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\n\tvoid RemoveConstraint(int faceIndex, int neighbourIndex)\n\t{\n\t\tif (neighbourIndex < 0 || neighbourIndex > 2)\n\t\t\treturn;\n\n\t\tauto face = this->map.FindFace(this->model, faceIndex);\n\t\tif (face != nullptr)\n\t\t{\n\t\t\tthis->model.remove_constraint(*face, neighbourIndex);\n\t\t}\n\t}\n\n\tvoid RemoveIncidentConstraints(int vertexIndex)\n\t{\n\t\tauto vert = this->map.FindVertex(this->model, vertexIndex);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tthis->model.remove_incident_constraints(*vert);\n\t\t}\n\t}\n\n\tint MarkDomains(int* indices, int count)\n\t{\n\t\t\n\n\t\tthis->map.SetVertexIndices(this->model);\n\n\t\t//Need each face to store its nesting level.\n\t\t//Use the faces info value and then reset after.\n\t\tthis->map.ForceSetFaceIndices(this->model, 0);\n\t\tthis->MarkDomains(this->model);\n\n\t\tint num = 0;\n\t\tint index = 0;\n\n\t\tfor (Face face : this->model.finite_face_handles())\n\t\t{\n\t\t\tif (face->info() % 2 == 1)\n\t\t\t{\n\t\t\t\tindices[index * 3 + 0] = face->vertex(0)->info();\n\t\t\t\tindices[index * 3 + 1] = face->vertex(1)->info();\n\t\t\t\tindices[index * 3 + 2] = face->vertex(2)->info();\n\n\t\t\t\tindex++;\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\n\t\t//Restore faces index value.\n\t\t//Face indices may have changed so \n\t\t//increment buildd stamp as well.\n\t\tthis->map.SetFaceIndices(this->model);\n\t\tthis->map.IncrementBuildStamp();\n\n\t\treturn num * 3;\n\t}\n\n\tprivate:\n\n\tvoid MarkDomains(Triangulation_2& ct, Face start, int index, std::list<Edge>& border)\n\t{\n\t\tif (start->info() != -1)\n\t\t\treturn;\n\n\t\tstd::list<Face> queue;\n\t\tqueue.push_back(start);\n\n\t\twhile (!queue.empty())\n\t\t{\n\t\t\tFace fh = queue.front();\n\t\t\tqueue.pop_front();\n\n\t\t\tif (fh->info() == -1)\n\t\t\t{\n\t\t\t\tfh->info() = index;\n\n\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t{\n\t\t\t\t\tEdge e(fh, i);\n\t\t\t\t\tFace n = fh->neighbor(i);\n\n\t\t\t\t\tif (n->info() == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ct.is_constrained(e))\n\t\t\t\t\t\t\tborder.push_back(e);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tqueue.push_back(n);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// explore set of facets connected with non constrained edges,\n\t/// and attribute to each such set a nesting level.\n\t/// We start from facets incident to the infinite vertex, with a nesting\n\t/// level of 0. Then we recursively consider the non-explored facets incident\n\t/// to constrained edges bounding the former set and increase the nesting level by 1.\n\t/// Facets in the domain are those with an odd nesting level.\n\t/// </summary>\n\t/// <param name=\"cdt\"></param>\n\tvoid MarkDomains(Triangulation_2& cdt)\n\t{\n\t\tfor (Face f : cdt.all_face_handles())\n\t\t\tf->info() = -1;\n\n\t\tstd::list<Edge> border;\n\t\tMarkDomains(cdt, cdt.infinite_face(), 0, border);\n\n\t\twhile (!border.empty())\n\t\t{\n\t\t\tEdge e = border.front();\n\t\t\tborder.pop_front();\n\t\t\tFace n = e.first->neighbor(e.second);\n\n\t\t\tif (n->info() == -1)\n\t\t\t{\n\t\t\t\tMarkDomains(cdt, n, e.first->info() + 1, border);\n\t\t\t}\n\t\t}\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedTriangulation2_EEK.cpp",
    "content": "#pragma once\n\n#include \"ConstrainedTriangulation2_EEK.h\"\n#include \"ConstrainedTriangulation2.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriEDge2.h\"\n\ntypedef typename EEK::Point_2 Point_2;\ntypedef CGAL::No_constraint_intersection_tag Tag1;\ntypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\ntypedef CGAL::Exact_predicates_tag Tag3;\ntypedef CGAL::Exact_intersections_tag Tag4;\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EEK> Vb;\ntypedef CGAL::Constrained_triangulation_face_base_2<EEK> CFb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EEK, CFb> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Constrained_triangulation_2<EEK, Tds, Tag4> Triangulation_2;\n\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\ntypedef typename Triangulation_2::Edge Edge;\n\ntypedef ConstrainedTriangulation2<EEK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* ConstrainedTriangulation2_EEK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid ConstrainedTriangulation2_EEK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid ConstrainedTriangulation2_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* ConstrainedTriangulation2_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* ConstrainedTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\t}\n}\n\nvoid ConstrainedTriangulation2_EEK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint ConstrainedTriangulation2_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL ConstrainedTriangulation2_EEK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint ConstrainedTriangulation2_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint ConstrainedTriangulation2_EEK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL ConstrainedTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool ConstrainedTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL ConstrainedTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL ConstrainedTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL ConstrainedTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint ConstrainedTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL ConstrainedTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL ConstrainedTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL ConstrainedTriangulation2_EEK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL ConstrainedTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid ConstrainedTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Constrained only\n\nint ConstrainedTriangulation2_EEK_ConstrainedEdgesCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->ConstrainedEdgesCount();\n}\n\nBOOL ConstrainedTriangulation2_EEK_HasIncidentConstraints(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->HasIncidentConstraints(index);\n}\n\nint ConstrainedTriangulation2_EEK_IncidentConstraintCount(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IncidentConstraintCount(index);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(a, b);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(vertIndex1, vertIndex2);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraints(segments, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonConstraint(polyPtr);\n}\n\nvoid ConstrainedTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHolesConstraint(pwhPtr);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIncidentConstraints(vertexIndex, constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EEK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveConstraint(faceIndex, neighbourIndex);\n}\n\nvoid ConstrainedTriangulation2_EEK_RemoveIncidentConstraints(void* ptr, int vertexIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveIncidentConstraints(vertexIndex);\n}\n\nint ConstrainedTriangulation2_EEK_MarkDomains(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MarkDomains(indices, count);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedTriangulation2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConstrainedTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EEK_Create();\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool ConstrainedTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Constrained only\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_ConstrainedEdgesCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EEK_HasIncidentConstraints(void* ptr, int index);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_IncidentConstraintCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EEK_RemoveIncidentConstraints(void* ptr, int vertexIndex);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EEK_MarkDomains(void* ptr, int* indices, int count);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedTriangulation2_EIK.cpp",
    "content": "#pragma once\n\n#include \"ConstrainedTriangulation2_EIK.h\"\n#include \"ConstrainedTriangulation2.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriEDge2.h\"\n\ntypedef typename EIK::Point_2 Point_2;\ntypedef CGAL::No_constraint_intersection_tag Tag1;\ntypedef CGAL::No_constraint_intersection_requiring_constructions_tag Tag2;\ntypedef CGAL::Exact_predicates_tag Tag3;\ntypedef CGAL::Exact_intersections_tag Tag4;\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EIK> Vb;\ntypedef CGAL::Constrained_triangulation_face_base_2<EIK> CFb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EIK, CFb> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Constrained_triangulation_2<EIK, Tds, Tag4> Triangulation_2;\n\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\ntypedef typename Triangulation_2::Edge Edge;\n\ntypedef ConstrainedTriangulation2<EIK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* ConstrainedTriangulation2_EIK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid ConstrainedTriangulation2_EIK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid ConstrainedTriangulation2_EIK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* ConstrainedTriangulation2_EIK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* ConstrainedTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\t}\n}\n\nvoid ConstrainedTriangulation2_EIK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint ConstrainedTriangulation2_EIK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL ConstrainedTriangulation2_EIK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint ConstrainedTriangulation2_EIK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint ConstrainedTriangulation2_EIK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL ConstrainedTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool ConstrainedTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL ConstrainedTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL ConstrainedTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL ConstrainedTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint ConstrainedTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL ConstrainedTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL ConstrainedTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL ConstrainedTriangulation2_EIK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL ConstrainedTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid ConstrainedTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Constrained only\n\nint ConstrainedTriangulation2_EIK_ConstrainedEdgesCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->ConstrainedEdgesCount();\n}\n\nBOOL ConstrainedTriangulation2_EIK_HasIncidentConstraints(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->HasIncidentConstraints(index);\n}\n\nint ConstrainedTriangulation2_EIK_IncidentConstraintCount(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IncidentConstraintCount(index);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(a, b);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraint(vertIndex1, vertIndex2);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertSegmentConstraints(segments, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonConstraint(polyPtr);\n}\n\nvoid ConstrainedTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHolesConstraint(pwhPtr);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetConstraints(constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIncidentConstraints(vertexIndex, constraints, count);\n}\n\nvoid ConstrainedTriangulation2_EIK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveConstraint(faceIndex, neighbourIndex);\n}\n\nvoid ConstrainedTriangulation2_EIK_RemoveIncidentConstraints(void* ptr, int vertexIndex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->RemoveIncidentConstraints(vertexIndex);\n}\n\nint ConstrainedTriangulation2_EIK_MarkDomains(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MarkDomains(indices, count);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/ConstrainedTriangulation2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"ConstrainedTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EIK_Create();\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* ConstrainedTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool ConstrainedTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Constrained only\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_ConstrainedEdgesCount(void* ptr);\n\n\tCGALWRAPPER_API BOOL ConstrainedTriangulation2_EIK_HasIncidentConstraints(void* ptr, int index);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_IncidentConstraintCount(void* ptr, int index);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromPoints(void* ptr, Point2d a, Point2d b);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertSegmentConstraintFromVertices(void* ptr, int vertIndex1, int vertIndex2);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertSegmentConstraints(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPolygonConstraint(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_InsertPolygonWithHolesConstraint(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetEdgeConstraints(void* ptr, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetSegmentConstraints(void* ptr, Segment2d* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_GetIncidentConstraints(void* ptr, int vertexIndex, TriEdge2* constraints, int count);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_RemoveConstraint(void* ptr, int faceIndex, int neighbourIndex);\n\n\tCGALWRAPPER_API void ConstrainedTriangulation2_EIK_RemoveIncidentConstraints(void* ptr, int vertexIndex);\n\n\tCGALWRAPPER_API int ConstrainedTriangulation2_EIK_MarkDomains(void* ptr, int* indices, int count);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"TriUtil.h\"\n#include \"TriVertex2.h\"\n#include \"TriFace2.h\"\n#include \"TriangulationMap2.h\"\n#include \"BaseTriangulation2.h\"\n\n#include <vector>\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Delaunay_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n#include <CGAL/Delaunay_mesh_face_base_2.h>\n#include <CGAL/Delaunay_mesh_vertex_base_2.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass DelaunayTriangulation2 : public BaseTriangulation2<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef typename K::Point_2 Point_2;\n\ttypedef CGAL::Triangulation_vertex_base_with_info_2<int, K> Vb;\n\ttypedef CGAL::Triangulation_face_base_with_info_2<int, K> Fb;\n\ttypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\n\ttypedef CGAL::Delaunay_triangulation_2<K, Tds> Triangulation_2;\n\ttypedef typename Triangulation_2::Face_handle Face;\n\ttypedef typename Triangulation_2::Vertex_handle Vertex;\n\nprivate:\n\npublic:\n\n\tinline static DelaunayTriangulation2* NewTriangulation2()\n\t{\n\t\treturn new DelaunayTriangulation2();\n\t}\n\n\tinline static void DeleteTriangulation2(void* ptr)\n\t{\n\t\tauto obj = static_cast<DelaunayTriangulation2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static DelaunayTriangulation2* CastToTriangulation2(void* ptr)\n\t{\n\t\treturn static_cast<DelaunayTriangulation2*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation2();\n\t\tcopy->model = this->model;\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto tri = NewTriangulation2();\n\t\tauto tri2 = new DelaunayTriangulation2<K2, Triangulation_2, Vertex, Face>();\n\n\t\tfor (const auto& vert : tri->model.finite_vertex_handles())\n\t\t{\n\t\t\tauto p = convert(vert->point());\n\t\t\t//tri2->model.insert(p);\n\t\t}\n\n\t\treturn tri2;\n\t}\n\n\t//Delauny only\n\n\tvoid VoronoiCount(int& numSegments, int& numRays)\n\t{\n\t\tnumSegments = 0;\n\t\tnumRays = 0;\n\n\t\tfor (auto eit = this->model.edges_begin(); eit != this->model.edges_end(); ++eit)\n\t\t{\n\t\t\tCGAL::Object o = this->model.dual(eit);\n\t\t\tif (CGAL::object_cast<K::Segment_2>(&o))\n\t\t\t\tnumSegments++;\n\t\t\telse if (CGAL::object_cast<K::Ray_2>(&o))\n\t\t\t\tnumRays++;\n\t\t}\n\t}\n\n\tint VoronoiSegmentCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto eit = this->model.edges_begin(); eit != this->model.edges_end(); ++eit)\n\t\t{\n\t\t\tCGAL::Object o = this->model.dual(eit);\n\t\t\tif (CGAL::object_cast<K::Segment_2>(&o)) \n\t\t\t\t++count;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tint VoronoiRayCount()\n\t{\n\t\tint count = 0;\n\t\tfor (auto eit = this->model.edges_begin(); eit != this->model.edges_end(); ++eit)\n\t\t{\n\t\t\tCGAL::Object o = this->model.dual(eit);\n\t\t\tif (CGAL::object_cast<K::Ray_2>(&o))\n\t\t\t\t++count;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tvoid GetVoronoiSegments(Segment2d* segments, int count)\n\t{\n\t\tint i = 0;\n\t\tfor (auto eit = this->model.edges_begin(); eit != this->model.edges_end(); ++eit)\n\t\t{\n\t\t\tif (i >= count) return;\n\n\t\t\tCGAL::Object o = this->model.dual(eit);\n\t\t\tif (auto seg = CGAL::object_cast<K::Segment_2>(&o))\n\t\t\t\tsegments[i++] = Segment2d::FromCGAL<K>(seg->source(), seg->target());\n\t\t}\n\t}\n\n\tvoid GetVoronoiRays(Ray2d* rays, int count)\n\t{\n\t\tint i = 0;\n\t\tfor (auto eit = this->model.edges_begin(); eit != this->model.edges_end(); ++eit)\n\t\t{\n\t\t\tif (i >= count) return;\n\n\t\t\tCGAL::Object o = this->model.dual(eit);\n\t\t\tif (auto ray = CGAL::object_cast<K::Ray_2>(&o))\n\t\t\t\trays[i++] = Ray2d::FromCGAL<K>(ray->source(), ray->to_vector());\n\t\t}\n\t}\n\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation2_EEK.cpp",
    "content": "#pragma once\n\n#include \"DelaunayTriangulation2_EEK.h\"\n#include \"DelaunayTriangulation2.h\"\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EEK> Vb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EEK> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Delaunay_triangulation_2<EEK, Tds> Triangulation_2;\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\n\ntypedef DelaunayTriangulation2<EEK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* DelaunayTriangulation2_EEK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid DelaunayTriangulation2_EEK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid DelaunayTriangulation2_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* DelaunayTriangulation2_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* DelaunayTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\t}\n}\n\nvoid DelaunayTriangulation2_EEK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint DelaunayTriangulation2_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL DelaunayTriangulation2_EEK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint DelaunayTriangulation2_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint DelaunayTriangulation2_EEK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid DelaunayTriangulation2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid DelaunayTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid DelaunayTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid DelaunayTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid DelaunayTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid DelaunayTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL DelaunayTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid DelaunayTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool DelaunayTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid DelaunayTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL DelaunayTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL DelaunayTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid DelaunayTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL DelaunayTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid DelaunayTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint DelaunayTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL DelaunayTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL DelaunayTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL DelaunayTriangulation2_EEK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL DelaunayTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid DelaunayTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Delaunay only\n\nint DelaunayTriangulation2_EEK_VoronoiSegmentCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VoronoiSegmentCount();\n}\n\nint DelaunayTriangulation2_EEK_VoronoiRayCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VoronoiRayCount();\n}\n\nvoid DelaunayTriangulation2_EEK_VoronoiCount(void* ptr, int& numSegments, int& numRays)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->VoronoiCount(numSegments, numRays);\n}\n\nvoid DelaunayTriangulation2_EEK_GetVoronoiSegments(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVoronoiSegments(segments, count);\n}\n\nvoid DelaunayTriangulation2_EEK_GetVoronoiRays(void* ptr, Ray2d* rays, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVoronoiRays(rays, count);\n}"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"DelaunayTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EEK_Create();\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool DelaunayTriangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Delaunay only\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_VoronoiSegmentCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EEK_VoronoiRayCount(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_VoronoiCount(void* ptr, int& numSegments, int& numRays);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetVoronoiSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EEK_GetVoronoiRays(void* ptr, Ray2d* rays, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation2_EIK.cpp",
    "content": "#pragma once\n\n#include \"DelaunayTriangulation2_EIK.h\"\n#include \"DelaunayTriangulation2.h\"\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EIK> Vb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EIK> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Delaunay_triangulation_2<EIK, Tds> Triangulation_2;\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\n\ntypedef DelaunayTriangulation2<EIK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* DelaunayTriangulation2_EIK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid DelaunayTriangulation2_EIK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid DelaunayTriangulation2_EIK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* DelaunayTriangulation2_EIK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* DelaunayTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\t}\n}\n\nvoid DelaunayTriangulation2_EIK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint DelaunayTriangulation2_EIK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL DelaunayTriangulation2_EIK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint DelaunayTriangulation2_EIK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint DelaunayTriangulation2_EIK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid DelaunayTriangulation2_EIK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid DelaunayTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid DelaunayTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid DelaunayTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid DelaunayTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid DelaunayTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL DelaunayTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid DelaunayTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool DelaunayTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid DelaunayTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL DelaunayTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL DelaunayTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid DelaunayTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL DelaunayTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid DelaunayTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint DelaunayTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL DelaunayTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL DelaunayTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL DelaunayTriangulation2_EIK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL DelaunayTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid DelaunayTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n//Delaunay only\n\nint DelaunayTriangulation2_EIK_VoronoiSegmentCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VoronoiSegmentCount();\n}\n\nint DelaunayTriangulation2_EIK_VoronoiRayCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VoronoiRayCount();\n}\n\nvoid DelaunayTriangulation2_EIK_VoronoiCount(void* ptr, int& numSegments, int& numRays)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->VoronoiCount(numSegments, numRays);\n}\n\nvoid DelaunayTriangulation2_EIK_GetVoronoiSegments(void* ptr, Segment2d* segments, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVoronoiSegments(segments, count);\n}\n\nvoid DelaunayTriangulation2_EIK_GetVoronoiRays(void* ptr, Ray2d* rays, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVoronoiRays(rays, count);\n}"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"DelaunayTriangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EIK_Create();\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* DelaunayTriangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool DelaunayTriangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n\t//Delaunay only\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_VoronoiSegmentCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation2_EIK_VoronoiRayCount(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_VoronoiCount(void* ptr, int& numSegments, int& numRays);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetVoronoiSegments(void* ptr, Segment2d* segments, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation2_EIK_GetVoronoiRays(void* ptr, Ray2d* rays, int count);\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"TriUtil.h\"\n\n#include <vector>\n#include \"CGAL/Point_3.h\"\n#include <CGAL/Triangulation_3.h>\n#include <CGAL/Triangulation_cell_base_with_info_3.h>\n#include <CGAL/Triangulation_vertex_base_with_info_3.h>\n#include <CGAL/Aff_transformation_3.h>\n\n#include <CGAL/Delaunay_triangulation_3.h>\n#include <CGAL/Delaunay_triangulation_cell_base_3.h>\n#include <CGAL/Triangulation_vertex_base_with_info_3.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass DelaunayTriangulation3 : public BaseTriangulation3<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef typename CGAL::Triangulation_vertex_base_with_info_3<int, K>\t\tVb;\n\ttypedef typename CGAL::Delaunay_triangulation_cell_base_3<K>                Cb;\n\ttypedef typename CGAL::Triangulation_data_structure_3<Vb, Cb>               Tds;\n\n\ttypedef CGAL::Delaunay_triangulation_3<K, Tds> \t\t\t\t\t\tDelaunayTriangulation_3;\n\n\ttypedef typename DelaunayTriangulation_3::Point\t\t\t\t\t\tPoint_3;\n\ttypedef typename DelaunayTriangulation_3::Cell_handle\t\t\t\tCell;\n\ttypedef typename DelaunayTriangulation_3::Vertex_handle\t\t\t\tVertex;\n\n\ttypedef CGAL::Aff_transformation_3<K>\t\t\t\t\t\t\t\tTransformation_3;\n\npublic:\n\n\tDelaunayTriangulation3()\n\t{\n\n\t}\n\n\t~DelaunayTriangulation3()\n\t{\n\n\t}\n\n\tinline static DelaunayTriangulation3* NewTriangulation3()\n\t{\n\t\treturn new DelaunayTriangulation3();\n\t}\n\n\tinline static void DeleteTriangulation3(void* ptr)\n\t{\n\t\tauto obj = static_cast<DelaunayTriangulation3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static DelaunayTriangulation3* CastToTriangulation3(void* ptr)\n\t{\n\t\treturn static_cast<DelaunayTriangulation3*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation3();\n\t\tcopy->model = this->model;\n\t\treturn copy;\n\t}\n\n\tBOOL Move(int index, const Point3d& point, BOOL ifNoCollision)\n\t{\n\t\tauto vert = this->GetVertex(index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tif (ifNoCollision)\n\t\t\t\tthis->model.move_if_no_collision(vert, point.ToCGAL<K>());\n\t\t\telse\n\t\t\t\tthis->model.move(vert, point.ToCGAL<K>());\n\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\n\tint NearestVertex(const Point3d& point)\n\t{\n\t\tthis->BuildVertexIndices();\n\t\tauto vert = this->model.nearest_vertex(point.ToCGAL<K>());\n\t\treturn vert->info();\n\t}\n\n\tint NearestVertexInCell(int index, const Point3d& point)\n\t{\n\t\tauto cell = this->GetCell(index);\n\t\tif (cell != nullptr)\n\t\t{\n\t\t\tthis->BuildVertexIndices();\n\t\t\tauto vert = this->model.nearest_vertex_in_cell(point.ToCGAL<K>(), cell);\n\t\t\treturn vert->info();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn NULL_INDEX;\n\t\t}\n\t}\n\n\tBOOL RemoveVertex(int index)\n\t{\n\t\tauto vert = this->GetVertex(index);\n\t\tif (vert != nullptr)\n\t\t{\n\t\t\tthis->model.remove(vert);\n\t\t\treturn TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n};"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation3_EEK.cpp",
    "content": "#pragma once\n#include \"DelaunayTriangulation3_EEK.h\"\n#include \"BaseTriangulation3.h\"\n#include \"DelaunayTriangulation3.h\"\n\ntypedef typename CGAL::Triangulation_vertex_base_with_info_3<int, EEK>\t\tVb;\ntypedef typename CGAL::Delaunay_triangulation_cell_base_3<EEK>                Cb;\ntypedef typename CGAL::Triangulation_data_structure_3<Vb, Cb>               Tds;\n\ntypedef CGAL::Delaunay_triangulation_3<EEK, Tds> \t\t\t\t\t\tDelaunayTriangulation_3;\n\ntypedef typename DelaunayTriangulation_3::Point\t\t\t\t\t\tPoint_3;\ntypedef typename DelaunayTriangulation_3::Cell_handle\t\t\t\tCell;\ntypedef typename DelaunayTriangulation_3::Vertex_handle\t\t\t\tVertex;\n\ntypedef DelaunayTriangulation3<EEK, DelaunayTriangulation_3, Vertex, Cell> Tri3;\n\nvoid* DelaunayTriangulation3_EEK_Create()\n{\n\treturn Tri3::NewTriangulation3();\n}\n\nvoid DelaunayTriangulation3_EEK_Release(void* ptr)\n{\n\tTri3::DeleteTriangulation3(ptr);\n}\n\nvoid* DelaunayTriangulation3_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Copy();\n}\n\nvoid DelaunayTriangulation3_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->Clear();\n}\n\nint DelaunayTriangulation3_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->buildStamp;\n}\n\nint DelaunayTriangulation3_EEK_Dimension(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Dimension();\n}\n\nBOOL DelaunayTriangulation3_EEK_IsValid(void* ptr, BOOL verbose)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->IsValid(verbose);\n}\n\nint DelaunayTriangulation3_EEK_FiniteVertexCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteVertexCount();\n}\n\nint DelaunayTriangulation3_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->VertexCount();\n}\n\nint DelaunayTriangulation3_EEK_CellCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->CellCount();\n}\n\nint DelaunayTriangulation3_EEK_FiniteCellCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteCellCount();\n}\n\nint DelaunayTriangulation3_EEK_EdgeCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->EdgeCount();\n}\n\nint DelaunayTriangulation3_EEK_FiniteEdgeCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteEdgeCount();\n}\n\nint DelaunayTriangulation3_EEK_FacetCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FacetCount();\n}\n\nint DelaunayTriangulation3_EEK_FiniteFacetCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteFacetCount();\n}\n\nvoid DelaunayTriangulation3_EEK_InsertPoint(void* ptr, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid DelaunayTriangulation3_EEK_InsertPoints(void* ptr, Point3d* points, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid DelaunayTriangulation3_EEK_InsertInCell(void* ptr, int index, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertInCell(index, point);\n}\n\nint DelaunayTriangulation3_EEK_Locate(void* ptr, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Locate(point);\n}\n\nvoid DelaunayTriangulation3_EEK_GetCircumcenters(void* ptr, Point3d* Circumcenters, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetCircumcenters(Circumcenters, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetVertices(void* ptr, TriVertex3* vertices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nBOOL DelaunayTriangulation3_EEK_GetVertex(void* ptr, int index, TriVertex3& vertex)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid DelaunayTriangulation3_EEK_GetCells(void* ptr, TriCell3* cells, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetCells(cells, count);\n}\n\nBOOL DelaunayTriangulation3_EEK_GetCell(void* ptr, int index, TriCell3& cell)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->GetCell(index, cell);\n}\n\nvoid DelaunayTriangulation3_EEK_GetSegmentIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetSegmentIndices(indices, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetTriangleIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTriangleIndices(indices, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetTetrahedraIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTetrahedraIndices(indices, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetSegments(segments, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nvoid DelaunayTriangulation3_EEK_GetTetahedrons(void* ptr, Tetahedron3d* tetahedrons, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTetahedrons(tetahedrons, count);\n}\n\nvoid DelaunayTriangulation3_EEK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->Transform(matrix);\n}\n\nBOOL DelaunayTriangulation3_EEK_Move(void* ptr, int index, const Point3d& point, BOOL ifNoCollision)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Move(index, point, ifNoCollision);\n}\n\nint DelaunayTriangulation3_EEK_NearestVertex(void* ptr, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->NearestVertex(point);\n}\n\nint DelaunayTriangulation3_EEK_NearestVertexInCell(void* ptr, int index, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->NearestVertexInCell(index, point);\n}\n\nBOOL DelaunayTriangulation3_EEK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->RemoveVertex(index);\n}\n"
  },
  {
    "path": "CGALWrapper/Triangulations/DelaunayTriangulation3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"TriVertex3.h\"\n#include \"TriCell3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* DelaunayTriangulation3_EEK_Create();\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* DelaunayTriangulation3_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_Dimension(void* ptr);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation3_EEK_IsValid(void* ptr, BOOL verbose);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_FiniteVertexCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_CellCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_FiniteCellCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_FiniteEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_FacetCount(void* ptr);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_FiniteFacetCount(void* ptr);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_InsertPoint(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_InsertPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_InsertInCell(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_Locate(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetCircumcenters(void* ptr, Point3d* Circumcenters, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetVertices(void* ptr, TriVertex3* vertices, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation3_EEK_GetVertex(void* ptr, int index, TriVertex3& vertex);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetCells(void* ptr, TriCell3* cells, int count);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation3_EEK_GetCell(void* ptr, int index, TriCell3& cell);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetSegmentIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetTriangleIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetTetrahedraIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_GetTetahedrons(void* ptr, Tetahedron3d* tetahedrons, int count);\n\n\tCGALWRAPPER_API void DelaunayTriangulation3_EEK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation3_EEK_Move(void* ptr, int index, const Point3d& point, BOOL ifNoCollision);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_NearestVertex(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API int DelaunayTriangulation3_EEK_NearestVertexInCell(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API BOOL DelaunayTriangulation3_EEK_RemoveVertex(void* ptr, int index);\n}"
  },
  {
    "path": "CGALWrapper/Triangulations/TriCell3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"CGAL/Point_3.h\"\n\nstruct TriCell3\n{\n\tBOOL IsInfinite;\n\n\tint Index;\n\n\tint VertexIndices[4];\n\n\tint NeighborIndices[4];\n\n\tstatic TriCell3 NullCell()\n\t{\n\t\tTriCell3 c;\n\t\tc.IsInfinite = false;\n\t\tc.Index = NULL_INDEX;\n\t\tc.VertexIndices[0] = NULL_INDEX;\n\t\tc.VertexIndices[1] = NULL_INDEX;\n\t\tc.VertexIndices[2] = NULL_INDEX;\n\t\tc.VertexIndices[3] = NULL_INDEX;\n\t\tc.NeighborIndices[0] = NULL_INDEX;\n\t\tc.NeighborIndices[1] = NULL_INDEX;\n\t\tc.NeighborIndices[2] = NULL_INDEX;\n\t\tc.NeighborIndices[3] = NULL_INDEX;\n\t\treturn c;\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/TriEdge2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include \"CGAL/Point_2.h\"\n\nstruct TriEdge2\n{\n\tint FaceIndex;\n\tint NeighbourIndex;\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/TriFace2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n\n#include \"CGAL/Point_2.h\"\n\nstruct TriFace2\n{\n\tBOOL IsInfinite;\n\tint Index;\n\tint VertexIndices[3];\n\n\tstatic TriFace2 NullFace()\n\t{\n\t\tTriFace2 f;\n\t\tf.IsInfinite = false;\n\t\tf.Index = NULL_INDEX;\n\t\tf.VertexIndices[0] = NULL_INDEX;\n\t\tf.VertexIndices[1] = NULL_INDEX;\n\t\tf.VertexIndices[2] = NULL_INDEX;\n\t\treturn f;\n\t}\n\n\ttemplate<class TRI, class FACE>\n\tstatic TriFace2 FromFace(const TRI& tri, FACE face)\n\t{\n\t\tTriFace2 triFace;\n\t\ttriFace.IsInfinite = tri.is_infinite(face);\n\n\t\tif(triFace.IsInfinite)\n\t\t\ttriFace.Index = NULL_INDEX;\n\t\telse\n\t\t\ttriFace.Index = face->info();\n\n\t\tfor (int j = 0; j < 3; j++)\n\t\t{\n\t\t\tauto vert = face->vertex(j);\n\n\t\t\tif (tri.is_infinite(vert))\n\t\t\t\ttriFace.VertexIndices[j] = NULL_INDEX;\n\t\t\telse\n\t\t\t\ttriFace.VertexIndices[j] = vert->info();\n\t\t}\n\n\t\treturn triFace;\n\t}\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/TriUtil.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"TriFace2.h\"\n#include \"TriVertex2.h\"\n\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Triangulation_2.h>\n#include <CGAL/Delaunay_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n\nnamespace TriUtil\n{\n\n\ttemplate<class FACE>\n\tint NeighbourIndex(FACE face, FACE neighbour)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t{\n\t\t\tif (face->neighbor(i) == neighbour)\n\t\t\t\treturn i;\n\t\t}\n\n\t\treturn NULL_INDEX;\n\t}\n\n\ttemplate<class TRI, class VERT>\n\tint Degree2(TRI& tri, VERT vert)\n\t{\n\t\tauto face = vert->face();\n\t\tauto start = vert->incident_faces(face), end(start);\n\n\t\tint count = 0;\n\n\t\tif (!start.is_empty())\n\t\t{\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (!tri.is_infinite(start))\n\t\t\t\t\t++count;\n\n\t\t\t} while (++start != end);\n\t\t}\n\n\t\treturn count;\n\t}\n\n\t//template<class TRI, class VERT, class CELL>\n\t//int Degree3(TRI& tri, VERT vert)\n\t//{\n\t//\tstd::vector<CELL> cells;\n\t//\ttri.finite_incident_cells(vert, std::back_inserter(cells));\n\t//\treturn cells.size();\n\t//}\n\n\ttemplate<class POINT, class FACE>\n\tPOINT CenterPoint(FACE face)\n\t{\n\t\tPOINT p0 = face->vertex(0)->point();\n\t\tPOINT p1 = face->vertex(1)->point();\n\t\tPOINT p2 = face->vertex(2)->point();\n\n\t\tauto x = (p0.x() + p1.x() + p2.x()) / 3;\n\t\tauto y = (p0.y() + p1.y() + p2.y()) / 3;\n\n\t\treturn POINT(x, y);\n\t}\n\n}\n"
  },
  {
    "path": "CGALWrapper/Triangulations/TriVertex2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include \"CGAL/Point_2.h\"\n\nstruct TriVertex2\n{\n\tPoint2d Point;\n\n\tBOOL IsInfinite;\n\n\tint Degree;\n\n\tint Index;\n\n\tint FaceIndex;\n\n\tstatic TriVertex2 NullVertex()\n\t{\n\t\tTriVertex2 v;\n\t\tv.Point = { 0, 0};\n\t\tv.IsInfinite = false;\n\t\tv.Degree = 0;\n\t\tv.Index = NULL_INDEX;\n\t\tv.FaceIndex = NULL_INDEX;\n\t\treturn v;\n\t}\n\n\ttemplate<class K, class TRI, class VERT>\n\tstatic TriVertex2 FromVertex(const TRI& tri, VERT vert, int degree)\n\t{\n\t\tTriVertex2 triVertex;\n\t\ttriVertex.Point = Point2d::FromCGAL<K>(vert->point());\n\t\ttriVertex.IsInfinite = tri.is_infinite(vert);\n\t\ttriVertex.Degree = degree;\n\t\ttriVertex.Index = vert->info();\n\n\t\tauto face = vert->face();\n\n\t\tif (tri.is_infinite(face) || tri.number_of_faces() == 0)\n\t\t\ttriVertex.FaceIndex = NULL_INDEX;\n\t\telse\n\t\t\ttriVertex.FaceIndex = face->info();\n\n\t\treturn triVertex;\n\t}\n};\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/TriVertex3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\n#include \"CGAL/Point_3.h\"\n\nstruct TriVertex3\n{\n\tPoint3d Point;\n\n\tBOOL IsInfinite;\n\n\tint Degree;\n\n\tint Index;\n\n\tint CellIndex;\n\n\tstatic TriVertex3 NullVertex()\n\t{\n\t\tTriVertex3 v;\n\t\tv.Point = { 0, 0 };\n\t\tv.IsInfinite = false;\n\t\tv.Degree = 0;\n\t\tv.Index = NULL_INDEX;\n\t\tv.CellIndex = NULL_INDEX;\n\t\treturn v;\n\t}\n\n};\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Polygons/Polygon2.h\"\n#include \"../Polygons/PolygonWithHoles2.h\"\n#include \"BaseTriangulation2.h\"\n\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass Triangulation2 : public BaseTriangulation2<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef CGAL::Triangulation_vertex_base_with_info_2<int, K> Vb;\n\ttypedef CGAL::Triangulation_face_base_with_info_2<int, K> Fb;\n\ttypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\n\ttypedef CGAL::Triangulation_2<K, Tds> Triangulation_2;\n\ttypedef typename Triangulation_2::Face_handle Face;\n\ttypedef typename Triangulation_2::Vertex_handle Vertex;\n\npublic:\n\n\tinline static Triangulation2* NewTriangulation2()\n\t{\n\t\treturn new Triangulation2();\n\t}\n\n\tinline static void DeleteTriangulation2(void* ptr)\n\t{\n\t\tauto obj = static_cast<Triangulation2*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Triangulation2* CastToTriangulation2(void* ptr)\n\t{\n\t\treturn static_cast<Triangulation2*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation2();\n\t\tcopy->model = this->model;\n\t\treturn copy;\n\t}\n\n\ttemplate<class K2>\n\tstatic void* Convert(void* ptr)\n\t{\n\t\ttypedef CGAL::Cartesian_converter<K, K2> Converter;\n\t\tConverter convert;\n\n\t\tauto tri = NewTriangulation2();\n\t\tauto tri2 = new Triangulation2<K2, Triangulation_2, Vertex, Face>();\n\n\t\tfor (const auto& vert : tri->model.finite_vertex_handles())\n\t\t{\n\t\t\tauto p = convert(vert->point());\n\t\t\t//tri2->model.insert(p);\n\t\t}\n\n\t\treturn tri2;\n\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation2_EEK.cpp",
    "content": "#pragma once\n#include \"Triangulation2_EEK.h\"\n#include \"Triangulation2.h\"\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EEK> Vb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EEK> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Triangulation_2<EEK, Tds> Triangulation_2;\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\n\ntypedef Triangulation2<EEK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* Triangulation2_EEK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid Triangulation2_EEK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid Triangulation2_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* Triangulation2_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* Triangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\t}\n}\n\nvoid Triangulation2_EEK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint Triangulation2_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL Triangulation2_EEK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint Triangulation2_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint Triangulation2_EEK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid Triangulation2_EEK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid Triangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid Triangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid Triangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid Triangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid Triangulation2_EEK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL Triangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid Triangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool Triangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid Triangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL Triangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL Triangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid Triangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL Triangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid Triangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint Triangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL Triangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL Triangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL Triangulation2_EEK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL Triangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid Triangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation2_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Triangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Triangulation2_EEK_Create();\n\n\tCGALWRAPPER_API void Triangulation2_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* Triangulation2_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Triangulation2_EEK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation2_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int Triangulation2_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation2_EEK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool Triangulation2_EEK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int Triangulation2_EEK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EEK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void Triangulation2_EEK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation2_EIK.cpp",
    "content": "#pragma once\n#include \"Triangulation2_EIK.h\"\n#include \"Triangulation2.h\"\n\ntypedef CGAL::Triangulation_vertex_base_with_info_2<int, EIK> Vb;\ntypedef CGAL::Triangulation_face_base_with_info_2<int, EIK> Fb;\ntypedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;\ntypedef CGAL::Triangulation_2<EIK, Tds> Triangulation_2;\ntypedef typename Triangulation_2::Face_handle Face;\ntypedef typename Triangulation_2::Vertex_handle Vertex;\n\ntypedef Triangulation2<EIK, Triangulation_2, Vertex, Face> Tri2;\n\nvoid* Triangulation2_EIK_Create()\n{\n\treturn Tri2::NewTriangulation2();\n}\n\nvoid Triangulation2_EIK_Release(void* ptr)\n{\n\tTri2::DeleteTriangulation2(ptr);\n}\n\nvoid Triangulation2_EIK_Clear(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Clear();\n}\n\nvoid* Triangulation2_EIK_Copy(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->Copy();\n}\n\nvoid* Triangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k)\n{\n\tswitch (k)\n\t{\n\tcase CGAL_KERNEL::EXACT_PREDICATES_INEXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\n\tcase CGAL_KERNEL::EXACT_PREDICATES_EXACT_CONSTRUCTION:\n\t\treturn Tri2::Convert<EEK>(ptr);\n\n\tdefault:\n\t\treturn Tri2::Convert<EIK>(ptr);\n\t}\n}\n\nvoid Triangulation2_EIK_SetIndices(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->SetIndices();\n}\n\nint Triangulation2_EIK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->BuildStamp();\n}\n\nBOOL Triangulation2_EIK_IsValid(void* ptr, int level)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->IsValid(level);\n}\n\nint Triangulation2_EIK_VertexCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->VertexCount();\n}\n\nint Triangulation2_EIK_FaceCount(void* ptr)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FaceCount();\n}\n\nvoid Triangulation2_EIK_InsertPoint(void* ptr, Point2d point)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid Triangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid Triangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygon(polyPtr);\n}\n\nvoid Triangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr)\n{\n\tauto tri = Tri2::CastToTriangulation2(triPtr);\n\ttri->InsertPolygonWithHoles(pwhPtr);\n}\n\nvoid Triangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid Triangulation2_EIK_GetIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetIndices(indices, count);\n}\n\nBOOL Triangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid Triangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nbool Triangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetFace(index, face);\n}\n\nvoid Triangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetFaces(faces, count);\n}\n\nBOOL Triangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetSegment(faceIndex, neighbourIndex, segment);\n}\n\nBOOL Triangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetTriangle(faceIndex, triangle);\n}\n\nvoid Triangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nBOOL Triangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->GetCircumcenter(faceIndex, circumcenter);\n}\n\nvoid Triangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->GetCircumcenters(circumcenters, count);\n}\n\nint Triangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->NeighbourIndex(faceIndex, index);\n}\n\nBOOL Triangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->LocateFace(point, face);\n}\n\nBOOL Triangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->MoveVertex(index, point, ifNoCollision, vertex);\n}\n\nBOOL Triangulation2_EIK_RemoveVertex(void* ptr, int index)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->RemoveVertex(index);\n}\n\nBOOL Triangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\treturn tri->FlipEdge(faceIndex, neighbour);\n}\n\nvoid Triangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale)\n{\n\tauto tri = Tri2::CastToTriangulation2(ptr);\n\ttri->Transform(translation, rotation, scale);\n}\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation2_EIK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"Triangulation2.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Triangulation2_EIK_Create();\n\n\tCGALWRAPPER_API void Triangulation2_EIK_Release(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* Triangulation2_EIK_Copy(void* ptr);\n\n\tCGALWRAPPER_API void* Triangulation2_EIK_Convert(void* ptr, CGAL_KERNEL k);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_SetIndices(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation2_EIK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_IsValid(void* ptr, int level);\n\n\tCGALWRAPPER_API int Triangulation2_EIK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation2_EIK_FaceCount(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_InsertPoint(void* ptr, Point2d point);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_InsertPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_InsertPolygon(void* triPtr, void* polyPtr);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_InsertPolygonWithHoles(void* triPtr, void* pwhPtr);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetPoints(void* ptr, Point2d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_GetVertex(void* ptr, int index, TriVertex2& vertex);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetVertices(void* ptr, TriVertex2* vertices, int count);\n\n\tCGALWRAPPER_API bool Triangulation2_EIK_GetFace(void* ptr, int index, TriFace2& face);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetFaces(void* ptr, TriFace2* faces, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_GetSegment(void* ptr, int faceIndex, int neighbourIndex, Segment2d& segment);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_GetTriangle(void* ptr, int faceIndex, Triangle2d& triangle);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetTriangles(void* ptr, Triangle2d* triangles, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_GetCircumcenter(void* ptr, int faceIndex, Point2d& circumcenter);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_GetCircumcenters(void* ptr, Point2d* circumcenters, int count);\n\n\tCGALWRAPPER_API int Triangulation2_EIK_NeighbourIndex(void* ptr, int faceIndex, int index);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_LocateFace(void* ptr, Point2d point, TriFace2& face);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_MoveVertex(void* ptr, int index, Point2d point, BOOL ifNoCollision, TriVertex2& vertex);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_RemoveVertex(void* ptr, int index);\n\n\tCGALWRAPPER_API BOOL Triangulation2_EIK_FlipEdge(void* ptr, int faceIndex, int neighbour);\n\n\tCGALWRAPPER_API void Triangulation2_EIK_Transform(void* ptr, Point2d translation, double rotation, double scale);\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation3.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"TriUtil.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"BaseTriangulation3.h\"\n\n#include <vector>\n#include \"CGAL/Point_3.h\"\n#include <CGAL/Triangulation_3.h>\n#include <CGAL/Triangulation_cell_base_with_info_3.h>\n#include <CGAL/Triangulation_vertex_base_with_info_3.h>\n#include <CGAL/Aff_transformation_3.h>\n\ntemplate<class K, class TRI, class VERT, class FACE>\nclass Triangulation3 : public BaseTriangulation3<K, TRI, VERT, FACE>\n{\n\npublic:\n\n\ttypedef CGAL::Triangulation_vertex_base_with_info_3<int, K> Vb;\n\ttypedef CGAL::Triangulation_cell_base_with_info_3<int, K>\tCb;\n\ttypedef CGAL::Triangulation_data_structure_3<Vb, Cb>        Tds;\n\n\ttypedef CGAL::Triangulation_3<K, Tds>\t\t\t\t\t\tTriangulation_3;\n\n\ttypedef typename Triangulation_3::Point\t\t\t\t\t\tPoint_3;\n\ttypedef typename Triangulation_3::Cell_handle\t\t\t\tCell;\n\ttypedef typename Triangulation_3::Vertex_handle\t\t\t\tVertex;\n\npublic:\n\n\tTriangulation3()\n\t{\n\n\t}\n\n\t~Triangulation3()\n\t{\n\n\t}\n\n\tinline static Triangulation3* NewTriangulation3()\n\t{\n\t\treturn new Triangulation3();\n\t}\n\n\tinline static void DeleteTriangulation3(void* ptr)\n\t{\n\t\tauto obj = static_cast<Triangulation3*>(ptr);\n\n\t\tif (obj != nullptr)\n\t\t{\n\t\t\tdelete obj;\n\t\t\tobj = nullptr;\n\t\t}\n\t}\n\n\tinline static Triangulation3* CastToTriangulation3(void* ptr)\n\t{\n\t\treturn static_cast<Triangulation3*>(ptr);\n\t}\n\n\tvoid* Copy()\n\t{\n\t\tauto copy = NewTriangulation3();\n\t\tcopy->model = this->model;\n\t\treturn copy;\n\t}\n\n};"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation3_EEK.cpp",
    "content": "#pragma once\n#include \"Triangulation3_EEK.h\"\n#include \"Triangulation3.h\"\n#include \"BaseTriangulation3.h\"\n\n\ntypedef CGAL::Triangulation_vertex_base_with_info_3<int, EEK> Vb;\ntypedef CGAL::Triangulation_cell_base_with_info_3<int, EEK>\tCb;\ntypedef CGAL::Triangulation_data_structure_3<Vb, Cb>        Tds;\n\ntypedef CGAL::Triangulation_3<EEK, Tds>\t\t\t\t\t\tTriangulation_3;\n\ntypedef typename Triangulation_3::Point\t\t\t\t\t\tPoint_3;\ntypedef typename Triangulation_3::Cell_handle\t\t\t\tCell;\ntypedef typename Triangulation_3::Vertex_handle\t\t\t\tVertex;\ntypedef typename Triangulation_3::Edge\t\t\t\t\t\tEdge;\n\ntypedef Triangulation3<EEK, Triangulation_3, Vertex, Cell> Tri3;\n\nvoid* Triangulation3_EEK_Create()\n{\n\treturn Tri3::NewTriangulation3();\n}\n\nvoid Triangulation3_EEK_Release(void* ptr)\n{\n\tTri3::DeleteTriangulation3(ptr);\n}\n\nvoid Triangulation3_EEK_Clear(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->Clear();\n}\n\nvoid* Triangulation3_EEK_Copy(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Copy();\n}\n\nint Triangulation3_EEK_BuildStamp(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->buildStamp;\n}\n\nint Triangulation3_EEK_Dimension(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Dimension();\n}\n\nBOOL Triangulation3_EEK_IsValid(void* ptr, BOOL verbose)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->IsValid(verbose);\n}\n\nint Triangulation3_EEK_FiniteVertexCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteVertexCount();\n}\n\nint Triangulation3_EEK_VertexCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->VertexCount();\n}\n\nint Triangulation3_EEK_CellCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->CellCount();\n}\n\nint Triangulation3_EEK_FiniteCellCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteCellCount();\n}\n\nint Triangulation3_EEK_EdgeCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->EdgeCount();\n}\n\nint Triangulation3_EEK_FiniteEdgeCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteEdgeCount();\n}\n\nint Triangulation3_EEK_FacetCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FacetCount();\n}\n\nint Triangulation3_EEK_FiniteFacetCount(void* ptr)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->FiniteFacetCount();\n}\n\nvoid Triangulation3_EEK_InsertPoint(void* ptr, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertPoint(point);\n}\n\nvoid Triangulation3_EEK_InsertPoints(void* ptr, Point3d* points, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertPoints(points, count);\n}\n\nvoid Triangulation3_EEK_InsertInCell(void* ptr, int index, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->InsertInCell(index, point);\n}\n\nint Triangulation3_EEK_Locate(void* ptr, const Point3d& point)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->Locate(point);\n}\n\nvoid Triangulation3_EEK_GetCircumcenters(void* ptr, Point3d* Circumcenters, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetCircumcenters(Circumcenters, count);\n}\n\nvoid Triangulation3_EEK_GetPoints(void* ptr, Point3d* points, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetPoints(points, count);\n}\n\nvoid Triangulation3_EEK_GetVertices(void* ptr, TriVertex3* vertices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetVertices(vertices, count);\n}\n\nBOOL Triangulation3_EEK_GetVertex(void* ptr, int index, TriVertex3& vertex)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->GetVertex(index, vertex);\n}\n\nvoid Triangulation3_EEK_GetCells(void* ptr, TriCell3* cells, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetCells(cells, count);\n}\n\nBOOL Triangulation3_EEK_GetCell(void* ptr, int index, TriCell3& cell)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\treturn tri->GetCell(index, cell);\n}\n\nvoid Triangulation3_EEK_GetSegmentIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetSegmentIndices(indices, count);\n}\n\nvoid Triangulation3_EEK_GetTriangleIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTriangleIndices(indices, count);\n}\n\nvoid Triangulation3_EEK_GetTetrahedraIndices(void* ptr, int* indices, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTetrahedraIndices(indices, count);\n}\n\nvoid Triangulation3_EEK_GetSegments(void* ptr, Segment3d* segments, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetSegments(segments, count);\n}\n\nvoid Triangulation3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTriangles(triangles, count);\n}\n\nvoid Triangulation3_EEK_GetTetahedrons(void* ptr, Tetahedron3d* tetahedrons, int count)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->GetTetahedrons(tetahedrons, count);\n}\n\nvoid Triangulation3_EEK_Transform(void* ptr, const Matrix4x4d& matrix)\n{\n\tauto tri = Tri3::CastToTriangulation3(ptr);\n\ttri->Transform(matrix);\n}\n\n\n\n"
  },
  {
    "path": "CGALWrapper/Triangulations/Triangulation3_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"../Geometry/Matrices.h\"\n#include \"TriVertex3.h\"\n#include \"TriCell3.h\"\n\nextern \"C\"\n{\n\tCGALWRAPPER_API void* Triangulation3_EEK_Create();\n\n\tCGALWRAPPER_API void Triangulation3_EEK_Release(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_Clear(void* ptr);\n\n\tCGALWRAPPER_API void* Triangulation3_EEK_Copy(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_BuildStamp(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_Dimension(void* ptr);\n\n\tCGALWRAPPER_API BOOL Triangulation3_EEK_IsValid(void* ptr, BOOL verbose);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_FiniteVertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_VertexCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_CellCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_FiniteCellCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_EdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_FiniteEdgeCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_FacetCount(void* ptr);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_FiniteFacetCount(void* ptr);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_InsertPoint(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_InsertPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_InsertInCell(void* ptr, int index, const Point3d& point);\n\n\tCGALWRAPPER_API int Triangulation3_EEK_Locate(void* ptr, const Point3d& point);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetCircumcenters(void* ptr, Point3d* Circumcenters, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetPoints(void* ptr, Point3d* points, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetVertices(void* ptr, TriVertex3* vertices, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation3_EEK_GetVertex(void* ptr, int index, TriVertex3& vertex);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetCells(void* ptr, TriCell3* cells, int count);\n\n\tCGALWRAPPER_API BOOL Triangulation3_EEK_GetCell(void* ptr, int index, TriCell3& cell);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetSegmentIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetTriangleIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetTetrahedraIndices(void* ptr, int* indices, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetSegments(void* ptr, Segment3d* segments, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetTriangles(void* ptr, Triangle3d* triangles, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_GetTetahedrons(void* ptr, Tetahedron3d* tetahedrons, int count);\n\n\tCGALWRAPPER_API void Triangulation3_EEK_Transform(void* ptr, const Matrix4x4d& matrix);\n\n}"
  },
  {
    "path": "CGALWrapper/Triangulations/TriangulationMap2.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Collections/IndexMap.h\"\n\n#include \"CGAL/Point_2.h\"\n#include <CGAL/Constrained_triangulation_2.h>\n#include <CGAL/Triangulation_face_base_with_info_2.h>\n#include <CGAL/Triangulation_vertex_base_with_info_2.h>\n\n#include <CGAL/Constrained_triangulation_face_base_2.h>\n#include <CGAL/Constrained_triangulation_plus_2.h>\n\n/// <summary>\n/// A helper class to hold a triangulations faces and vertices\n/// by a int key value that represents their index in the triangulation.\n/// Infinite faces/vertices will have a index of -1 set and not be \n/// inculded in the map.\n/// </summary>\n/// <typeparam name=\"K\">The triangulations kernel type.</typeparam>\n/// <typeparam name=\"VERTEX\">The vertex type</typeparam>\n/// <typeparam name=\"FACE\">The face type.</typeparam>\ntemplate<class K, class VERTEX, class FACE>\nclass TriangulationMap2\n{\n\nprivate:\n\n\t/// <summary>\n\t/// The map that holds the vertices.\n\t/// </summary>\n\tIndexMap<VERTEX> vertexMap;\n\n\t/// <summary>\n\t/// The mape that holds the faces.\n\t/// </summary>\n\tIndexMap<FACE> faceMap;\n\n\t/// <summary>\n\t/// A build stamp that is increment anytime the map changes.\n\t/// </summary>\n\tint buildStamp;\n\npublic:\n\n\tTriangulationMap2()\n\t{\n\t\t\n\t}\n\n\t/// <summary>\n\t/// Get the current build stamp.\n\t/// </summary>\n\t/// <returns></returns>\n\tint BuildStamp()\n\t{\n\t\treturn buildStamp;\n\t}\n\n\t/// <summary>\n\t/// Increment the build stamp.\n\t/// </summary>\n\tvoid IncrementBuildStamp()\n\t{\n\t\t++buildStamp;\n\t}\n\n\t/// <summary>\n\t/// Build the face and vertex maps\n\t/// if not already built.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulations type</typeparam>\n\t/// <param name=\"model\">The triangulation.</param>\n\ttemplate<class TRI>\n\tvoid BuildMaps(TRI& model)\n\t{\n\t\tBuildVertexMap(model);\n\t\tBuildFaceMap(model);\n\t}\n\n\t/// <summary>\n\t/// Clear the maps to a empty state.\n\t/// </summary>\n\tvoid ClearMaps()\n\t{\n\t\tvertexMap.Clear();\n\t\tfaceMap.Clear();\n\t}\n\n\t/// <summary>\n\t/// Call when the triangulation model has changed.\n\t/// Will mark the faces and vertex maps as needing\n\t/// to be updated.\n\t/// </summary>\n\tvoid OnModelChanged()\n\t{\n\t\tOnVerticesChanged();\n\t\tOnFacesChanged();\n\t}\n\n\t/// <summary>\n\t/// Call when the triangulation vertices have changed.\n\t/// </summary>\n\tvoid OnVerticesChanged()\n\t{\n\t\tbuildStamp++;\n\t\tvertexMap.Clear();\n\t}\n\n\t/// <summary>\n\t/// Call when th triangulation faces have changed.\n\t/// </summary>\n\tvoid OnFacesChanged()\n\t{\n\t\tbuildStamp++;\n\t\tfaceMap.Clear();\n\t}\n\n\t/// <summary>\n\t/// Find the vertex by its key.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation.</param>\n\t/// <param name=\"index\">The vertices index key value.</param>\n\t/// <returns>The vertex or null.</returns>\n\ttemplate<class TRI>\n\tVERTEX* FindVertex(TRI& model, int index)\n\t{\n\t\tif (index == NULL_INDEX) \n\t\t\treturn nullptr;\n\n\t\tSetVertexIndices(model);\n\t\tBuildVertexMap(model);\n\t\treturn vertexMap.Find(index);\n\t}\n\n\t/// <summary>\n\t/// Find the face by its key.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation.</param>\n\t/// <param name=\"index\">The face index key value.</param>\n\t/// <returns>The face or null.</returns>\n\ttemplate<class TRI>\n\tFACE* FindFace(TRI& model, int index)\n\t{\n\t\tif (index == NULL_INDEX)\n\t\t\treturn nullptr;\n\n\t\tSetFaceIndices(model);\n\t\tBuildFaceMap(model);\n\t\treturn faceMap.Find(index);\n\t}\n\n\t/// <summary>\n\t/// Sets the indices of the vertices and faces.\n\t/// Infinite faces/vertices will have a index of\n\t/// -1 set and not be inculded in the map.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\ttemplate<class TRI>\n\tvoid SetIndices(TRI& model)\n\t{\n\t\tSetVertexIndices(model);\n\t\tSetFaceIndices(model);\n\t}\n\n\t/// <summary>\n\t/// Sets the indices of the vertices if they have not already been set.\n\t/// Infinite vertices will have a index of\n\t/// -1 set and not be inculded in the map.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\ttemplate<class TRI>\n\tvoid SetVertexIndices(TRI& model)\n\t{\n\t\tif (vertexMap.indicesSet)\n\t\t\treturn;\n\n\t\tvertexMap.Clear();\n\t\tmodel.infinite_vertex()->info() = NULL_INDEX;\n\n\t\tfor (auto& vert : model.finite_vertex_handles())\n\t\t{\n\t\t\t//If the vertices face is infinite then try and\n\t\t\t//find one of its other surrounding faces that is \n\t\t\t//finite and set that as the face.\n\t\t\tif (model.is_infinite(vert->face()))\n\t\t\t\tResetFace(model, vert);\n\n\t\t\tvert->info() = vertexMap.NextIndex();\n\t\t}\n\n\t\tvertexMap.indicesSet = true;\n\t}\n\n\t/// <summary>\n\t/// Build the vertex map by adding each vertex to the map\n\t/// using its index as the key.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\ttemplate<class TRI>\n\tvoid BuildVertexMap(TRI& model)\n\t{\n\t\tif (vertexMap.mapBuilt)\n\t\t\treturn;\n\n\t\tvertexMap.ClearMap();\n\n\t\tfor (auto& vert : model.finite_vertex_handles())\n\t\t\tvertexMap.Insert(vert->info(), vert);\n\n\t\tvertexMap.mapBuilt = true;\n\t}\n\n\t/// <summary>\n\t/// Sets the indices of the faces if they have not already been set.\n\t/// Infinite faces will have a index of\n\t/// -1 set and not be inculded in the map.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\ttemplate<class TRI>\n\tvoid SetFaceIndices(TRI& model)\n\t{\n\t\tif (faceMap.indicesSet)\n\t\t\treturn;\n\n\t\tfaceMap.Clear();\n\t\tmodel.infinite_face()->info() = NULL_INDEX;\n\n\t\tfor (auto& face : model.finite_face_handles())\n\t\t\tface->info() = faceMap.NextIndex();\n\n\t\tfaceMap.indicesSet = true;\n\t}\n\n\t/// <summary>\n\t/// Set all the faces indices to the value.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\t/// <param name=\"value\">The faces index value to uses.</param>\n\ttemplate<class TRI>\n\tvoid ForceSetFaceIndices(TRI& model, int value)\n\t{\n\t\tfaceMap.mapBuilt = false;\n\n\t\tfor (auto& face : model.finite_face_handles())\n\t\t\tface->info() = value;\n\t}\n\n\t/// <summary>\n\t/// Build the face map by adding each face to the map\n\t/// using its index as the key.\n\t/// </summary>\n\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t/// <param name=\"model\">The triangulation model.</param>\n\ttemplate<class TRI>\n\tvoid BuildFaceMap(TRI& model)\n\t{\n\t\tif (faceMap.mapBuilt)\n\t\t\treturn;\n\n\t\tfaceMap.ClearMap();\n\n\t\tfor (auto& face : model.finite_face_handles())\n\t\t\tfaceMap.Insert(face->info(), face);\n\n\t\tfaceMap.mapBuilt = true;\n\t}\n\n\tprivate:\n\n\t\t/// <summary>\n\t\t/// If the vertices face is infinite then try and\n\t\t/// find one of its other surrounding faces that is \n\t\t/// finite and set that as the face.\n\t\t/// </summary>\n\t\t/// <typeparam name=\"TRI\">The triangulation type.</typeparam>\n\t\t/// <param name=\"tri\">The triangulation model.</param>\n\t\t/// <param name=\"vert\">The vertex to reset.</param>\n\t\ttemplate<class TRI>\n\t\tvoid ResetFace(const TRI& tri, VERTEX vert)\n\t\t{\n\t\t\tauto face = vert->face();\n\t\t\tauto start = vert->incident_faces(face), end(start);\n\n\t\t\tif (start != nullptr)\n\t\t\t{\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\tif (!tri.is_infinite(start))\n\t\t\t\t\t{\n\t\t\t\t\t\tvert->set_face(start);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} while (++start != end);\n\t\t\t}\n\t\t}\n\n};\n"
  },
  {
    "path": "CGALWrapper/Utility/ArrayUtil.h",
    "content": "#pragma once\n#include \"../CGALWrapper.h\"\n\nnamespace ArrayUtil\n{\n\tstatic void FillWithNull(int* indices, int count)\n\t{\n\t\tif (count <= 0) return;\n\t\tif (indices == nullptr) return;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t\tindices[i] = NULL_INDEX;\n\t}\n\n\tstatic void MakeOutOfBoundsNull(int* indices, int count, int len)\n\t{\n\t\tif (count <= 0) return;\n\t\tif (indices == nullptr) return;\n\n\t\tfor (int i = 0; i < count; i++)\n\t\t{\n\t\t\tif(indices[i] < NULL_INDEX || indices[i] >= len)\n\t\t\t\tindices[i] = NULL_INDEX;\n\t\t}\n\t\t\t\n\t}\n}"
  },
  {
    "path": "CGALWrapper/Utility/CGALGlobal.h",
    "content": "#pragma once\n\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\ntemplate<class K>\nclass CGALGlobal\n{\nprivate:\n\n    typedef CGAL::Point_2<K> Point2;\n    typedef CGAL::Vector_2<K> Vector2;\n    typedef CGAL::Line_2<K> Line2;\n    typedef CGAL::Line_3<K> Line3;\n    typedef CGAL::Ray_2<K> Ray2;\n    typedef CGAL::Segment_2<K> Segment2;\n    typedef CGAL::Triangle_2<K> Triangle2;\n    typedef CGAL::Iso_rectangle_2<K> Box2;\n    typedef std::vector<Point2> Polygon2;\n\n    inline static CGAL::Vector_2<EIK>* CastToVector2_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Vector_2<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Vector_2<EEK>* CastToVector2_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Vector_2<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Vector_3<EIK>* CastToVector3_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Vector_3<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Vector_3<EEK>* CastToVector3_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Vector_3<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Point_2<EIK>* CastToPoint2_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Point_2<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Point_2<EEK>* CastToPoint2_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Point_2<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Point_3<EIK>* CastToPoint3_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Point_3<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Point_3<EEK>* CastToPoint3_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Point_3<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Line_2<EIK>* CastToLine2_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Line_2<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Line_2<EEK>* CastToLine2_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Line_2<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Ray_2<EIK>* CastToRay2_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Ray_2<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Ray_2<EEK>* CastToRay2_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Ray_2<EEK>*>(ptr);\n    }\n\n    inline static CGAL::Segment_2<EIK>* CastToSegment2_EIK(void* ptr)\n    {\n        return static_cast<CGAL::Segment_2<EIK>*>(ptr);\n    }\n\n    inline static CGAL::Segment_2<EEK>* CastToSegment2_EEK(void* ptr)\n    {\n        return static_cast<CGAL::Segment_2<EEK>*>(ptr);\n    }\n\npublic:\n\n    //---------------------------------------------------------------------------//\n    //                               Angle                                       //\n    //---------------------------------------------------------------------------//\n\n    static CGAL::Angle Angle_Vector2(Vector2d u, Vector2d v)\n    {\n        return CGAL::angle(u.ToCGAL<K>(), v.ToCGAL<K>());\n    }\n\n    static CGAL::Angle Angle_EIK_Vector2(void* u, void* v)\n    {\n        auto U = CastToVector2_EIK(u);\n        auto V = CastToVector2_EIK(v);\n        return CGAL::angle(*U, *V);\n    }\n\n    static CGAL::Angle Angle_EEK_Vector2(void* u, void* v)\n    {\n        auto U = CastToVector2_EEK(u);\n        auto V = CastToVector2_EEK(v);\n        return CGAL::angle(*U, *V);\n    }\n\n    static CGAL::Angle Angle_Vector3(Vector3d u, Vector3d v)\n    {\n        return CGAL::angle(u.ToCGAL<K>(), v.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                           ApproxAngle                                     //\n    //---------------------------------------------------------------------------//\n\n    static double ApproxAngle_Vector3d(Vector3d u, Vector3d v)\n    {\n        auto d = CGAL::approximate_angle(u.ToCGAL<K>(), v.ToCGAL<K>());\n        return CGAL::to_double(d);\n    }\n\n    //---------------------------------------------------------------------------//\n    //                           ApproxApproxAngle                               //\n    //---------------------------------------------------------------------------//\n\n    static double ApproxDihedralAngle(Point3d p, Point3d q, Point3d r, Point3d s)\n    {\n        auto d = CGAL::approximate_dihedral_angle(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>(), s.ToCGAL<K>());\n        return CGAL::to_double(d);\n    }\n\n    //---------------------------------------------------------------------------//\n    //                           AreOrderedAlongLine                             //\n    //---------------------------------------------------------------------------//\n\n    static BOOL AreOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::are_ordered_along_line(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static BOOL AreOrderedAlongLine_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::are_ordered_along_line(*P, *Q, *R);\n    }\n\n    static BOOL AreOrderedAlongLine_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::are_ordered_along_line(*P, *Q, *R);\n    }\n\n    static BOOL AreOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        return CGAL::are_ordered_along_line(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                           AreStrictlyOrderedAlongLine                             //\n    //---------------------------------------------------------------------------//\n\n    static BOOL AreStrictlyOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::are_strictly_ordered_along_line(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static BOOL AreStrictlyOrderedAlongLine_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::are_strictly_ordered_along_line(*P, *Q, *R);\n    }\n\n    static BOOL AreStrictlyOrderedAlongLine_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::are_strictly_ordered_along_line(*P, *Q, *R);\n    }\n\n    static BOOL AreStrictlyOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        return CGAL::are_strictly_ordered_along_line(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                                  Collinear                                //\n    //---------------------------------------------------------------------------//\n\n    static BOOL Collinear_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::collinear(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static BOOL Collinear_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::collinear(*P, *Q, *R);\n    }\n\n    static BOOL Collinear_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::collinear(*P, *Q, *R);\n    }\n\n    static BOOL Collinear_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        return CGAL::collinear(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                              Barycenter                                   //\n    //---------------------------------------------------------------------------//\n\n    static Point2d Barycenter_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        auto bc = CGAL::barycenter(p.ToCGAL<K>(), 1, q.ToCGAL<K>(), 1, r.ToCGAL<K>(), 1);\n        double x = CGAL::to_double(bc.x());\n        double y = CGAL::to_double(bc.y());\n        return { x, y };\n    }\n\n    static void* Barycenter_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        auto bc = CGAL::barycenter(*P, 1, *Q, 1, *R, 1);\n\n        return new CGAL::Point_2<EIK>(bc.x(), bc.y());\n    }\n\n    static void* Barycenter_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        auto bc = CGAL::barycenter(*P, 1, *Q, 1, *R, 1);\n\n        return new CGAL::Point_2<EEK>(bc.x(), bc.y());\n    }\n\n    static Point3d Barycenter_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        auto bc = CGAL::barycenter(p.ToCGAL<K>(), 1, q.ToCGAL<K>(), 1, r.ToCGAL<K>(), 1);\n        double x = CGAL::to_double(bc.x());\n        double y = CGAL::to_double(bc.y());\n        double z = CGAL::to_double(bc.z());\n        return { x, y, z};\n    }\n\n    //---------------------------------------------------------------------------//\n    //                              Bisector                                     //\n    //---------------------------------------------------------------------------//\n\n    static Line2d Bisector_Point3d(Point3d p, Point3d q)\n    {\n        auto l = CGAL::bisector(p.ToCGAL<K>(), q.ToCGAL<K>());\n        auto a = CGAL::to_double(l.a());\n        auto b = CGAL::to_double(l.b());\n        auto c = CGAL::to_double(l.c());\n        return { a, b, c };\n    }\n\n    static Line2d Bisector_Line2d(Line2d p, Line2d q)\n    {\n        auto l = CGAL::bisector(p.ToCGAL<K, Line2>(), q.ToCGAL<K, Line2>());\n        auto a = CGAL::to_double(l.a());\n        auto b = CGAL::to_double(l.b());\n        auto c = CGAL::to_double(l.c());\n        return { a, b, c };\n    }\n\n    static void* Bisector_EIK_Line2(void* p, void* q)\n    {\n        auto P = CastToLine2_EIK(p);\n        auto Q = CastToLine2_EIK(q);\n\n        auto l = CGAL::bisector(*P, *Q);\n        return new CGAL::Line_2<EIK>(l.a(), l.b(), l.c());\n    }\n\n    static void* Bisector_EEK_Line2(void* p, void* q)\n    {\n        auto P = CastToLine2_EEK(p);\n        auto Q = CastToLine2_EEK(q);\n\n        auto l = CGAL::bisector(*P, *Q);\n        return new CGAL::Line_2<EEK>(l.a(), l.b(), l.c());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                             Coplanar                                      //\n    //---------------------------------------------------------------------------//\n\n    static BOOL Coplanar_Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n    {\n        return CGAL::coplanar(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>(), s.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                            CoplanarOrientation                            //\n    //---------------------------------------------------------------------------//\n\n    static CGAL::Orientation CoplanarOrientation_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        return CGAL::coplanar_orientation(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static CGAL::Orientation CoplanarOrientation_Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n    {\n        return CGAL::coplanar_orientation(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>(), s.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                               EquidistantLine                             //\n    //---------------------------------------------------------------------------//\n\n    static Line3d EquidistantLine_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        auto l = CGAL::equidistant_line(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n        return Line3d::FromCGAL<K>(l.point(), l.to_vector());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                            LeftTurn                                       //\n    //---------------------------------------------------------------------------//\n\n    static BOOL LeftTurn_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::left_turn(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static BOOL LeftTurn_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::left_turn(*P, *Q, *R);\n    }\n\n    static BOOL LeftTurn_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::left_turn(*P, *Q, *R);\n    }\n\n    //---------------------------------------------------------------------------//\n    //                            RightTurn                                      //\n    //---------------------------------------------------------------------------//\n\n    static BOOL RightTurn_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::right_turn(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static BOOL RightTurn_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::right_turn(*P, *Q, *R);\n    }\n\n    static BOOL RightTurn_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::right_turn(*P, *Q, *R);\n    }\n\n    //---------------------------------------------------------------------------//\n    //                              Orientation                                  //\n    //---------------------------------------------------------------------------//\n\n    static CGAL::Orientation Orientation_Point2d(Point2d p, Point2d q, Point2d r)\n    {\n        return CGAL::orientation(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n    }\n\n    static CGAL::Orientation Orientation_EIK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EIK(p);\n        auto Q = CastToPoint2_EIK(q);\n        auto R = CastToPoint2_EIK(r);\n        return CGAL::orientation(*P, *Q, *R);\n    }\n\n    static CGAL::Orientation Orientation_EEK_Point2(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint2_EEK(p);\n        auto Q = CastToPoint2_EEK(q);\n        auto R = CastToPoint2_EEK(r);\n        return CGAL::orientation(*P, *Q, *R);\n    }\n\n    static CGAL::Orientation Orientation_Vector2d(Vector2d u, Vector2d v)\n    {\n        return CGAL::orientation(u.ToCGAL<K>(), v.ToCGAL<K>());\n    }\n\n    static CGAL::Orientation Orientation_EIK_Vector2(void* p, void* q)\n    {\n        auto P = CastToVector2_EIK(p);\n        auto Q = CastToVector2_EIK(q);\n        return CGAL::orientation(*P, *Q);\n    }\n\n    static CGAL::Orientation Orientation_EEK_Vector2(void* p, void* q)\n    {\n        auto P = CastToVector2_EEK(p);\n        auto Q = CastToVector2_EEK(q);\n        return CGAL::orientation(*P, *Q);\n    }\n\n    static CGAL::Orientation Orientation_Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n    {\n        return CGAL::orientation(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>(), s.ToCGAL<K>());\n    }\n\n    static CGAL::Orientation Orientation_Vector3d(Vector3d u, Vector3d v, Vector3d w)\n    {\n        return CGAL::orientation(u.ToCGAL<K>(), v.ToCGAL<K>(), w.ToCGAL<K>());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                            OrthogonalVector                               //\n    //---------------------------------------------------------------------------//\n\n    static Vector3d OrthogonalVector_Point3d(Point3d p, Point3d q, Point3d r)\n    {\n        auto v = CGAL::orthogonal_vector(p.ToCGAL<K>(), q.ToCGAL<K>(), r.ToCGAL<K>());\n        return Vector3d::FromCGAL<K>(v);\n    }\n\n    static void* OrthogonalVector_EIK_Point3(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint3_EIK(p);\n        auto Q = CastToPoint3_EIK(q);\n        auto R = CastToPoint3_EIK(r);\n        auto v = CGAL::orthogonal_vector(*P, *Q, *R);\n\n        return new CGAL::Vector_3<EIK>(v.x(), v.y(), v.z());\n    }\n\n    static void* OrthogonalVector_EEK_Point3(void* p, void* q, void* r)\n    {\n        auto P = CastToPoint3_EEK(p);\n        auto Q = CastToPoint3_EEK(q);\n        auto R = CastToPoint3_EEK(r);\n        auto v = CGAL::orthogonal_vector(*P, *Q, *R);\n\n        return new CGAL::Vector_3<EEK>(v.x(), v.y(), v.z());\n    }\n\n    //---------------------------------------------------------------------------//\n    //                            Parallel                                       //\n    //---------------------------------------------------------------------------//\n\n    static BOOL Parallel_Line2d(Line2d l1, Line2d l2)\n    {\n        auto L1 = l1.ToCGAL<K, Line2>();\n        auto L2 = l2.ToCGAL<K, Line2>();\n        return CGAL::parallel(L1, L2);\n    }\n\n    static BOOL Parallel_EIK_Line2d(void* l1, void* l2)\n    {\n        auto L1 = CastToLine2_EIK(l1);\n        auto L2 = CastToLine2_EIK(l2);\n        return CGAL::parallel(*L1, *L2);\n    }\n\n    static BOOL Parallel_EEK_Line2d(void* l1, void* l2)\n    {\n        auto L1 = CastToLine2_EEK(l1);\n        auto L2 = CastToLine2_EEK(l2);\n        return CGAL::parallel(*L1, *L2);\n    }\n\n    static BOOL Parallel_Ray2d(Ray2d r1, Ray2d r2)\n    {\n        auto R1 = r1.ToCGAL<K, Ray2>();\n        auto R2 = r2.ToCGAL<K, Ray2>();\n        return CGAL::parallel(R1, R2);\n    }\n\n    static BOOL Parallel_EIK_Ray2d(void* r1, void* r2)\n    {\n        auto R1 = CastToRay2_EIK(r1);\n        auto R2 = CastToRay2_EIK(r2);\n        return CGAL::parallel(*R1, *R2);\n    }\n\n    static BOOL Parallel_EEK_Ray2d(void* r1, void* r2)\n    {\n        auto R1 = CastToRay2_EEK(r1);\n        auto R2 = CastToRay2_EEK(r2);\n        return CGAL::parallel(*R1, *R2);\n    }\n\n    static BOOL Parallel_Segment2d(Segment2d s1, Segment2d s2)\n    {\n        auto S1 = s1.ToCGAL<K, Segment2>();\n        auto S2 = s2.ToCGAL<K, Segment2>();\n        return CGAL::parallel(S1, S2);\n    }\n\n    static BOOL Parallel_EIK_Segment2d(void* s1, void* s2)\n    {\n        auto S1 = CastToSegment2_EIK(s1);\n        auto S2 = CastToSegment2_EIK(s2);\n        return CGAL::parallel(*S1, *S2);\n    }\n\n    static BOOL Parallel_EEK_Segment2d(void* s1, void* s2)\n    {\n        auto S1 = CastToSegment2_EEK(s1);\n        auto S2 = CastToSegment2_EEK(s2);\n        return CGAL::parallel(*S1, *S2);\n    }\n};\n\n\n"
  },
  {
    "path": "CGALWrapper/Utility/CGALGlobal_EIK_EEK.cpp",
    "content": "\n#include \"../pch.h\"\n#include \"CGALGlobal_EIK_EEK.h\"\n#include \"CGALGlobal.h\"\n\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n\n//---------------------------------------------------------------------------//\n//                               Angle                                       //\n//---------------------------------------------------------------------------//\n\nCGAL::Angle CGALGlobal_EIK_Angle_Vector2d(Vector2d u, Vector2d v)\n{\n\treturn CGALGlobal<EIK>::Angle_Vector2(u, v);\n}\n\nCGAL::Angle CGALGlobal_EIK_Angle_Vector2(void* u, void* v)\n{\n\treturn CGALGlobal<EIK>::Angle_EIK_Vector2(u, v);\n}\n\nCGAL::Angle CGALGlobal_EEK_Angle_Vector2(void* u, void* v)\n{\n\treturn CGALGlobal<EEK>::Angle_EEK_Vector2(u, v);\n}\n\nCGAL::Angle CGALGlobal_EIK_Angle_Vector3d(Vector3d u, Vector3d v)\n{\n\treturn CGALGlobal<EIK>::Angle_Vector3(u, v);\n}\n\n//---------------------------------------------------------------------------//\n//                               ApproxAngle                                 //\n//---------------------------------------------------------------------------//\n\ndouble CGALGlobal_EIK_ApproxAngle_Vector3d(Vector3d u, Vector3d v)\n{\n\treturn CGALGlobal<EIK>::ApproxAngle_Vector3d(u, v);\n}\n\n//---------------------------------------------------------------------------//\n//                               ApproxDihedralAngle                         //\n//---------------------------------------------------------------------------//\n\ndouble CGALGlobal_EIK_ApproxDihedralAngle_Point3(Point3d p, Point3d q, Point3d r, Point3d s)\n{\n\treturn CGALGlobal<EIK>::ApproxDihedralAngle(p, q, r, s);\n}\n\n//---------------------------------------------------------------------------//\n//                               AreOrderedAlongLine                         //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_AreOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::AreOrderedAlongLine_Point2d(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_AreOrderedAlongLine_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::AreOrderedAlongLine_EIK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EEK_AreOrderedAlongLine_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::AreOrderedAlongLine_EEK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_AreOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::AreOrderedAlongLine_Point3d(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                               AreStrictlyOrderedAlongLine                 //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::AreStrictlyOrderedAlongLine_Point2d(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::AreStrictlyOrderedAlongLine_EIK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EEK_AreStrictlyOrderedAlongLine_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::AreStrictlyOrderedAlongLine_EEK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::AreStrictlyOrderedAlongLine_Point3d(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                                  Collinear                                //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_Collinear_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::Collinear_Point2d(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_Collinear_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::Collinear_EIK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EEK_Collinear_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::Collinear_EEK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_Collinear_Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::Collinear_Point3d(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                                  Barycenter                               //\n//---------------------------------------------------------------------------//\n\nPoint2d CGALGlobal_EIK_Barycenter_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::Barycenter_Point2d(p, q, r);\n}\n\nvoid* CGALGlobal_EIK_Barycenter_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::Barycenter_EIK_Point2(p, q, r);\n}\n\nvoid* CGALGlobal_EEK_Barycenter_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::Barycenter_EEK_Point2(p, q, r);\n}\n\nPoint3d CGALGlobal_EIK_Barycenter_Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::Barycenter_Point3d(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                              Bisector                                     //\n//---------------------------------------------------------------------------//\n\nLine2d CGALGlobal_EIK_Bisector_Point3d(Point3d p, Point3d q)\n{\n\treturn CGALGlobal<EIK>::Bisector_Point3d(p, q);\n}\n\nLine2d CGALGlobal_EIK_Bisector_Line2d(Line2d p, Line2d q)\n{\n\treturn CGALGlobal<EIK>::Bisector_Line2d(p, q);\n}\n\nvoid* CGALGlobal_EIK_Bisector_Line2(void* p, void* q)\n{\n\treturn CGALGlobal<EIK>::Bisector_EIK_Line2(p, q);\n}\n\nvoid* CGALGlobal_EEK_Bisector_Line2(void* p, void* q)\n{\n\treturn CGALGlobal<EEK>::Bisector_EEK_Line2(p, q);\n}\n\n//---------------------------------------------------------------------------//\n//                             Coplanar                                      //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_Coplanar_Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n{\n\treturn CGALGlobal<EIK>::Coplanar_Point3d(p, q, r, s);\n}\n\n//---------------------------------------------------------------------------//\n//                          CoplanarOrientation                              //\n//---------------------------------------------------------------------------//\n\nCGAL::Orientation CGALGlobal_EIK_CoplanarOrientation_3Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::CoplanarOrientation_Point3d(p, q, r);\n}\n\nCGAL::Orientation CGALGlobal_EIK_CoplanarOrientation_4Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n{\n\treturn CGALGlobal<EIK>::CoplanarOrientation_Point3d(p, q, r, s);\n}\n\n//---------------------------------------------------------------------------//\n//                            EquidistantLine                                //\n//---------------------------------------------------------------------------//\n\nLine3d CGALGlobal_EIK_EquidistantLine_Line3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::EquidistantLine_Point3d(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                               LeftTurn                                    //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_LeftTurn_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::LeftTurn_Point2d(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_LeftTurn_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::LeftTurn_EIK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EEK_LeftTurn_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::LeftTurn_EEK_Point2(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                             RightTurn                                     //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_RightTurn_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::RightTurn_Point2d(p, q, r);\n}\n\nBOOL CGALGlobal_EIK_RightTurn_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::RightTurn_EIK_Point2(p, q, r);\n}\n\nBOOL CGALGlobal_EEK_RightTurn_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::RightTurn_EEK_Point2(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                             Orientation                                   //\n//---------------------------------------------------------------------------//\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Point2d(Point2d p, Point2d q, Point2d r)\n{\n\treturn CGALGlobal<EIK>::Orientation_Point2d(p, q, r);\n}\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::Orientation_EIK_Point2(p, q, r);\n}\n\nCGAL::Orientation CGALGlobal_EEK_Orientation_Point2(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::Orientation_EEK_Point2(p, q, r);\n}\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Vector2d(Vector2d u, Vector2d v)\n{\n\treturn CGALGlobal<EIK>::Orientation_Vector2d(u, v);\n}\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Vector2(void* p, void* q)\n{\n\treturn CGALGlobal<EIK>::Orientation_EIK_Vector2(p, q);\n}\n\nCGAL::Orientation CGALGlobal_EEK_Orientation_Vector2(void* p, void* q)\n{\n\treturn CGALGlobal<EEK>::Orientation_EEK_Vector2(p, q);\n}\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Point3d(Point3d p, Point3d q, Point3d r, Point3d s)\n{\n\treturn CGALGlobal<EIK>::Orientation_Point3d(p, q, r, s);\n}\n\nCGAL::Orientation CGALGlobal_EIK_Orientation_Vector3d(Vector3d u, Vector3d v, Vector3d w)\n{\n\treturn CGALGlobal<EIK>::Orientation_Vector3d(u, v, w);\n}\n\n//---------------------------------------------------------------------------//\n//                            OrthogonalVector                               //\n//---------------------------------------------------------------------------//\n\nVector3d CGALGlobal_EIK_OrthogonalVector_Point3d(Point3d p, Point3d q, Point3d r)\n{\n\treturn CGALGlobal<EIK>::OrthogonalVector_Point3d(p, q, r);\n}\n\nvoid* CGALGlobal_EIK_OrthogonalVector_Point3(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EIK>::OrthogonalVector_EIK_Point3(p, q, r);\n}\n\nvoid* CGALGlobal_EEK_OrthogonalVector_Point3(void* p, void* q, void* r)\n{\n\treturn CGALGlobal<EEK>::OrthogonalVector_EEK_Point3(p, q, r);\n}\n\n//---------------------------------------------------------------------------//\n//                              Parallel                                     //\n//---------------------------------------------------------------------------//\n\nBOOL CGALGlobal_EIK_Parallel_Line2d(Line2d l1, Line2d l2)\n{\n\treturn CGALGlobal<EIK>::Parallel_Line2d(l1, l2);\n}\n\nBOOL CGALGlobal_EIK_Parallel_Line2(void* l1, void* l2)\n{\n\treturn CGALGlobal<EIK>::Parallel_EIK_Line2d(l1, l2);\n}\n\nBOOL CGALGlobal_EEK_Parallel_Line2(void* l1, void* l2)\n{\n\treturn CGALGlobal<EEK>::Parallel_EEK_Line2d(l1, l2);\n}\n\nBOOL CGALGlobal_EIK_Parallel_Ray2d(Ray2d r1, Ray2d r2)\n{\n\treturn CGALGlobal<EIK>::Parallel_Ray2d(r1, r2);\n}\n\nBOOL CGALGlobal_EIK_Parallel_Ray2(void* r1, void* r2)\n{\n\treturn CGALGlobal<EIK>::Parallel_EIK_Ray2d(r1, r2);\n}\n\nBOOL CGALGlobal_EEK_Parallel_Ray2(void* r1, void* r2)\n{\n\treturn CGALGlobal<EEK>::Parallel_EEK_Ray2d(r1, r2);\n}\n\nBOOL CGALGlobal_EIK_Parallel_Segment2d(Segment2d s1, Segment2d s2)\n{\n\treturn CGALGlobal<EIK>::Parallel_Segment2d(s1, s2);\n}\n\nBOOL CGALGlobal_EIK_Parallel_Segment2(void* s1, void* s2)\n{\n\treturn CGALGlobal<EIK>::Parallel_EIK_Segment2d(s1, s2);\n}\n\nBOOL CGALGlobal_EEK_Parallel_Segment2(void* s1, void* s2)\n{\n\treturn CGALGlobal<EEK>::Parallel_EEK_Segment2d(s1, s2);\n}\n\n\n"
  },
  {
    "path": "CGALWrapper/Utility/CGALGlobal_EIK_EEK.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Geometry2.h\"\n#include \"../Geometry/Geometry3.h\"\n#include \"CGALGlobal.h\"\n\n#include <CGAL/enum.h>\n\nextern \"C\"\n{\n\n    //---------------------------------------------------------------------------//\n    //                               Angle                                       //\n    //---------------------------------------------------------------------------//\n\n\tCGALWRAPPER_API CGAL::Angle CGALGlobal_EIK_Angle_Vector2d(Vector2d u, Vector2d v);\n\n    CGALWRAPPER_API CGAL::Angle CGALGlobal_EIK_Angle_Vector2(void* u, void* v);\n\n    CGALWRAPPER_API CGAL::Angle CGALGlobal_EEK_Angle_Vector2(void* u, void* v);\n\n\tCGALWRAPPER_API CGAL::Angle CGALGlobal_EIK_Angle_Vector3d(Vector3d u, Vector3d v);\n\n    //---------------------------------------------------------------------------//\n    //                               ApproxAngle                                 //\n    //---------------------------------------------------------------------------//\n\n\tCGALWRAPPER_API double CGALGlobal_EIK_ApproxAngle_Vector3d(Vector3d u, Vector3d v);\n\n    //---------------------------------------------------------------------------//\n    //                               ApproxDihedralAngle                         //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API double CGALGlobal_EIK_ApproxDihedralAngle_Point3(Point3d p, Point3d q, Point3d r, Point3d s);\n\n    //---------------------------------------------------------------------------//\n    //                               AreOrderedAlongLine                         //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreOrderedAlongLine_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_AreOrderedAlongLine_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r);\n\n    //---------------------------------------------------------------------------//\n    //                               AreStrictlyOrderedAlongLine                 //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_AreStrictlyOrderedAlongLine_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_AreStrictlyOrderedAlongLine_Point3d(Point3d p, Point3d q, Point3d r);\n\n    //---------------------------------------------------------------------------//\n    //                                  Collinear                                //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Collinear_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Collinear_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_Collinear_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Collinear_Point3d(Point3d p, Point3d q, Point3d r);\n\n   //---------------------------------------------------------------------------//\n   //                                  Barycenter                               //\n   //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API Point2d CGALGlobal_EIK_Barycenter_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API void* CGALGlobal_EIK_Barycenter_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API void* CGALGlobal_EEK_Barycenter_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API Point3d CGALGlobal_EIK_Barycenter_Point3d(Point3d p, Point3d q, Point3d r);\n\n    //---------------------------------------------------------------------------//\n    //                                Bisector                                   //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API Line2d CGALGlobal_EIK_Bisector_Point3d(Point3d p, Point3d q);\n\n    CGALWRAPPER_API Line2d CGALGlobal_EIK_Bisector_Line2d(Line2d p, Line2d q);\n\n    CGALWRAPPER_API void* CGALGlobal_EIK_Bisector_Line2(void* p, void* q);\n\n    CGALWRAPPER_API void* CGALGlobal_EEK_Bisector_Line2(void* p, void* q);\n\n    //---------------------------------------------------------------------------//\n    //                                Coplanar                                   //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Coplanar_Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n    //---------------------------------------------------------------------------//\n    //                           CoplanarOrientation                             //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_CoplanarOrientation_3Point3d(Point3d p, Point3d q, Point3d r);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_CoplanarOrientation_4Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n    //---------------------------------------------------------------------------//\n    //                          EquidistantLine                                  //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API Line3d CGALGlobal_EIK_EquidistantLine_Line3d(Point3d p, Point3d q, Point3d r);\n\n    //---------------------------------------------------------------------------//\n    //                             LeftTurn                                      //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_LeftTurn_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_LeftTurn_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_LeftTurn_Point2(void* p, void* q, void* r);\n\n    //---------------------------------------------------------------------------//\n    //                              RightTurn                                    //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_RightTurn_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_RightTurn_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_RightTurn_Point2(void* p, void* q, void* r);\n\n    //---------------------------------------------------------------------------//\n    //                             Orientation                                   //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Point2d(Point2d p, Point2d q, Point2d r);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EEK_Orientation_Point2(void* p, void* q, void* r);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Vector2d(Vector2d u, Vector2d v);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Vector2(void* p, void* q);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EEK_Orientation_Vector2(void* p, void* q);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Point3d(Point3d p, Point3d q, Point3d r, Point3d s);\n\n    CGALWRAPPER_API CGAL::Orientation CGALGlobal_EIK_Orientation_Vector3d(Vector3d u, Vector3d v, Vector3d w);\n\n    //---------------------------------------------------------------------------//\n    //                                OrthogonalVector                           //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API Vector3d CGALGlobal_EIK_OrthogonalVector_Point3d(Point3d p, Point3d q, Point3d r);\n\n    CGALWRAPPER_API void* CGALGlobal_EIK_OrthogonalVector_Point3(void* p, void* q, void* r);\n\n    CGALWRAPPER_API void* CGALGlobal_EEK_OrthogonalVector_Point3(void* p, void* q, void* r);\n\n    //---------------------------------------------------------------------------//\n    //                                    Parallel                               //\n    //---------------------------------------------------------------------------//\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Line2d(Line2d l1, Line2d l2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Line2(void* l1, void* l2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_Parallel_Line2(void* l1, void* l2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Ray2d(Ray2d r1, Ray2d r2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Ray2(void* r1, void* r2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_Parallel_Ray2(void* r1, void* r2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Segment2d(Segment2d s1, Segment2d s2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EIK_Parallel_Segment2(void* s1, void* s2);\n\n    CGALWRAPPER_API BOOL CGALGlobal_EEK_Parallel_Segment2(void* s1, void* s2);\n\n\n\n}\n\n"
  },
  {
    "path": "CGALWrapper/Utility/VersionNumber.cpp",
    "content": "#include \"VersionNumber.h\"\n#include \"Eigen\\src\\Core\\util\\Macros.h\"\n\nint CGALGlobal_VersionNumber()\n{\n\treturn CGAL_VERSION_NR;\n\n\t//CGAL_VERSION_MAJOR (CGAL_VERSION_NR/10000000%100)\n\t//CGAL_VERSION_MINOR (CGAL_VERSION_NR/100000%100)\n\t//CGAL_VERSION_PATCH (CGAL_VERSION_NR/10000%10)\n\t// CGAL_VERSION_BUILD (CGAL_VERSION_NR%10000)\n\n\t//CGAL_VERSION_NUMBER(M, m, b)\n\t//CGAL_VERSION_NUMBER(x, y, z) (1000001 + 10000 * x + 100 * y + 10 * z) * 1000\n}\n\nIndex3 CGALGlobal_EigenVersionNumber()\n{\n\treturn { EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION , EIGEN_MINOR_VERSION };\n}"
  },
  {
    "path": "CGALWrapper/Utility/VersionNumber.h",
    "content": "#pragma once\n\n#include \"../CGALWrapper.h\"\n#include \"../Geometry/Index.h\"\n\nextern \"C\"\n{\n\n\tCGALWRAPPER_API int CGALGlobal_VersionNumber();\n\n\tCGALWRAPPER_API Index3 CGALGlobal_EigenVersionNumber();\n\n}\n"
  },
  {
    "path": "CGALWrapper/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n\n#undef max\n#undef min\n"
  },
  {
    "path": "CGALWrapper/pch.cpp",
    "content": "// pch.cpp: source file corresponding to the pre-compiled header\n\n#include \"pch.h\"\n\n// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.\n"
  },
  {
    "path": "CGALWrapper/pch.h",
    "content": "// pch.h: This is a precompiled header file.\n// Files listed below are compiled only once, improving build performance for future builds.\n// This also affects IntelliSense performance, including code completion and many code browsing features.\n// However, files listed here are ALL re-compiled if any one of them is updated between builds.\n// Do not add files here that you will be updating frequently as this negates the performance advantage.\n\n#ifndef PCH_H\n#define PCH_H\n\n// add headers that you want to pre-compile here\n#include \"framework.h\"\n\n\n#endif //PCH_H\n"
  },
  {
    "path": "CGALWrapper/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by CGALWrapper.rc\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NEXT_RESOURCE_VALUE        101\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "\n# Welcome to CGALDotNet.\n\n- [Introduction.](https://github.com/Scrawk/CGALDotNet/wiki/Introduction)\n\n- [The CGAL Numbers types.](https://github.com/Scrawk/CGALDotNet/wiki/The-Number-Types)\n\n- [Eigen](https://github.com/Scrawk/CGALDotNet/wiki/Eigen)\n\n- [The CGAL Object.](https://github.com/Scrawk/CGALDotNet/wiki/The-CGALObject)\n\n- [The CGAL Global Functions.](https://github.com/Scrawk/CGALDotNet/wiki/The-CGALGlobal-Functions)\n\n- [Unity Extensions](https://github.com/Scrawk/CGALDotNet/wiki/Unity-Extensions)\n\n# The Geometry Kernel.\n\n- [The Geometry Numerics.](https://github.com/Scrawk/CGALDotNet/wiki/The-Geometry-Numerics)\n\n- [The Geometry Shapes.](https://github.com/Scrawk/CGALDotNet/wiki/The-Geometry-Shapes)\n\n- [The Geometry Objects.](https://github.com/Scrawk/CGALDotNet/wiki/The-Geometry-Objects)\n\n- [The Geometry Intersections.](https://github.com/Scrawk/CGALDotNet/wiki/The-Geometry-Intersections)\n\n# The Polygon Kernel.\n\n- [The Polygon Object.](https://github.com/Scrawk/CGALDotNet/wiki/The-Polygon-Object)\n\n- [The Polygon With Holes Object.](https://github.com/Scrawk/CGALDotNet/wiki/The-Polygon-With-Holes-Object)\n\n- [Polygon Boolean.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Boolean)\n\n- [Polygon Minkowski.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Minkowski)\n\n- [Polygon Offset.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Offset)\n\n- [Polygon Simplification.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Simplification)\n\n- [Polygon Visibility.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Visibility)\n\n- [Polygon Partition.](https://github.com/Scrawk/CGALDotNet/wiki/Polygon-Partition)\n\n# The Triangulation Kernel\n\n- [Triangulation 2D](https://github.com/Scrawk/CGALDotNet/wiki/Triangulations-2D)\n\n- [Triangulation 3D](https://github.com/Scrawk/CGALDotNet/wiki/Triangulations-3D) \n\n# The Arrangements Kernel\n\n- [Arrangements 2D](https://github.com/Scrawk/CGALDotNet/wiki/Arrangements-2D)\n\n- [Sweep Line 2D](https://github.com/Scrawk/CGALDotNet/wiki/Sweep-Line-2D) \n\n# The Polyhedra Kernel\n\n- [Polyhedra3 Mesh](https://github.com/Scrawk/CGALDotNet/wiki/Polyhedron3-Mesh)\n\n- [Mesh Processing](https://github.com/Scrawk/CGALDotNet/wiki/Mesh-Processing)\n\nSome common geomerty objects are referrenced in a [seperate project](https://github.com/Scrawk/CGALDotNetGeometry) so they can come under a different license.\n\nWork in progress. Only 64 bit windows binarys provided.\n\nExamples in Unity can be found in [this](https://github.com/Scrawk/CGALDotNetUnity) repository.\n\nA page on the Unity forums can be found [here](https://forum.unity.com/threads/cgaldotnet-a-c-computational-library-built-around-cgal.1250314/).\n\n\n"
  }
]