1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #pragma once19 20 #ifdef MATH_ENABLE_STL_SUPPORT21 #include <string>22 #include <vector>23 #endif24 25 #include "[Math/MathFwd.h]"26 27 #ifdef MATH_QT_INTEROP28 #include <QVector2D>29 #endif30 31 #ifdef MATH_OGRE_INTEROP32 #include <OgreVector2.h>33 #endif34 35 [MATH_BEGIN_NAMESPACE]36 37 38 class [float2]39 {40 public:41 enum42 {43 44 [Size] = 245 };46 47 48 float [x];49 50 51 float [y];52 53 54 55 56 57 [float2]() {}58 59 60 61 62 [float2](const [float2] &rhs) { [x] = rhs.[x]; [y] = rhs.[y]; }63 64 65 66 [float2](float [x], float [y]);67 68 69 70 explicit [float2](float scalar);71 72 73 74 explicit [float2](const float *data);75 76 77 78 79 80 81 82 83 84 85 86 87 float *[ptr]();88 const float *[ptr]() const;89 90 91 92 93 94 95 float &[operator []](int index) { return [At](index); }96 [CONST_WIN32] float [operator []](int index) const { return [At](index); }97 98 99 100 101 102 103 float &[At](int index);104 [CONST_WIN32] float [At](int index) const;105 106 107 108 109 [float2] [operator +](const [float2] &v) const;110 111 112 113 [float2] [operator -]() const;114 115 116 117 [float2] [operator -](const [float2] &v) const;118 119 120 121 [float2] [operator *](float scalar) const;122 123 124 125 [float2] [operator /](float scalar) const;126 127 128 129 [float2] &[operator +=](const [float2] &v);130 131 132 [float2] &[operator -=](const [float2] &v);133 134 135 [float2] &[operator *=](float scalar);136 137 138 [float2] &[operator /=](float scalar);139 140 #ifdef MATH_ENABLE_UNCOMMON_OPERATIONS141 [float2] [operator *](const [float2] &vector) const { return this->[Mul](vector); }142 [float2] [operator /](const [float2] &vector) const { return this->[Div](vector); }143 [float2] &[operator *=](const [float2] &vector) { *this = this->[Mul](vector); return *this; }144 [float2] &[operator /=](const [float2] &vector) { *this = this->[Div](vector); return *this; }145 #endif146 147 148 149 [float2] [Add](const [float2] &v) const { return *this + v; }150 151 152 153 154 155 [float2] [Add](float s) const;156 157 158 159 [float2] [Sub](const [float2] &v) const { return *this - v; }160 161 162 163 164 165 [float2] [Sub](float s) const;166 167 168 169 170 171 [float2] [SubLeft](float s) const;172 173 174 175 176 177 [float2] [Mul](const [float2] &v) const;178 179 180 181 [float2] [Mul](float s) const { return *this * s; }182 183 184 185 186 187 [float2] [Div](const [float2] &v) const;188 189 190 191 [float2] [Div](float s) const { return *this / s; }192 193 194 195 196 197 [float2] [DivLeft](float s) const;198 199 200 [float2] [xx]() const { return [float2]([x],[x]); }201 [float2] [xy]() const { return [float2]([x],[y]); } 202 [float2] [yx]() const { return [float2]([y],[x]); } 203 [float2] [yy]() const { return [float2]([y],[y]); } 204 205 206 207 208 209 210 211 [float2] [Swizzled](int i, int j) const;212 [float3] [Swizzled](int i, int j, int k) const;213 [float4] [Swizzled](int i, int j, int k, int l) const;214 215 216 217 static [float2] [FromScalar](float scalar);218 219 220 221 void [SetFromScalar](float scalar);222 223 224 225 void [Set](float [x], float [y]);226 227 228 229 230 float [Length]() const;231 232 233 234 235 236 237 238 239 float [LengthSq]() const;240 241 242 243 244 245 246 247 248 249 250 float [Normalize]();251 252 253 254 255 256 257 [float2] [Normalized]() const;258 259 260 261 262 263 264 265 266 267 268 float [ScaleToLength](float newLength);269 270 271 272 273 274 [float2] [ScaledToLength](float newLength) const;275 276 277 278 bool [IsNormalized](float epsilonSq = 1[e]-6f) const;279 280 281 282 bool [IsZero](float epsilonSq = 1[e]-6f) const;283 284 285 286 bool [IsFinite]() const;287 288 289 290 bool [IsPerpendicular](const [float2] &other, float epsilon = 1[e]-3f) const;291 292 293 294 bool [Equals](const [float2] &other, float epsilon = 1[e]-3f) const;295 bool [Equals](float [x], float [y], float epsilon = 1[e]-3f) const;296 297 #ifdef MATH_ENABLE_STL_SUPPORT298 299 std::string ToString() const;300 301 302 std::string SerializeToString() const;303 #endif304 305 306 static [float2] [FromString](const char *str);307 #ifdef MATH_ENABLE_STL_SUPPORT308 static [float2] [FromString](const std::string &str) { return [FromString](str.c_str()); }309 #endif310 311 312 float [SumOfElements]() const;313 314 float [ProductOfElements]() const;315 316 float [AverageOfElements]() const;317 318 319 float [MinElement]() const;320 321 322 int [MinElementIndex]() const;323 324 325 float [MaxElement]() const;326 327 328 int [MaxElementIndex]() const;329 330 331 332 [float2] [Abs]() const;333 334 335 336 337 [float2] [Neg]() const;338 339 340 341 [float2] [Recip]() const;342 343 344 [float2] [Min](float ceil) const;345 346 347 348 [float2] [Min](const [float2] &ceil) const;349 350 351 [float2] [Max](float floor) const;352 353 354 355 [float2] [Max](const [float2] &floor) const;356 357 [float2] [Clamp](float floor, float ceil) const;358 359 360 [float2] [Clamp](const [float2] &floor, const [float2] &ceil) const;361 362 363 [float2] [Clamp01]() const;364 365 366 367 float [Distance](const [float2] &point) const;368 369 370 371 372 373 374 375 float [DistanceSq](const [float2] &point) const;376 377 378 379 380 381 382 float [Dot](const [float2] &v) const;383 384 385 386 387 388 389 390 [float2] [Perp]() const;391 392 393 394 float [PerpDot](const [float2] &rhs) const;395 396 397 398 399 void [Rotate90CW]();400 401 402 403 404 [float2] [Rotated90CW]() const;405 406 407 408 409 void [Rotate90CCW]();410 411 412 413 [float2] [Rotated90CCW]() const;414 415 416 417 418 [float2] [Reflect](const [float2] &normal) const;419 420 421 422 423 424 425 426 427 428 [float2] [Refract](const [float2] &normal, float negativeSideRefractionIndex, float positiveSideRefractionIndex) const;429 430 431 432 433 434 [float2] [ProjectTo](const [float2] &direction) const;435 436 437 438 439 [float2] [ProjectToNorm](const [float2] &direction) const;440 441 442 443 444 445 float [AngleBetween](const [float2] &other) const;446 447 448 449 450 451 float [AngleBetweenNorm](const [float2] &normalizedVector) const;452 453 454 455 456 457 void [Decompose](const [float2] &direction, [float2] &outParallel, [float2] &outPerpendicular) const;458 459 460 461 462 463 464 [float2] [Lerp](const [float2] &b, float t) const;465 466 static [float2] [Lerp](const [float2] &a, const [float2] &b, float t);467 468 469 470 471 472 473 static void [Orthogonalize](const [float2] &a, [float2] &b);474 475 476 477 static bool [AreOrthogonal](const [float2] &a, const [float2] &b, float epsilon = 1[e]-3f);478 479 480 481 482 483 484 static void [Orthonormalize]([float2] &a, [float2] &b);485 486 487 488 489 490 491 static bool [OrientedCCW](const [float2] &a, const [float2] &b, const [float2] &c);492 493 #ifdef MATH_ENABLE_STL_SUPPORT494 495 496 static void ConvexHull(const [float2] *pointArray, int numPoints, std::vector<float2> &outConvexHull);497 498 499 500 501 502 503 static int ConvexHullInPlace([float2] *pointArray, int numPoints);504 #endif505 506 507 508 509 510 static float [MinAreaRect](const [float2] *pointArray, int numPoints, [float2] ¢er, [float2] &uDir, [float2] &vDir);511 512 513 static [float2] [RandomDir]([LCG] &lcg, float length = 1.f);514 515 #ifdef MATH_ENABLE_UNCOMMON_OPERATIONS516 [float2] [operator *](const [float2] &rhs) const { return this->[Mul](rhs); }517 [float2] [operator /](const [float2] &rhs) const { return this->[Div](rhs); }518 [float2] &[operator *=](const [float2] &rhs) { *this = this->[Mul](rhs); return *this; }519 [float2] &[operator /=](const [float2] &rhs) { *this = this->[Div](rhs); return *this; }520 #endif521 522 523 524 525 static const [float2] [zero];526 527 528 529 static const [float2] [one];530 531 532 533 static const [float2] [unitX];534 535 536 537 static const [float2] [unitY];538 539 540 541 542 543 544 static const [float2] [nan];545 546 547 548 static const [float2] [inf];549 550 #ifdef MATH_OGRE_INTEROP551 [float2](const Ogre::Vector2 &other) { [x] = other.x; [y] = other.y; }552 operator Ogre::Vector2() const { return Ogre::Vector2([x], [y]); }553 #endif554 #ifdef MATH_QT_INTEROP555 [float2](const QVector2D &other) { [x] = other.x(); [y] = other.y(); }556 operator QVector2D() const { return QVector2D([x], [y]); }557 operator QString() const { return "float2(" + QString::number([x]) + "," + QString::number([y]) + ")"; }558 QString toString() const { return (QString)*this; }559 QVector2D ToQVector2D() const { return QVector2D([x], [y]); }560 static [float2] FromQVector2D(const QVector2D &v) { return ([float2])v; }561 static [float2] [FromString](const QString &str) { return [FromString](str.toStdString()); }562 #endif563 };564 565 #ifdef MATH_ENABLE_STL_SUPPORT566 567 std::ostream &operator <<(std::ostream &out, const [float2] &rhs);568 #endif569 570 [float2] [operator *](float scalar, const [float2] &rhs);571 572 #ifdef MATH_ENABLE_UNCOMMON_OPERATIONS573 inline [float2] [operator /](float scalar, const [float2] &rhs) { return [float2::FromScalar](scalar) / rhs; }574 #endif575 576 inline float [Dot](const [float2] &a, const [float2] &b) { return a.[Dot](b); }577 inline [float2] [Abs](const [float2] &a) { return a.[Abs](); }578 inline [float2] [Min](const [float2] &a, const [float2] &b) { return a.[Min](b); }579 inline [float2] [Max](const [float2] &a, const [float2] &b) { return a.[Max](b); }580 inline [float2] [Clamp](const [float2] &a, float floor, float ceil) { return a.[Clamp](floor, ceil); }581 inline [float2] [Clamp](const [float2] &a, const [float2] &floor, const [float2] &ceil) { return a.[Clamp](floor, ceil); }582 inline [float2] [Clamp01](const [float2] &a) { return a.[Clamp01](); }583 inline [float2] [Lerp](const [float2] &a, const [float2] &b, float t) { return a.[Lerp](b, t); }584 585 [MATH_END_NAMESPACE]586 587 #ifdef MATH_QT_INTEROP588 Q_DECLARE_METATYPE([float2])589 Q_DECLARE_METATYPE([float2]*)590 #endif Go back to previous page