FineKernelToolKit: FK/Math.h ソースファイル

FineKernelToolKit 4.3.0

読み取り中…
検索中…
一致する文字列を見つけられません
Math.h
[詳解]
1#if !defined(__FK_MATH_HEADER__)
2#define __FK_MATH_HEADER__
3
4#include <FK/Quaternion.h>
5#include <random>
6
7namespace FK {
8
10 enum class fk_LineType {
11 OPEN,
12 CLOSE,
13 HALF,
14 };
15
17
33
34 class fk_Math {
35 public:
36 static constexpr double EPS = 1.0e-8;
37 static constexpr double PI = 3.1415926535897932;
38
41
43
51 static double sgn(double a);
52
54
66 static double clamp(double a, double min, double max);
68
71
73
85 static double calcCosine(fk_Vector A, fk_Vector B);
86
88
110
111 static std::tuple<double, double, double>
112 divideVec(fk_Vector V, fk_Vector A, fk_Vector B, fk_Vector C);
113
115
118
120
148 static bool isOnLine(fk_LineType type, fk_Vector A, fk_Vector B,
149 fk_Vector P, bool openFlg = true);
150
151#if !defined(FK_DOXYGEN_USER_PROCESS) && !defined(FK_OLD_NONSUPPORT)
152 static bool isOnLine(fk_Vector, fk_Vector, fk_Vector);
153 static bool isOnLineSegment(fk_Vector, fk_Vector, fk_Vector, bool = true);
154#endif
155
157
199 static bool isCrossLine(fk_LineType t_L, fk_Vector A, fk_Vector B,
200 fk_LineType t_M, fk_Vector C, fk_Vector D,
201 bool openFlg = true);
202
203#if !defined(FK_DOXYGEN_USER_PROCESS) && !defined(FK_OLD_NONSUPPORT)
204 static bool isCrossLine(fk_Vector, fk_Vector, fk_Vector, fk_Vector);
205 static bool isCrossLineSegment(fk_Vector, fk_Vector, fk_Vector, fk_Vector, bool = true);
206#endif
207
209
233 static double calcNearest(fk_Vector P, fk_LineType type, fk_Vector A, fk_Vector B);
234
235#if !defined(FK_DOXYGEN_USER_PROCESS) && !defined(FK_OLD_NONSUPPORT)
236 static std::tuple<double, fk_Vector>
237 calcClosestPtPtToSeg(fk_Vector, fk_Vector, fk_Vector);
238
239 static void calcClosestPtPtToSeg(fk_Vector, fk_Vector, fk_Vector, double *, fk_Vector *);
240#endif
241
243
285
286 static std::tuple<double, double>
287 calcNearest(fk_LineType t_L, fk_Vector A, fk_Vector B,
288 fk_LineType t_M, fk_Vector C, fk_Vector D);
289
290#if !defined(FK_DOXYGEN_USER_PROCESS) && !defined(FK_OLD_NONSUPPORT)
291 static std::tuple<double, double, double, fk_Vector, fk_Vector>
292 calcClosestPtSegToSeg(fk_Vector, fk_Vector, fk_Vector, fk_Vector);
293
294 static double calcClosestPtSegToSeg(fk_Vector, fk_Vector, fk_Vector, fk_Vector,
295 double *, double *, fk_Vector *, fk_Vector *);
296#endif
297
299
333 static std::tuple<bool, double, double, double>
334 calcCrossTriangle(fk_LineType type, fk_Vector P, fk_Vector Q,
335 fk_Vector A, fk_Vector B, fk_Vector C);
336
337#if !defined(FK_DOXYGEN_USER_PROCESS) && !defined(FK_OLD_NONSUPPORT)
338 static std::tuple<bool, double, double, double>
339 calcCrossLineAndTri(fk_Vector P, fk_Vector Q, fk_Vector A, fk_Vector B, fk_Vector C);
340
341 static bool calcCrossLineAndTri(fk_Vector P, fk_Vector Q, fk_Vector A, fk_Vector B, fk_Vector C, fk_Vector *R);
342#endif
343
345
365 static std::tuple<int, double, double>
366 calcCrossSphere(fk_Vector P, double r, fk_LineType type, fk_Vector A, fk_Vector B);
367
369
401 static std::tuple<int, double, double, double, double>
402 calcCrossCylinder(fk_Vector P, fk_Vector Q, double r,
403 fk_LineType type, fk_Vector A, fk_Vector B);
405
408
410
439 static fk_Quaternion quatInterLinear(fk_Quaternion q1, fk_Quaternion q2, double t);
440
442
473
474 static fk_Quaternion quatInterSphere(fk_Quaternion q1, fk_Quaternion q2, double t);
475
477
480
482
487 static unsigned int rand(void);
488
490
498 static int rand(int m, int M);
499
501
506 static double drand(void);
507
509
517 static double drand(double m, double M);
518
520
527 static void seed(unsigned int s);
529
530 private:
531 static inline std::unique_ptr<std::random_device> _rd;
532 static inline std::unique_ptr<std::mt19937> _mt;
533 static void RandInit(void);
534 };
535}
536
537#endif // !__FK_MATH_HEADER__
538
539/****************************************************************************
540 *
541 * Copyright (c) 1999-2024, Fine Kernel Project, All rights reserved.
542 *
543 * Redistribution and use in source and binary forms,
544 * with or without modification, are permitted provided that the
545 * following conditions are met:
546 *
547 * - Redistributions of source code must retain the above
548 * copyright notice, this list of conditions and the
549 * following disclaimer.
550 *
551 * - Redistributions in binary form must reproduce the above
552 * copyright notice, this list of conditions and the
553 * following disclaimer in the documentation and/or
554 * other materials provided with the distribution.
555 *
556 * - Neither the name of the copyright holders nor the names
557 * of its contributors may be used to endorse or promote
558 * products derived from this software without specific
559 * prior written permission.
560 *
561 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
562 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
563 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
564 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
565 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
566 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
567 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
568 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
569 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
570 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
571 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
572 * POSSIBILITY OF SUCH DAMAGE.
573 *
574 ****************************************************************************/
575/****************************************************************************
576 *
577 * Copyright (c) 1999-2024, Fine Kernel Project, All rights reserved.
578 *
579 * 本ソフトウェアおよびソースコードのライセンスは、基本的に
580 * 「修正 BSD ライセンス」に従います。以下にその詳細を記します。
581 *
582 * ソースコード形式かバイナリ形式か、変更するかしないかを問わず、
583 * 以下の条件を満たす場合に限り、再頒布および使用が許可されます。
584 *
585 * - ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、
586 * および下記免責条項を含めること。
587 *
588 * - バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の
589 * 資料に、上記の著作権表示、本条件一覧、および下記免責条項を
590 * 含めること。
591 *
592 * - 書面による特別の許可なしに、本ソフトウェアから派生した製品の
593 * 宣伝または販売促進に、本ソフトウェアの著作権者の名前または
594 * コントリビューターの名前を使用してはならない。
595 *
596 * 本ソフトウェアは、著作権者およびコントリビューターによって「現
597 * 状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、
598 * および特定の目的に対する適合性に関す暗黙の保証も含め、またそれ
599 * に限定されない、いかなる保証もないものとします。著作権者もコン
600 * トリビューターも、事由のいかんを問わず、損害発生の原因いかんを
601 * 問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その
602 * 他の)不法行為であるかを問わず、仮にそのような損害が発生する可
603 * 能性を知らされていたとしても、本ソフトウェアの使用によって発生
604 * した(代替品または代用サービスの調達、使用の喪失、データの喪失、
605 * 利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、
606 * 間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害に
607 * ついて、一切責任を負わないものとします。
608 *
609 ****************************************************************************/
Quaternion.h
FK::fk_Math
数学処理関数集合クラス
Definition Math.h:34
FK::fk_Math::PI
static constexpr double PI
円周率
Definition Math.h:37
FK::fk_Math::isOnLine
static bool isOnLine(fk_LineType type, fk_Vector A, fk_Vector B, fk_Vector P, bool openFlg=true)
直線群上判定関数
FK::fk_Math::EPS
static constexpr double EPS
数値演算用誤差値
Definition Math.h:36
FK::fk_Math::rand
static unsigned int rand(void)
一様整数乱数取得関数
FK::fk_Math::sgn
static double sgn(double a)
符号関数
FK::fk_Math::clamp
static double clamp(double a, double min, double max)
数値範囲制限関数
FK::fk_Math::quatInterSphere
static fk_Quaternion quatInterSphere(fk_Quaternion q1, fk_Quaternion q2, double t)
四元数球面線形補間関数
FK::fk_Math::seed
static void seed(unsigned int s)
乱数シード値設定関数
FK::fk_Math::calcNearest
static std::tuple< double, double > calcNearest(fk_LineType t_L, fk_Vector A, fk_Vector B, fk_LineType t_M, fk_Vector C, fk_Vector D)
直線群間最近接点算出関数
FK::fk_Math::calcCosine
static double calcCosine(fk_Vector A, fk_Vector B)
余弦値算出関数
FK::fk_Math::quatInterLinear
static fk_Quaternion quatInterLinear(fk_Quaternion q1, fk_Quaternion q2, double t)
四元数単純線形補間関数
FK::fk_Math::calcNearest
static double calcNearest(fk_Vector P, fk_LineType type, fk_Vector A, fk_Vector B)
点・直線群間最近接点算出関数
FK::fk_Math::calcCrossCylinder
static std::tuple< int, double, double, double, double > calcCrossCylinder(fk_Vector P, fk_Vector Q, double r, fk_LineType type, fk_Vector A, fk_Vector B)
直線群円柱面交差点算出関数
FK::fk_Math::calcCrossTriangle
static std::tuple< bool, double, double, double > calcCrossTriangle(fk_LineType type, fk_Vector P, fk_Vector Q, fk_Vector A, fk_Vector B, fk_Vector C)
三角形対線分交差判定関数
FK::fk_Math::divideVec
static std::tuple< double, double, double > divideVec(fk_Vector V, fk_Vector A, fk_Vector B, fk_Vector C)
ベクトル分離係数算出関数
FK::fk_Math::isCrossLine
static bool isCrossLine(fk_LineType t_L, fk_Vector A, fk_Vector B, fk_LineType t_M, fk_Vector C, fk_Vector D, bool openFlg=true)
直線群交差判定関数
FK::fk_Math::drand
static double drand(double m, double M)
範囲付一様実数乱数取得関数
FK::fk_Math::rand
static int rand(int m, int M)
範囲付一様整数乱数取得関数
FK::fk_Math::calcCrossSphere
static std::tuple< int, double, double > calcCrossSphere(fk_Vector P, double r, fk_LineType type, fk_Vector A, fk_Vector B)
直線群球面交差点算出関数
FK::fk_Math::drand
static double drand(void)
一様実数乱数取得関数
FK::fk_Quaternion
四元数(クォータニオン)を管理するクラス
Definition Quaternion.h:44
FK::fk_Vector
3次元ベクトルを管理するクラス
Definition Vector.h:45
FK
Fine Kernel Toolkit 名前空間
Definition Angle.h:6
FK::fk_Type::HALF
@ HALF
fk_Half 型
Definition Base.h:93
FK::fk_LineType
fk_LineType
fk_Math クラス内での直線群タイプを表す列挙型
Definition Math.h:10
FK::fk_LineType::CLOSE
@ CLOSE
有向線分
Definition Math.h:12
FK::fk_LineType::OPEN
@ OPEN
直線
Definition Math.h:11