本文整理汇总了C#中FarseerPhysics.Common.Decomposition.CDT.Delaunay.Sweep.DTSweepContext类的典型用法代码示例。如果您正苦于以下问题:C# DTSweepContext类的具体用法?C# DTSweepContext怎么用?C# DTSweepContext使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
DTSweepContext类属于FarseerPhysics.Common.Decomposition.CDT.Delaunay.Sweep命名空间,在下文中一共展示了DTSweepContext类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ConvexPartition
public static List<Vertices> ConvexPartition(Vertices vertices)
{
Polygon poly = new Polygon();
foreach (Vector2 vertex in vertices)
{
poly.Points.Add(new TriangulationPoint(vertex.X, vertex.Y));
}
DTSweepContext tcx = new DTSweepContext();
tcx.PrepareTriangulation(poly);
DTSweep.Triangulate(tcx);
List<Vertices> results = new List<Vertices>();
foreach (DelaunayTriangle triangle in poly.Triangles)
{
Vertices v = new Vertices();
foreach (TriangulationPoint p in triangle.Points)
{
v.Add(new Vector2((float)p.X, (float)p.Y));
}
results.Add(v);
}
return results;
}
示例2: Triangulate
/// <summary>
/// Triangulate simple polygon with holes
/// </summary>
public static void Triangulate(DTSweepContext tcx)
{
tcx.CreateAdvancingFront();
Sweep(tcx);
// Finalize triangulation
if (tcx.TriangulationMode == TriangulationMode.Polygon)
{
FinalizationPolygon(tcx);
}
else
{
FinalizationConvexHull(tcx);
}
tcx.Done();
}
示例3: Sweep
/// <summary>
/// Start sweeping the Y-sorted point set from bottom to top
/// </summary>
static void Sweep( DTSweepContext tcx )
{
List<TriangulationPoint> points = tcx.Points;
for( int i = 1; i < points.Count; i++ )
{
TriangulationPoint point = points[i];
AdvancingFrontNode node = PointEvent( tcx, point );
if( point.HasEdges )
{
foreach( DTSweepConstraint e in point.Edges )
{
EdgeEvent( tcx, e, node );
}
}
tcx.Update( null );
}
}
示例4: ConvexPartition
/// <summary>
/// Decompose the polygon into several smaller non-concave polygon.
/// </summary>
public static List<Vertices> ConvexPartition(Vertices vertices)
{
if (vertices.Count <= 3)
return new List<Vertices> { vertices };
Polygon poly = new Polygon();
foreach (Vector2 vertex in vertices)
poly.Points.Add(new TriangulationPoint(vertex.X, vertex.Y));
if (vertices.Holes != null)
{
foreach (Vertices holeVertices in vertices.Holes)
{
Polygon hole = new Polygon();
foreach (Vector2 vertex in holeVertices)
hole.Points.Add(new TriangulationPoint(vertex.X, vertex.Y));
poly.AddHole(hole);
}
}
DTSweepContext tcx = new DTSweepContext();
tcx.PrepareTriangulation(poly);
DTSweep.Triangulate(tcx);
List<Vertices> results = new List<Vertices>();
foreach (DelaunayTriangle triangle in poly.Triangles)
{
Vertices v = new Vertices();
foreach (TriangulationPoint p in triangle.Points)
{
v.Add(new Vector2((float)p.X, (float)p.Y));
}
results.Add(v);
}
return results;
}
示例5: FillRightBelowEdgeEvent
private static void FillRightBelowEdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node)
{
if (node.Point.X < edge.P.X) // needed?
{
if (TriangulationUtil.Orient2d(node.Point, node.Next.Point, node.Next.Next.Point) == Orientation.CCW)
{
// Concave
FillRightConcaveEdgeEvent(tcx, edge, node);
}
else
{
// Convex
FillRightConvexEdgeEvent(tcx, edge, node);
// Retry this one
FillRightBelowEdgeEvent(tcx, edge, node);
}
}
}
示例6: FillRightAboveEdgeEvent
private static void FillRightAboveEdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node)
{
while (node.Next.Point.X < edge.P.X)
{
// Check if next node is below the edge
Orientation o1 = TriangulationUtil.Orient2d(edge.Q, node.Next.Point, edge.P);
if (o1 == Orientation.CCW)
{
FillRightBelowEdgeEvent(tcx, edge, node);
}
else
{
node = node.Next;
}
}
}
示例7: NewFrontTriangle
/// <summary>
/// Creates a new front triangle and legalize it
/// </summary>
private static AdvancingFrontNode NewFrontTriangle(DTSweepContext tcx, TriangulationPoint point, AdvancingFrontNode node)
{
DelaunayTriangle triangle = new DelaunayTriangle(point, node.Point, node.Next.Point);
triangle.MarkNeighbor(node.Triangle);
tcx.Triangles.Add(triangle);
AdvancingFrontNode newNode = new AdvancingFrontNode(point);
newNode.Next = node.Next;
newNode.Prev = node;
node.Next.Prev = newNode;
node.Next = newNode;
tcx.AddNode(newNode); // XXX: BST
if (!Legalize(tcx, triangle))
{
tcx.MapTriangleToNodes(triangle);
}
return newNode;
}
示例8: IsShallow
private static bool IsShallow(DTSweepContext tcx, AdvancingFrontNode node)
{
double height;
if (tcx.Basin.leftHighest)
{
height = tcx.Basin.leftNode.Point.Y - node.Point.Y;
}
else
{
height = tcx.Basin.rightNode.Point.Y - node.Point.Y;
}
if (tcx.Basin.width > height)
{
return true;
}
return false;
}
示例9: FinalizationPolygon
private static void FinalizationPolygon(DTSweepContext tcx)
{
// Get an Internal triangle to start with
DelaunayTriangle t = tcx.aFront.Head.Next.Triangle;
TriangulationPoint p = tcx.aFront.Head.Next.Point;
while (!t.GetConstrainedEdgeCW(p))
{
t = t.NeighborCCW(p);
}
// Collect interior triangles constrained by edges
tcx.MeshClean(t);
}
示例10: Fill
/// <summary>
/// Adds a triangle to the advancing front to fill a hole.
/// </summary>
/// <param name="tcx"></param>
/// <param name="node">middle node, that is the bottom of the hole</param>
private static void Fill(DTSweepContext tcx, AdvancingFrontNode node)
{
DelaunayTriangle triangle = new DelaunayTriangle(node.Prev.Point, node.Point, node.Next.Point);
// TODO: should copy the cEdge value from neighbor triangles
// for now cEdge values are copied during the legalize
triangle.MarkNeighbor(node.Prev.Triangle);
triangle.MarkNeighbor(node.Triangle);
tcx.Triangles.Add(triangle);
// Update the advancing front
node.Prev.Next = node.Next;
node.Next.Prev = node.Prev;
tcx.RemoveNode(node);
// If it was legalized the triangle has already been mapped
if (!Legalize(tcx, triangle))
{
tcx.MapTriangleToNodes(triangle);
}
}
示例11: EdgeEvent
private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle triangle, TriangulationPoint point)
{
if (IsEdgeSideOfTriangle(triangle, ep, eq))
return;
TriangulationPoint p1 = triangle.PointCCW(point);
Orientation o1 = TriangulationUtil.Orient2d(eq, p1, ep);
if (o1 == Orientation.Collinear)
{
if (triangle.Contains(eq, p1))
{
triangle.MarkConstrainedEdge(eq, p1);
// We are modifying the constraint maybe it would be better to
// not change the given constraint and just keep a variable for the new constraint
tcx.EdgeEvent.ConstrainedEdge.Q = p1;
triangle = triangle.NeighborAcross(point);
EdgeEvent(tcx, ep, p1, triangle, p1);
}
else
{
throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet");
}
return;
}
TriangulationPoint p2 = triangle.PointCW(point);
Orientation o2 = TriangulationUtil.Orient2d(eq, p2, ep);
if (o2 == Orientation.Collinear)
{
if (triangle.Contains(eq, p2))
{
triangle.MarkConstrainedEdge(eq, p2);
// We are modifying the constraint maybe it would be better to
// not change the given constraint and just keep a variable for the new constraint
tcx.EdgeEvent.ConstrainedEdge.Q = p2;
triangle = triangle.NeighborAcross(point);
EdgeEvent(tcx, ep, p2, triangle, p2);
}
else
{
throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet");
}
return;
}
if (o1 == o2)
{
// Need to decide if we are rotating CW or CCW to get to a triangle
// that will cross edge
if (o1 == Orientation.CW)
{
triangle = triangle.NeighborCCW(point);
}
else
{
triangle = triangle.NeighborCW(point);
}
EdgeEvent(tcx, ep, eq, triangle, point);
}
else
{
// This triangle crosses constraint so lets flippin start!
FlipEdgeEvent(tcx, ep, eq, triangle, point);
}
}
示例12: TurnAdvancingFrontConvex
/// <summary>
/// We will traverse the entire advancing front and fill it to form a convex hull.
/// </summary>
private static void TurnAdvancingFrontConvex(DTSweepContext tcx, AdvancingFrontNode b, AdvancingFrontNode c)
{
AdvancingFrontNode first = b;
while (c != tcx.aFront.Tail)
{
if (TriangulationUtil.Orient2d(b.Point, c.Point, c.Next.Point) == Orientation.CCW)
{
// [b,c,d] Concave - fill around c
Fill(tcx, c);
c = c.Next;
}
else
{
// [b,c,d] Convex
if (b != first && TriangulationUtil.Orient2d(b.Prev.Point, b.Point, c.Point) == Orientation.CCW)
{
// [a,b,c] Concave - fill around b
Fill(tcx, b);
b = b.Prev;
}
else
{
// [a,b,c] Convex - nothing to fill
b = c;
c = c.Next;
}
}
}
}
示例13: PointEvent
/// <summary>
/// Find closes node to the left of the new point and
/// create a new triangle. If needed new holes and basins
/// will be filled to.
/// </summary>
private static AdvancingFrontNode PointEvent(DTSweepContext tcx, TriangulationPoint point)
{
AdvancingFrontNode node = tcx.LocateNode(point);
AdvancingFrontNode newNode = NewFrontTriangle(tcx, point, node);
// Only need to check +epsilon since point never have smaller
// x value than node due to how we fetch nodes from the front
if (point.X <= node.Point.X + TriangulationUtil.EPSILON)
{
Fill(tcx, node);
}
tcx.AddNode(newNode);
FillAdvancingFront(tcx, newNode);
return newNode;
}
示例14: FillLeftBelowEdgeEvent
static void FillLeftBelowEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node )
{
if( node.Point.X > edge.P.X )
{
if( TriangulationUtil.Orient2d( node.Point, node.Prev.Point, node.Prev.Prev.Point ) == Orientation.CW )
{
// Concave
FillLeftConcaveEdgeEvent( tcx, edge, node );
}
else
{
// Convex
FillLeftConvexEdgeEvent( tcx, edge, node );
// Retry this one
FillLeftBelowEdgeEvent( tcx, edge, node );
}
}
}
示例15: FillRightConvexEdgeEvent
private static void FillRightConvexEdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node)
{
// Next concave or convex?
if (TriangulationUtil.Orient2d(node.Next.Point, node.Next.Next.Point, node.Next.Next.Next.Point) ==
Orientation.CCW)
{
// Concave
FillRightConcaveEdgeEvent(tcx, edge, node.Next);
}
else
{
// Convex
// Next above or below edge?
if (TriangulationUtil.Orient2d(edge.Q, node.Next.Next.Point, edge.P) == Orientation.CCW)
{
// Below
FillRightConvexEdgeEvent(tcx, edge, node.Next);
}
else
{
// Above
}
}
}