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