コード例 #1
0
        protected IEnumerable <MarkupStyleDash> CalculateCroswalkDash(ILineTrajectory trajectory, float startT, float endT, Vector3 direction, ILineTrajectory[] borders, float length, float width)
        {
            var position       = trajectory.Position((startT + endT) / 2);
            var dashTrajectory = new StraightTrajectory(position, position + direction, false);
            var intersects     = MarkupIntersect.Calculate(dashTrajectory, borders, true);

            intersects = intersects.OrderBy(i => i.FirstT).ToList();

            var halfLength = length / 2;
            var halfWidth  = width / 2;

            for (var i = 1; i < intersects.Count; i += 2)
            {
                var startOffset = GetOffset(intersects[i - 1], halfWidth);
                var endOffset   = GetOffset(intersects[i], halfWidth);

                var start = Mathf.Clamp(intersects[i - 1].FirstT + startOffset, -halfLength, halfLength);
                var end   = Mathf.Clamp(intersects[i].FirstT - endOffset, -halfLength, halfLength);

                var delta = end - start;
                if (delta < 0.9 * length && delta < 0.67 * width)
                {
                    continue;
                }

                var startPosition = position + direction * start;
                var endPosition   = position + direction * end;

                yield return(new MarkupStyleDash(startPosition, endPosition, direction, width, Color));
            }
        }
コード例 #2
0
ファイル: FillerStyle3D.cs プロジェクト: Vince0789/NodeMarkup
        private bool FindIntersects(List <ITrajectory> A, List <ITrajectory> B, bool invert)
        {
            var x     = !invert ? A.Count - 1 : 0;
            var xPart = new StraightTrajectory(A[x]);

            for (var y = !invert ? 1 : B.Count - 2; !invert ? y < B.Count : y >= 0; y += !invert ? 1 : -1)
            {
                var yPart     = new StraightTrajectory(B[y]);
                var intersect = MarkupIntersect.CalculateSingle(xPart, yPart);
                if (intersect.IsIntersect)
                {
                    if (!invert)
                    {
                        A[x] = xPart.Cut(0f, intersect.FirstT);
                        B[y] = yPart.Cut(intersect.SecondT, 1f);
                        B.RemoveRange(0, y);
                    }
                    else
                    {
                        A[x] = xPart.Cut(intersect.FirstT, 1f);
                        B[y] = yPart.Cut(0f, intersect.SecondT);
                        B.RemoveRange(y + 1, B.Count - (y + 1));
                    }

                    return(true);
                }
            }

            return(false);
        }
コード例 #3
0
        protected float GetOffset(MarkupIntersect intersect, float offset)
        {
            var tan = Mathf.Tan(intersect.Angle);

            return(tan != 0 ? offset / tan : 1000f);
        }
コード例 #4
0
        protected float GetOffset(MarkupIntersect intersect, float offset)
        {
            var sin = Mathf.Sin(intersect.Angle);

            return(sin != 0 ? offset / sin : 1000f);
        }