コード例 #1
0
        bool update_stroke(Frame3f vLocalF)
        {
            SculptCurveMove.DeformInfo dinfo = sculptOp.UpdateDeformation(vLocalF);
            if (dinfo.bNoChange)
            {
                return(false);
            }

            double dMaxEdgeLen = this.Radius.SceneValue * 0.1;
            double dMinEdgeLen = dMaxEdgeLen * 0.3;

            // resample curve
            if (dinfo.maxEdgeLenSqr > dMaxEdgeLen * dMaxEdgeLen ||
                dinfo.minEdgeLenSqr < dMinEdgeLen * dMinEdgeLen)
            {
                //List<Vector3d> newV = resampler.SplitResample(targets[0].Curve, dMaxEdgeLen);
                List <Vector3d> newV = resampler.SplitCollapseResample(targets[0].Curve, dMaxEdgeLen, dMinEdgeLen);
                if (newV != null && newV.Count > 0)
                {
                    targets[0].Curve.SetVertices(newV, true);
                }
            }

            return(true);
        }
コード例 #2
0
 public static Action <List <Vector3d> > MakeLoopOnSurfaceProcessorF(FScene scene, IProjectionTarget surface,
                                                                     Func <float> SampleRateF, Func <bool> ClosedF,
                                                                     float fSmoothAlpha = 0.2f, int nSmoothIter = 15)
 {
     return((vertices) => {
         CurveResampler resampler = new CurveResampler();
         IWrappedCurve3d temp_curve = new IWrappedCurve3d()
         {
             VertexList = vertices, Closed = ClosedF()
         };
         float rate = SampleRateF();
         List <Vector3d> result = resampler.SplitCollapseResample(temp_curve, rate, rate * 0.6);
         if (result != null && result.Count > 3)
         {
             vertices.Clear();
             vertices.AddRange(result);
         }
         CurveUtils.InPlaceSmooth(vertices, fSmoothAlpha, nSmoothIter, ClosedF());
         gs.CurveDrawingUtil.ProjectToTarget_Scene(vertices, scene, surface);
     });
 }