Flutter Engine
The Flutter Engine
Functions
SkPath_arcto_conic_parametric2.cpp File Reference
#include "tools/fiddle/examples.h"

Go to the source code of this file.

Functions

 REG_FIDDLE (SkPath_arcto_conic_parametric2, 512, 512, false, 0)
 

Function Documentation

◆ REG_FIDDLE()

REG_FIDDLE ( SkPath_arcto_conic_parametric2  ,
512  ,
512  ,
false  ,
 
)

Add a weighted quadratic bezier from the last point, approaching control point (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0). If the starting point is (x0, y0), then this curve is defined as the paramentric curve as t goes from 0 to 1: s := 1 - t x := ((s * s * x0) + (w * 2 * s * t * x1) + (t * t * x2)) / ((s * s) + (w * 2 * s * t) + (t * t)) y := ((s * s * y0) + (w * 2 * s * t * y1) + (t * t * y2)) / ((s * s) + (w * 2 * s * t) + (t * t))

Parameters
x1The x-coordinate of the control point on a quadratic curve
y1The y-coordinate of the control point on a quadratic curve
x2The x-coordinate of the end point on a quadratic curve
y2The y-coordinate of the end point on a quadratic curve
wThe weight of the control point (x1,y1)

Definition at line 4 of file SkPath_arcto_conic_parametric2.cpp.

4 {
5/** Add a weighted quadratic bezier from the last point, approaching control point
6 (x1,y1), and ending at (x2,y2). If no moveTo() call has been made for
7 this contour, the first point is automatically set to (0,0).
8 If the starting point is (x0, y0), then this curve is defined as the
9 paramentric curve as `t` goes from 0 to 1:
10 s := 1 - t
11 x := ((s * s * x0) + (w * 2 * s * t * x1) + (t * t * x2)) /
12 ((s * s) + (w * 2 * s * t) + (t * t))
13 y := ((s * s * y0) + (w * 2 * s * t * y1) + (t * t * y2)) /
14 ((s * s) + (w * 2 * s * t) + (t * t))
15 @param x1 The x-coordinate of the control point on a quadratic curve
16 @param y1 The y-coordinate of the control point on a quadratic curve
17 @param x2 The x-coordinate of the end point on a quadratic curve
18 @param y2 The y-coordinate of the end point on a quadratic curve
19 @param w The weight of the control point (x1,y1)
20*/
21
22SkPoint conic(SkPoint p0, SkPoint p1, SkPoint p2, float w, float t) {
23 float s = 1 - t;
24 return {((s * s * p0.x()) + (2 * s * t * w * p1.x()) + (t * t * p2.x())) /
25 ((s * s) + (w * 2 * s * t) + (t * t)),
26 ((s * s * p0.y()) + (2 * s * t * w * p1.y()) + (t * t * p2.y())) /
27 ((s * s) + (w * 2 * s * t) + (t * t))};
28}
29
30void draw(SkCanvas* canvas) {
31 canvas->clear(SkColorSetARGB(255, 255, 255, 255));
32
34 paint.setAntiAlias(true);
36 paint.setStrokeWidth(1);
37
38 SkPoint center = {256, 256};
39 float r = 192;
40 SkRect oval = {center.x() - r, center.y() - r, center.x() + r, center.y() + r};
41 canvas->drawOval(oval, paint);
42 float startAngle = 15;
43 float sweepAngle = 75;
44
45 SkPath arc;
46 arc.arcTo(oval, startAngle, sweepAngle, false);
47
48 SkPaint arcPaint(paint);
49 arcPaint.setStrokeWidth(5);
50 arcPaint.setColor(SkColorSetARGB(255, 0, 0, 255));
51 canvas->drawPath(arc, arcPaint);
52
53 SkPaint pointPaint;
54 pointPaint.setAntiAlias(true);
55 pointPaint.setStrokeWidth(8);
57 pointPaint.setColor(SkColorSetARGB(255, 0, 255, 0));
58
59 float finalAngle = startAngle + sweepAngle;
60 float middleAngle = startAngle + 0.5f * sweepAngle;
61 float weight = cos(SkDegreesToRadians(sweepAngle) / 2);
64 float d = r / weight;
65 SkPoint p1 = {d * SkScalarCos(SkDegreesToRadians(middleAngle)),
66 d * SkScalarSin(SkDegreesToRadians(middleAngle))};
67 SkPoint p2 = {r * SkScalarCos(SkDegreesToRadians(finalAngle)),
68 r * SkScalarSin(SkDegreesToRadians(finalAngle))};
69 p0 += center;
70 p1 += center;
71 p2 += center;
72
73 canvas->drawLine(p0.x(), p0.y(), p1.x(), p1.y(), paint);
74 canvas->drawLine(p1.x(), p1.y(), p2.x(), p2.y(), paint);
75
76 const int N = 16;
77 for (int i = 0; i <= N; ++i) {
78 SkPoint p = conic(p0, p1, p2, weight, (float)i / N);
79 canvas->drawPoint(p.x(), p.y(), pointPaint);
80 }
81 pointPaint.setColor(SkColorSetARGB(255, 255, 0, 0));
82 canvas->drawPoint(p0.x(), p0.y(), pointPaint);
83 canvas->drawPoint(p1.x(), p1.y(), pointPaint);
84 canvas->drawPoint(p2.x(), p2.y(), pointPaint);
85
86 SkPath weightedQuadratic;
87 weightedQuadratic.moveTo(p0);
88 weightedQuadratic.conicTo(p1, p2, weight);
89 paint.setColor(SK_ColorYELLOW);
90 paint.setStrokeWidth(2.5);
91 canvas->drawPath(weightedQuadratic, paint);
92}
93} // END FIDDLE
constexpr SkColor SK_ColorYELLOW
Definition: SkColor.h:139
static constexpr SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
Definition: SkColor.h:49
#define SkDegreesToRadians(degrees)
Definition: SkScalar.h:77
#define SkScalarSin(radians)
Definition: SkScalar.h:45
#define SkScalarCos(radians)
Definition: SkScalar.h:46
static SkScalar center(float pos0, float pos1)
static void draw(SkCanvas *canvas, SkRect &target, int x, int y)
Definition: aaclip.cpp:27
#define N
Definition: beziers.cpp:19
void drawOval(const SkRect &oval, const SkPaint &paint)
Definition: SkCanvas.cpp:1698
void drawPoint(SkScalar x, SkScalar y, const SkPaint &paint)
Definition: SkCanvas.cpp:2695
void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint &paint)
Definition: SkCanvas.cpp:2700
void clear(SkColor color)
Definition: SkCanvas.h:1199
void drawPath(const SkPath &path, const SkPaint &paint)
Definition: SkCanvas.cpp:1747
@ kRound_Cap
adds circle
Definition: SkPaint.h:335
void setColor(SkColor color)
Definition: SkPaint.cpp:119
void setAntiAlias(bool aa)
Definition: SkPaint.h:170
void setStrokeCap(Cap cap)
Definition: SkPaint.cpp:179
@ kStroke_Style
set to stroke geometry
Definition: SkPaint.h:194
void setStrokeWidth(SkScalar width)
Definition: SkPaint.cpp:159
Definition: SkPath.h:59
SkPath & arcTo(const SkRect &oval, SkScalar startAngle, SkScalar sweepAngle, bool forceMoveTo)
Definition: SkPath.cpp:1220
SkPath & moveTo(SkScalar x, SkScalar y)
Definition: SkPath.cpp:688
SkPath & conicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2, SkScalar w)
Definition: SkPath.cpp:766
const Paint & paint
Definition: color_source.cc:38
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
Definition: main.cc:19
struct MyStruct s
SkRect oval
Definition: SkRecords.h:249
SkScalar startAngle
Definition: SkRecords.h:250
SkScalar sweepAngle
Definition: SkRecords.h:251
AI float conic(float tolerance, const SkPoint pts[], float w, const VectorXform &vectorXform=VectorXform())
Definition: WangsFormula.h:287
SkScalar w
constexpr float y() const
Definition: SkPoint_impl.h:187
constexpr float x() const
Definition: SkPoint_impl.h:181