skia2/samplecode
Chris Dalton 392fa03a1b Add an interactive sample that fits cubics to circular arcs
Fits a cubic to an arc on the unit circle using the following
constraints:

  1) The endpoints and tangent directions at the endpoints must match
     the arc.
  2) The cubic must be symmetric (length(p1 - p0) == length(p3 - p2)).
  3) The height of the cubic must match the height of the arc.

Using the above constraints, we arrive at the following formula for the
control length (c) (i.e., lengths of (p1 - p0) and (p3 - p2)):

  d = x0*x1 + y0*y1
  c = (sqrt(1 + d) * kM + kA) * rsqrt(1 - d)

(Where x0,y0,x1,y1 are the endpoints, kM = -4/3, and kA = 4/3 * sqrt(2).)

The sample also comes with a root finder that finds the max error value
of the curve, which ends up serving as a semi-formal proof that:

  1) Max error always occurs at T=0.21132486540519, regardless of
     endpoints.
  2) Error is reduced by exactly 64x each time we halve the arc angle

Change-Id: I29ad60dda06743d79f71275c38ffdd97261159ac
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/295303
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Mike Reed <reed@google.com>
2020-06-09 23:04:03 +00:00
..
DecodeFile.h Sample/Filter2View: make it work without /skimages 2019-07-08 17:05:23 +00:00
PerlinPatch.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
Sample2PtRadial.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
Sample3D.cpp Revert "Revert "move onto new factories for SkMatrix"" 2020-05-21 16:58:39 +00:00
Sample.cpp Update internal skia uses to use flushAndSubmit and submit calls. 2020-05-14 20:26:44 +00:00
Sample.h add std::function option to Click to simplify callsites 2020-04-22 15:41:28 +00:00
SampleAAClip.cpp Revert "add guard to switch to SkPathTypes" 2019-09-14 19:13:44 +00:00
SampleAAGeometry.cpp Remove SkPath::RawIter from tests/tools/samplecode 2020-05-06 16:31:53 +00:00
SampleAARectModes.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleAARects.cpp more rect api simplifications 2019-08-25 10:12:57 +00:00
SampleAndroidShadows.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
SampleAnimatedImage.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleAnimatedText.cpp Remove GrAtlasManager.h from all other .h files 2020-04-07 12:43:46 +00:00
SampleAnimBlur.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleArc.cpp more rect api simplifications 2019-08-25 10:12:57 +00:00
SampleAtlas.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleBackdropBounds.cpp Revert "Revert "move onto new factories for SkMatrix"" 2020-05-21 16:58:39 +00:00
SampleBitmapRect.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleCamera.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleCCPRGeometry.cpp Reland "GrClips provided as pointers to GrRTC" 2020-05-29 15:09:54 +00:00
SampleChart.cpp Remove SkMin32/SkMax32 2020-02-06 17:31:51 +00:00
SampleChineseFling.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
SampleCircle.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleClip.cpp Revert "Revert "move onto new factories for SkMatrix"" 2020-05-21 16:58:39 +00:00
SampleClipDrawMatch.cpp Samples: clean up cruft 2019-07-17 18:29:50 +00:00
SampleClock.cpp Revert "Reland "Revert "Use flat version of path-direction enum""" 2019-11-22 19:09:54 +00:00
SampleColorFilter.cpp more rect api simplifications 2019-08-25 10:12:57 +00:00
SampleComplexClip.cpp Revert "Revert "switch to new filltype for SkPath"" 2019-11-26 17:43:14 +00:00
SampleCowboy.cpp Revert "Revert "move onto new factories for SkMatrix"" 2020-05-21 16:58:39 +00:00
SampleCusp.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleDegenerateQuads.cpp Rename domain types and vars to subset. 2020-04-21 21:43:45 +00:00
SampleDegenerateTwoPtRadials.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleEffects.cpp SkColorMatrix cleanup 2019-11-04 15:20:15 +00:00
SampleEmboss.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleFatBits.cpp Revert "Revert "move onto new factories for SkMatrix"" 2020-05-21 16:58:39 +00:00
SampleFillType.cpp Revert "Revert "switch to new filltype for SkPath"" 2019-11-26 17:43:14 +00:00
SampleFilter2.cpp Sample/Filter2View: make it work without /skimages 2019-07-08 17:05:23 +00:00
SampleFilterQuality.cpp Revert "Revert "switch to new filltype for SkPath"" 2019-11-26 17:43:14 +00:00
SampleFitCubicToCircle.cpp Add an interactive sample that fits cubics to circular arcs 2020-06-09 23:04:03 +00:00
SampleFlutterAnimate.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleFontCache.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleGlyphTransform.cpp tools: separate TimeUtils from AnimTimer 2019-07-12 15:05:01 +00:00
SampleGradients.cpp more rect api simplifications 2019-08-25 10:12:57 +00:00
SampleHairCurves.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleHairline.cpp tools/skui: put all enums in a common namespace 2019-08-29 15:39:32 +00:00
SampleHairModes.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleHT.cpp tools/skui: put all enums in a common namespace 2019-08-29 15:39:32 +00:00
SampleIdentityScale.cpp SkBlurMaskFilter.h is only needed for (deprecated) emboss 2019-12-30 15:40:46 +00:00
SampleImageFilterDAG.cpp Remove SkMaxScalar and SkMinScalar 2020-02-06 15:43:22 +00:00
SampleLayerMask.cpp Revert "Revert "switch to new filltype for SkPath"" 2019-11-26 17:43:14 +00:00
SampleLayers.cpp hide savelayer's clipmask fields 2020-05-31 14:06:42 +00:00
SampleLCD.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleLua.cpp tools/skui: put all enums in a common namespace 2019-08-29 15:39:32 +00:00
SampleManyRects.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleMegaStroke.cpp more rect api simplifications 2019-08-25 10:12:57 +00:00
SampleMixer.cpp remove LerpRed shader 2020-03-12 18:37:17 +00:00
SamplePatch.cpp SkVertices: Remove volatile/nonvolatile bit 2020-03-11 17:33:17 +00:00
SamplePath.cpp add std::function option to Click to simplify callsites 2020-04-22 15:41:28 +00:00
SamplePathClip.cpp add std::function option to Click to simplify callsites 2020-04-22 15:41:28 +00:00
SamplePathEffects.cpp Revert "add guard to switch to SkPathTypes" 2019-09-14 19:13:44 +00:00
SamplePathOverstroke.cpp Samples: simplify Sample::Event 2019-07-08 19:09:42 +00:00
SamplePathText.cpp Merge PathText samples into one, with different modes 2020-05-29 16:35:25 +00:00
SamplePolyToPoly.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleQuadStroker.cpp Remove SkPath::RawIter from tests/tools/samplecode 2020-05-06 16:31:53 +00:00
SampleRectanizer.cpp Reland GrRectanizerPow2 2020-05-19 18:35:13 +00:00
SampleRegion.cpp Revert "Reland "Revert "Use flat version of path-direction enum""" 2019-11-22 19:09:54 +00:00
SampleRepeatTile.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleSG.cpp [skottie] Cleanup: relocate Animator base class out of SkSG 2020-03-26 20:50:10 +00:00
SampleShaders.cpp re-run tools/rewrite_includes.py 2019-07-25 15:40:33 +00:00
SampleShadowColor.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
SampleShadowReference.cpp Samples: simplify Sample::Event 2019-07-08 19:09:42 +00:00
SampleShadowUtils.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
SampleShip.cpp Remove WallTimer class. 2019-07-15 16:06:11 +00:00
SampleSlides.cpp Remove unnecessary SK_SIZE_T_SPECIFIER macro. 2020-05-05 13:25:28 +00:00
SampleStringArt.cpp Remove SkMaxScalar and SkMinScalar 2020-02-06 15:43:22 +00:00
SampleStrokePath.cpp Revert "Revert "switch to new filltype for SkPath"" 2019-11-26 17:43:14 +00:00
SampleStrokeRect.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleSubpixelTranslate.cpp SkBlurMaskFilter.h is only needed for (deprecated) emboss 2019-12-30 15:40:46 +00:00
SampleSVGFile.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleTessellatedWedge.cpp Handle tessellated paths that require more segments than are supported 2020-06-05 15:33:19 +00:00
SampleTextBox.cpp Regularize SkFontMgr for CoreText build. 2020-06-04 16:45:09 +00:00
SampleTextEffects.cpp SkBlurMaskFilter.h is only needed for (deprecated) emboss 2019-12-30 15:40:46 +00:00
SampleTextureUpload.cpp Remove SkTMin and SkTMax 2020-02-07 18:40:09 +00:00
SampleThinAA.cpp Reland "Rename GrShape to GrStyledShape" 2020-04-17 20:24:53 +00:00
SampleUnpremul.cpp remove code now that loopers are dead (w.r.t. canvas and paint) 2019-07-30 12:49:28 +00:00
SampleVertices.cpp tools/skui: put all enums in a common namespace 2019-08-29 15:39:32 +00:00
SampleWritePixels.cpp Samples: add name() virtual 2019-07-03 17:41:16 +00:00
SampleXfer.cpp tools/skui: put all enums in a common namespace 2019-08-29 15:39:32 +00:00
SampleXfermodesBlur.cpp SkBlurMaskFilter.h is only needed for (deprecated) emboss 2019-12-30 15:40:46 +00:00
vertexdump.cpp rewrite includes to not need so much -Ifoo 2019-04-24 16:27:11 +00:00