NeuronPositionById(int id)
    {
        NeuronRenderer neuron = GetComponentInParent <NeuralNetRenderer> ().GetNeuronById(id);

        if (neuron == null)
        {
            Debug.LogWarning("neuron with neuron id " + id + " does not exist!");
            Destroy(this.gameObject);
            return(Vector2.zero);
        }
        Vector3 originWorldPosition = GetComponentInParent <NeuronRenderer> ().transform.position;
        Vector3 worldPosition       = neuron.transform.position;


        RectTransform canvasRect = GetComponentInParent <Canvas> ().GetComponent <RectTransform>();

        Vector2 viewportPosition = Camera.main.WorldToViewportPoint(originWorldPosition);
        Vector2 originScreenPos  = new Vector2(
            ((viewportPosition.x * canvasRect.sizeDelta.x) - (canvasRect.sizeDelta.x * 0.5f)),
            ((viewportPosition.y * canvasRect.sizeDelta.y) - (canvasRect.sizeDelta.y * 0.5f)));

        viewportPosition = Camera.main.WorldToViewportPoint(worldPosition);
        Vector2 screenPos = new Vector2(
            ((viewportPosition.x * canvasRect.sizeDelta.x) - (canvasRect.sizeDelta.x * 0.5f)),
            ((viewportPosition.y * canvasRect.sizeDelta.y) - (canvasRect.sizeDelta.y * 0.5f)));

        return(screenPos - originScreenPos);
    }
示例#2
0
    UpdateNeural(CNeuralNet neuralNet)
    {
        this.neuralNet = neuralNet;
        neurons.Clear();

        AddLayers();

        List <SNeuron> neuronsToAdd = new List <SNeuron>();

        for (int i = 0; i < layers.Count; i++)
        {
            float     splitY      = layers.ElementAt(i).Key;
            Transform parentLayer = layers[splitY].transform;
            neuronsToAdd.Clear();

            // select all neurons with the same splitY value
            for (int j = 0; j < neuralNet.Neurons().Count; j++)
            {
                SNeuron neuron = neuralNet.Neurons()[j];
                if (neuron.splitY != splitY)
                {
                    continue;
                }

                neuronsToAdd.Add(neuron);
            }

            // sort by splitX values
            neuronsToAdd.Sort(delegate(SNeuron a, SNeuron b) {
                return(a.splitX.CompareTo(b.splitX));
            });

            for (int j = 0; j < neuronsToAdd.Count; j++)
            {
                SNeuron neuron = neuronsToAdd[j];

                if (neurons.ContainsKey(neuron.neuronID))
                {
                    Debug.LogWarning("a neuron with id " + neuron.neuronID + " already exists!");
                    continue;
                }

                NeuronRenderer neuronRenderer = Instantiate(neuronPrefab, parentLayer).GetComponent <NeuronRenderer>();
                neuronRenderer.neuron = neuron;

                neurons.Add(neuron.neuronID, neuronRenderer);
            }
        }
    }
    Update()
    {
        if (link == null)
        {
            return;
        }

        Color colour;
        float thickness = 1.0f;

        thickness = Mathf.Clamp(link.weight * thicknessCoefficient, minThickness, maxThickness);

        isRecurrent = link.isRecurrent;
        weight      = link.weight;

        if (link.isRecurrent)
        {
            if (link.weight < 0)
            {
                colour = Color.blue;
            }
            else if (link.weight == 0)
            {
                colour = Color.black;
            }
            else
            {
                colour = Color.red;
            }

            if (link.fromNeuron == link.toNeuron)
            {
                float x;
                float y;
                float angle = 20f;

                List <Vector2> newPoints = new List <Vector2> ();

                for (int i = 0; i < (recurrentSegments + 1); i++)
                {
                    x = Mathf.Sin(Mathf.Deg2Rad * angle) * radiusRecurrent;
                    y = Mathf.Cos(Mathf.Deg2Rad * angle) * radiusRecurrent - recurrentOffset;

                    newPoints.Add(new Vector2(x, y));

                    angle += (360f / recurrentSegments);
                }

                lineRenderer.color         = colour;
                lineRenderer.LineThickness = thickness;
                lineRenderer.Points        = newPoints.ToArray();
                return;
            }
        }
        else
        {
            if (link.weight <= 0)
            {
                colour = Color.yellow;
            }
            else if (link.weight == 0)
            {
                colour = Color.black;
            }
            else
            {
                colour = Color.grey;
            }
        }

        // draw bias links in green
        NeuronRenderer neuronRenderer = GetComponentInParent <NeuralNetRenderer>().GetNeuronById(link.fromNeuron);

        if (neuronRenderer == null)
        {
            Debug.LogWarning("neuron with neuron id " + link.fromNeuron + " does not exist!");
            Destroy(this.gameObject);
            return;
        }

        if (neuronRenderer.neuron.type == GA.NeuronType.Bias)
        {
            colour = Color.green;
        }

        lineRenderer.color         = colour;
        lineRenderer.LineThickness = thickness;
        Vector2 endPoint = NeuronPositionById(link.toNeuron);

        lineRenderer.Points = new Vector2[] { Vector2.zero, endPoint };
    }