• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#Topic Point
2#Alias Points ##
3#Alias Point_Reference ##
4
5#Struct SkPoint
6
7#Code
8#Populate
9##
10
11SkPoint holds two 32-bit floating point coordinates.
12
13#Member SkScalar  fX
14#Line # x-axis value ##
15x-axis value used by both Point and Vector. May contain any value, including
16infinities and NaN.
17##
18
19#Member SkScalar  fY
20#Line # y-axis value ##
21y-axis value used by both Point and Vector. May contain any value, including
22infinities and NaN.
23##
24
25# ------------------------------------------------------------------------------
26
27#Method static constexpr SkPoint Make(SkScalar x, SkScalar y)
28#In Constructors
29#Line # constructs from SkScalar inputs ##
30#Populate
31
32#Example
33SkPoint pt1 = {45, 66};
34SkPoint pt2 = SkPoint::Make(45, 66);
35SkVector v1 = {45, 66};
36SkVector v2 = SkPoint::Make(45, 66);
37SkDebugf("all %s" "equal\n", pt1 == pt2 && pt2 == v1 && v1 == v2 ? "" : "not ");
38#StdOut
39all equal
40##
41##
42
43#SeeAlso set() iset() SkIPoint::Make
44
45#Method ##
46
47# ------------------------------------------------------------------------------
48
49#Subtopic Property
50#Line # member values ##
51##
52
53#Method SkScalar x() const
54#In Property
55#Line # returns fX ##
56#Populate
57
58#Example
59SkPoint pt1 = {45, 66};
60SkDebugf("pt1.fX %c= pt1.x()\n", pt1.fX == pt1.x() ? '=' : '!');
61#StdOut
62pt1.fX == pt1.x()
63##
64##
65
66#SeeAlso y() SkIPoint::x()
67
68#Method ##
69
70# ------------------------------------------------------------------------------
71
72#Method SkScalar y() const
73#In Property
74#Line # returns fY ##
75#Populate
76
77#Example
78SkPoint pt1 = {45, 66};
79SkDebugf("pt1.fY %c= pt1.y()\n", pt1.fY == pt1.y() ? '=' : '!');
80#StdOut
81pt1.fY == pt1.y()
82##
83##
84
85#SeeAlso x() SkIPoint::y()
86
87#Method ##
88
89# ------------------------------------------------------------------------------
90
91#Method bool isZero() const
92#In Property
93#Line # returns true if both members equal zero ##
94#Populate
95
96#Example
97SkPoint pt = { 0.f, -0.f};
98SkDebugf("pt.fX=%c%g pt.fY=%c%g\n", std::signbit(pt.fX) ? '-' : '+', fabsf(pt.fX),
99                                    std::signbit(pt.fY) ? '-' : '+', fabsf(pt.fY));
100SkDebugf("pt.isZero() == %s\n", pt.isZero() ? "true" : "false");
101#StdOut
102pt.fX=+0 pt.fY=-0
103pt.isZero() == true
104##
105##
106
107#SeeAlso isFinite SkIPoint::isZero
108
109#Method ##
110
111# ------------------------------------------------------------------------------
112
113#Subtopic Set
114#Line # replaces all values ##
115##
116
117#Method void set(SkScalar x, SkScalar y)
118#In Set
119#Line # sets to SkScalar input ##
120#Populate
121
122#Example
123SkPoint pt1, pt2 = { SK_ScalarPI, SK_ScalarSqrt2 };
124pt1.set(SK_ScalarPI, SK_ScalarSqrt2);
125SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
126#StdOut
127pt1 == pt2
128##
129##
130
131#SeeAlso iset() Make
132
133#Method ##
134
135# ------------------------------------------------------------------------------
136
137#Method void iset(int32_t x, int32_t y)
138#In Set
139#Line # sets to integer input ##
140#Populate
141
142#Example
143SkPoint pt1, pt2 = { SK_MinS16, SK_MaxS16 };
144pt1.iset(SK_MinS16, SK_MaxS16);
145SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
146##
147
148#SeeAlso set Make SkIPoint::set
149
150#Method ##
151
152# ------------------------------------------------------------------------------
153
154#Method void iset(const SkIPoint& p)
155#Populate
156
157#Example
158SkIPoint iPt = { SK_MinS32, SK_MaxS32 };
159SkPoint fPt;
160fPt.iset(iPt);
161SkDebugf("iPt: %d, %d\n", iPt.fX, iPt.fY);
162SkDebugf("fPt: %g, %g\n", fPt.fX, fPt.fY);
163#StdOut
164iPt: -2147483647, 2147483647
165fPt: -2.14748e+09, 2.14748e+09
166##
167##
168
169#SeeAlso set Make SkIPoint::set
170
171#Method ##
172
173# ------------------------------------------------------------------------------
174
175#Method void setAbs(const SkPoint& pt)
176#In Set
177#Line # sets sign of both members to positive ##
178#Populate
179
180#Example
181SkPoint test[] = { {0.f, -0.f}, {-1, -2},
182                   { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
183                   { SK_ScalarNaN, -SK_ScalarNaN } };
184for (const SkPoint& pt : test) {
185    SkPoint absPt;
186    absPt.setAbs(pt);
187    SkDebugf("pt: %g, %g  abs: %g, %g\n", pt.fX, pt.fY, absPt.fX, absPt.fY);
188}
189#StdOut
190pt: 0, -0  abs: 0, 0
191pt: -1, -2  abs: 1, 2
192pt: inf, -inf  abs: inf, inf
193pt: nan, -nan  abs: nan, nan
194##
195##
196
197#SeeAlso set Make negate
198
199#Method ##
200
201# ------------------------------------------------------------------------------
202
203#Subtopic Offset
204#Line # moves sides ##
205##
206
207#Method static void Offset(SkPoint points[], int count, const SkVector& offset)
208#In Offset
209#Line # translates Point array ##
210#Populate
211
212#Example
213    SkPaint paint;
214    paint.setAntiAlias(true);
215    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
216                         { 6, 4 }, { 7, 5 }, { 5, 7 },
217                         { 4, 6 }, { 3, 7 }, { 1, 5 },
218                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
219    canvas->scale(30, 15);
220    paint.setStyle(SkPaint::kStroke_Style);
221    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
222    SkPoint::Offset(points, SK_ARRAY_COUNT(points), { 1, 9 } );
223    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
224##
225
226#SeeAlso offset operator+=(const SkVector& v)
227
228#Method ##
229
230# ------------------------------------------------------------------------------
231
232#Method static void Offset(SkPoint points[], int count, SkScalar dx, SkScalar dy)
233#Populate
234
235#Example
236    SkPaint paint;
237    paint.setAntiAlias(true);
238    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
239                         { 6, 4 }, { 7, 5 }, { 5, 7 },
240                         { 4, 6 }, { 3, 7 }, { 1, 5 },
241                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
242    canvas->scale(30, 15);
243    paint.setStyle(SkPaint::kStroke_Style);
244    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
245    SkPoint::Offset(points, SK_ARRAY_COUNT(points), 1, 9);
246    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
247##
248
249#SeeAlso offset operator+=(const SkVector& v)
250
251#Method ##
252
253# ------------------------------------------------------------------------------
254
255#Method void offset(SkScalar dx, SkScalar dy)
256#In Offset
257#Line # translates Point ##
258#Populate
259
260#Example
261#Height 128
262    SkPaint paint;
263    paint.setAntiAlias(true);
264    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
265                         { 6, 4 }, { 7, 5 }, { 5, 7 },
266                         { 4, 6 }, { 3, 7 }, { 1, 5 },
267                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
268    canvas->scale(30, 15);
269    paint.setStyle(SkPaint::kStroke_Style);
270    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
271    points[1].offset(1, 1);
272    paint.setColor(SK_ColorRED);
273    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
274##
275
276#SeeAlso Offset operator+=(const SkVector& v)
277
278#Method ##
279
280# ------------------------------------------------------------------------------
281
282#Method SkScalar length() const
283#In Property
284#Line # returns straight-line distance to origin ##
285#Populate
286
287#Example
288#Height 192
289    SkPaint paint;
290    paint.setAntiAlias(true);
291    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
292    const SkPoint origin = {30, 140};
293    for (auto point : points) {
294        canvas->drawLine(origin, point, paint);
295        SkAutoCanvasRestore acr(canvas, true);
296        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
297        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
298        SkString length("length = ");
299        length.appendScalar(point.length());
300        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
301    }
302##
303
304#SeeAlso distanceToOrigin Length setLength Distance
305
306#Method ##
307
308# ------------------------------------------------------------------------------
309
310#Method SkScalar distanceToOrigin() const
311#In Property
312#Line # returns straight-line distance to origin ##
313#Populate
314
315#Example
316#Height 192
317    SkPaint paint;
318    paint.setAntiAlias(true);
319    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
320    const SkPoint origin = {0, 0};
321    canvas->translate(30, 140);
322    for (auto point : points) {
323        canvas->drawLine(origin, point, paint);
324        SkAutoCanvasRestore acr(canvas, true);
325        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
326        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
327        SkString distance("distance = ");
328        distance.appendScalar(point.distanceToOrigin());
329        canvas->drawString(distance, origin.fX + 25, origin.fY - 4, paint);
330    }
331##
332
333#SeeAlso length Length setLength Distance
334
335#Method ##
336
337# ------------------------------------------------------------------------------
338
339#Method bool normalize()
340#In Set
341#Line # sets length to one, preserving direction ##
342#Populate
343
344#Example
345    SkPaint paint;
346    paint.setAntiAlias(true);
347    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},
348                                 {{ 120, 140 }, {  30, 220 }}};
349    for (auto line : lines) {
350        canvas->drawLine(line[0], line[1], paint);
351        SkVector vector = line[1] - line[0];
352        if (vector.normalize()) {
353            SkVector rotate90 = { -vector.fY, vector.fX };
354            rotate90 *= 10.f;
355            canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
356            canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
357        }
358    }
359##
360
361#SeeAlso Normalize setLength length Length
362
363#Method ##
364
365# ------------------------------------------------------------------------------
366
367#Method bool setNormalize(SkScalar x, SkScalar y)
368#In Set
369#Line # sets length to one, in direction of (x, y) ##
370#Populate
371
372#Example
373    SkPaint paint;
374    paint.setAntiAlias(true);
375    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
376    const SkPoint origin = {0, 0};
377    canvas->translate(30, 140);
378    for (auto point : points) {
379        paint.setStrokeWidth(1);
380        paint.setColor(SK_ColorBLACK);
381        canvas->drawLine(origin, point, paint);
382        SkVector normal;
383        normal.setNormalize(point.fX, point.fY);
384        normal *= 100;
385        paint.setStrokeWidth(10);
386        paint.setColor(0x3f4512bf);
387        canvas->drawLine(origin, normal, paint);
388    }
389##
390
391#SeeAlso normalize setLength
392
393#Method ##
394
395# ------------------------------------------------------------------------------
396
397#Method bool setLength(SkScalar length)
398#In Set
399#Line # sets straight-line distance to origin ##
400#Populate
401
402#Example
403#Height 160
404    SkPaint paint;
405    paint.setAntiAlias(true);
406    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
407    const SkPoint origin = {0, 0};
408    canvas->translate(30, 140);
409    for (auto point : points) {
410        paint.setStrokeWidth(1);
411        paint.setColor(SK_ColorBLACK);
412        canvas->drawLine(origin, point, paint);
413        SkVector normal = point;
414        normal.setLength(100);
415        paint.setStrokeWidth(10);
416        paint.setColor(0x3f45bf12);
417        canvas->drawLine(origin, normal, paint);
418    }
419##
420
421#SeeAlso length Length setNormalize setAbs
422
423#Method ##
424
425# ------------------------------------------------------------------------------
426
427#Method bool setLength(SkScalar x, SkScalar y, SkScalar length)
428#Populate
429
430#Example
431#Height 160
432    SkPaint paint;
433    paint.setAntiAlias(true);
434    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
435    const SkPoint origin = {0, 0};
436    canvas->translate(30, 140);
437    for (auto point : points) {
438        paint.setStrokeWidth(1);
439        paint.setColor(SK_ColorBLACK);
440        canvas->drawLine(origin, point, paint);
441        SkVector normal;
442        normal.setLength(point.fX, point.fY, 100);
443        paint.setStrokeWidth(10);
444        paint.setColor(0x3fbf4512);
445        canvas->drawLine(origin, normal, paint);
446    }
447##
448
449#SeeAlso length Length setNormalize setAbs
450
451#Method ##
452
453# ------------------------------------------------------------------------------
454
455#Method void scale(SkScalar scale, SkPoint* dst) const
456#In Offset
457#In Operators
458#Line # multiplies Point by scale factor ##
459#Populate
460
461#Example
462    SkPaint paint;
463    paint.setAntiAlias(true);
464    SkPoint point = {40, -15}, scaled;
465    SkPoint origin = {30, 110};
466    for (auto scale : {1, 2, 3, 5}) {
467        paint.setStrokeWidth(scale * 5);
468        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
469        point.scale(scale, &scaled);
470        canvas->drawLine(origin, origin + scaled, paint);
471    }
472##
473
474#SeeAlso operator*(SkScalar scale) const operator*=(SkScalar scale) setLength
475
476#Method ##
477
478# ------------------------------------------------------------------------------
479
480#Method void scale(SkScalar value)
481#Populate
482
483#Example
484    SkPaint paint;
485    paint.setAntiAlias(true);
486    SkPoint point = {40, -15};
487    SkPoint origin = {30, 110};
488    for (auto scale : {1, 2, 3, 5}) {
489        paint.setStrokeWidth(scale * 5);
490        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
491        point.scale(scale);
492        canvas->drawLine(origin, origin + point, paint);
493    }
494##
495
496#SeeAlso operator*(SkScalar scale) const operator*=(SkScalar scale) setLength
497
498#Method ##
499
500# ------------------------------------------------------------------------------
501
502#Method void negate()
503#In Operators
504#Line # reverses the sign of both members ##
505#Populate
506
507#Example
508SkPoint test[] = { {0.f, -0.f}, {-1, -2},
509                   { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
510                   { SK_ScalarNaN, -SK_ScalarNaN } };
511for (const SkPoint& pt : test) {
512    SkPoint negPt = pt;
513    negPt.negate();
514    SkDebugf("pt: %g, %g  negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
515}
516#StdOut
517pt: 0, -0  negate: -0, 0
518pt: -1, -2  negate: 1, 2
519pt: inf, -inf  negate: -inf, inf
520pt: nan, -nan  negate: -nan, nan
521##
522##
523
524#SeeAlso operator-() const setAbs
525
526#Method ##
527
528# ------------------------------------------------------------------------------
529
530#Method SkPoint operator-() const
531
532#Line # reverses sign of Point ##
533#Populate
534
535#Example
536SkPoint test[] = { {0.f, -0.f}, {-1, -2},
537                   { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
538                   { SK_ScalarNaN, -SK_ScalarNaN } };
539for (const SkPoint& pt : test) {
540    SkPoint negPt = -pt;
541    SkDebugf("pt: %g, %g  negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
542}
543#StdOut
544pt: 0, -0  negate: -0, 0
545pt: -1, -2  negate: 1, 2
546pt: inf, -inf  negate: -inf, inf
547pt: nan, -nan  negate: -nan, nan
548##
549##
550
551#SeeAlso negate operator-(const SkPoint& a, const SkPoint& b) operator-=(const SkVector& v) SkIPoint::operator-() const
552
553#Method ##
554
555# ------------------------------------------------------------------------------
556
557#Method void operator+=(const SkVector& v)
558
559#Line # adds Vector to Point ##
560Adds Vector v to Point. Sets Point to: #Formula # (fX + v.fX, fY + v.fY) ##.
561
562#Param v  Vector to add ##
563
564#Example
565#Height 128
566    SkPaint paint;
567    paint.setAntiAlias(true);
568    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
569                         { 6, 4 }, { 7, 5 }, { 5, 7 },
570                         { 4, 6 }, { 3, 7 }, { 1, 5 },
571                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
572    canvas->scale(30, 15);
573    paint.setStyle(SkPaint::kStroke_Style);
574    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
575    points[1] += {1, 1};
576    points[2] += {-1, -1};
577    paint.setColor(SK_ColorRED);
578    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
579##
580
581#SeeAlso offset() operator+(const SkPoint& a, const SkVector& b) SkIPoint::operator+=(const SkIVector& v)
582
583#Method ##
584
585# ------------------------------------------------------------------------------
586
587#Method void operator-=(const SkVector& v)
588
589#Line # subtracts Vector from Point ##
590Subtracts Vector v from Point. Sets Point to: #Formula # (fX - v.fX, fY - v.fY) ##.
591
592#Param v  Vector to subtract ##
593
594#Example
595#Height 128
596    SkPaint paint;
597    paint.setAntiAlias(true);
598    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
599                         { 6, 4 }, { 7, 5 }, { 5, 7 },
600                         { 4, 6 }, { 3, 7 }, { 1, 5 },
601                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
602    canvas->scale(30, 15);
603    paint.setStyle(SkPaint::kStroke_Style);
604    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
605    points[1] -= {1, 1};
606    points[2] -= {-1, -1};
607    paint.setColor(SK_ColorRED);
608    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
609##
610
611#SeeAlso offset() operator-(const SkPoint& a, const SkPoint& b) SkIPoint::operator-=(const SkIVector& v)
612
613#Method ##
614
615# ------------------------------------------------------------------------------
616
617#Method SkPoint operator*(SkScalar scale) const
618
619#Line # returns Point multiplied by scale ##
620#Populate
621
622#Example
623#Height 128
624    SkPaint paint;
625    paint.setAntiAlias(true);
626    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
627                         { 6, 4 }, { 7, 5 }, { 5, 7 },
628                         { 4, 6 }, { 3, 7 }, { 1, 5 },
629                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
630    canvas->scale(15, 10);
631    paint.setStyle(SkPaint::kStroke_Style);
632    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
633    for (auto& point : points) {
634        point = point * 1.5f;
635    }
636    paint.setColor(SK_ColorRED);
637    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
638##
639
640#SeeAlso operator*=(SkScalar scale) scale() setLength setNormalize
641
642#Method ##
643
644# ------------------------------------------------------------------------------
645
646#Method SkPoint& operator*=(SkScalar scale)
647
648#Line # multiplies Point by scale factor ##
649Multiplies Point by scale. Sets Point to: #Formula # (fX * scale, fY * scale) ##.
650
651#Param scale  Scalar to multiply by ##
652
653#Return reference to Point ##
654
655#Example
656#Height 128
657    SkPaint paint;
658    paint.setAntiAlias(true);
659    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
660                         { 6, 4 }, { 7, 5 }, { 5, 7 },
661                         { 4, 6 }, { 3, 7 }, { 1, 5 },
662                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
663    canvas->scale(15, 10);
664    paint.setStyle(SkPaint::kStroke_Style);
665    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
666    for (auto& point : points) {
667        point *= 2;
668    }
669    paint.setColor(SK_ColorRED);
670    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
671##
672
673#SeeAlso operator*(SkScalar scale) const scale() setLength setNormalize
674
675#Method ##
676
677# ------------------------------------------------------------------------------
678
679#Method bool isFinite() const
680#In Property
681#Line # returns true if no member is infinite or NaN ##
682#Populate
683
684#Example
685SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
686for (const SkPoint& pt : test) {
687    SkDebugf("pt: %g, %g  finite: %s\n", pt.fX, pt.fY, pt.isFinite() ? "true" : "false");
688}
689#StdOut
690pt: 0, -0  finite: true
691pt: -1, -2  finite: true
692pt: inf, 1  finite: false
693pt: nan, -1  finite: false
694##
695##
696
697#SeeAlso SkRect::isFinite SkPath::isFinite
698
699#Method ##
700
701# ------------------------------------------------------------------------------
702
703#Method bool equals(SkScalar x, SkScalar y) const
704#In Operators
705#Line # returns true if Points are equal ##
706#Populate
707
708#Example
709SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
710for (const SkPoint& pt : test) {
711    SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');
712}
713#StdOut
714pt: 0, -0  == pt
715pt: -1, -2  == pt
716pt: inf, 1  == pt
717pt: nan, -1  != pt
718##
719##
720
721#SeeAlso operator==(const SkPoint& a, const SkPoint& b)
722
723#Method ##
724
725# ------------------------------------------------------------------------------
726
727#Method bool operator==(const SkPoint& a, const SkPoint& b)
728
729#Line # returns true if Point are equal ##
730#Populate
731
732#Example
733SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
734for (const SkPoint& pt : test) {
735    SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt == pt ? '=' : '!');
736}
737#StdOut
738pt: 0, -0  == pt
739pt: -1, -2  == pt
740pt: inf, 1  == pt
741pt: nan, -1  != pt
742##
743##
744
745#SeeAlso equals() operator!=(const SkPoint& a, const SkPoint& b)
746
747#Method ##
748
749# ------------------------------------------------------------------------------
750
751#Method bool operator!=(const SkPoint& a, const SkPoint& b)
752
753#Line # returns true if Point are unequal ##
754#Populate
755
756#Example
757SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
758for (const SkPoint& pt : test) {
759    SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt != pt ? '!' : '=');
760}
761#StdOut
762pt: 0, -0  == pt
763pt: -1, -2  == pt
764pt: inf, 1  == pt
765pt: nan, -1  != pt
766##
767##
768
769#SeeAlso operator==(const SkPoint& a, const SkPoint& b) equals()
770
771#Method ##
772
773# ------------------------------------------------------------------------------
774
775#Method SkVector operator-(const SkPoint& a, const SkPoint& b)
776
777#Line # returns Vector between Points ##
778Returns Vector from b to a, computed as #Formula # (a.fX - b.fX, a.fY - b.fY) ##.
779
780Can also be used to subtract Vector from Point, returning Point.
781Can also be used to subtract Vector from Vector, returning Vector.
782
783#Param a  Point to subtract from ##
784#Param b  Point to subtract ##
785
786#Return Vector from b to a ##
787
788#Example
789    SkPaint paint;
790    paint.setAntiAlias(true);
791    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
792                         { 6, 4 }, { 7, 5 }, { 5, 7 },
793                         { 4, 6 }, { 3, 7 }, { 1, 5 },
794                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
795    canvas->scale(30, 15);
796    paint.setStyle(SkPaint::kStroke_Style);
797    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
798    points[1] += points[0] - points[2];
799    points[2] -= points[3] - points[5];
800    paint.setColor(SK_ColorRED);
801    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
802##
803
804#SeeAlso operator-=(const SkVector& v) offset()
805
806#Method ##
807
808# ------------------------------------------------------------------------------
809
810#Method SkPoint operator+(const SkPoint& a, const SkVector& b)
811
812#Line # returns Point offset by Vector ##
813Returns Point resulting from Point a offset by Vector b, computed as:
814#Formula # (a.fX + b.fX, a.fY + b.fY) ##.
815
816Can also be used to offset Point b by Vector a, returning Point.
817Can also be used to add Vector to Vector, returning Vector.
818
819#Param a  Point or Vector to add to ##
820#Param b  Point or Vector to add ##
821
822#Return Point equal to a offset by b ##
823
824#Example
825    SkPaint paint;
826    paint.setAntiAlias(true);
827    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
828                         { 6, 4 }, { 7, 5 }, { 5, 7 },
829                         { 4, 6 }, { 3, 7 }, { 1, 5 },
830                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
831    canvas->scale(30, 15);
832    paint.setStyle(SkPaint::kStroke_Style);
833    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
834    SkVector mod = {1, 1};
835    for (auto& point : points) {
836        point = point + mod;
837        mod.fX *= 1.1f;
838        mod.fY += .2f;
839    }
840    paint.setColor(SK_ColorRED);
841    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
842##
843
844#SeeAlso operator+=(const SkVector& v) offset()
845
846#Method ##
847
848# ------------------------------------------------------------------------------
849
850#Method static SkScalar Length(SkScalar x, SkScalar y)
851#In Property
852#Line # returns straight-line distance to origin ##
853#Populate
854
855#Example
856#Height 192
857    SkPaint paint;
858    paint.setAntiAlias(true);
859    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
860    const SkPoint origin = {30, 140};
861    for (auto point : points) {
862        canvas->drawLine(origin, point, paint);
863        SkAutoCanvasRestore acr(canvas, true);
864        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
865        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
866        SkString length("length = ");
867        length.appendScalar(SkPoint::Length(point.fX, point.fY));
868        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
869    }
870##
871
872#SeeAlso length() Distance setLength
873
874#Method ##
875
876# ------------------------------------------------------------------------------
877
878#Method static SkScalar Normalize(SkVector* vec)
879#In Offset
880#Line # sets length to one, and returns prior length ##
881#Populate
882
883#Example
884    SkPaint paint;
885    paint.setAntiAlias(true);
886    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},
887                                 {{  30, 220 }, { 120, 140 }}};
888    for (auto line : lines) {
889        canvas->drawLine(line[0], line[1], paint);
890        SkVector vector = line[1] - line[0];
891        SkScalar priorLength = SkPoint::Normalize(&vector);
892        SkVector rotate90 = { -vector.fY, vector.fX };
893        rotate90 *= 10.f;
894        canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
895        canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
896        SkString length("length = ");
897        length.appendScalar(priorLength);
898        canvas->drawString(length, line[0].fX + 25, line[0].fY - 4, paint);
899    }
900##
901
902#SeeAlso normalize() setLength Length
903
904#Method ##
905
906# ------------------------------------------------------------------------------
907
908#Method static SkScalar Distance(const SkPoint& a, const SkPoint& b)
909#In Property
910#Line # returns straight-line distance between points ##
911#Populate
912
913#Example
914#Height 192
915    SkPaint paint;
916    paint.setAntiAlias(true);
917    const SkPoint lines[][2] = {{{-10, -10}, {90, 30}}, {{0, 0}, {150, 30}}, {{10, 25}, {120, 150}}};
918    const SkPoint origin = {30, 160};
919    for (auto line : lines) {
920        SkPoint a = origin + line[0];
921        const SkPoint& b = line[1];
922        canvas->drawLine(a, b, paint);
923        SkAutoCanvasRestore acr(canvas, true);
924        SkScalar angle = SkScalarATan2((b.fY - a.fY), b.fX - a.fX);
925        canvas->rotate(angle * 180 / SK_ScalarPI, a.fX, a.fY);
926        SkString distance("distance = ");
927        distance.appendScalar(SkPoint::Distance(a, b));
928        canvas->drawString(distance, a.fX + 25, a.fY - 4, paint);
929    }
930##
931
932#SeeAlso length() setLength
933
934#Method ##
935
936# ------------------------------------------------------------------------------
937
938#Method static SkScalar DotProduct(const SkVector& a, const SkVector& b)
939#In Operators
940#Line # returns dot product ##
941#Populate
942
943#Example
944    SkPaint paint;
945    paint.setAntiAlias(true);
946    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
947                             {{-20, -24}, {-24, -20}}};
948    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
949    paint.setStrokeWidth(2);
950    for (size_t i = 0; i < 4; ++i) {
951        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
952        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
953        SkString str;
954        str.printf("dot = %g", SkPoint::DotProduct(vectors[i][0], vectors[i][1]));
955        canvas->drawString(str, center[i].fX, center[i].fY, paint);
956    }
957##
958
959#SeeAlso dot CrossProduct
960
961#Method ##
962
963# ------------------------------------------------------------------------------
964
965#Method static SkScalar CrossProduct(const SkVector& a, const SkVector& b)
966#In Operators
967#Line # returns cross product ##
968#Populate
969
970#Example
971    SkPaint paint;
972    paint.setAntiAlias(true);
973    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
974                             {{-20, -24}, {-24, -20}}};
975    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
976    paint.setStrokeWidth(2);
977    for (size_t i = 0; i < 4; ++i) {
978        paint.setColor(SK_ColorRED);
979        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
980        paint.setColor(SK_ColorBLUE);
981        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
982        SkString str;
983        SkScalar cross = SkPoint::CrossProduct(vectors[i][1], vectors[i][0]);
984        str.printf("cross = %g", cross);
985        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
986        canvas->drawString(str, center[i].fX, center[i].fY, paint);
987    }
988##
989
990#SeeAlso cross DotProduct
991
992#Method ##
993
994# ------------------------------------------------------------------------------
995
996#Method SkScalar cross(const SkVector& vec) const
997#In Operators
998#Line # returns cross product ##
999#Populate
1000
1001#Example
1002    SkPaint paint;
1003    paint.setAntiAlias(true);
1004    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
1005                             {{-20, -24}, {-24, -20}}};
1006    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
1007    paint.setStrokeWidth(2);
1008    for (size_t i = 0; i < 4; ++i) {
1009        paint.setColor(SK_ColorRED);
1010        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
1011        paint.setColor(SK_ColorBLUE);
1012        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
1013        SkString str;
1014        SkScalar cross = vectors[i][0].cross(vectors[i][1]);
1015        str.printf("cross = %g", cross);
1016        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
1017        canvas->drawString(str, center[i].fX, center[i].fY, paint);
1018    }
1019##
1020
1021#SeeAlso CrossProduct dot
1022
1023#Method ##
1024
1025# ------------------------------------------------------------------------------
1026
1027#Method SkScalar dot(const SkVector& vec) const
1028#In Operators
1029#Line # returns dot product ##
1030#Populate
1031
1032#Example
1033    SkPaint paint;
1034    paint.setAntiAlias(true);
1035    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
1036                             {{-20, -24}, {-24, -20}}};
1037    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
1038    paint.setStrokeWidth(2);
1039    for (size_t i = 0; i < 4; ++i) {
1040        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
1041        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
1042        SkString str;
1043        str.printf("dot = %g", vectors[i][0].dot(vectors[i][1]));
1044        canvas->drawString(str, center[i].fX, center[i].fY, paint);
1045    }
1046##
1047
1048#SeeAlso DotProduct cross
1049
1050#Method ##
1051
1052#Struct SkPoint ##
1053
1054
1055# ------------------------------------------------------------------------------
1056
1057#Subtopic Vector
1058#Line # alias for Point ##
1059    #Alias Vector ##
1060    #Alias Vectors ##
1061    #Typedef SkPoint SkVector
1062    #Line # alias for Point ##
1063    #Code
1064    typedef SkPoint SkVector;
1065    ##
1066    SkVector provides an alternative name for SkPoint. SkVector and SkPoint can
1067    be used interchangeably for all purposes.
1068    #Typedef ##
1069##
1070
1071#Topic Point ##
1072