Compare commits
2 commits
0431c3ca2e
...
9719a7b549
Author | SHA1 | Date | |
---|---|---|---|
|
9719a7b549 | ||
|
157deccc57 |
7 changed files with 64 additions and 71 deletions
|
@ -191,17 +191,13 @@ namespace Boprs
|
||||||
{
|
{
|
||||||
List<SweepVertex> sortedVerts = new List<SweepVertex>();
|
List<SweepVertex> sortedVerts = new List<SweepVertex>();
|
||||||
|
|
||||||
foreach (LineSegment2d seg in subject.GetSegments())
|
foreach (SweepEdge edge in subject.GetEdgeCopies())
|
||||||
{
|
{
|
||||||
SweepEdge edge = new SweepEdge(seg.StartPoint, seg.EndPoint);
|
|
||||||
|
|
||||||
sortedVerts.Add(edge.LeftVertex);
|
sortedVerts.Add(edge.LeftVertex);
|
||||||
sortedVerts.Add(edge.RightVertex);
|
sortedVerts.Add(edge.RightVertex);
|
||||||
}
|
}
|
||||||
foreach (LineSegment2d seg in clip.GetSegments())
|
foreach (SweepEdge edge in clip.GetEdgeCopies())
|
||||||
{
|
{
|
||||||
SweepEdge edge = new SweepEdge(seg.StartPoint, seg.EndPoint);
|
|
||||||
|
|
||||||
sortedVerts.Add(edge.LeftVertex);
|
sortedVerts.Add(edge.LeftVertex);
|
||||||
sortedVerts.Add(edge.RightVertex);
|
sortedVerts.Add(edge.RightVertex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,9 +41,6 @@
|
||||||
<Reference Include="acmgd">
|
<Reference Include="acmgd">
|
||||||
<HintPath>..\..\..\..\..\Program Files\Autodesk\AutoCAD 2024\acmgd.dll</HintPath>
|
<HintPath>..\..\..\..\..\Program Files\Autodesk\AutoCAD 2024\acmgd.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="BrxMgd">
|
|
||||||
<HintPath>..\..\..\..\..\Program Files\Bricsys\BricsCAD V23 en_US\BrxMgd.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
@ -52,9 +49,6 @@
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="TD_Mgd">
|
|
||||||
<HintPath>..\..\..\..\..\Program Files\Bricsys\BricsCAD V23 en_US\TD_Mgd.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="BooleanOperation.cs" />
|
<Compile Include="BooleanOperation.cs" />
|
||||||
|
|
|
@ -8,9 +8,9 @@ using System.Runtime.InteropServices;
|
||||||
[assembly: AssemblyTitle("Boprs")]
|
[assembly: AssemblyTitle("Boprs")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("DEK")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Boprs")]
|
[assembly: AssemblyProduct("Boprs")]
|
||||||
[assembly: AssemblyCopyright("Copyright © DEK 2024")]
|
[assembly: AssemblyCopyright("")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("1.0.1.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
[assembly: AssemblyFileVersion("1.0.1.0")]
|
||||||
|
|
80
Region.cs
80
Region.cs
|
@ -21,34 +21,34 @@ namespace Boprs
|
||||||
public class Region
|
public class Region
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Vertices belonging to this polygon.
|
/// Edges belonging to this polygon.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<SweepVertex> Vertices { get; }
|
private List<SweepEdge> Edges { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Subdivide my edges, set their inOut tags and validate their non-colinearity.
|
/// Subdivide my edges, set their inOut tags and validate their non-colinearity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void ValidateEdges()
|
private void SetEdges(List<SweepVertex> vertices)
|
||||||
{
|
{
|
||||||
// Lexico-graphically sort my vertices.
|
// Lexico-graphically sort my vertices.
|
||||||
Vertices.Sort();
|
vertices.Sort();
|
||||||
|
|
||||||
// Sweepline to keep track of edges.
|
// Sweepline to keep track of edges.
|
||||||
SweepLine sweepLine = new SweepLine();
|
SweepLine sweepLine = new SweepLine();
|
||||||
|
|
||||||
// Current number of vertices in the list.
|
// Processed edges will be moved here.
|
||||||
// Will be increased if subdivision occurs.
|
List<SweepEdge> processed = new List<SweepEdge>();
|
||||||
int numVertices = Vertices.Count;
|
|
||||||
|
|
||||||
// Go through all the sorted vertices, test for intersections when appropriate and,
|
// Go through all the sorted vertices, test for intersections when appropriate and,
|
||||||
// if needed, subdivide the edges.
|
// if needed, subdivide the edges.
|
||||||
for (int i = 0; i < numVertices; i++)
|
while (vertices.Count != 0)
|
||||||
{
|
{
|
||||||
SweepVertex acVx = Vertices[i];
|
SweepVertex acVx = vertices[0];
|
||||||
|
vertices.RemoveAt(0);
|
||||||
|
|
||||||
if (acVx.IsLeft())
|
if (acVx.IsLeft())
|
||||||
{
|
{
|
||||||
sweepLine.Add(acVx.Edge, false);
|
sweepLine.Add(acVx.Edge, true);
|
||||||
|
|
||||||
SweepEdge prevEdge = sweepLine.PrevEdge(acVx.Edge);
|
SweepEdge prevEdge = sweepLine.PrevEdge(acVx.Edge);
|
||||||
SweepEdge nextEdge = sweepLine.NextEdge(acVx.Edge);
|
SweepEdge nextEdge = sweepLine.NextEdge(acVx.Edge);
|
||||||
|
@ -61,8 +61,7 @@ namespace Boprs
|
||||||
|
|
||||||
foreach (SweepVertex vertex in newVertices)
|
foreach (SweepVertex vertex in newVertices)
|
||||||
{
|
{
|
||||||
Utils.InsertVertexSorted(Vertices, vertex);
|
Utils.InsertVertexSorted(vertices, vertex);
|
||||||
numVertices++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nextEdge != null)
|
if (nextEdge != null)
|
||||||
|
@ -71,8 +70,7 @@ namespace Boprs
|
||||||
|
|
||||||
foreach (SweepVertex vertex in newVertices)
|
foreach (SweepVertex vertex in newVertices)
|
||||||
{
|
{
|
||||||
Utils.InsertVertexSorted(Vertices, vertex);
|
Utils.InsertVertexSorted(vertices, vertex);
|
||||||
numVertices++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,6 +80,7 @@ namespace Boprs
|
||||||
SweepEdge nextEdge = sweepLine.NextEdge(acVx.Edge);
|
SweepEdge nextEdge = sweepLine.NextEdge(acVx.Edge);
|
||||||
|
|
||||||
sweepLine.Remove(acVx.Edge);
|
sweepLine.Remove(acVx.Edge);
|
||||||
|
processed.Add(acVx.Edge);
|
||||||
|
|
||||||
if (prevEdge != null && nextEdge != null)
|
if (prevEdge != null && nextEdge != null)
|
||||||
{
|
{
|
||||||
|
@ -89,32 +88,29 @@ namespace Boprs
|
||||||
|
|
||||||
foreach (SweepVertex vertex in newVertices)
|
foreach (SweepVertex vertex in newVertices)
|
||||||
{
|
{
|
||||||
Utils.InsertVertexSorted(Vertices, vertex);
|
Utils.InsertVertexSorted(vertices, vertex);
|
||||||
numVertices++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Edges = processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get a copy of the regions vertex list.
|
/// Get a copy of the regions edges list.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Copy of the regions vertex list.</returns>
|
/// <returns>Copy of the regions edges list.</returns>
|
||||||
internal List<LineSegment2d> GetSegments()
|
internal List<SweepEdge> GetEdgeCopies()
|
||||||
{
|
{
|
||||||
List <LineSegment2d> segments = new List<LineSegment2d>();
|
List<SweepEdge> copies = new List<SweepEdge>();
|
||||||
|
|
||||||
foreach(SweepVertex sweepVertex in Vertices)
|
foreach (SweepEdge edge in Edges)
|
||||||
{
|
{
|
||||||
if (sweepVertex.IsLeft())
|
copies.Add((SweepEdge)edge.Clone());
|
||||||
{
|
|
||||||
segments.Add(
|
|
||||||
new LineSegment2d(sweepVertex.Edge.LeftVertex.Point, sweepVertex.Edge.RightVertex.Point));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return segments;
|
return copies;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -126,48 +122,36 @@ namespace Boprs
|
||||||
{
|
{
|
||||||
Region region = new Region();
|
Region region = new Region();
|
||||||
|
|
||||||
|
List<SweepVertex> vertices = new List<SweepVertex>();
|
||||||
|
|
||||||
foreach(LineSegment2d segment in segments)
|
foreach(LineSegment2d segment in segments)
|
||||||
{
|
{
|
||||||
SweepEdge newEdge = new SweepEdge(segment.StartPoint, segment.EndPoint);
|
SweepEdge newEdge = new SweepEdge(segment.StartPoint, segment.EndPoint);
|
||||||
region.Vertices.Add(newEdge.LeftVertex);
|
vertices.Add(newEdge.LeftVertex);
|
||||||
region.Vertices.Add(newEdge.RightVertex);
|
vertices.Add(newEdge.RightVertex);
|
||||||
newEdge.ParentRegion = region;
|
newEdge.ParentRegion = region;
|
||||||
}
|
}
|
||||||
|
|
||||||
region.ValidateEdges();
|
region.SetEdges(vertices);
|
||||||
|
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor.
|
|
||||||
/// </summary>
|
|
||||||
private Region()
|
|
||||||
{
|
|
||||||
Vertices = new List<SweepVertex>();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
internal void Draw()
|
internal void Draw()
|
||||||
{
|
{
|
||||||
Erase();
|
Erase();
|
||||||
|
|
||||||
foreach (SweepVertex vert in Vertices)
|
foreach (SweepEdge edge in Edges)
|
||||||
{
|
{
|
||||||
if (vert.IsLeft())
|
edge.Draw();
|
||||||
{
|
|
||||||
vert.Edge.Draw();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal void Erase()
|
internal void Erase()
|
||||||
{
|
{
|
||||||
foreach (SweepVertex vert in Vertices)
|
foreach (SweepEdge edge in Edges)
|
||||||
{
|
{
|
||||||
if (vert.IsLeft())
|
edge.Erase();
|
||||||
{
|
|
||||||
vert.Edge.Erase();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
16
SweepEdge.cs
16
SweepEdge.cs
|
@ -44,7 +44,7 @@ namespace Boprs
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Line segment (edge) used while a sweep line is processing a boolean operation.
|
/// Line segment (edge) used while a sweep line is processing a boolean operation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class SweepEdge
|
internal class SweepEdge : ICloneable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// String representation of the edge.
|
/// String representation of the edge.
|
||||||
|
@ -54,6 +54,20 @@ namespace Boprs
|
||||||
return ($"({LeftVertex} -- {RightVertex})");
|
return ($"({LeftVertex} -- {RightVertex})");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public object Clone()
|
||||||
|
{
|
||||||
|
SweepVertex left = (SweepVertex)LeftVertex.Clone();
|
||||||
|
SweepVertex right = (SweepVertex)RightVertex.Clone();
|
||||||
|
SweepEdge clone = new SweepEdge(LeftVertex, RightVertex)
|
||||||
|
{
|
||||||
|
TransitionInside = TransitionInside,
|
||||||
|
InsideOther = InsideOther,
|
||||||
|
Type = Type,
|
||||||
|
ParentRegion = ParentRegion,
|
||||||
|
};
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Comparison of edges.
|
/// Comparison of edges.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace Boprs
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// End point of an edge used while sweep line is processing a boolean operation.
|
/// End point of an edge used while sweep line is processing a boolean operation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class SweepVertex : IComparable
|
internal class SweepVertex : IComparable, ICloneable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// String representation of the vertex.
|
/// String representation of the vertex.
|
||||||
|
@ -28,6 +28,11 @@ namespace Boprs
|
||||||
return ($"({Point.X}, {Point.Y})");
|
return ($"({Point.X}, {Point.Y})");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public object Clone()
|
||||||
|
{
|
||||||
|
return new SweepVertex(Point) { Edge = Edge};
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Comparison of vertices.
|
/// Comparison of vertices.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in a new issue