public ClusterVisuals(SwarmCluster[] clusters, bool showVelocity)
            {
                this.Clusters = clusters;
                _showVelocity = showVelocity;

                var visual = CreateVisual(clusters, showVelocity);

                this.Visual = visual.Item1;
                _transforms = visual.Item2;
            }
        public static bool IsSame(SwarmCluster[] cluster1, SwarmCluster[] cluster2)
        {
            if (cluster1 == null && cluster2 == null)
            {
                return true;
            }
            else if (cluster1 == null || cluster2 == null)
            {
                return false;
            }
            else if (cluster1.Length != cluster2.Length)
            {
                return false;
            }

            for (int cntr = 0; cntr < cluster1.Length; cntr++)
            {
                if (cluster1[cntr].Token != cluster2[cntr].Token)
                {
                    return false;
                }
            }

            return true;
        }
            private static Tuple<Visual3D, Tuple<TranslateTransform3D, ScaleTransform3D, BillboardLine3D>[]> CreateVisual(SwarmCluster[] clusters, bool showVelocity)
            {
                Model3DGroup models = new Model3DGroup();

                // Hull Material
                MaterialGroup materials = new MaterialGroup();
                materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(UtilityWPF.ColorFromHex("10FFFFFF"))));
                materials.Children.Add(new SpecularMaterial(new SolidColorBrush(UtilityWPF.ColorFromHex("18FFFFFF")), 4));

                var transforms = new Tuple<TranslateTransform3D, ScaleTransform3D, BillboardLine3D>[clusters.Length];

                for (int cntr = 0; cntr < clusters.Length; cntr++)
                {
                    SwarmClusterInfo clusterInfo = clusters[cntr].GetCurrentInfo();

                    #region velocity

                    BillboardLine3D velocity = null;
                    if (showVelocity)
                    {
                        velocity = new BillboardLine3D()
                        {
                            Color = UtilityWPF.ColorFromHex("20FFFFFF"),
                            IsReflectiveColor = false,
                            Thickness = .2,
                        };

                        velocity.SetPoints(clusterInfo.Center, clusterInfo.Center + clusterInfo.Velocity);

                        models.Children.Add(velocity.Model);
                    }

                    #endregion

                    #region hull

                    // Model
                    GeometryModel3D hull = new GeometryModel3D();
                    hull.Material = materials;
                    hull.BackMaterial = materials;
                    hull.Geometry = UtilityWPF.GetSphere_Ico(1d, 2, true);

                    // Transform
                    Transform3DGroup transformGroup = new Transform3DGroup();

                    ScaleTransform3D scale = new ScaleTransform3D(clusterInfo.Radius, clusterInfo.Radius, clusterInfo.Radius);
                    transformGroup.Children.Add(scale);

                    TranslateTransform3D translate = new TranslateTransform3D(clusterInfo.Center.ToVector());
                    transformGroup.Children.Add(translate);

                    hull.Transform = transformGroup;

                    models.Children.Add(hull);

                    #endregion

                    transforms[cntr] = Tuple.Create(translate, scale, velocity);
                }

                ModelVisual3D visual = new ModelVisual3D();
                visual.Content = models;

                return Tuple.Create((Visual3D)visual, transforms);
            }