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); }
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 }; }