示例#1
0
        /***************************************************/

        private static Avalue ClipView(Spectator spectator, Vector viewVect, Polyline activityArea)
        {
            Avalue result = new Avalue();

            result.ObjectId       = spectator.BHoM_Guid;
            result.ReferencePoint = spectator.Head.PairOfEyes.ReferenceLocation;

            Vector rowV  = Geometry.Query.CrossProduct(Vector.ZAxis, spectator.Head.PairOfEyes.ViewDirection);
            Vector viewY = Geometry.Query.CrossProduct(viewVect, rowV);
            Vector viewX = Geometry.Query.CrossProduct(viewVect, viewY);

            //viewX reversed to ensure cartesian Z matches the view direction
            viewX    = viewX.Reverse();
            viewX    = viewX.Normalise();
            viewY    = viewY.Normalise();
            viewVect = viewVect.Normalise();

            //local cartesian
            Cartesian local = Geometry.Create.CartesianCoordinateSystem(spectator.Head.PairOfEyes.ReferenceLocation, viewX, viewY);

            //get the ConeOfVision
            TransformMatrix transform = Geometry.Create.OrientationMatrixGlobalToLocal(local);

            result.ConeOfVision = m_AvalueSettings.EffectiveConeOfVision.Transform(transform);

            //planes where the calculation takes place
            Plane viewPlane = result.ConeOfVision.FitPlane();

            //make sure normal is viewvect
            viewPlane.Normal = viewVect;

            //find part of activity area to project
            Polyline clippedArea = ReduceActivityArea(viewPlane, activityArea);

            //project the pitch
            result.FullActivityArea = ProjectPolylineToPlane(viewPlane, clippedArea, spectator.Head.PairOfEyes.ReferenceLocation);

            //clip the projected pitch against the view cone
            result.ClippedActivityArea = ClipActivityArea(result.FullActivityArea, result.ConeOfVision);

            //calculate the avalue
            result.AValue = result.ClippedActivityArea.Area() / result.ConeOfVision.Area() * 100;

            //clip heads in front
            if (m_AvalueSettings.CalculateOcclusion)
            {
                List <Spectator> infront = GetSpectatorsInfront(spectator, m_ConeOfVisionAngle);
                if (infront.Count > 0)
                {
                    List <Polyline> occludingClippedHeads = ClipHeads(infront, spectator, viewPlane, result.ClippedActivityArea);
                    if (occludingClippedHeads.Count > 0)
                    {
                        result.OccludingHeads = occludingClippedHeads;
                        result.Occulsion      = occludingClippedHeads.Sum(x => x.Area()) / result.ConeOfVision.Area() * 100;
                    }
                }
            }

            return(result);
        }
示例#2
0
        /***************************************************/

        private static Avalue ClipView(Spectator spectator, Vector rowV, Vector viewVect, AvalueSettings settings, ActivityArea activityArea, KDTree <Spectator> tree)
        {
            Avalue result = new Avalue();

            Vector viewY = Geometry.Query.CrossProduct(viewVect, rowV);
            Vector viewX = Geometry.Query.CrossProduct(viewVect, viewY);

            viewVect = viewVect.Normalise();
            Vector shift = viewVect * settings.EyeFrameDist;

            Point shiftOrigin    = spectator.Head.PairOfEyes.ReferenceLocation + shift;
            Point viewClipOrigin = spectator.Head.PairOfEyes.ReferenceLocation + 2 * shift;

            //planes need orientation
            Plane viewPlane = Geometry.Create.Plane(shiftOrigin, viewVect);
            Plane viewClip  = Geometry.Create.Plane(viewClipOrigin, viewVect);

            //get the view cone
            result.ViewCone = Create.ViewCone(viewY, viewX, shiftOrigin, 1, settings.ConeType);
            //find part of activity area to project
            Polyline clippedArea = ClipActivityArea(viewClip, activityArea);

            //project the pitch
            result.FullActivityArea = ProjectPolylineToPlane(viewPlane, clippedArea, spectator.Head.PairOfEyes.ReferenceLocation);
            //clip the pitch against the viewcone

            result.ClippedActivityArea = ClipActivityArea(result.FullActivityArea, result.ViewCone, spectator, viewPlane);
            //calculate the avalue
            result.AValue = result.ClippedActivityArea.Sum(x => x.Area()) / result.ViewCone.ConeArea * 100;
            //clip heads infront
            if (settings.CalculateOcclusion)
            {
                List <Spectator> occludingSpectators = GetPotentialOcclusion(spectator, tree, 3);
                if (occludingSpectators.Count > 0)
                {
                    List <Polyline> occludingClippedHeads = ClipHeads(occludingSpectators, spectator, viewPlane, result.ClippedActivityArea);
                    if (occludingClippedHeads.Count > 0)
                    {
                        result.Heads     = occludingClippedHeads;
                        result.Occulsion = occludingClippedHeads.Sum(x => x.Area()) / result.ViewCone.ConeArea * 100;
                        CheckPolylineGeo(occludingClippedHeads);
                    }
                }
            }

            return(result);
        }