09d80c0337
Replace a hunk of documentation in docs/*.bmh with #Populate, which instructs bookmaker to retrieve the documentation from include/core. Check spelling for all documentation retrieved from include/core against Skia declarations and a list of words in spelling.txt. TBR=caryclark@google.com Docs-Preview: https://skia.org/?cl=163491 Bug: skia: Change-Id: If057c3a1336e312ad59c084a3a130f0276802496 Reviewed-on: https://skia-review.googlesource.com/c/163491 Commit-Queue: Cary Clark <caryclark@skia.org> Reviewed-by: Cary Clark <caryclark@skia.org> Auto-Submit: Cary Clark <caryclark@skia.org>
1072 lines
30 KiB
Plaintext
1072 lines
30 KiB
Plaintext
#Topic Point
|
|
#Alias Points ##
|
|
#Alias Point_Reference ##
|
|
|
|
#Struct SkPoint
|
|
|
|
#Code
|
|
#Populate
|
|
##
|
|
|
|
SkPoint holds two 32-bit floating point coordinates.
|
|
|
|
#Member SkScalar fX
|
|
#Line # x-axis value ##
|
|
x-axis value used by both Point and Vector. May contain any value, including
|
|
infinities and NaN.
|
|
##
|
|
|
|
#Member SkScalar fY
|
|
#Line # y-axis value ##
|
|
y-axis value used by both Point and Vector. May contain any value, including
|
|
infinities and NaN.
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static constexpr SkPoint Make(SkScalar x, SkScalar y)
|
|
#In Constructors
|
|
#Line # constructs from SkScalar inputs ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt1 = {45, 66};
|
|
SkPoint pt2 = SkPoint::Make(45, 66);
|
|
SkVector v1 = {45, 66};
|
|
SkVector v2 = SkPoint::Make(45, 66);
|
|
SkDebugf("all %s" "equal\n", pt1 == pt2 && pt2 == v1 && v1 == v2 ? "" : "not ");
|
|
#StdOut
|
|
all equal
|
|
##
|
|
##
|
|
|
|
#SeeAlso set() iset() SkIPoint::Make
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Subtopic Property
|
|
#Line # member values ##
|
|
##
|
|
|
|
#Method SkScalar x() const
|
|
#In Property
|
|
#Line # returns fX ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt1 = {45, 66};
|
|
SkDebugf("pt1.fX %c= pt1.x()\n", pt1.fX == pt1.x() ? '=' : '!');
|
|
#StdOut
|
|
pt1.fX == pt1.x()
|
|
##
|
|
##
|
|
|
|
#SeeAlso y() SkIPoint::x()
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar y() const
|
|
#In Property
|
|
#Line # returns fY ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt1 = {45, 66};
|
|
SkDebugf("pt1.fY %c= pt1.y()\n", pt1.fY == pt1.y() ? '=' : '!');
|
|
#StdOut
|
|
pt1.fY == pt1.y()
|
|
##
|
|
##
|
|
|
|
#SeeAlso x() SkIPoint::y()
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isZero() const
|
|
#In Property
|
|
#Line # returns true if both members equal zero ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt = { 0.f, -0.f};
|
|
SkDebugf("pt.fX=%c%g pt.fY=%c%g\n", std::signbit(pt.fX) ? '-' : '+', fabsf(pt.fX),
|
|
std::signbit(pt.fY) ? '-' : '+', fabsf(pt.fY));
|
|
SkDebugf("pt.isZero() == %s\n", pt.isZero() ? "true" : "false");
|
|
#StdOut
|
|
pt.fX=+0 pt.fY=-0
|
|
pt.isZero() == true
|
|
##
|
|
##
|
|
|
|
#SeeAlso isFinite SkIPoint::isZero
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Subtopic Set
|
|
#Line # replaces all values ##
|
|
##
|
|
|
|
#Method void set(SkScalar x, SkScalar y)
|
|
#In Set
|
|
#Line # sets to SkScalar input ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt1, pt2 = { SK_ScalarPI, SK_ScalarSqrt2 };
|
|
pt1.set(SK_ScalarPI, SK_ScalarSqrt2);
|
|
SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
|
|
#StdOut
|
|
pt1 == pt2
|
|
##
|
|
##
|
|
|
|
#SeeAlso iset() Make
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void iset(int32_t x, int32_t y)
|
|
#In Set
|
|
#Line # sets to integer input ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint pt1, pt2 = { SK_MinS16, SK_MaxS16 };
|
|
pt1.iset(SK_MinS16, SK_MaxS16);
|
|
SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
|
|
##
|
|
|
|
#SeeAlso set Make SkIPoint::set
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void iset(const SkIPoint& p)
|
|
#Populate
|
|
|
|
#Example
|
|
SkIPoint iPt = { SK_MinS32, SK_MaxS32 };
|
|
SkPoint fPt;
|
|
fPt.iset(iPt);
|
|
SkDebugf("iPt: %d, %d\n", iPt.fX, iPt.fY);
|
|
SkDebugf("fPt: %g, %g\n", fPt.fX, fPt.fY);
|
|
#StdOut
|
|
iPt: -2147483647, 2147483647
|
|
fPt: -2.14748e+09, 2.14748e+09
|
|
##
|
|
##
|
|
|
|
#SeeAlso set Make SkIPoint::set
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void setAbs(const SkPoint& pt)
|
|
#In Set
|
|
#Line # sets sign of both members to positive ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0.f, -0.f}, {-1, -2},
|
|
{ SK_ScalarInfinity, SK_ScalarNegativeInfinity },
|
|
{ SK_ScalarNaN, -SK_ScalarNaN } };
|
|
for (const SkPoint& pt : test) {
|
|
SkPoint absPt;
|
|
absPt.setAbs(pt);
|
|
SkDebugf("pt: %g, %g abs: %g, %g\n", pt.fX, pt.fY, absPt.fX, absPt.fY);
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 abs: 0, 0
|
|
pt: -1, -2 abs: 1, 2
|
|
pt: inf, -inf abs: inf, inf
|
|
pt: nan, -nan abs: nan, nan
|
|
##
|
|
##
|
|
|
|
#SeeAlso set Make negate
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Subtopic Offset
|
|
#Line # moves sides ##
|
|
##
|
|
|
|
#Method static void Offset(SkPoint points[], int count, const SkVector& offset)
|
|
#In Offset
|
|
#Line # translates Point array ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
SkPoint::Offset(points, SK_ARRAY_COUNT(points), { 1, 9 } );
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso offset operator+=(const SkVector& v)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static void Offset(SkPoint points[], int count, SkScalar dx, SkScalar dy)
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
SkPoint::Offset(points, SK_ARRAY_COUNT(points), 1, 9);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso offset operator+=(const SkVector& v)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void offset(SkScalar dx, SkScalar dy)
|
|
#In Offset
|
|
#Line # translates Point ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 128
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
points[1].offset(1, 1);
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso Offset operator+=(const SkVector& v)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar length() const
|
|
#In Property
|
|
#Line # returns straight-line distance to origin ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 192
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
|
|
const SkPoint origin = {30, 140};
|
|
for (auto point : points) {
|
|
canvas->drawLine(origin, point, paint);
|
|
SkAutoCanvasRestore acr(canvas, true);
|
|
SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
|
|
canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
|
|
SkString length("length = ");
|
|
length.appendScalar(point.length());
|
|
canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso distanceToOrigin Length setLength Distance
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar distanceToOrigin() const
|
|
#In Property
|
|
#Line # returns straight-line distance to origin ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 192
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
|
|
const SkPoint origin = {0, 0};
|
|
canvas->translate(30, 140);
|
|
for (auto point : points) {
|
|
canvas->drawLine(origin, point, paint);
|
|
SkAutoCanvasRestore acr(canvas, true);
|
|
SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
|
|
canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
|
|
SkString distance("distance = ");
|
|
distance.appendScalar(point.distanceToOrigin());
|
|
canvas->drawString(distance, origin.fX + 25, origin.fY - 4, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso length Length setLength Distance
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool normalize()
|
|
#In Set
|
|
#Line # sets length to one, preserving direction ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint lines[][2] = { {{ 30, 110 }, { 190, 30 }},
|
|
{{ 120, 140 }, { 30, 220 }}};
|
|
for (auto line : lines) {
|
|
canvas->drawLine(line[0], line[1], paint);
|
|
SkVector vector = line[1] - line[0];
|
|
if (vector.normalize()) {
|
|
SkVector rotate90 = { -vector.fY, vector.fX };
|
|
rotate90 *= 10.f;
|
|
canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
|
|
canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
|
|
}
|
|
}
|
|
##
|
|
|
|
#SeeAlso Normalize setLength length Length
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool setNormalize(SkScalar x, SkScalar y)
|
|
#In Set
|
|
#Line # sets length to one, in direction of (x, y) ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
|
|
const SkPoint origin = {0, 0};
|
|
canvas->translate(30, 140);
|
|
for (auto point : points) {
|
|
paint.setStrokeWidth(1);
|
|
paint.setColor(SK_ColorBLACK);
|
|
canvas->drawLine(origin, point, paint);
|
|
SkVector normal;
|
|
normal.setNormalize(point.fX, point.fY);
|
|
normal *= 100;
|
|
paint.setStrokeWidth(10);
|
|
paint.setColor(0x3f4512bf);
|
|
canvas->drawLine(origin, normal, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso normalize setLength
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool setLength(SkScalar length)
|
|
#In Set
|
|
#Line # sets straight-line distance to origin ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 160
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
|
|
const SkPoint origin = {0, 0};
|
|
canvas->translate(30, 140);
|
|
for (auto point : points) {
|
|
paint.setStrokeWidth(1);
|
|
paint.setColor(SK_ColorBLACK);
|
|
canvas->drawLine(origin, point, paint);
|
|
SkVector normal = point;
|
|
normal.setLength(100);
|
|
paint.setStrokeWidth(10);
|
|
paint.setColor(0x3f45bf12);
|
|
canvas->drawLine(origin, normal, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso length Length setNormalize setAbs
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool setLength(SkScalar x, SkScalar y, SkScalar length)
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 160
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
|
|
const SkPoint origin = {0, 0};
|
|
canvas->translate(30, 140);
|
|
for (auto point : points) {
|
|
paint.setStrokeWidth(1);
|
|
paint.setColor(SK_ColorBLACK);
|
|
canvas->drawLine(origin, point, paint);
|
|
SkVector normal;
|
|
normal.setLength(point.fX, point.fY, 100);
|
|
paint.setStrokeWidth(10);
|
|
paint.setColor(0x3fbf4512);
|
|
canvas->drawLine(origin, normal, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso length Length setNormalize setAbs
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void scale(SkScalar scale, SkPoint* dst) const
|
|
#In Offset
|
|
#In Operators
|
|
#Line # multiplies Point by scale factor ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint point = {40, -15}, scaled;
|
|
SkPoint origin = {30, 110};
|
|
for (auto scale : {1, 2, 3, 5}) {
|
|
paint.setStrokeWidth(scale * 5);
|
|
paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
|
|
point.scale(scale, &scaled);
|
|
canvas->drawLine(origin, origin + scaled, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso operator*(SkScalar scale)_const operator*=(SkScalar scale) setLength
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void scale(SkScalar value)
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint point = {40, -15};
|
|
SkPoint origin = {30, 110};
|
|
for (auto scale : {1, 2, 3, 5}) {
|
|
paint.setStrokeWidth(scale * 5);
|
|
paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
|
|
point.scale(scale);
|
|
canvas->drawLine(origin, origin + point, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso operator*(SkScalar scale)_const operator*=(SkScalar scale) setLength
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void negate()
|
|
#In Operators
|
|
#Line # reverses the sign of both members ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0.f, -0.f}, {-1, -2},
|
|
{ SK_ScalarInfinity, SK_ScalarNegativeInfinity },
|
|
{ SK_ScalarNaN, -SK_ScalarNaN } };
|
|
for (const SkPoint& pt : test) {
|
|
SkPoint negPt = pt;
|
|
negPt.negate();
|
|
SkDebugf("pt: %g, %g negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 negate: -0, 0
|
|
pt: -1, -2 negate: 1, 2
|
|
pt: inf, -inf negate: -inf, inf
|
|
pt: nan, -nan negate: -nan, nan
|
|
##
|
|
##
|
|
|
|
#SeeAlso operator-()_const setAbs
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkPoint operator-()_const
|
|
|
|
#Line # reverses sign of Point ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0.f, -0.f}, {-1, -2},
|
|
{ SK_ScalarInfinity, SK_ScalarNegativeInfinity },
|
|
{ SK_ScalarNaN, -SK_ScalarNaN } };
|
|
for (const SkPoint& pt : test) {
|
|
SkPoint negPt = -pt;
|
|
SkDebugf("pt: %g, %g negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 negate: -0, 0
|
|
pt: -1, -2 negate: 1, 2
|
|
pt: inf, -inf negate: -inf, inf
|
|
pt: nan, -nan negate: -nan, nan
|
|
##
|
|
##
|
|
|
|
#SeeAlso negate operator-(const SkPoint& a, const SkPoint& b) operator-=(const SkVector& v) SkIPoint::operator-()_const
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void operator+=(const SkVector& v)
|
|
|
|
#Line # adds Vector to Point ##
|
|
Adds Vector v to Point. Sets Point to: #Formula # (fX + v.fX, fY + v.fY) ##.
|
|
|
|
#Param v Vector to add ##
|
|
|
|
#Example
|
|
#Height 128
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
points[1] += {1, 1};
|
|
points[2] += {-1, -1};
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso offset() operator+(const SkPoint& a, const SkVector& b) SkIPoint::operator+=(const SkIVector& v)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method void operator-=(const SkVector& v)
|
|
|
|
#Line # subtracts Vector from Point ##
|
|
Subtracts Vector v from Point. Sets Point to: #Formula # (fX - v.fX, fY - v.fY) ##.
|
|
|
|
#Param v Vector to subtract ##
|
|
|
|
#Example
|
|
#Height 128
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
points[1] -= {1, 1};
|
|
points[2] -= {-1, -1};
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso offset() operator-(const SkPoint& a, const SkPoint& b) SkIPoint::operator-=(const SkIVector& v)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkPoint operator*(SkScalar scale)_const
|
|
|
|
#Line # returns Point multiplied by scale ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 128
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(15, 10);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
for (auto& point : points) {
|
|
point = point * 1.5f;
|
|
}
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso operator*=(SkScalar scale) scale() setLength setNormalize
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkPoint& operator*=(SkScalar scale)
|
|
|
|
#Line # multiplies Point by scale factor ##
|
|
Multiplies Point by scale. Sets Point to: #Formula # (fX * scale, fY * scale) ##.
|
|
|
|
#Param scale Scalar to multiply by ##
|
|
|
|
#Return reference to Point ##
|
|
|
|
#Example
|
|
#Height 128
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(15, 10);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
for (auto& point : points) {
|
|
point *= 2;
|
|
}
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso operator*(SkScalar scale)_const scale() setLength setNormalize
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool isFinite() const
|
|
#In Property
|
|
#Line # returns true if no member is infinite or NaN ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
|
|
for (const SkPoint& pt : test) {
|
|
SkDebugf("pt: %g, %g finite: %s\n", pt.fX, pt.fY, pt.isFinite() ? "true" : "false");
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 finite: true
|
|
pt: -1, -2 finite: true
|
|
pt: inf, 1 finite: false
|
|
pt: nan, -1 finite: false
|
|
##
|
|
##
|
|
|
|
#SeeAlso SkRect::isFinite SkPath::isFinite
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool equals(SkScalar x, SkScalar y) const
|
|
#In Operators
|
|
#Line # returns true if Points are equal ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
|
|
for (const SkPoint& pt : test) {
|
|
SkDebugf("pt: %g, %g %c= pt\n", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 == pt
|
|
pt: -1, -2 == pt
|
|
pt: inf, 1 == pt
|
|
pt: nan, -1 != pt
|
|
##
|
|
##
|
|
|
|
#SeeAlso operator==(const SkPoint& a, const SkPoint& b)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool operator==(const SkPoint& a, const SkPoint& b)
|
|
|
|
#Line # returns true if Point are equal ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
|
|
for (const SkPoint& pt : test) {
|
|
SkDebugf("pt: %g, %g %c= pt\n", pt.fX, pt.fY, pt == pt ? '=' : '!');
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 == pt
|
|
pt: -1, -2 == pt
|
|
pt: inf, 1 == pt
|
|
pt: nan, -1 != pt
|
|
##
|
|
##
|
|
|
|
#SeeAlso equals() operator!=(const SkPoint& a, const SkPoint& b)
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool operator!=(const SkPoint& a, const SkPoint& b)
|
|
|
|
#Line # returns true if Point are unequal ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
|
|
for (const SkPoint& pt : test) {
|
|
SkDebugf("pt: %g, %g %c= pt\n", pt.fX, pt.fY, pt != pt ? '!' : '=');
|
|
}
|
|
#StdOut
|
|
pt: 0, -0 == pt
|
|
pt: -1, -2 == pt
|
|
pt: inf, 1 == pt
|
|
pt: nan, -1 != pt
|
|
##
|
|
##
|
|
|
|
#SeeAlso operator==(const SkPoint& a, const SkPoint& b) equals()
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkVector operator-(const SkPoint& a, const SkPoint& b)
|
|
|
|
#Line # returns Vector between Points ##
|
|
Returns Vector from b to a, computed as #Formula # (a.fX - b.fX, a.fY - b.fY) ##.
|
|
|
|
Can also be used to subtract Vector from Point, returning Point.
|
|
Can also be used to subtract Vector from Vector, returning Vector.
|
|
|
|
#Param a Point to subtract from ##
|
|
#Param b Point to subtract ##
|
|
|
|
#Return Vector from b to a ##
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
points[1] += points[0] - points[2];
|
|
points[2] -= points[3] - points[5];
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso operator-=(const SkVector& v) offset()
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkPoint operator+(const SkPoint& a, const SkVector& b)
|
|
|
|
#Line # returns Point offset by Vector ##
|
|
Returns Point resulting from Point a offset by Vector b, computed as:
|
|
#Formula # (a.fX + b.fX, a.fY + b.fY) ##.
|
|
|
|
Can also be used to offset Point b by Vector a, returning Point.
|
|
Can also be used to add Vector to Vector, returning Vector.
|
|
|
|
#Param a Point or Vector to add to ##
|
|
#Param b Point or Vector to add ##
|
|
|
|
#Return Point equal to a offset by b ##
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
|
|
{ 6, 4 }, { 7, 5 }, { 5, 7 },
|
|
{ 4, 6 }, { 3, 7 }, { 1, 5 },
|
|
{ 2, 4 }, { 1, 3 }, { 3, 1 } };
|
|
canvas->scale(30, 15);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
SkVector mod = {1, 1};
|
|
for (auto& point : points) {
|
|
point = point + mod;
|
|
mod.fX *= 1.1f;
|
|
mod.fY += .2f;
|
|
}
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
|
|
##
|
|
|
|
#SeeAlso operator+=(const SkVector& v) offset()
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static SkScalar Length(SkScalar x, SkScalar y)
|
|
#In Property
|
|
#Line # returns straight-line distance to origin ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 192
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
|
|
const SkPoint origin = {30, 140};
|
|
for (auto point : points) {
|
|
canvas->drawLine(origin, point, paint);
|
|
SkAutoCanvasRestore acr(canvas, true);
|
|
SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
|
|
canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
|
|
SkString length("length = ");
|
|
length.appendScalar(SkPoint::Length(point.fX, point.fY));
|
|
canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso length() Distance setLength
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static SkScalar Normalize(SkVector* vec)
|
|
#In Offset
|
|
#Line # sets length to one, and returns prior length ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint lines[][2] = { {{ 30, 110 }, { 190, 30 }},
|
|
{{ 30, 220 }, { 120, 140 }}};
|
|
for (auto line : lines) {
|
|
canvas->drawLine(line[0], line[1], paint);
|
|
SkVector vector = line[1] - line[0];
|
|
SkScalar priorLength = SkPoint::Normalize(&vector);
|
|
SkVector rotate90 = { -vector.fY, vector.fX };
|
|
rotate90 *= 10.f;
|
|
canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
|
|
canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
|
|
SkString length("length = ");
|
|
length.appendScalar(priorLength);
|
|
canvas->drawString(length, line[0].fX + 25, line[0].fY - 4, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso normalize() setLength Length
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static SkScalar Distance(const SkPoint& a, const SkPoint& b)
|
|
#In Property
|
|
#Line # returns straight-line distance between points ##
|
|
#Populate
|
|
|
|
#Example
|
|
#Height 192
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
const SkPoint lines[][2] = {{{-10, -10}, {90, 30}}, {{0, 0}, {150, 30}}, {{10, 25}, {120, 150}}};
|
|
const SkPoint origin = {30, 160};
|
|
for (auto line : lines) {
|
|
SkPoint a = origin + line[0];
|
|
const SkPoint& b = line[1];
|
|
canvas->drawLine(a, b, paint);
|
|
SkAutoCanvasRestore acr(canvas, true);
|
|
SkScalar angle = SkScalarATan2((b.fY - a.fY), b.fX - a.fX);
|
|
canvas->rotate(angle * 180 / SK_ScalarPI, a.fX, a.fY);
|
|
SkString distance("distance = ");
|
|
distance.appendScalar(SkPoint::Distance(a, b));
|
|
canvas->drawString(distance, a.fX + 25, a.fY - 4, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso length() setLength
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static SkScalar DotProduct(const SkVector& a, const SkVector& b)
|
|
#In Operators
|
|
#Line # returns dot product ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
|
|
{{-20, -24}, {-24, -20}}};
|
|
SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
|
|
paint.setStrokeWidth(2);
|
|
for (size_t i = 0; i < 4; ++i) {
|
|
canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
|
|
SkString str;
|
|
str.printf("dot = %g", SkPoint::DotProduct(vectors[i][0], vectors[i][1]));
|
|
canvas->drawString(str, center[i].fX, center[i].fY, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso dot CrossProduct
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method static SkScalar CrossProduct(const SkVector& a, const SkVector& b)
|
|
#In Operators
|
|
#Line # returns cross product ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
|
|
{{-20, -24}, {-24, -20}}};
|
|
SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
|
|
paint.setStrokeWidth(2);
|
|
for (size_t i = 0; i < 4; ++i) {
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
|
|
paint.setColor(SK_ColorBLUE);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
|
|
SkString str;
|
|
SkScalar cross = SkPoint::CrossProduct(vectors[i][1], vectors[i][0]);
|
|
str.printf("cross = %g", cross);
|
|
paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
|
|
canvas->drawString(str, center[i].fX, center[i].fY, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso cross DotProduct
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar cross(const SkVector& vec) const
|
|
#In Operators
|
|
#Line # returns cross product ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
|
|
{{-20, -24}, {-24, -20}}};
|
|
SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
|
|
paint.setStrokeWidth(2);
|
|
for (size_t i = 0; i < 4; ++i) {
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
|
|
paint.setColor(SK_ColorBLUE);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
|
|
SkString str;
|
|
SkScalar cross = vectors[i][0].cross(vectors[i][1]);
|
|
str.printf("cross = %g", cross);
|
|
paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
|
|
canvas->drawString(str, center[i].fX, center[i].fY, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso CrossProduct dot
|
|
|
|
#Method ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method SkScalar dot(const SkVector& vec) const
|
|
#In Operators
|
|
#Line # returns dot product ##
|
|
#Populate
|
|
|
|
#Example
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
|
|
{{-20, -24}, {-24, -20}}};
|
|
SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
|
|
paint.setStrokeWidth(2);
|
|
for (size_t i = 0; i < 4; ++i) {
|
|
canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
|
|
canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
|
|
SkString str;
|
|
str.printf("dot = %g", vectors[i][0].dot(vectors[i][1]));
|
|
canvas->drawString(str, center[i].fX, center[i].fY, paint);
|
|
}
|
|
##
|
|
|
|
#SeeAlso DotProduct cross
|
|
|
|
#Method ##
|
|
|
|
#Struct SkPoint ##
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Subtopic Vector
|
|
#Line # alias for Point ##
|
|
#Alias Vector ##
|
|
#Alias Vectors ##
|
|
#Typedef SkPoint SkVector
|
|
#Line # alias for Point ##
|
|
#Code
|
|
typedef SkPoint SkVector;
|
|
##
|
|
SkVector provides an alternative name for SkPoint. SkVector and SkPoint can
|
|
be used interchangeably for all purposes.
|
|
#Typedef ##
|
|
##
|
|
|
|
#Topic Point ##
|