Пример #1
0
            protected override float ComputePixel(ref InstanceContext ctx)
            {
                var sd = SignedDistance.Infinite.Distance;

                for (var i = 0; i < Shape.Count; ++i)
                {
                    var         minDistance = SignedDistance.Infinite;
                    EdgeSegment nearEdge    = null;
                    double      nearParam   = 0;
                    foreach (var edge in Shape[i])
                    {
                        double param    = 0;
                        var    distance = edge.SignedDistance(ctx.P, ref param);
                        if (distance < minDistance)
                        {
                            minDistance = distance;
                            nearEdge    = edge;
                            nearParam   = param;
                        }
                    }

                    if (Math.Abs(minDistance.Distance) < Math.Abs(sd))
                    {
                        sd          = minDistance.Distance;
                        ctx.Winding = -Windings[i];
                    }

                    nearEdge?.DistanceToPseudoDistance(ref minDistance, ctx.P, nearParam);
                    ContourSd[i] = new SingleDistance {
                        Dist = minDistance.Distance
                    };
                    ctx.UpdateDistance(Windings[i], minDistance.Distance);
                }

                return((float)(ComputeSd(Infinite, ref ctx).Dist / Range + 0.5));
            }
Пример #2
0
            protected override float ComputePixel(ref InstanceContext ctx)
            {
                double dummy = 0;

                for (var i = 0; i < Shape.Count; ++i)
                {
                    var minDistance = SignedDistance.Infinite;
                    foreach (var edge in Shape[i])
                    {
                        var distance = edge.SignedDistance(ctx.P, ref dummy);
                        if (distance < minDistance)
                        {
                            minDistance = distance;
                        }
                    }

                    ContourSd[i] = new SingleDistance {
                        Dist = minDistance.Distance
                    };
                    ctx.UpdateDistance(Windings[i], minDistance.Distance);
                }

                return((float)(ComputeSd(Infinite, ref ctx).Dist / Range + 0.5));
            }