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