示例#1
0
        /// <summary>
        /// Get the subdomain regions of curve B which have no stored relationship
        /// to any part of curve A - typically the new parts of the curve that were
        /// created by whatever operation generated the mapper.
        /// </summary>
        /// <returns></returns>
        public IList <Interval> UnrelatedPartsOfB()
        {
            var result = new List <Interval>();

            if (_SpanDomains == null)
            {
                return(result);
            }

            for (int iSpan = 0; iSpan < _SpanDomains.Count; iSpan++)
            {
                if (!_SpanDomains[iSpan].IsValid)
                {
                    double tBStart = CurveB.ParameterAt(iSpan, 0);
                    double tBEnd   = CurveB.ParameterAt(iSpan, 1);

                    if (result.Count > 0 &&
                        result.Last().End == tBStart)
                    {
                        result[result.Count - 1] = result.Last().WithEnd(tBEnd);
                    }
                    else
                    {
                        result.Add(new Interval(tBStart, tBEnd));
                    }
                }
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Populate the result collection with equivalent subdomains on curve B
        /// </summary>
        /// <param name="tA"></param>
        /// <param name="result"></param>
        private void MapAtoB(Interval tA, IList <Interval> result)
        {
            if (_SpanDomains == null)
            {
                return;
            }

            for (int iSpan = 0; iSpan < _SpanDomains.Count; iSpan++)
            {
                Interval spanDomain = _SpanDomains[iSpan];
                if (spanDomain.Overlaps(tA))
                {
                    var    overlap = spanDomain.Overlap(tA);
                    double tAStart = spanDomain.ParameterOf(overlap.Start);
                    double tBStart = CurveB.ParameterAt(iSpan, tAStart);
                    double tAEnd   = spanDomain.ParameterOf(overlap.End);
                    double tBEnd   = CurveB.ParameterAt(iSpan, tAEnd);
                    if (result.Count > 0 &&
                        result.Last().End == tBStart)
                    {
                        result[result.Count - 1] = result.Last().WithEnd(tBEnd);
                    }
                    else
                    {
                        result.Add(new Interval(tBStart, tBEnd));
                    }
                }
            }
        }
示例#3
0
        /// <summary>
        /// Map from a parameter on curve A to an equivalent parameter
        /// on curve B.
        /// </summary>
        /// <param name="tA"></param>
        /// <returns></returns>
        public double MapAtoB(double tA)
        {
            if (_SpanDomains == null)
            {
                return(double.NaN);
            }

            for (int iSpan = 0; iSpan < _SpanDomains.Count; iSpan++)
            {
                Interval spanDomain = _SpanDomains[iSpan];
                if (spanDomain.Contains(tA))
                {
                    double tSpan = spanDomain.ParameterOf(tA);
                    return(CurveB.ParameterAt(iSpan, tSpan));
                }
            }
            return(double.NaN);
        }
示例#4
0
        /// <summary>
        /// Map from a parameter on curve B to an equivalent
        /// parameter on curve A.
        /// </summary>
        /// <param name="tB"></param>
        /// <returns></returns>
        public double MapBtoA(double tB)
        {
            if (_SpanDomains == null)
            {
                return(double.NaN);
            }

            int iSpan = CurveB.SpanAt(tB, out double tSpan);

            if (iSpan < 0 || iSpan >= _SpanDomains.Count)
            {
                return(double.NaN);
            }

            Interval spanDomain = SpanDomains[iSpan];

            if (!spanDomain.IsValid)
            {
                return(double.NaN);
            }

            return(spanDomain.ValueAt(tSpan));
        }