void AddAction(Point a, Point b) { Debug.Assert(_pathRouter.VisGraph.ContainsVertex(a)); Debug.Assert(_pathRouter.VisGraph.ContainsVertex(b)); _pathRouter.VisGraph.AddEdge(a, b); var ss = new SymmetricSegment(a, b); _symmetricSegmentsTree.Add(new Rectangle(a, b), ss); }
public Rail FindOrCreateRail(Point s, Point t) { var p0 = s; var p1 = t; var t1 = new SymmetricSegment(p0, p1); Rail rail; if (RailDictionary.TryGetValue(t1, out rail)) { return(rail); } var t2 = new SymmetricSegment(p1, p0); if (RailDictionary.TryGetValue(t2, out rail)) { return(rail); } // no rail exists // roman: please check that this code really can be commented out and does need to be fixed instead /* * var q0 = VisGraph.GetPointOfVisGraphVertex(s); * var q1 = VisGraph.GetPointOfVisGraphVertex(t); * if (q0 == null || q1 == null) * { * //no visgraph vertex found * } * else * { * var edge = VisGraph.FindEdge(q0.Point, q1.Point); * }*/ return(CreateRail(p0, p1)); }
bool IfCanInsertLooseSegmentUpdateTiles(SymmetricSegment seg, GridTraversal grid) { //test if already inserted if (IsSegmentAlreadyAdded(seg)) { return(true); } var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid); bool canInsertSegment = true; foreach (var tile in intersectedTiles) { if (!_segmentTileTable.ContainsKey(tile)) { _segmentTileTable[tile] = 0; } canInsertSegment &= _segmentTileTable[tile] < MaxAmountRailsPerTile; } if (!canInsertSegment) { return(false); } foreach (var tile in intersectedTiles) { _segmentTileTable[tile]++; } return(true); }
static bool SymmetricSegmentIntersects(SymmetricSegment ss, Point a, Point b) { double t0, t1; var dist = LineSegment.MinDistBetweenLineSegments(ss.A, ss.B, a, b, out t0, out t1); return(dist < 0.001 && ((0.01 < t0 && t0 < 0.99) || (0.01 < t1 && t1 < 0.99))); }
void RemoveAction(Point a, Point b) { #if DEBUG VisibilityEdge ve; Debug.Assert(_pathRouter.FindVertex(a).TryGetEdge(_pathRouter.FindVertex(b), out ve)); #endif _pathRouter.RemoveEdge(a, b); var ss=new SymmetricSegment(a, b); _symmetricSegmentsTree.Remove(new Rectangle(ss.A, ss.B), ss); }
public static void RunTest3() { var moveableRects = new Rectangle[0]; var fixedRects = new Rectangle[1]; fixedRects[0] = new Rectangle(-10, -20, 50, 60); SymmetricSegment[] fixedSegments = new SymmetricSegment[0]; var orb = new OverlapRemovalFixedSegmentsBitmap(moveableRects, fixedRects, fixedSegments); }
public Rail FindRail(Point s, Point t) { var p0 = s; var p1 = t; var ss = new SymmetricSegment(p1, p0); Rail rail; RailDictionary.TryGetValue(ss, out rail); return(rail); }
void RemoveAction(Point a, Point b) { #if TEST_MSAGL VisibilityEdge ve; Debug.Assert(_pathRouter.FindVertex(a).TryGetEdge(_pathRouter.FindVertex(b), out ve)); #endif _pathRouter.RemoveEdge(a, b); var ss = new SymmetricSegment(a, b); _symmetricSegmentsTree.Remove(new Rectangle(ss.A, ss.B), ss); }
internal RouteSimplifier(LgPathRouter pathRouter, IEnumerable<LgNodeInfo> nodes, Set<Point> fixedPoints) { _pathRouter = pathRouter; _fixedPoints = fixedPoints; foreach (var node in nodes) _nodesTree.Add(node.BoundaryOnLayer.BoundingBox, node); foreach (var e in pathRouter.VisGraph.Edges) { var ss= new SymmetricSegment(e.SourcePoint, e.TargetPoint); _symmetricSegmentsTree.Add(new Rectangle(ss.A, ss.B), ss); } }
void RemoveLooseSegmentDecrementTiles(SymmetricSegment seg, GridTraversal grid) { var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid); foreach (var tile in intersectedTiles) { if (_segmentTileTable.ContainsKey(tile)) { _segmentTileTable[tile]--; } } }
public OverlapRemovalFixedSegmentsBitmap(Rectangle[] moveableRectangles, Rectangle[] fixedRectangles, SymmetricSegment[] fixedSegments) { _moveableRectangles = moveableRectangles; _fixedRectangles = fixedRectangles; _fixedSegments = fixedSegments; _bbox = GetInitialBoundingBox(); _bbox.ScaleAroundCenter(1.25); InitBitmap(); InitTransform(); movedRectangles = new Rectangle[moveableRectangles.Length]; }
bool IsCrossedBySegment(SymmetricSegment edge) { var intersectingSegments = _segmentTree.GetAllIntersecting(new Rectangle(edge.A, edge.B)); bool hasIntersection = false; foreach (var seg in intersectingSegments) { if (RectSegIntersection.SegmentsIntersect(edge.A, edge.B, seg.p1, seg.p2)) { hasIntersection = true; break; } } return(hasIntersection); }
public Rail CreateRail(Point ep0, Point ep1) { var st = new SymmetricSegment(ep0, ep1); Rail rail; if (RailDictionary.TryGetValue(st, out rail)) { return(rail); } var ls = new LineSegment(ep0, ep1); rail = new Rail(ls, ZoomLevel); RailTree.Add(rail.BoundingBox, rail); RailDictionary.Add(st, rail); return(rail); }
internal RouteSimplifier(LgPathRouter pathRouter, IEnumerable <LgNodeInfo> nodes, Set <Point> fixedPoints) { _pathRouter = pathRouter; _fixedPoints = fixedPoints; foreach (var node in nodes) { _nodesTree.Add(node.BoundaryOnLayer.BoundingBox, node); } foreach (var e in pathRouter.VisGraph.Edges) { var ss = new SymmetricSegment(e.SourcePoint, e.TargetPoint); _symmetricSegmentsTree.Add(new Rectangle(ss.A, ss.B), ss); } }
void AddSegmentToRtree(SymmetricSegment seg) { if (IsSegmentAlreadyAdded(seg)) { return; } var rect = new Rectangle(seg.A, seg.B); //rect = new Rectangle(rect.LeftBottom - segRtreeBuffer*new Point(1, 1), // rect.RightTop + segRtreeBuffer*new Point(1, 1)); _insertedSegmentsTree.Add(rect, seg); // add to visgraph _pathRouter.AddVisGraphEdge(seg.A, seg.B); }
/// <summary> /// try adding single rail to dictionary /// </summary> /// <param name="rail"></param> /// <returns>true iff the rail does not belong to _railDictionary</returns> public bool AddRailToDictionary(Rail rail) { Point p0, p1; if (!rail.GetStartEnd(out p0, out p1)) { return(false); } var st = new SymmetricSegment(p0, p1); if (!_railDictionary.ContainsKey(st)) { _railDictionary.Add(st, rail); return(true); } return(false); }
public Rail FindOrCreateRail(Point s, Point t) { var p0 = s; var p1 = t; var t1 = new SymmetricSegment(p0, p1); Rail rail; if (RailDictionary.TryGetValue(t1, out rail)) { return(rail); } var t2 = new SymmetricSegment(p1, p0); if (RailDictionary.TryGetValue(t2, out rail)) { return(rail); } return(CreateRail(p0, p1)); }
public OverlapRemovalFixedSegmentsMst(Rectangle[] moveableRectangles, Rectangle[] fixedRectangles, SymmetricSegment[] fixedSegments) { TreeNode.numNodes = 0; this.moveableRectangles = moveableRectangles; this.fixedRectangles = fixedRectangles; this.fixedSegments = fixedSegments; SaveOldPositionsMoveable(); }
void AddSegmentToRtree(SymmetricSegment seg) { if (IsSegmentAlreadyAdded(seg)) return; var rect = new Rectangle(seg.A, seg.B); //rect = new Rectangle(rect.LeftBottom - segRtreeBuffer*new Point(1, 1), // rect.RightTop + segRtreeBuffer*new Point(1, 1)); _insertedSegmentsTree.Add(rect, seg); // add to visgraph _pathRouter.AddVisGraphEdge(seg.A, seg.B); }
bool IsSegmentAlreadyAdded(SymmetricSegment seg) { return(_pathRouter.ExistsEdge(seg.A, seg.B)); }
bool IsSegmentAlreadyAdded(SymmetricSegment seg) { return _pathRouter.ExistsEdge(seg.A, seg.B); }
Rail ContinueReadingRail(LgEdgeInfo topRankedEdgoInfo, int zoomLevel, LgLevel level) { XmlRead(); string pointString; if (TokenIs(GeometryToken.Arrowhead)) { Point arrowheadPosition = TryGetPointAttribute(GeometryToken.ArrowheadPosition); Point attachmentPoint = TryGetPointAttribute(GeometryToken.CurveAttachmentPoint); Arrowhead ah = new Arrowhead { TipPosition = arrowheadPosition, Length = (attachmentPoint - arrowheadPosition).Length }; XmlRead(); ReadEndElement(); var rail = new Rail(ah, attachmentPoint, topRankedEdgoInfo, zoomLevel); var tuple = new SymmetricSegment(arrowheadPosition, attachmentPoint); level._railDictionary[tuple] = rail; return rail; } if (TokenIs(GeometryToken.LineSegment)) { pointString = GetAttribute(GeometryToken.Points); var linePoints = ParsePoints(pointString); Debug.Assert(linePoints.Length == 2); LineSegment ls = new LineSegment(linePoints[0], linePoints[1]); XmlRead(); ReadEndElement(); var rail = new Rail(ls, topRankedEdgoInfo, zoomLevel); var tuple = new SymmetricSegment(ls.Start, ls.End); level._railDictionary[tuple] = rail; level._railTree.Add(ls.BoundingBox, rail); return rail; } if (TokenIs(GeometryToken.CubicBezierSegment)) { pointString = GetAttribute(GeometryToken.Points); var controlPoints = ParsePoints(pointString); Debug.Assert(controlPoints.Length == 4); var bs = new CubicBezierSegment(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3]); XmlRead(); ReadEndElement(); var rail = new Rail(bs, topRankedEdgoInfo, zoomLevel); var tuple = new SymmetricSegment(bs.Start, bs.End); level._railDictionary[tuple] = rail; return rail; } throw new Exception(); }
public Rail CreateRail(Point ep0, Point ep1) { var st = new SymmetricSegment(ep0, ep1); Rail rail; if (RailDictionary.TryGetValue(st, out rail)) { return rail; } var ls = new LineSegment(ep0, ep1); rail = new Rail(ls, ZoomLevel); RailTree.Add(rail.BoundingBox, rail); RailDictionary.Add(st, rail); return rail; }
public Rail FindRail(Point s, Point t) { var p0 = s; var p1 = t; var ss = new SymmetricSegment(p1, p0); Rail rail; RailDictionary.TryGetValue(ss, out rail); return rail; }
static bool SymmetricSegmentIntersects(SymmetricSegment ss, Point a, Point b) { double t0, t1; var dist = LineSegment.MinDistBetweenLineSegments(ss.A, ss.B, a, b, out t0, out t1); return dist <0.001 && ((0.01 < t0 && t0 < 0.99) || (0.01 < t1 && t1 < 0.99)); }
/// <summary> /// try adding single rail to dictionary /// </summary> /// <param name="rail"></param> /// <returns>true iff the rail does not belong to _railDictionary</returns> public bool AddRailToDictionary(Rail rail) { Point p0, p1; if (!rail.GetStartEnd(out p0, out p1)) return false; var st = new SymmetricSegment(p0, p1); if (!_railDictionary.ContainsKey(st)) { _railDictionary.Add(st, rail); return true; } return false; }
public Rail FindOrCreateRail(Point s, Point t) { var p0 = s; var p1 = t; var t1 = new SymmetricSegment(p0, p1); Rail rail; if (RailDictionary.TryGetValue(t1, out rail)) return rail; var t2 = new SymmetricSegment(p1, p0); if (RailDictionary.TryGetValue(t2, out rail)) return rail; // no rail exists // roman: please check that this code really can be commented out and does need to be fixed instead /* * var q0 = VisGraph.GetPointOfVisGraphVertex(s); var q1 = VisGraph.GetPointOfVisGraphVertex(t); if (q0 == null || q1 == null) { //no visgraph vertex found } else { var edge = VisGraph.FindEdge(q0.Point, q1.Point); }*/ return CreateRail(p0, p1); }
void RemoveLooseSegmentDecrementTiles(SymmetricSegment seg, GridTraversal grid) { var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid); foreach (var tile in intersectedTiles) { if (_segmentTileTable.ContainsKey(tile)) _segmentTileTable[tile]--; } }
bool IsCrossedBySegment(SymmetricSegment edge) { var intersectingSegments = _segmentTree.GetAllIntersecting(new Rectangle(edge.A, edge.B)); bool hasIntersection = false; foreach (var seg in intersectingSegments) { if (RectSegIntersection.SegmentsIntersect(edge.A, edge.B, seg.p1, seg.p2)) { hasIntersection = true; break; } } return hasIntersection; }
bool IfCanInsertLooseSegmentUpdateTiles(SymmetricSegment seg, GridTraversal grid) { //test if already inserted if (IsSegmentAlreadyAdded(seg)) return true; var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid); bool canInsertSegment = true; foreach (var tile in intersectedTiles) { if (!_segmentTileTable.ContainsKey(tile)) _segmentTileTable[tile] = 0; canInsertSegment &= _segmentTileTable[tile] < MaxAmountRailsPerTile; } if (!canInsertSegment) return false; foreach (var tile in intersectedTiles) { _segmentTileTable[tile]++; } return true; }