Skia
2D Graphics Library
SkPoint3.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkPoint3_DEFINED
9 #define SkPoint3_DEFINED
10 
11 #include "include/core/SkPoint.h"
12 #include "include/core/SkScalar.h"
13 
14 struct SK_API SkPoint3 {
15  SkScalar fX, fY, fZ;
16 
18  SkPoint3 pt;
19  pt.set(x, y, z);
20  return pt;
21  }
22 
23  SkScalar x() const { return fX; }
24  SkScalar y() const { return fY; }
25  SkScalar z() const { return fZ; }
26 
27  void set(SkScalar x, SkScalar y, SkScalar z) { fX = x; fY = y; fZ = z; }
28 
29  friend bool operator==(const SkPoint3& a, const SkPoint3& b) {
30  return a.fX == b.fX && a.fY == b.fY && a.fZ == b.fZ;
31  }
32 
33  friend bool operator!=(const SkPoint3& a, const SkPoint3& b) {
34  return !(a == b);
35  }
36 
40 
43  SkScalar length() const { return SkPoint3::Length(fX, fY, fZ); }
44 
49  bool normalize();
50 
53  SkPoint3 makeScale(SkScalar scale) const {
54  SkPoint3 p;
55  p.set(scale * fX, scale * fY, scale * fZ);
56  return p;
57  }
58 
61  void scale(SkScalar value) {
62  fX *= value;
63  fY *= value;
64  fZ *= value;
65  }
66 
70  SkPoint3 operator-() const {
71  SkPoint3 neg;
72  neg.fX = -fX;
73  neg.fY = -fY;
74  neg.fZ = -fZ;
75  return neg;
76  }
77 
81  friend SkPoint3 operator-(const SkPoint3& a, const SkPoint3& b) {
82  return { a.fX - b.fX, a.fY - b.fY, a.fZ - b.fZ };
83  }
84 
87  friend SkPoint3 operator+(const SkPoint3& a, const SkPoint3& b) {
88  return { a.fX + b.fX, a.fY + b.fY, a.fZ + b.fZ };
89  }
90 
93  void operator+=(const SkPoint3& v) {
94  fX += v.fX;
95  fY += v.fY;
96  fZ += v.fZ;
97  }
98 
101  void operator-=(const SkPoint3& v) {
102  fX -= v.fX;
103  fY -= v.fY;
104  fZ -= v.fZ;
105  }
106 
108  return { t * p.fX, t * p.fY, t * p.fZ };
109  }
110 
115  bool isFinite() const {
116  SkScalar accum = 0;
117  accum *= fX;
118  accum *= fY;
119  accum *= fZ;
120 
121  // accum is either NaN or it is finite (zero).
122  SkASSERT(0 == accum || SkScalarIsNaN(accum));
123 
124  // value==value will be true iff value is not NaN
125  // TODO: is it faster to say !accum or accum==accum?
126  return !SkScalarIsNaN(accum);
127  }
128 
131  static SkScalar DotProduct(const SkPoint3& a, const SkPoint3& b) {
132  return a.fX * b.fX + a.fY * b.fY + a.fZ * b.fZ;
133  }
134 
135  SkScalar dot(const SkPoint3& vec) const {
136  return DotProduct(*this, vec);
137  }
138 
141  static SkPoint3 CrossProduct(const SkPoint3& a, const SkPoint3& b) {
142  SkPoint3 result;
143  result.fX = a.fY*b.fZ - a.fZ*b.fY;
144  result.fY = a.fZ*b.fX - a.fX*b.fZ;
145  result.fZ = a.fX*b.fY - a.fY*b.fX;
146 
147  return result;
148  }
149 
150  SkPoint3 cross(const SkPoint3& vec) const {
151  return CrossProduct(*this, vec);
152  }
153 };
154 
157 
158 #endif
SkPoint3 SkVector3
Definition: SkPoint3.h:155
SkPoint3 SkColor3f
Definition: SkPoint3.h:156
static bool SkScalarIsNaN(SkScalar x)
Definition: SkScalar.h:64
float SkScalar
Definition: SkScalar.h:14
Definition: SkPoint3.h:14
friend SkPoint3 operator+(const SkPoint3 &a, const SkPoint3 &b)
Returns a new point whose coordinates are the sum of a and b (a + b)
Definition: SkPoint3.h:87
static SkScalar Length(SkScalar x, SkScalar y, SkScalar z)
Returns the Euclidian distance from (0,0,0) to (x,y,z)
void operator+=(const SkPoint3 &v)
Add v's coordinates to the point's.
Definition: SkPoint3.h:93
friend bool operator==(const SkPoint3 &a, const SkPoint3 &b)
Definition: SkPoint3.h:29
SkPoint3 cross(const SkPoint3 &vec) const
Definition: SkPoint3.h:150
static SkPoint3 CrossProduct(const SkPoint3 &a, const SkPoint3 &b)
Returns the cross product of a and b, treating them as 3D vectors.
Definition: SkPoint3.h:141
friend SkPoint3 operator*(SkScalar t, SkPoint3 p)
Definition: SkPoint3.h:107
SkScalar fX
Definition: SkPoint3.h:15
static SkPoint3 Make(SkScalar x, SkScalar y, SkScalar z)
Definition: SkPoint3.h:17
void operator-=(const SkPoint3 &v)
Subtract v's coordinates from the point's.
Definition: SkPoint3.h:101
SkScalar x() const
Definition: SkPoint3.h:23
friend SkPoint3 operator-(const SkPoint3 &a, const SkPoint3 &b)
Returns a new point whose coordinates are the difference between a and b (i.e., a - b)
Definition: SkPoint3.h:81
SkScalar length() const
Return the Euclidian distance from (0,0,0) to the point.
Definition: SkPoint3.h:43
SkPoint3 makeScale(SkScalar scale) const
Return a new point whose X, Y and Z coordinates are scaled.
Definition: SkPoint3.h:53
SkScalar y() const
Definition: SkPoint3.h:24
friend bool operator!=(const SkPoint3 &a, const SkPoint3 &b)
Definition: SkPoint3.h:33
SkScalar fZ
Definition: SkPoint3.h:15
bool normalize()
Set the point (vector) to be unit-length in the same direction as it already points.
SkScalar dot(const SkPoint3 &vec) const
Definition: SkPoint3.h:135
void set(SkScalar x, SkScalar y, SkScalar z)
Definition: SkPoint3.h:27
static SkScalar DotProduct(const SkPoint3 &a, const SkPoint3 &b)
Returns the dot product of a and b, treating them as 3D vectors.
Definition: SkPoint3.h:131
bool isFinite() const
Returns true if fX, fY, and fZ are measurable values.
Definition: SkPoint3.h:115
SkPoint3 operator-() const
Return a new point whose X, Y and Z coordinates are the negative of the original point's.
Definition: SkPoint3.h:70
SkScalar z() const
Definition: SkPoint3.h:25
void scale(SkScalar value)
Scale the point's coordinates by scale.
Definition: SkPoint3.h:61
SkScalar fY
Definition: SkPoint3.h:15