コード例 #1
0
        private void AddMarker(Marker svgElement, string attributeName, bool isendarrow)
        {
            if (svgElement != null)
            {
                SvgDocument fadde1 = base.svgElement.OwnerDocument;
                bool        flag1  = fadde1.AcceptChanges;
                string      text1  = svgElement.GetAttribute("id").Trim();
                string      text2  = string.Empty;
                if (text1.Length > 0)
                {
                    if (isendarrow)
                    {
                        text1 = "end" + text1;
                    }
                    else
                    {
                        text1 = "start" + text1;
                    }
                }
                text2 = "url(#" + text1 + ")";
                if (text1.Length == 0)
                {
                    text2 = string.Empty;
                }
                string text3 = (base.svgElement as SvgElement).GetAttribute(attributeName);
                if (text2 != text3)
                {
                    string[] textArray1 = new string[] { "marker" };
                    Marker   cfb1       = NodeFunc.GetRefNode(text1, fadde1) as Marker;
                    if (cfb1 == null)
                    {
                        cfb1 = svgElement;

                        if (isendarrow)
                        {
                            //fadde1.AcceptChanges = false;
                            for (int num1 = 0; num1 < cfb1.GraphList.Count; num1++)
                            {
                                SvgElement facbce1 = cfb1.GraphList[num1] as SvgElement;
                                if (facbce1 != null)
                                {
                                    string text4 = facbce1.GetAttribute("transform");
                                    text4 = "matrix(-1,0,0,1,0,0) " + text4;
                                    facbce1.SetAttribute("transform", text4);

                                    text4 = null;
                                }
                            }
                        }
                        cfb1.SetAttribute("id", text1);
                        fadde1.AddDefsElement(cfb1);
                    }

                    AttributeFunc.SetAttributeValue(base.svgElement, attributeName, text2);
                }
                fadde1.AcceptChanges = flag1;
            }
        }
コード例 #2
0
        /// <summary>
        /// 以原子方式遍历
        /// </summary>
        /// <param name="func"></param>
        /// <param name="state"></param>
        public void Foreach(NodeFunc <T> func, object state = null)
        {
            if (func == null)
            {
                throw new ArgumentNullException("func");
            }
            Node          prev   = this.m_head;
            var           curr   = prev;
            ForeachResult result = false;

            while (curr != null)
            {
                if ((result = func(curr.Data, state)).IsDelete)
                {
                    if (prev == curr)
                    {
                        if (Interlocked.CompareExchange(ref this.m_head, curr.Next, prev) == prev)
                        {
                            Interlocked.Decrement(ref this.m_count);
                            prev = curr.Next;
                        }
                        else
                        {
                            prev = this.GetPrevNode(curr);
                            if (prev != null)
                            {
                                if (Interlocked.CompareExchange(ref prev.Next, curr.Next, curr) == curr)
                                {
                                    Interlocked.Decrement(ref this.m_count);
                                }
                            }
                        }
                    }
                    else
                    {
                        var old = prev.Next;
                        if (Interlocked.CompareExchange(ref prev.Next, curr.Next, old) == old)
                        {
                            Interlocked.Decrement(ref this.m_count);
                        }
                    }
                }
                else if (prev != curr)
                {
                    prev = curr;
                }

                if (result.IsStop)
                {
                    break;
                }
                curr = curr.Next;
            }
        }
コード例 #3
0
        protected void PaintMarkers(Graphics g)
        {
            string markerStartUrl = extractMarkerUrl(this.GetAttribute("marker-start"));
            string markerEndUrl   = extractMarkerUrl(this.GetAttribute("marker-end"));

            PointF[] points1 = this.Points.Clone() as PointF[];
            int      num1    = 0;
            int      num11   = 1;

            int num3  = 0;
            int num33 = 1;

            if (points1.Length > 3)
            {
                num33 = points1.Length - 1;
                num3  = num33 - 1;
            }


            base.GraphTransform.Matrix.TransformPoints(points1);

            float angle = 0f;//(float)(180*Math.Atan2(points1[1].Y - points1[0].Y,points1[1].X-points1[0].X)/Math.PI);

            GraphicsContainer container1 = g.BeginContainer();

            Marker element1;

            if (markerStartUrl.Length > 0)
            {
                angle = (float)(180 * Math.Atan2(points1[num11].Y - points1[num1].Y, points1[num11].X - points1[num1].X) / Math.PI);

                element1 = (Marker)NodeFunc.GetRefNode(markerStartUrl, this.OwnerDocument);
                if (element1 is Marker)
                {
                    ((Marker)element1).GraphTransform.Matrix = new Matrix();
                    Matrix matrix1 = ((Marker)element1).MarkerTransForm;

                    matrix1.Rotate(angle);
                    matrix1.Translate(points1[num1].X, points1[num1].Y, MatrixOrder.Append);
                    element1.GraphStroke   = this.GraphStroke;
                    element1.IsMarkerChild = true;
                    ((Marker)element1).Draw(g, 0);
                }
            }



            if (markerEndUrl.Length > 0)
            {
                angle = (float)(180 * Math.Atan2(points1[num33].Y - points1[num3].Y, points1[num33].X - points1[num3].X) / Math.PI);

                element1 = (Marker)NodeFunc.GetRefNode(markerEndUrl, this.OwnerDocument);
                if (element1 is Marker)
                {
                    ((Marker)element1).GraphTransform.Matrix = new Matrix();
                    Matrix matrix1 = ((Marker)element1).MarkerTransForm;

                    matrix1.Rotate(angle);
                    matrix1.Translate(points1[num33].X, points1[num33].Y, MatrixOrder.Append);
                    element1.GraphStroke   = this.GraphStroke;
                    element1.IsMarkerChild = true;
                    ((Marker)element1).Draw(g, 0);
                }
            }
            g.EndContainer(container1);
        }
コード例 #4
0
        protected void PaintMarkers(Graphics g)
        {
            string markerStartUrl  = extractMarkerUrl(this.GetAttribute("marker-start"));
            string markerMiddleUrl = extractMarkerUrl(this.GetAttribute("marker-mid"));
            string markerEndUrl    = extractMarkerUrl(this.GetAttribute("marker-end"));

            PointF pt0 = new PointF(this.X1, this.Y1);
            PointF pt1 = new PointF(this.X2, this.Y2);
            PointF pt2 = new PointF((this.X1 + this.X2) / 2, (this.Y1 + this.Y2) / 2);

            PointF[] points1 = new PointF[] { pt0, pt1, pt2 };
            int      num1    = 0;
            int      num11   = 1;
//			int num2 = 2;
//			int num22 = 1;
            int num3  = 0;
            int num33 = 1;

            if (this is ConnectLine)
            {
                PointF[] points2 = this.GPath.PathPoints.Clone() as PointF[];

                points1 = points2;
                if (points2.Length > 3)
                {
//					points1 = points2;
                    num33 = points1.Length - 1;
                    num3  = num33 - 1;
                }
            }

            base.GraphTransform.Matrix.TransformPoints(points1);

            float angle = 0f;             //(float)(180*Math.Atan2(points1[1].Y - points1[0].Y,points1[1].X-points1[0].X)/Math.PI);

            GraphicsContainer container1 = g.BeginContainer();

            Marker element1;

            if (markerStartUrl.Length > 0)
            {
                angle = (float)(180 * Math.Atan2(points1[num11].Y - points1[num1].Y, points1[num11].X - points1[num1].X) / Math.PI);

                element1 = (Marker)NodeFunc.GetRefNode(markerStartUrl, this.OwnerDocument);
                if (element1 is Marker)
                {
                    ((Marker)element1).GraphTransform.Matrix = new Matrix();
                    Matrix matrix1 = ((Marker)element1).MarkerTransForm;

                    matrix1.Rotate(angle);
                    matrix1.Translate(points1[num1].X, points1[num1].Y, MatrixOrder.Append);
                    element1.GraphStroke   = this.GraphStroke;
                    element1.IsMarkerChild = true;
                    ((Marker)element1).Draw(g, 0);
                }
            }

            if (markerMiddleUrl.Length > 0)
            {
                element1 = (Marker)NodeFunc.GetRefNode(markerMiddleUrl, this.OwnerDocument);
                if (element1 is IGraph)
                {
                    ((Marker)element1).GraphTransform.Matrix = new Matrix();
                    Matrix matrix1 = ((Marker)element1).MarkerTransForm;

                    matrix1.Rotate(angle);
                    matrix1.Translate(points1[2].X, points1[2].Y, MatrixOrder.Append);
                    element1.GraphStroke   = this.GraphStroke;
                    element1.IsMarkerChild = true;
                    ((IGraph)element1).Draw(g, 0);
                }
            }

            if (markerEndUrl.Length > 0)
            {
                angle = (float)(180 * Math.Atan2(points1[num33].Y - points1[num3].Y, points1[num33].X - points1[num3].X) / Math.PI);

                element1 = (Marker)NodeFunc.GetRefNode(markerEndUrl, this.OwnerDocument);
                if (element1 is IGraph)
                {
                    ((Marker)element1).GraphTransform.Matrix = new Matrix();
                    Matrix matrix1 = ((Marker)element1).MarkerTransForm;

                    matrix1.Rotate(angle);
                    matrix1.Translate(points1[num33].X, points1[num33].Y, MatrixOrder.Append);
                    element1.GraphStroke   = this.GraphStroke;
                    element1.IsMarkerChild = true;
                    ((IGraph)element1).Draw(g, 0);
                }
            }
            g.EndContainer(container1);
        }
コード例 #5
0
        public ImmutableArray <double> Calculate(ImmutableArray <double> inputValues)
        {
            var enabledEdges = Chromosome.EdgeGenes
                               .Where(edgeGene => edgeGene.Value.IsEnabled)
                               .ToImmutableArray();
            var edgesByFrom = enabledEdges
                              .GroupBy(pair => pair.Key.From)
                              .ToImmutableDictionary(g => g.Key, g => g.Select(pair => pair.Key.To).ToImmutableArray());

            var edgesByTo = enabledEdges
                            .GroupBy(pair => pair.Key.To)
                            .ToImmutableDictionary(g => g.Key, g => g.Select(pair => pair.Key.From).ToImmutableArray());

            var dependenciesCount = Chromosome.NodeGenes.Keys
                                    .ToDictionary(geneType => geneType, dependenciesCount => 0.0);

            enabledEdges.Each(edgeGene => dependenciesCount[edgeGene.Key.To]++);

            var nodeInput = InputGenes
                            .Zip(inputValues)
                            .ToImmutableDictionary(pair => pair.First, pair => pair.Second);

            var nodeOutput = Chromosome.NodeGenes.Keys
                             .ToDictionary(geneType => geneType, _ => 0.0);

            var nodesToVisit = new Queue <NodeGeneType>(dependenciesCount
                                                        .Where(pair => pair.Value == 0)
                                                        .Select(pair => pair.Key));

            var visitedNodes = new HashSet <NodeGeneType>();

            while (nodesToVisit.Count > 0)
            {
                var nodeGeneType = nodesToVisit.Dequeue();
                var nodeGene     = Chromosome.NodeGenes[nodeGeneType];
                visitedNodes.Add(nodeGeneType);

                double input = nodeInput.TryGetValue(nodeGeneType, out var externalInput) ?
                               externalInput :
                               0.0;

                double incomingTotal = edgesByTo.TryGetValue(nodeGeneType, out var inEdges) ?
                                       Aggregate(
                    nodeGene.AggregationType,
                    inEdges.Select(
                        fromNode => nodeOutput[fromNode] *
                        Chromosome.EdgeGenes[new EdgeGeneType(fromNode, nodeGeneType)].Weight
                        )
                    ) :
                                       0.0;

                nodeOutput[nodeGeneType] = NodeFunc(Chromosome.NodeGenes[nodeGeneType])(input + incomingTotal);

                if (!edgesByFrom.TryGetValue(nodeGeneType, out var outEdges))
                {
                    continue;
                }

                foreach (var to in outEdges)
                {
                    dependenciesCount[to]--;

                    if (dependenciesCount[to] == 0)
                    {
                        nodesToVisit.Enqueue(to);
                    }
                }
            }

            if (visitedNodes.Count < Chromosome.NodeGenes.Count)
            {
                throw new Exception("Loop in CPPN");
            }

            return(OutputGenes.Select(gene => nodeOutput[gene]).ToImmutableArray());
        }