public Rectangle DrawEdge(IDeviceContext dc, Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects)
 {
     if (dc == null)
     {
         throw new ArgumentNullException("dc");
     }
     if (!System.Windows.Forms.ClientUtils.IsEnumValid_Masked(edges, (int) edges, 0x1f))
     {
         throw new InvalidEnumArgumentException("edges", (int) edges, typeof(Edges));
     }
     if (!System.Windows.Forms.ClientUtils.IsEnumValid_NotSequential(style, (int) style, new int[] { 5, 10, 6, 9 }))
     {
         throw new InvalidEnumArgumentException("style", (int) style, typeof(EdgeStyle));
     }
     if (!System.Windows.Forms.ClientUtils.IsEnumValid_Masked(effects, (int) effects, 0xd800))
     {
         throw new InvalidEnumArgumentException("effects", (int) effects, typeof(EdgeEffects));
     }
     System.Windows.Forms.NativeMethods.COMRECT pContentRect = new System.Windows.Forms.NativeMethods.COMRECT();
     using (WindowsGraphicsWrapper wrapper = new WindowsGraphicsWrapper(dc, TextFormatFlags.PreserveGraphicsTranslateTransform | TextFormatFlags.PreserveGraphicsClipping))
     {
         HandleRef hdc = new HandleRef(wrapper, wrapper.WindowsGraphics.DeviceContext.Hdc);
         this.lastHResult = System.Windows.Forms.SafeNativeMethods.DrawThemeEdge(new HandleRef(this, this.Handle), hdc, this.part, this.state, new System.Windows.Forms.NativeMethods.COMRECT(bounds), (int) style, ((int) (edges | ((Edges) ((int) effects)))) | 0x2000, pContentRect);
     }
     return Rectangle.FromLTRB(pContentRect.left, pContentRect.top, pContentRect.right, pContentRect.bottom);
 }
Exemple #2
0
 public void CreateEdges()
 {
     setParams();
     if (edges != null)
         edges.Clear();
     edges = new Edges(EdgeEntity, edgeCount, size);
 }
Exemple #3
0
 public Square(Point location, int size, Color surfaceColor, Color borderColor,Edges edges)
 {
     this.Location = location;
     this.Size = size;
     this.SurfaceColor = surfaceColor;
     this.BorderColor = borderColor;
     this.Edges = edges;
 }
		public int UxThemeDrawThemeEdge (IntPtr hTheme, IDeviceContext dc, int iPartId, int iStateId, Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects, out Rectangle result)
		{
			XplatUIWin32.RECT BoundsRect = XplatUIWin32.RECT.FromRectangle (bounds);
			XplatUIWin32.RECT retval;

			int hresult = UXTheme.DrawThemeEdge (hTheme, dc.GetHdc (), iPartId, iStateId, ref BoundsRect, (uint)style, (uint)edges + (uint)effects, out retval);
			dc.ReleaseHdc ();
			result = retval.ToRectangle();
			return hresult;
		}
Exemple #5
0
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 /// <summary>	Ensure that the passed in edge is adjacent to this vertex. </summary>
 /// <remarks>	Darrellp, 2/18/2011. </remarks>
 /// <param name="edge">	Edge to check. </param>
 /// <returns>	True if the edge is adjacent, else false. </returns>
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 internal bool FValidateEdgeIsAdjacent(WeEdge edge)
 {
     return(Edges.Any(edgeCur => ReferenceEquals(edgeCur, edge)));
 }
 /// <summary>
 /// Iterator access to the ordered list of edges is optimized by
 /// copying the map collection to a list.  (This assumes that
 /// once an iterator is requested, it is likely that insertion into
 /// the map is complete).
 /// </summary>
 public IEnumerator <EdgeEnd> GetEnumerator()
 {
     return(Edges.GetEnumerator());
 }
Exemple #7
0
 public override string ToString()
 {
     return($"Nodes: {Nodes.ToString()}\n\nEdges: {Edges.ToString()}\n");
 }
        public void ReadEdges(byte[] memory)
        {
            TreeNode res = new TreeNode("Edges list, start: 0x" + readerpos.ToString("X4"));
            UnknownList edges = new UnknownList(); //here using struct unknown list, later we're just filling up data array byte by byte
            Edges e = new Edges();
            edges.size = BitConverter.ToInt32(memory, readerpos);
            edges.count = BitConverter.ToInt32(memory, readerpos + 4);
            e.size = edges.size;
            e.count = edges.count;
            //quick'n'dirty fix above, need work! <--------------
            readerpos += 8;
            int len = edges.size * edges.count;
            edges.data = new byte[len];
            res.Nodes.Add(new TreeNode("Size : " + edges.size.ToString()));
            res.Nodes.Add(new TreeNode("Count : " + edges.count.ToString()));
            TreeNode data = new TreeNode("Data");
            int datacounter = 0;

            e.UVSet = new List<UVSet>();
            for (int i = 0; i < edges.count; i++)
            {
                UVSet uv = new UVSet();
                uv.UVs = new List<Vector2>();

                //here adding packed normals
                uv.x1 = memory[readerpos];
                uv.y1 = memory[readerpos + 1];
                uv.z1 = memory[readerpos + 2];
                uv.w1 = memory[readerpos + 3];
                uv.x2 = memory[readerpos + 4];
                uv.y2 = memory[readerpos + 5];
                uv.z2 = memory[readerpos + 6];
                uv.w2 = memory[readerpos + 7];

                //string rawdata = "";
                //string n1 = packedNorm(readerpos);
                //string n2 = packedNorm(readerpos + 4);
                //rawdata = n1 + " " + n2 + " UV Sets: "; //
                //          memory[readerpos].ToString("X2") + " " +
                //          memory[readerpos + 1].ToString("X2") + " " +
                //          memory[readerpos + 2].ToString("X2") + " " +
                //          memory[readerpos + 3].ToString("X2") + " " +
                //          memory[readerpos + 4].ToString("X2") + " " +
                //          memory[readerpos + 5].ToString("X2") + " " +
                //          memory[readerpos + 6].ToString("X2") + " " +
                //          memory[readerpos + 7].ToString("X2") + " " + 
                readerpos += 8;


                for (int row = 0; row < (edges.size - 8) / 4; row++)
                {
                    float u = HalfToFloat(BitConverter.ToUInt16(memory, readerpos));
                    float v = HalfToFloat(BitConverter.ToUInt16(memory, readerpos + 2));
                    uv.UVs.Add(new Vector2(u, v));
                    //rawdata += "uv(" + u + " ; " + v + ") ";
                    edges.data[datacounter] = memory[readerpos];
                    readerpos += 4;
                    datacounter += 1;
                }
                e.UVSet.Add(uv);
                data.Nodes.Add(new TreeNode(i.ToString("d4") + ": " ));
            }

            res.Nodes.Add(data);
            e.t = res;
            Mesh.Edges = e;
        }
		public int UxThemeDrawThemeEdge (IntPtr hTheme, IDeviceContext dc, int iPartId, int iStateId, Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects, out Rectangle result)
		{
			result = Rectangle.Empty;
			return (int)S.S_FALSE;
		}
 /// <summary>
 /// Add all the effects of "af" over the given variable
 /// </summary>
 /// <param name="af"></param>
 /// <param name="variableEffects"></param>
 /// <param name="tree"></param>
 /// <param name="p"></param>
 private void CheckAndAddEffect(AField af, Set<VariableEffect> variableEffects, Edges tree, Variable p)
 {
     IPTAnalysisNode from = this.Address(p);
     // Compute all paths from the variable to the affected node 
     // DIEGO-TODO: this is terribly slow. I have to make it much more faster.
     IEnumerable<IEnumerable<Edge>> paths = PointsToGraph.DFSPathFromTo(from, af.Src, tree);
     foreach (List<Edge> currentPath in paths)
     {
         IPTAnalysisNode rootNode = null;
         if (currentPath.Count > 0)
             rootNode = currentPath[0].Src;
         else
             rootNode = af.Src;
         if (rootNode.IsVariableReference)
         {
             IVarRefNode vrNode = rootNode as IVarRefNode;
             Variable v = vrNode.ReferencedVariable;
             if (v != null)
             {
                 VariableEffect vEffect = ComputeOneEffectPath(af, currentPath, v);
                 variableEffects.Add(vEffect);
             }
         }
     }
 }
Exemple #11
0
 internal EdgeEnumerator1(Edges linksAtVertex)
 {
     links=linksAtVertex;
     ntag=node-links.graph.n;
     cur=-1;
 }
Exemple #12
0
        // todo: not cut by rhythm
        // todo: i forget math
        private SliderTick[] GetPerfectDiscreteBallData(double interval)
        {
            if (Math.Round(interval - _singleElapsedTime) >= 0)
            {
                return(Array.Empty <SliderTick>());
            }

            Vector2 <float> p1;
            Vector2 <float> p2;
            Vector2 <float> p3;

            try
            {
                p1 = StartPoint;
                p2 = CurvePoints[0];
                p3 = CurvePoints[1];
            }
            catch (IndexOutOfRangeException)
            {
                this.SliderType = SliderType.Linear;
                return(GetBezierDiscreteBallData(interval));
            }

            var circle = GetCircle(p1, p2, p3);

            var radStart = Math.Atan2(p1.Y - circle.p.Y, p1.X - circle.p.X);
            var radMid   = Math.Atan2(p2.Y - circle.p.Y, p2.X - circle.p.X);
            var radEnd   = Math.Atan2(p3.Y - circle.p.Y, p3.X - circle.p.X);

            if (radMid - radStart > Math.PI)
            {
                radMid -= Math.PI * 2;
            }
            else if (radMid - radStart < -Math.PI)
            {
                radMid += Math.PI * 2;
            }

            if (radEnd - radMid > Math.PI)
            {
                radEnd -= Math.PI * 2;
            }
            else if (radEnd - radMid < -Math.PI)
            {
                radEnd += Math.PI * 2;
            }

            var ticks = new List <SliderTick>();

            for (int i = 1; i *interval < _singleElapsedTime; i++)
            {
                var offset = i * interval; // 当前tick的相对时间
                if (Edges.Any(k => Math.Abs(k.Offset - _offset - offset) < 0.01))
                {
                    continue;
                }
                var ratio       = offset / _singleElapsedTime; // 相对整个滑条的时间比例,=距离比例
                var relativeRad = (radEnd - radStart) * ratio; // 至滑条头的距离
                var offsetRad   = radStart + relativeRad;
                var x           = circle.p.X + circle.r * Math.Cos(offsetRad);
                var y           = circle.p.Y + circle.r * Math.Sin(offsetRad);

                ticks.Add(new SliderTick(_offset + offset, new Vector2 <float>((float)x, (float)y)));
            }

            if (Repeat > 1)
            {
                var firstSingleCopy = ticks.ToArray();
                for (int i = 2; i <= Repeat; i++)
                {
                    var reverse = i % 2 == 0;
                    if (reverse)
                    {
                        ticks.AddRange(firstSingleCopy.Reverse().Select(k =>
                                                                        new SliderTick((_singleElapsedTime - (k.Offset - _offset)) + (i - 1) * _singleElapsedTime + _offset,
                                                                                       k.Point)));
                    }
                    else
                    {
                        ticks.AddRange(firstSingleCopy.Select(k =>
                                                              new SliderTick(k.Offset + (i - 1) * _singleElapsedTime, k.Point)));
                    }
                }
            }

            return(ticks.ToArray());
            //var degStart = radStart / Math.PI * 180;
            //var degMid = radMid / Math.PI * 180;
            //var degEnd = radEnd / Math.PI * 180;
            //return Array.Empty<SliderTick>();
        }
Exemple #13
0
 public static void InitMap()
 {
     vertexes = new Vertexes();
     edges    = new Edges();
 }
Exemple #14
0
 public void RemoveEdge(Edge edge)
 {
     //TODO Do I need to do anything else here?
     Edges.Remove(edge);
 }
Exemple #15
0
 IEnumerator IEnumerable.GetEnumerator()
 {
     return(Edges.GetEnumerator());
 }
Exemple #16
0
 /// <summary>
 /// Adiciona um arco com nó origem igual ao nó atual, e destino e custo de acordo com os parâmetros.
 /// </summary>
 /// <param name="to">O nó destino.</param>
 /// <param name="cost">O custo associado ao arco.</param>
 public void AddEdge(Node to, int cost)
 {
     Edges.Add(new Edge(this, to, cost));
 }
Exemple #17
0
 public void CleanNullRefs()
 {
     VerticesData.RemoveWhere(pair => Util.IsBadRef(pair.Key));
     Edges.RemoveWhere(edge => Util.IsBadRef(edge.Source) || Util.IsBadRef(edge.Target));
 }
        /// <summary>
        /// Calculates the desired position, rotation and snapping edge given the position of the window.
        /// </summary>
        /// <param name="startx"></param>
        /// <param name="starty"></param>
        /// <param name="angle"></param>
        /// <param name="edge"></param>
        /// <returns></returns>
        private DoublePoint GetDesiredPosition(double startx, double starty, out double angle, out Edges edge)
        {
            angle = 0d;
            edge = Edges.None;

            if (WindowEdgeSnapBehavior == WindowEdgeSnapBehavior.None)
            {
                _lastWindowPosition.X = startx;
                _lastWindowPosition.Y = starty;
            }

            var movableAreaBoundaries = this.GetMovableArea();

            if (WindowEdgeSnapBehavior == WindowEdgeSnapBehavior.Straight ||
                WindowEdgeSnapBehavior == WindowEdgeSnapBehavior.StraightToTitleBar)
            {
                var x = startx.Max(movableAreaBoundaries.Left).Min(movableAreaBoundaries.Right);
                var y = starty.Max(movableAreaBoundaries.Top).Min(movableAreaBoundaries.Bottom);
                DoublePoint ret;
                ret.X = x;
                ret.Y = y;

                return ret;
            }
            else// if (WindowEdgeSnapBehavior == WindowEdgeSnapBehavior.ToTitleBarWithRotation)
            {
                var x = startx.Max(movableAreaBoundaries.Left).Min(movableAreaBoundaries.Right);
                var y = starty.Max(movableAreaBoundaries.Top).Min(movableAreaBoundaries.Bottom);

                if (x != startx || y != starty)
                {
                    // title height
                    var t = _titleGrid == null ? 0 : _titleGrid.ActualHeight + (_border == null ? 0 : _border.BorderThickness.Top);
                    var h = this.ActualHeight;
                    var w = this.ActualWidth;

                    if (x != startx && (y == starty || x.Distance(startx) > y.Distance(starty)))
                    {
                        if (startx < x)
                        {
                            edge = Edges.Left;
                            x += t - w / 2 - h / 2;
                            angle = 90;
                        }
                        else
                        {
                            edge = Edges.Right;
                            x -= t - w / 2 - h / 2;
                            angle = -90;
                        }

                        var minY = movableAreaBoundaries.Top + this.ActualWidth / 2 - this.ActualHeight / 2;
                        var maxY = movableAreaBoundaries.Bottom - this.ActualWidth / 2 + this.ActualHeight / 2;

                        y = starty.Max(minY).Min(maxY);
                    }
                    else if (y != starty && (x == startx || y.Distance(starty) > x.Distance(startx)))
                    {
                        if (starty < y)
                        {
                            edge = Edges.Top;
                            angle = 180;
                            y += t - h;
                        }
                        else
                        {
                            edge = Edges.Bottom;
                            angle = 0;
                            y -= t - h;
                        }
                    }
                }

                DoublePoint ret;
                ret.X = x;
                ret.Y = y;
                return ret;
            }
        }
 public void Clear()
 {
     edges = new Edges();
 }
 public System.Drawing.Rectangle DrawEdge(System.Drawing.IDeviceContext dc, System.Drawing.Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects)
 {
 }
Exemple #21
0
 /// <summary>
 /// Iterator access to the ordered list of edges is optimized by
 /// copying the map collection to a list.  (This assumes that
 /// once an iterator is requested, it is likely that insertion into
 /// the map is complete).
 /// </summary>
 public IEnumerator GetEnumerator()
 {
     return(Edges.GetEnumerator());
 }
Exemple #22
0
        Sprite GetSprite(Sprite[] sprites, Edges edges, int variant)
        {
            if (edges == Edges.None)
                return null;

            return sprites[variant * variantStride + edgesToSpriteIndexOffset[(byte)edges]];
        }
        private void btnMonitor_Click(object sender, EventArgs e)
        {
            var test = new Edges(lstLog);

            test.GetListOfEdge();
        }
		public Rectangle DrawEdge (IDeviceContext dc, Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects)
		{
			if (dc == null)
				throw new ArgumentNullException ("dc");
			
			Rectangle result;
			last_hresult = VisualStyles.UxThemeDrawThemeEdge (theme, dc, this.part, this.state, bounds, edges, style, effects, out result);
			return result;
		}
        private void FortunesAlgorithm()
        {
            Profiler.BeginSample("DAll HEs");
            Halfedge.DisposeAll();
            Edge.DisposeAll();
            Profiler.EndSample();

            //UnityEngine.Debug.Log("HE pool: " + Halfedge.unusedPool.Count);

            currentSiteIndex = 0;
            nVertices        = 0;

            // vars

            Profiler.BeginSample("Fortunes: initing");
            Site     newSite, bottomSite, topSite, tempSite;
            Vertex   v, vertex;
            Vector2f newIntStar = Vector2f.zero;
            bool     leftRight;

            Halfedge lbnd     = null;
            Halfedge rbnd     = null;
            Halfedge llbnd    = null;
            Halfedge rrbnd    = null;
            Halfedge bisector = null;

            Edge edge;

            Profiler.EndSample();

            // Data bounds
            Profiler.BeginSample("Fortunes: Getting data bounds");
            Rectf dataBounds = Site.GetSitesBounds(sites);

            Profiler.EndSample();

            int sqrtSitesNb = (int)Math.Sqrt(sites.Count + 4); // WTF

            Profiler.BeginSample("Fortunes: Init heap");

            if (heap == null)
            {
                heap = new HalfedgePriorityQueue(dataBounds.y, dataBounds.height, sqrtSitesNb);
            }
            else
            {
                heap.ReinitNoSizeChange(dataBounds.y, dataBounds.height);
            }

            Profiler.EndSample();

            Profiler.BeginSample("Fortunes: Init EdgeList");
            if (edgeList == null)
            {
                edgeList = new EdgeList(dataBounds.x, dataBounds.width, sqrtSitesNb);
            }
            else
            {
                edgeList.ClearNoResize(dataBounds.x, dataBounds.width);
            }

            //edgeList = new EdgeList(dataBounds.x, dataBounds.width, sqrtSitesNb);
            Profiler.EndSample();

            Profiler.BeginSample("Fortunes: Init HEs and vertices");
            if (halfEdges == null) // TODO: Move to init
            {
                halfEdges = new List <Halfedge>();
                vertices  = new List <Vertex>();
            }
            else
            {
                halfEdges.Clear();
                vertices.Clear();
            }
            Profiler.EndSample();

            Site bottomMostSite = GetNextSite();

            newSite = GetNextSite();

            Profiler.BeginSample("Fortunes: Main Loop");
            while (true)
            {
                if (heap.count > 0)
                {
                    newIntStar = heap.Min();
                }

                if (newSite != null &&
                    (heap.count == 0 || CompareByYThenX(newSite, newIntStar) < 0))
                {
                    // New site is smallest
                    //Debug.Log("smallest: new site " + newSite);

                    // Step 8:
                    // The halfedge just to the left of newSite
                    //UnityEngine.Debug.Log("lbnd: " + lbnd);
                    lbnd = edgeList.EdgeListLeftNeighbor(newSite.Coord);
                    // The halfedge just to the right
                    rbnd = lbnd.edgeListRightNeighbor;
                    //UnityEngine.Debug.Log("rbnd: " + rbnd);

                    // This is the same as leftRegion(rbnd)
                    // This Site determines the region containing the new site
                    bottomSite = RightRegion(lbnd, bottomMostSite);
                    //UnityEngine.Debug.Log("new Site is in region of existing site: " + bottomSite);

                    // Step 9
                    Profiler.BeginSample("CreateBisectingEdge");
                    edge = Edge.CreateBisectingEdge(bottomSite, newSite);
                    Profiler.EndSample();
                    //UnityEngine.Debug.Log("new edge: " + edge);
                    Edges.Add(edge);

                    bisector = Halfedge.Create(edge, false);
                    halfEdges.Add(bisector);
                    // Inserting two halfedges into edgelist constitutes Step 10:
                    // Insert bisector to the right of lbnd:
                    edgeList.Insert(lbnd, bisector);

                    // First half of Step 11:
                    if ((vertex = Vertex.Intersect(lbnd, bisector)) != null)
                    {
                        vertices.Add(vertex);
                        heap.Remove(lbnd);
                        lbnd.vertex = vertex;
                        lbnd.ystar  = vertex.y + newSite.Dist(vertex);
                        heap.Insert(lbnd);
                    }

                    lbnd     = bisector;
                    bisector = Halfedge.Create(edge, true);
                    halfEdges.Add(bisector);
                    // Second halfedge for Step 10::
                    // Insert bisector to the right of lbnd:
                    edgeList.Insert(lbnd, bisector);

                    // Second half of Step 11:
                    if ((vertex = Vertex.Intersect(bisector, rbnd)) != null)
                    {
                        vertices.Add(vertex);
                        bisector.vertex = vertex;
                        bisector.ystar  = vertex.y + newSite.Dist(vertex);
                        heap.Insert(bisector);
                    }

                    newSite = GetNextSite();
                }
                else if (heap.count > 0)
                {
                    // Intersection is smallest
                    lbnd       = heap.ExtractMin();
                    llbnd      = lbnd.edgeListLeftNeighbor;
                    rbnd       = lbnd.edgeListRightNeighbor;
                    rrbnd      = rbnd.edgeListRightNeighbor;
                    bottomSite = LeftRegion(lbnd, bottomMostSite);
                    topSite    = RightRegion(rbnd, bottomMostSite);
                    // These three sites define a Delaunay triangle
                    // (not actually using these for anything...)
#if TRIANGLES
                    triangles.Add(new Triangle(bottomSite, topSite, RightRegion(lbnd, bottomMostSite)));
#endif

                    v             = lbnd.vertex;
                    v.VertexIndex = nVertices++;
                    lbnd.edge.SetVertex(lbnd.leftRight, v);
                    rbnd.edge.SetVertex(rbnd.leftRight, v);
                    edgeList.Remove(lbnd);
                    heap.Remove(rbnd);
                    edgeList.Remove(rbnd);
                    leftRight = false;

                    if (bottomSite.y > topSite.y)
                    {
                        tempSite   = bottomSite;
                        bottomSite = topSite;
                        topSite    = tempSite;
                        leftRight  = true;
                    }

                    edge = Edge.CreateBisectingEdge(bottomSite, topSite);

                    Profiler.BeginSample("addedge");
                    Edges.Add(edge);
                    Profiler.EndSample();

                    bisector = Halfedge.Create(edge, leftRight);

                    halfEdges.Add(bisector);

                    edgeList.Insert(llbnd, bisector);

                    edge.SetVertex(!leftRight, v);

                    if ((vertex = Vertex.Intersect(llbnd, bisector)) != null)
                    {
                        vertices.Add(vertex);
                        heap.Remove(llbnd);
                        llbnd.vertex = vertex;
                        llbnd.ystar  = vertex.y + bottomSite.Dist(vertex);
                        heap.Insert(llbnd);
                    }
                    if ((vertex = Vertex.Intersect(bisector, rrbnd)) != null)
                    {
                        vertices.Add(vertex);
                        bisector.vertex = vertex;
                        bisector.ystar  = vertex.y + bottomSite.Dist(vertex);
                        heap.Insert(bisector);
                    }
                }
                else
                {
                    break;
                }
            }
            Profiler.EndSample();

            // DISPOSE

            // Heap should be empty now
            Profiler.BeginSample("Fortunes: Heap dispose");
            heap.Dispose();
            Profiler.EndSample();
            Profiler.BeginSample("Fortunes: Edgelist dispose");
            edgeList.Dispose();
            Profiler.EndSample();

            Profiler.BeginSample("Fortunes: Halfedges REALLY dispose");
            for (int i = 0; i < halfEdges.Count; i++)
            {
                halfEdges[i].ReallyDispose();
            }
            halfEdges.Clear();
            Profiler.EndSample();

            Profiler.BeginSample("Fortunes: ClipVertices");
            // we need the vertices to clip the edges
            for (int i = 0; i < Edges.Count; i++)
            {
                Edges[i].ClipVertices(PlotBounds, true);
            }
            Profiler.EndSample();

            // But we don't actually ever use them again!
            if (!disposeVerticesManually)
            {
                Profiler.BeginSample("Vertices dispose");
                DisposeVertices();
                Profiler.EndSample();
                UnityEngine.Debug.Log("Disposing vertices!");
            }

            /*
             * UnityEngine.Debug.Assert(Halfedge.unusedPool.Contains(lbnd), "lbnd");
             * UnityEngine.Debug.Assert(Halfedge.unusedPool.Contains(rbnd), "rbnd");
             * UnityEngine.Debug.Assert(Halfedge.unusedPool.Contains(llbnd), "llbnd");
             * UnityEngine.Debug.Assert(Halfedge.unusedPool.Contains(rrbnd), "rrbnd");
             * UnityEngine.Debug.Assert(Halfedge.unusedPool.Contains(bisector), "bisector");
             */
        }
Exemple #26
0
 public bool ContainsEdge(Relation <T, P> relation)
 {
     return(Edges.Contains(relation));
 }
Exemple #27
0
        Sprite GetTile(Sprite[] sprites, Edges edges, int variant)
        {
            if (edges == Edges.None)
                return null;

            return sprites[variant * variantStride + spriteMap[(byte)edges]];
        }
Exemple #28
0
        public ShroudRenderer(World world, ShroudRendererInfo info)
        {
            if (info.ShroudVariants.Length != info.FogVariants.Length)
            {
                throw new ArgumentException("ShroudRenderer must define the same number of shroud and fog variants!");
            }

            if ((info.OverrideFullFog == null) ^ (info.OverrideFullShroud == null))
            {
                throw new ArgumentException("ShroudRenderer cannot define overrides for only one of shroud or fog!");
            }

            if (info.ShroudVariants.Length > byte.MaxValue)
            {
                throw new ArgumentException("ShroudRenderer cannot define this many shroud and fog variants.");
            }

            if (info.Index.Length >= byte.MaxValue)
            {
                throw new ArgumentException("ShroudRenderer cannot define this many indexes for shroud directions.");
            }

            this.info = info;
            this.map  = world.Map;

            tileInfos = new CellLayer <TileInfo>(map);

            //Load sprite variants
            var variantCount = info.ShroudVariants.Length;

            variantStride = (byte)(info.Index.Length + (info.OverrideFullShroud != null ? 1 : 0));
            shroudSprites = new Sprite[variantCount * variantStride];
            fogSprites    = new Sprite[variantCount * variantStride];

            var sequenceProvider = map.Rules.Sequences;

            for (var j = 0; j < variantCount; j++)
            {
                var shroud = sequenceProvider.GetSequence(info.Sequence, info.ShroudVariants[j]);
                var fog    = sequenceProvider.GetSequence(info.Sequence, info.FogVariants[j]);
                for (var i = 0; i < info.Index.Length; i++)
                {
                    shroudSprites[j * variantStride + i] = shroud.GetSprite(i);
                    fogSprites[j * variantStride + i]    = fog.GetSprite(i);
                }


                if (info.OverrideFullShroud != null)
                {
                    var i = (j + 1) * variantStride - 1;
                    shroudSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud).GetSprite(0);
                    fogSprites[i]    = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog).GetSprite(0);
                }
            }


            //Mapping of shrouded directions -> sprite index
            edgesToSpriteIndexOffset = new byte[(byte)(info.UseExtendedIndex ? Edges.All : Edges.AllCorners) + 1];
            for (var i = 0; i < info.Index.Length; i++)
            {
                edgesToSpriteIndexOffset[info.Index[i]] = (byte)i;
            }

            if (info.OverrideFullShroud != null)
            {
                edgesToSpriteIndexOffset[info.OverrideShroudIndex] = (byte)(variantStride - 1);
            }

            notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
        }
Exemple #29
0
 public Edge <T> FindEdge(Node <T> node1, Node <T> node2)
 {
     return(Edges.Where(x => (x.Node1 == node1) && (x.Node2 == node2)).FirstOrDefault() ?? Edges.Where(x => (x.Node1 == node2) && (x.Node2 == node1)).FirstOrDefault());
 }
        public static Bitmap DetectEdges(Bitmap image)
        {
            Edges edgeDetector = new Edges();

            return(edgeDetector.Apply(image));
        }
Exemple #31
0
        //parse from a xml file generated by a different project
        private void FromXML()
        {
            XmlDocument doc = new XmlDocument();

            doc.Load("database.xml");

            XmlNode root = doc.DocumentElement;

            XmlNode treverse = root.FirstChild;
            Dictionary <int, String> NameD = new Dictionary <int, String>();
            Dictionary <int, String> PathD = new Dictionary <int, String>();

            while (treverse != null)
            {
                int    key = -1;
                String v   = "";
                String d   = "";
                foreach (XmlNode node in treverse.ChildNodes)
                {
                    switch (node.Name)
                    {
                    case "Key":
                        key = int.Parse(node.InnerText);
                        Console.WriteLine("Detect vertex: " + key);
                        break;

                    case "Value":
                        v = node.InnerText;
                        Console.WriteLine("Detect value: " + v);
                        break;

                    case "Description":
                        d = node.InnerText;
                        Console.WriteLine("Detect description: " + d);
                        break;
                    }
                }
                GS.AddParticle(key);
                NameD.Add(key, v.Substring(1));
                PathD.Add(key, d.Substring(1));
                foreach (XmlNode collection in treverse.ChildNodes)
                {
                    switch (collection.Name)
                    {
                    case "ChildCollection":
                        foreach (int n in Retrive(collection.InnerText))
                        {
                            GS.AddEdge(key, n);
                            Console.WriteLine("Detect edge: " + key + "->" + n);
                        }
                        break;

                    case "ParentCollection":
                        foreach (int n in Retrive(collection.InnerText))
                        {
                            GS.AddEdge(n, key);
                            Console.WriteLine("Detect edge: " + n + "->" + key);
                        }
                        break;
                    }
                }
                treverse = treverse.NextSibling;
            }
            var od = new Dictionary <int, int>();

            for (int i = 0; i < GS.V.Count; i++)
            {
                od.Add(GS.V[i], i);
            }

            foreach (var ve in GS.V)
            {
                Color c = SimpleColor(od[ve]).Color;
                foreach (var item in od)
                {
                    if (FromSamePackage(NameD[ve], NameD[item.Key]))
                    {
                        c = SimpleColor(od[item.Value]).Color;
                    }
                }
                Vertices.Add(new MassParticleViewModel(ve, c, NameD[ve] + "Path: " + PathD[ve], 450, 800));
            }
            foreach (var ed in GS.E)
            {
                Edges.Add(new EdgeViewModel(ed.Item1, ed.Item2, Color.FromRgb(125, 125, 125), 450, 800));
            }
        }
Exemple #32
0
        private Edges DetectEdges(byte* data, int width, int height, byte edgeColor, float threshold)
        {
            data = InterpolateEdges(data, ref width, ref height, edgeColor);

            Edges edges = new Edges(width, height);

            int maxSide = Math.Max(width, height) - 1;
            for (int i = 1; i < maxSide; i++)
            {
                int edgeColorsHorz = 0, edgeColorsVert = 0;
                for (int j = 1; j < maxSide; j++)
                {
                    DetectEdge(data, i, j, width, height, edgeColor, ref edgeColorsHorz);
                    DetectEdge(data, j, i, height, width, edgeColor, ref edgeColorsVert);
                }
                StoreEdge(edgeColorsHorz, i, width, threshold, edges.Horz);
                StoreEdge(edgeColorsVert, i, height, threshold, edges.Vert);
            }

            edges.CompleteBorderEdges();

            return edges;
        }
Exemple #33
0
 /// <summary>
 /// Удаление ребра
 /// </summary>
 /// <param name="e">ребро</param>
 public void DeleteEdge(Edge e)
 {
     Edges.Remove(e);
 }
        private void OnBorderManipulationInertiaStarting(object sender, ManipulationInertiaStartingRoutedEventArgs e)
        {
            _flickStartX = this.X;
            _flickStartY = this.Y;
            _flickStartCumulativeX = e.Cumulative.Translation.X;
            _flickStartCumulativeY = e.Cumulative.Translation.Y;

            if (_isDraggingFromSnapped)
            {
                // TODO: Prevent snapping if flicking towards center of screen
            }

            if (_layoutGridTransform != null)
            {
                _flickStartAngle = _layoutGridTransform.Rotation;
            }

            var naturalFlickDisplacement = e.GetExpectedDisplacement();
            e.TranslationBehavior.DesiredDisplacement = naturalFlickDisplacement;
            _naturalFlickDisplacementX = e.GetExpectedDisplacementX();
            _naturalFlickDisplacementY = e.GetExpectedDisplacementY();

            Edges desiredSnapEdge;
            var desiredPosition = this.GetDesiredPosition(_flickStartX + _naturalFlickDisplacementX, _flickStartY + _naturalFlickDisplacementY, out _flickAdjustedEndAngle, out desiredSnapEdge);
            _flickAdjustedEndX = desiredPosition.X;
            _flickAdjustedEndY = desiredPosition.Y;

            if (desiredSnapEdge == Edges.None)
            {
                return;
            }

            _lastSnapEdge = desiredSnapEdge;
            _isAdjustedFlick = true;

            if (_flickAdjustedEndX != _naturalFlickDisplacementX && (_flickAdjustedEndY == _naturalFlickDisplacementY ||
                _flickAdjustedEndX.Distance(_naturalFlickDisplacementX) > _flickAdjustedEndY.Distance(_naturalFlickDisplacementY)))
            {
                // snap to left or right side
                e.SetDesiredDisplacementX(_flickAdjustedEndX - _flickStartX);
                _naturalFlickDisplacementX = e.GetExpectedDisplacementX();
                _naturalFlickDisplacementY = e.GetExpectedDisplacementY();
            }
            else if (_flickAdjustedEndY != _naturalFlickDisplacementY && (_flickAdjustedEndX == _naturalFlickDisplacementX ||
                _flickAdjustedEndX.Distance(_naturalFlickDisplacementY) > _flickAdjustedEndY.Distance(_naturalFlickDisplacementX)))
            {
                // snap to left or right side
                e.SetDesiredDisplacementY(_flickAdjustedEndY - _flickStartY);
                _naturalFlickDisplacementX = e.GetExpectedDisplacementX();
                _naturalFlickDisplacementY = e.GetExpectedDisplacementY();
            }

            if (e.GetExpectedDisplacementDuration() > 0.5)
            {
                _isFlickTooLong = true;
                _restorePositionOnStateChange = false;
                this.WindowState = WindowStates.Snapped;
                _restorePositionOnStateChange = true;

                if (WindowEdgeSnapBehavior != WindowEdgeSnapBehavior.ToTitleBarWithRotation)
                {
#pragma warning disable 4014
                    AnimateStraightSnapAsync(_flickAdjustedEndX, _flickAdjustedEndY);
#pragma warning restore 4014
                }
                else
                {
#pragma warning disable 4014
                    AnimateRotatedSnapAsync(_flickAdjustedEndX, _flickAdjustedEndY, _flickAdjustedEndAngle);
#pragma warning restore 4014
                }
            }
        }
 /// <summary>
 /// Retrun the degree value of the specific node ID on the network topology.
 /// </summary>
 /// <param name="NodeID">The node ID on the network topology.</param>
 /// <returns>The degree value for the node ID on the network topology.</returns>
 public int Degree(int NodeID)
 {
     return(Edges.Where(n => n.Node1 == NodeID || n.Node2 == NodeID).ToList().Count);
 }
Exemple #36
0
 internal EdgeEnumerator0(Edges linksAtVertex)
 {
     links=linksAtVertex;
     cur=-1;
 }
Exemple #37
0
 public void CreateEdge(int Id, int Start, int End, int SizeModule, int NumberModules, int CostModule)
 {
     Edges.Add(new Edge(Id, Start, End, SizeModule, NumberModules, CostModule));
 }
Exemple #38
0
        Sprite CacheTile(MPos uv, int offset, Edges edges, TileInfo tileInfo,
			Sprite[] sprites, Vertex[] vertices, PaletteReference palette, CellLayer<Sprite> spriteLayer)
        {
            var sprite = GetSprite(sprites, edges, tileInfo.Variant);
            if (sprite != null)
            {
                var size = sprite.Size;
                var location = tileInfo.ScreenPosition - 0.5f * size;
                OpenRA.Graphics.Util.FastCreateQuad(
                    vertices, location + sprite.FractionalOffset * size,
                    sprite, palette.TextureIndex, offset, size);
            }

            spriteLayer[uv] = sprite;
            return sprite;
        }
Exemple #39
0
        public void ReadEdges(byte[] memory)
        {
            UnknownList edges = new UnknownList(); 
            Edges e = new Edges();
            edges.size = BitConverter.ToInt32(memory, readerpos);
            edges.count = BitConverter.ToInt32(memory, readerpos + 4);
            e.size = edges.size;
            e.count = edges.count;
            readerpos += 8;
            int len = edges.size * edges.count;
            edges.data = new byte[len];
            int datacounter = 0;
            e.UVSet = new List<UVSet>();
            for (int i = 0; i < edges.count; i++)
            {
                UVSet uv = new UVSet();
                uv.UVs = new List<Vector2>();
                uv.x1 = memory[readerpos];
                uv.y1 = memory[readerpos + 1];
                uv.z1 = memory[readerpos + 2];
                uv.w1 = memory[readerpos + 3];
                uv.x2 = memory[readerpos + 4];
                uv.y2 = memory[readerpos + 5];
                uv.z2 = memory[readerpos + 6];
                uv.w2 = memory[readerpos + 7];
                readerpos += 8;

                for (int row = 0; row < (edges.size - 8) / 4; row++)
                {
                    float u = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos));
                    float v = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos + 2));
                    uv.UVs.Add(new Vector2(u, v));
                    edges.data[datacounter] = memory[readerpos];
                    readerpos += 4;
                    datacounter += 1;
                }
                e.UVSet.Add(uv);
            }
            Mesh.Edges = e;
        }
        static int Main(string[] args)
        {
            ErrorNodeList enl = new ErrorNodeList();
            ErrorHandler eh = new ErrorHandler(enl);
            TypeSystem ts = new TypeSystem(eh);

            //args = new string[]
            //    {
            //        //@"C:\Users\Jonathan Tapicer\Documents\Visual Studio 2010\Projects\escape_test\escape_test\bin\Debug\escape_test.dll",
            //        //@"C:\Users\Jonathan Tapicer\Desktop\tesis\cci_rewriter\example_with_contracts\Example\obj\Debug\Decl\Example.dll",
            //        @"C:\Users\Jonathan Tapicer\Desktop\tesis\cci_rewriter\experiments\experiments\obj\Debug\Decl\experiments.dll",
            //    };

            if (args.Length == 0)
            {
                Console.WriteLine("Provide assembly full path as an argument.");
                return 1;
            }

            AssemblyNode assembly = AssemblyNode.GetAssembly(
                args[0],
                true, true, true);

            PointsToAnalysis pta = new PointsToAnalysis(ts, assembly, true, true, 3);

            pta.Visit(assembly);

            XmlTextWriter xml = new XmlTextWriter(Console.Out);

            xml.Formatting = Formatting.Indented;

            xml.WriteStartElement("ptg");

            foreach (var method in pta.AnalyzedMethods())
            {
                xml.WriteStartElement("method");
                xml.WriteAttributeString("type", method.DeclaringType.ToString());
                xml.WriteAttributeString("name", method.Name.ToString());

                var summ = pta.GetSummaryForMethod(method);

                var ptg = summ.PointsToGraph;

                //if (method.Name.ToString() == "M1") ptg.GenerateDotGraph("c:\\tmp\\ptg.dot");

                //nodes escape

                xml.WriteStartElement("escape");

                var added = new List<string>();
                foreach (var n in ptg.ReachableFromParametersReturnAndGlobals())
                {
                    if (!added.Contains(n.Name))
                    {
                        xml.WriteStartElement("node");
                        xml.WriteAttributeString("name", n.Name);
                        if (n.Label != null && n.Label.Method != null)
                        {
                            xml.WriteAttributeString("method", n.Label.Method.DeclaringType.ToString() + "::" + n.Label.Method.Name);
                        }
                        xml.WriteEndElement(); //</node>
                        added.Add(n.Name);
                    }
                }

                xml.WriteEndElement(); //</escape>

                //locals, params, ret, globals, fields inside nodes

                xml.WriteStartElement("expressions");

                Edges edges = new Edges();
                edges.AddEdges(ptg.I);
                edges.AddEdges(ptg.O);

                foreach (var v in ptg.LV)
                {
                    xml.WriteStartElement("expr");
                    if (ptg.RetValue == v.Key.Variable)
                    {
                        xml.WriteAttributeString("isReturn", "true");
                    }
                    xml.WriteAttributeString("val", v.Key.Name.Name);

                    Nodes nodesReacheable = Nodes.Empty;
                    var reacheableNodesExpressions = new Dictionary<string, Set<string>>(); //key are exprs, values are reacheable nodes by the expr

                    foreach (var addr in v.Value)
                    {
                        var nodesReacheableFromAddr = ptg.NodesForwardReachableFrom(addr);

                        nodesReacheable.AddRange(nodesReacheableFromAddr);

                        foreach (var nodeReacheableFromAddr in nodesReacheableFromAddr)
                        {
                            Set<IEnumerable<Edge>> pathsFromAddrToReacheableNode = (Set<IEnumerable<Edge>>)ptg.DFSPathFromTo(addr, nodeReacheableFromAddr, edges);
                            foreach (var path in pathsFromAddrToReacheableNode)
                            {
                                var pathFields = new List<string>();
                                foreach (var edge in path)
                                {
                                    if (edge.Field.Name.Name != "*" &&
                                        edge.Field.Name.Name != "?" &&
                                        edge.Field.Name.Name != "$")
                                    {
                                        pathFields.Add(edge.Field.Name.Name);
                                    }
                                }
                                if (!reacheableNodesExpressions.ContainsKey(nodeReacheableFromAddr.Name))
                                {
                                    reacheableNodesExpressions.Add(nodeReacheableFromAddr.Name, new Set<string>());
                                }
                                var expr = "." + string.Join(".", pathFields);
                                if (!reacheableNodesExpressions[nodeReacheableFromAddr.Name].Contains(expr))
                                {
                                    reacheableNodesExpressions[nodeReacheableFromAddr.Name].Add(expr);
                                }
                            }
                        }
                    }

                    xml.WriteStartElement("reaches");
                    foreach (var r in nodesReacheable)
                    {
                        if (r.Name != v.Key.Name.Name)
                        {
                            xml.WriteStartElement("node");
                            xml.WriteAttributeString("name", r.Name);
                            if (r.Label != null && r.Label.Method != null)
                            {
                                xml.WriteAttributeString("method", r.Label.Method.DeclaringType.ToString() + "::" + r.Label.Method.Name);
                            }

                            if (reacheableNodesExpressions.ContainsKey(r.Name))
                            {
                                foreach (var expr in reacheableNodesExpressions[r.Name])
                                {
                                    xml.WriteStartElement("expr");
                                    xml.WriteAttributeString("val", expr);
                                    xml.WriteEndElement(); //</expr>
                                }
                            }

                            xml.WriteEndElement(); //</node>
                        }
                    }
                    xml.WriteEndElement(); //</reaches>

                    xml.WriteEndElement(); //</expr>
                }

                xml.WriteEndElement(); //</expressions>

                xml.WriteEndElement(); //</method>
            }

            xml.WriteEndElement(); //</ptg>

            return 0;
        }
Exemple #41
0
 private void DeleteVertex(Vertex vertex)
 {
     Vertices = Vertices.Where(v => !ReferenceEquals(v, vertex)).ToArray();
     Edges    = Edges.Where(e => e.A != vertex && e.B != vertex).ToArray();
 }
Exemple #42
0
    /// <summary>
    /// Bind the caller with the callee and simplify the resulting pointsToGraph
    /// by removing the load nodes that has been resolved (captured objects)
    /// </summary>
    /// <param name="callerPTG"></param>
    /// <param name="calleePTG"></param>
    /// <param name="vr"></param>
    /// <returns></returns>
    private void bindCallerWithCalleePTG(PTGraph callerPTG, PTGraph calleePTG,  Variable vr)
    {



      // Compute Edges
      Edges Inew = new Edges();
      foreach (Edge ie in calleePTG.I)
      {
        foreach (IPTAnalysisNode nu1 in RelatedExtended(ie.Src))
        {
          foreach (IPTAnalysisNode nu2 in RelatedExtended(ie.Dst))
          {
            Inew.AddIEdge(nu1, ie.Field, nu2);
          }
        }
      }
      // Compute Edges
      Edges Onew = new Edges();
      foreach (Edge oe in calleePTG.O)
      {
        foreach (IPTAnalysisNode nu1 in RelatedExtended(oe.Src))
        {
          if (!nu1.IsNull)
            Onew.AddOEdge(nu1, oe.Field, oe.Dst);
        }
      }


      // Compute Escape
      Nodes eNew = new Nodes();
      foreach (IPTAnalysisNode n in calleePTG.E)
      {
        eNew.AddRange(RelatedExtended(n));
      }

      callerPTG.I.AddEdges(Inew);
      callerPTG.O.AddEdges(Onew);
      callerPTG.E.AddRange(eNew);

      /// Assign vr = related(retValue) 


      Nodes argNodes = Nodes.Empty;
      if (callerThisRef != null)
      {
        // argNodes.Add(callerPTG.GetAddress(callerThisRef));
        argNodes.AddRange(callerPTG.GetLocations(callerThisRef));
      }
      if (calleePTG.Method.Parameters != null)
      {
        for (int i = 0; i < calleePTG.Method.Parameters.Count; i++)
        {
          Parameter p = calleePTG.Method.Parameters[i];
          PNode pn = calleePTG.ParameterMap[p];
          if (!pn.IsByValue)
          {
            if (arguments[i] is Variable)
            {
              Variable vArg = (Variable)arguments[i];
              bindRefOrOutParameter(callerPTG, calleePTG, arguments[i] as Variable, p);
            }
          }
          if (arguments[i] is Variable)
          {
            Variable vArg = (Variable)arguments[i];
            // PTAnalysisNode addrArg = callerPTG.GetAddress(vArg);
            // argNodes.Add(addrArg);
            argNodes.AddRange(callerPTG.GetLocations(vArg));
          }

        }
      }


      if (vr != null)
      {
        if (!vr.Type.IsPrimitive && calleePTG.RetValue != null)
        {
          callerPTG.AddVariable(vr, callerPTG.MethodLabel);

          Nodes relatedValues2 = Nodes.Empty;
          // PTAnalysisNode addrRetValue = calleePTG.GetAddress(calleePTG.RetValue);
          // foreach (PTAnalysisNode n2 in calleePTG.Values(addrRetValue))
          foreach (IPTAnalysisNode n2 in calleePTG.Values(calleePTG.GetLocations(calleePTG.RetValue)))
          {
            relatedValues2.AddRange(RelatedExtended(n2));
          }
          callerPTG.Assign(vr, relatedValues2, calleePTG.MethodLabel);

        }
        else
        {
          callerPTG.ForgetVariable(vr);
        }
      }

      // Now we can remove the load nodes that don't escape
      Set<LNode> lNodes = callerPTG.LoadNodes;
      // B = Nodes forward reachable from from Escaping, Parameters, callee Arguments and Global nodes
      Nodes B = callerPTG.ReachableFromParametersReturnAndGlobalsAnd(argNodes);

      foreach (LNode ln in lNodes)
      {
        Set<Edge> IToRemove = new Set<Edge>();
        Set<Edge> OToRemove = new Set<Edge>();
        // If the LoadNode is not reachable or it is captured 
        if (!B.Contains(ln) || (Related(ln).Count > 0))
        // if (!B.Contains(ln) || (ln.IsParameterValueLNode && (Related(ln).Count > 0 || !Related(ln).Contains(ln))))
        //if (!B.Contains(ln) /*&& (ln is LAddrFieldNode  */
        //    /*&& ln.Label.Method.Equals(callerPTG.Method)*/)
        {
          foreach (Edge ie in callerPTG.I.EdgesFromSrc(ln))
            IToRemove.Add(ie);
          foreach (Edge ie in callerPTG.I.EdgesFromDst(ln))
            IToRemove.Add(ie);
          foreach (Edge oe in callerPTG.O.EdgesFromDst(ln))
            OToRemove.Add(oe);
          foreach (Edge oe in callerPTG.O.EdgesFromSrc(ln))
            OToRemove.Add(oe);
          removedLoadNodes.Add(ln);
        }
        callerPTG.I.RemoveEdges(IToRemove);
        callerPTG.O.RemoveEdges(OToRemove);
      }


    }
Exemple #43
0
 private void DeleteEdge(Edge edge)
 {
     Edges = Edges.Where(x => !ReferenceEquals(x, edge)).ToArray();
 }
Exemple #44
0
        public ShroudRenderer(World world, ShroudRendererInfo info)
        {
            if (info.ShroudVariants.Length != info.FogVariants.Length)
                throw new ArgumentException("ShroudRenderer must define the same number of shroud and fog variants!", "info");

            if ((info.OverrideFullFog == null) ^ (info.OverrideFullShroud == null))
                throw new ArgumentException("ShroudRenderer cannot define overrides for only one of shroud or fog!", "info");

            if (info.ShroudVariants.Length > byte.MaxValue)
                throw new ArgumentException("ShroudRenderer cannot define this many shroud and fog variants.", "info");

            if (info.Index.Length >= byte.MaxValue)
                throw new ArgumentException("ShroudRenderer cannot define this many indexes for shroud directions.", "info");

            this.info = info;
            map = world.Map;

            tileInfos = new CellLayer<TileInfo>(map);

            // Load sprite variants
            var variantCount = info.ShroudVariants.Length;
            variantStride = (byte)(info.Index.Length + (info.OverrideFullShroud != null ? 1 : 0));
            shroudSprites = new Sprite[variantCount * variantStride];
            fogSprites = new Sprite[variantCount * variantStride];

            var sequenceProvider = map.Rules.Sequences;
            for (var j = 0; j < variantCount; j++)
            {
                var shroud = sequenceProvider.GetSequence(info.Sequence, info.ShroudVariants[j]);
                var fog = sequenceProvider.GetSequence(info.Sequence, info.FogVariants[j]);
                for (var i = 0; i < info.Index.Length; i++)
                {
                    shroudSprites[j * variantStride + i] = shroud.GetSprite(i);
                    fogSprites[j * variantStride + i] = fog.GetSprite(i);
                }

                if (info.OverrideFullShroud != null)
                {
                    var i = (j + 1) * variantStride - 1;
                    shroudSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud).GetSprite(0);
                    fogSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog).GetSprite(0);
                }
            }

            // Mapping of shrouded directions -> sprite index
            edgesToSpriteIndexOffset = new byte[(byte)(info.UseExtendedIndex ? Edges.All : Edges.AllCorners) + 1];
            for (var i = 0; i < info.Index.Length; i++)
                edgesToSpriteIndexOffset[info.Index[i]] = (byte)i;

            if (info.OverrideFullShroud != null)
                edgesToSpriteIndexOffset[info.OverrideShroudIndex] = (byte)(variantStride - 1);

            notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
        }
Exemple #45
0
 /// <summary>
 /// Clears the graph ready for new node insertions.
 /// </summary>
 public void Clear()
 {
     NextNodeIndex = 0;
     Nodes.Clear();
     Edges.Clear();
 }
Exemple #46
0
            public Edges ObscuredFrom(int x, int y, int z)
            {
                Edges obsc = 0;

                var self = SpanAt(x, y);

                if (self != null) {
                    if (self.Voxels.Any(v => v.Z == z + 1)) {
                        obsc |= Edges.ZMore;
                    }

                    if (self.Voxels.Any(v => v.Z == z - 1)) {
                        obsc |= Edges.ZLess;
                    }

                    var off = new Vector2[] {
                        new Vector2(-1, 0),
                        new Vector2(+1, 0),
                        new Vector2(0, -1),
                        new Vector2(0, +1),
                    };
                    var edgeoff = new Edges[] { Edges.XLess, Edges.XMore, Edges.YLess, Edges.YMore };

                    for (var i = 0; i < 4; ++i) {
                        var shift = off[i];
                        var edge = edgeoff[i];

                        var neighbour = SpanAt(x + (int)shift.X, y + (int)shift.Y);
                        if (neighbour != null) {
                            if (neighbour.Voxels.Any(v => v.Z == z)) {
                                obsc |= edge;
                            }
                        }
                    }

                }

                return obsc;
            }
Exemple #47
0
        public List <Tin_Point> GetValueLine(List <Triangle> triangles, double value, List <Tin_Point> theline, int type)//递归调用
        {
            Edges    firstedges  = null;
            Triangle theTriangle = null;
            int      sign        = -1;

            if (triangles.Count <= 0)
            {
                return(null);
            }
            for (int i = 0; i < triangles.Count; i++)
            {
                if (GetValidEdges(triangles[i], value) != null && !triangles[i].flag)
                {
                    firstedges = GetValidEdges(triangles[i], value);
                    firstedges = Index(firstedges);
                    //Console.WriteLine(firstedges.ToString());
                    theTriangle = triangles[i];
                    sign        = i;
                    //Console.WriteLine("三角形序号为:" + sign + "被使用");
                    //Console.WriteLine(theTriangle.ToString());
                    break;
                }
                else
                {
                    triangles[i].flag = true;
                    //Console.WriteLine("三角形序号为:" + i + "已被使用或没有该等值点");
                    //Console.WriteLine("三角形" + i + ": " + triangles[i].ToString());
                }
            }
            if (firstedges == null || theTriangle == null)
            {
                return(theline);
            }
            var theedge  = firstedges;
            var thePoint = GetValuePoint(firstedges, value, type);

            thePoint.Num = NumOfEdges(theedge);
            //Console.WriteLine("点的层数(type)为:" + thePoint.ToString() +";现在的层数(type)为:"+type);
            theline.Add(thePoint);
            while (true)
            {
                /*for(int i = 0; i < triangles.Count; i++)
                 * {
                 *  if (triangles[i].flag == false)
                 *      break;
                 *  else if (i - 1 == triangles.Count && triangles[i].flag == true)
                 *  {
                 *
                 *  }
                 * }//检测三角形数组中还有没有没有搜索到的三角形*/
                triangles[sign].flag = true;
                var edgess = EdgesForTriangle(theedge, theTriangle);
                int useEdge;
                if (ContainPoint(edgess[0], value))
                {
                    useEdge = 0;
                }
                else
                {
                    useEdge = 1;
                }
                thePoint = GetValuePoint(edgess[useEdge], value, type);

                /*if (thePoint == null)
                 * {
                 *  thePoint = GetValuePoint(edgess[1], value, type);
                 *  useEdge = 1;
                 *
                 * }
                 * Console.WriteLine(edgess[0].ToString());
                 * Console.WriteLine(edgess[1].ToString());
                 * Console.ReadKey();*/
                thePoint.Num = NumOfEdges(edgess[useEdge]);
                theline.Add(thePoint);
                theedge = edgess[useEdge];
                theedge = Index(theedge);//变成了序号为4的边?应该是序号为8的边

                sign = GetOtherTriangle(theedge, sign);
                //Console.WriteLine(sign + ": " + theedge.SignT1 + "," + theedge.SignT2);
                //Console.WriteLine("re三角形序号为:" + sign + "被使用");
                //theTriangle = GetOtherTriangle(theedge, theTriangle);
                if (sign == -1)
                {
                    if (CheckTriangle(triangles))
                    {
                        type++;
                        Console.WriteLine("进入重载函数进行递归循环" + type);
                        return(GetValueLine(triangles, value, theline, type));
                        //未完待续
                    }
                    else
                    {
                        //break;
                        return(theline);
                    }
                }
                else
                {
                    theTriangle = triangles[sign];
                }
                if (theTriangle.flag)
                {
                    if (CheckTriangle(triangles))
                    {
                        type++;
                        Console.WriteLine("进入重载函数进行递归循环" + type);
                        return(GetValueLine(triangles, value, theline, type));
                        //未完待续
                    }
                    else
                    {
                        //break;
                        return(theline);
                    }
                }
            }
        }
        /// <include file='doc\VisualStyleRenderer.uex' path='docs/doc[@for="VisualStyleRenderer.DrawEdge"]/*' />
        /// <devdoc>
        ///    <para>
        ///       [See win32 equivalent.]
        ///    </para>
        /// </devdoc>
        public Rectangle DrawEdge(IDeviceContext dc, Rectangle bounds, Edges edges, EdgeStyle style, EdgeEffects effects) {
            if (dc == null) {
                throw new ArgumentNullException("dc");
            }

            if (!ClientUtils.IsEnumValid_Masked(edges, (int)edges,(UInt32)(Edges.Left | Edges.Top | Edges.Right | Edges.Bottom | Edges.Diagonal))) {
                throw new InvalidEnumArgumentException("edges", (int)edges, typeof(Edges));
            }

            if (!ClientUtils.IsEnumValid_NotSequential(style, (int)style, (int)EdgeStyle.Raised,(int)EdgeStyle.Sunken,(int)EdgeStyle.Etched,(int)EdgeStyle.Bump )) {
                throw new InvalidEnumArgumentException("style", (int)style, typeof(EdgeStyle));
            }

            if (!ClientUtils.IsEnumValid_Masked(effects, (int)effects, (UInt32)(EdgeEffects.FillInterior | EdgeEffects.Flat | EdgeEffects.Soft | EdgeEffects.Mono))) {
                throw new InvalidEnumArgumentException("effects", (int)effects, typeof(EdgeEffects));
            }

            NativeMethods.COMRECT rect = new NativeMethods.COMRECT();

            using( WindowsGraphicsWrapper wgr = new WindowsGraphicsWrapper( dc, AllGraphicsProperties ) ) {
                HandleRef hdc = new HandleRef( wgr, wgr.WindowsGraphics.DeviceContext.Hdc );
                lastHResult = SafeNativeMethods.DrawThemeEdge( new HandleRef( this, Handle ), hdc, part, state, new NativeMethods.COMRECT( bounds ), (int) style, (int) edges | (int) effects | EdgeAdjust, rect );
            }

            return Rectangle.FromLTRB(rect.left, rect.top, rect.right, rect.bottom);
        }
Exemple #49
0
 public void ComputeMyDimensions(ref Edges edg)
 {
     edg.areaNode1      = TriangleArea(edg.node1, edg.side1, edg.side2);
     edg.areaNode2      = TriangleArea(edg.node2, edg.side2, edg.side1);
     edg.boundaryLength = EdgeLength(edg.side1, edg.side2);
 }
Exemple #50
0
 public void Add(Edge edge)
 {
     Edges.Add(edge);
 }
Exemple #51
0
    void FindAllPairs()
    {
        int i1, i2, i3;
        int totalUnique = nT;         // dec for each dup found

        Edges[] allPairs = new Edges[nT];
        for (int tn = 0; tn < nT; tn += 3)
        {
            i1               = trianglesArray [tn];
            i2               = trianglesArray [tn + 1];
            i3               = trianglesArray [tn + 2];
            allPairs [tn]    = new Edges(i1, i2, i3);
            allPairs[tn + 1] = new Edges(i2, i3, i1);
            allPairs[tn + 2] = new Edges(i3, i1, i2);
        }
        for (int n = 0; n < nT - 1; n++)
        {
            if (allPairs [n].dup)
            {
                continue;
            }
            for (int m = n + 1; m < nT; m++)
            {
                if (allPairs [m].dup)
                {
                    continue;
                }
                if ((allPairs[n].node1 == allPairs[m].node1) & (allPairs[n].node2 == allPairs[m].node2))
                {
                    allPairs [n].dup    = true;
                    allPairs [m].dup    = true;
                    allPairs [n].side2  = allPairs [m].side1;
                    allPairs [m].side2  = allPairs [n].side1;       // Not really needed, as will be excluded.
                    allPairs [m].dopple = true;                     // tag which one to exclude
                    totalUnique        -= 1;
                    break;
                }
            }
        }
        nE    = totalUnique;
        edges = new Edges[nE];
        int   walk     = 0;
        float totBound = 0;
        float totArea  = 0;

        for (int j = 0; j < nT; j++)
        {
            if (!allPairs [j].dopple)
            {
                edges [walk] = allPairs [j];
                ComputeMyDimensions(ref edges[walk]);
                totBound += edges [walk].boundaryLength;
                totArea  += edges [walk].areaNode1;
                vertAreas [edges [walk].node1] += edges [walk].areaNode1;
                walk += 1;
            }
        }
        Debug.Log("n triangles " + nT);
        Debug.Log("n edges " + nE);
        Debug.Log("n vert " + nV);
        Debug.Log("avg boundary length " + totBound / (1.0f * nT));
        Debug.Log("avg area " + totArea / (1.0f * nT));
    }
Exemple #52
0
 public void Remove(Edge edge)
 {
     Edges.Remove(edge);
 }
Exemple #53
0
 public void AddEdge(Relationship edge)
 {
     Edges.Add(edge);
 }