diff --git a/.gitignore b/.gitignore
index 18bf290..9ed6556 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,6 +48,7 @@
*.cmd
.tmp_versions/
.vs
+basic-geometry
x64
x86
Debug
diff --git a/butis/butis.vcxproj b/butis/butis.vcxproj
index 9f0ebf2..7120f0e 100644
--- a/butis/butis.vcxproj
+++ b/butis/butis.vcxproj
@@ -162,13 +162,11 @@
-
-
diff --git a/butis/butis.vcxproj.filters b/butis/butis.vcxproj.filters
index b5a0706..2aa370c 100644
--- a/butis/butis.vcxproj.filters
+++ b/butis/butis.vcxproj.filters
@@ -24,9 +24,6 @@
Файлы заголовков
-
- Файлы заголовков
-
@@ -38,8 +35,5 @@
Исходные файлы
-
- Исходные файлы
-
\ No newline at end of file
diff --git a/butis/motor.c b/butis/motor.c
index c007cb3..ac58a12 100644
--- a/butis/motor.c
+++ b/butis/motor.c
@@ -3,6 +3,12 @@
extern inline void bt_motor_reset_fp32(BtMotorFP32* motor);
extern inline void bt_motor_reset_fp64(BtMotorFP64* motor);
+extern inline void bt_motor_reset_at_point_fp32(const BgcVector3FP32* point, BtMotorFP32* motor);
+extern inline void bt_motor_reset_at_point_fp64(const BgcVector3FP64* point, BtMotorFP64* motor);
+
+extern inline void bt_motor_reset_with_values_fp32(const float x1, const float x2, const float x3, BtMotorFP32* motor);
+extern inline void bt_motor_reset_with_values_fp64(const double x1, const double x2, const double x3, BtMotorFP64* motor);
+
extern inline void bt_motor_copy_fp32(const BtMotorFP32* source, BtMotorFP32* destination);
extern inline void bt_motor_copy_fp64(const BtMotorFP64* source, BtMotorFP64* destination);
@@ -24,6 +30,24 @@ extern inline void bt_motor_multiply_at_number_fp64(const BtMotorFP64* multiplic
extern inline void bt_motor_divide_at_number_fp32(const BtMotorFP32* divident, const float divisor, BtMotorFP32* quotient);
extern inline void bt_motor_divide_at_number_fp64(const BtMotorFP64* divident, const double divisor, BtMotorFP64* quotient);
+extern inline void bt_motor_add_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, BtMotorFP32* sum);
+extern inline void bt_motor_add_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, BtMotorFP64* sum);
+
+extern inline void bt_motor_add_motor_fp32(const BtMotorFP32* motor, BtMotorFP32* sum);
+extern inline void bt_motor_add_motor_fp64(const BtMotorFP64* motor, BtMotorFP64* sum);
+
+extern inline void bt_motor_add_scaled_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, const float scale, BtMotorFP32* sum);
+extern inline void bt_motor_add_scaled_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, const double scale, BtMotorFP64* sum);
+
+extern inline void bt_motor_subtract_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, BtMotorFP32* difference);
+extern inline void bt_motor_subtract_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, BtMotorFP64* difference);
+
+extern inline void bt_motor_subtract_scaled_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, const float scale, BtMotorFP32* difference);
+extern inline void bt_motor_subtract_scaled_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, const double scale, BtMotorFP64* differences);
+
+extern inline int bt_motor_is_vector_fp32(const BtMotorFP32* motor);
+extern inline int bt_motor_is_vector_fp64(const BtMotorFP64* motor);
+
extern inline int bt_motor_is_screw_fp32(const BtMotorFP32* motor);
extern inline int bt_motor_is_screw_fp64(const BtMotorFP64* motor);
diff --git a/butis/motor.h b/butis/motor.h
index e7779f1..8fb6ba2 100644
--- a/butis/motor.h
+++ b/butis/motor.h
@@ -29,6 +29,38 @@ inline void bt_motor_reset_fp64(BtMotorFP64* motor)
bgc_vector3_reset_fp64(&motor->momentum);
}
+// =============== Reset At Point =============== //
+
+inline void bt_motor_reset_at_point_fp32(const BgcVector3FP32* point, BtMotorFP32* motor)
+{
+ bgc_vector3_copy_fp32(point, &motor->point);
+ bgc_vector3_reset_fp32(&motor->vector);
+ bgc_vector3_reset_fp32(&motor->momentum);
+}
+
+inline void bt_motor_reset_at_point_fp64(const BgcVector3FP64* point, BtMotorFP64* motor)
+{
+ bgc_vector3_copy_fp64(point, &motor->point);
+ bgc_vector3_reset_fp64(&motor->vector);
+ bgc_vector3_reset_fp64(&motor->momentum);
+}
+
+// ============== Reset At Values =============== //
+
+inline void bt_motor_reset_with_values_fp32(const float x1, const float x2, const float x3, BtMotorFP32* motor)
+{
+ bgc_vector3_set_values_fp32(x1, x2, x3, &motor->point);
+ bgc_vector3_reset_fp32(&motor->vector);
+ bgc_vector3_reset_fp32(&motor->momentum);
+}
+
+inline void bt_motor_reset_with_values_fp64(const double x1, const double x2, const double x3, BtMotorFP64* motor)
+{
+ bgc_vector3_set_values_fp64(x1, x2, x3, &motor->point);
+ bgc_vector3_reset_fp64(&motor->vector);
+ bgc_vector3_reset_fp64(&motor->momentum);
+}
+
// ==================== Copy ==================== //
inline void bt_motor_copy_fp32(const BtMotorFP32* source, BtMotorFP32* destination)
@@ -149,6 +181,142 @@ inline void bt_motor_divide_at_number_fp64(const BtMotorFP64* divident, const do
bt_motor_multiply_at_number_fp64(divident, 1.0 / divisor, quotient);
}
+// ==================== Add ===================== //
+
+inline void bt_motor_add_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, BtMotorFP32* sum)
+{
+ BgcVector3FP32 distance, momentum;
+
+ bgc_vector3_subtract_fp32(point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp32(&distance, vector, &momentum);
+
+ bgc_vector3_add_fp32(&sum->vector, vector, &sum->vector);
+ bgc_vector3_add_fp32(&sum->momentum, &momentum, &sum->momentum);
+}
+
+inline void bt_motor_add_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, BtMotorFP64* sum)
+{
+ BgcVector3FP64 distance, momentum;
+
+ bgc_vector3_subtract_fp64(point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp64(&distance, vector, &momentum);
+
+ bgc_vector3_add_fp64(&sum->vector, vector, &sum->vector);
+ bgc_vector3_add_fp64(&sum->momentum, &momentum, &sum->momentum);
+}
+
+// ================= Add Motor ================== //
+
+inline void bt_motor_add_motor_fp32(const BtMotorFP32* motor, BtMotorFP32* sum)
+{
+ BgcVector3FP32 distance, momentum;
+
+ bgc_vector3_subtract_fp32(&motor->point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp32(&distance, &motor->vector, &momentum);
+
+ bgc_vector3_add_fp32(&momentum, &motor->vector, &momentum);
+
+ bgc_vector3_add_fp32(&sum->vector, &motor->vector, &sum->vector);
+ bgc_vector3_add_fp32(&sum->momentum, &momentum, &sum->momentum);
+}
+
+inline void bt_motor_add_motor_fp64(const BtMotorFP64* motor, BtMotorFP64* sum)
+{
+ BgcVector3FP64 distance, momentum;
+
+ bgc_vector3_subtract_fp64(&motor->point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp64(&distance, &motor->vector, &momentum);
+
+ bgc_vector3_add_fp64(&momentum, &motor->vector, &momentum);
+
+ bgc_vector3_add_fp64(&sum->vector, &motor->vector, &sum->vector);
+ bgc_vector3_add_fp64(&sum->momentum, &momentum, &sum->momentum);
+}
+
+// ================= Add Scaled ================= //
+
+inline void bt_motor_add_scaled_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, const float scale, BtMotorFP32* sum)
+{
+ BgcVector3FP32 distance, momentum;
+
+ bgc_vector3_subtract_fp32(point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp32(&distance, vector, &momentum);
+
+ bgc_vector3_add_scaled_fp32(&sum->vector, vector, scale, &sum->vector);
+ bgc_vector3_add_scaled_fp32(&sum->momentum, &momentum, scale, &sum->momentum);
+}
+
+inline void bt_motor_add_scaled_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, const double scale, BtMotorFP64* sum)
+{
+ BgcVector3FP64 distance, momentum;
+
+ bgc_vector3_subtract_fp64(point, &sum->point, &distance);
+ bgc_vector3_get_cross_product_fp64(&distance, vector, &momentum);
+
+ bgc_vector3_add_scaled_fp64(&sum->vector, vector, scale, &sum->vector);
+ bgc_vector3_add_scaled_fp64(&sum->momentum, &momentum, scale, &sum->momentum);
+}
+
+// ================== Subtract ================== //
+
+inline void bt_motor_subtract_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, BtMotorFP32* difference)
+{
+ BgcVector3FP32 distance, momentum;
+
+ bgc_vector3_subtract_fp32(point, &difference->point, &distance);
+ bgc_vector3_get_cross_product_fp32(&distance, vector, &momentum);
+
+ bgc_vector3_subtract_fp32(&difference->vector, vector, &difference->vector);
+ bgc_vector3_subtract_fp32(&difference->momentum, &momentum, &difference->momentum);
+}
+
+inline void bt_motor_subtract_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, BtMotorFP64* difference)
+{
+ BgcVector3FP64 distance, momentum;
+
+ bgc_vector3_subtract_fp64(point, &difference->point, &distance);
+ bgc_vector3_get_cross_product_fp64(&distance, vector, &momentum);
+
+ bgc_vector3_subtract_fp64(&difference->vector, vector, &difference->vector);
+ bgc_vector3_subtract_fp64(&difference->momentum, &momentum, &difference->momentum);
+}
+
+// ============== Subtract Scaled =============== //
+
+inline void bt_motor_subtract_scaled_vector_fp32(const BgcVector3FP32* point, const BgcVector3FP32* vector, const float scale, BtMotorFP32* motor)
+{
+ BgcVector3FP32 distance, momentum;
+
+ bgc_vector3_subtract_fp32(point, &motor->point, &distance);
+ bgc_vector3_get_cross_product_fp32(&distance, vector, &momentum);
+
+ bgc_vector3_subtract_scaled_fp32(&motor->vector, vector, scale, &motor->vector);
+ bgc_vector3_subtract_scaled_fp32(&motor->momentum, &momentum, scale, &motor->momentum);
+}
+
+inline void bt_motor_subtract_scaled_vector_fp64(const BgcVector3FP64* point, const BgcVector3FP64* vector, const double scale, BtMotorFP64* motor)
+{
+ BgcVector3FP64 distance, momentum;
+
+ bgc_vector3_subtract_fp64(point, &motor->point, &distance);
+ bgc_vector3_get_cross_product_fp64(&distance, vector, &momentum);
+
+ bgc_vector3_subtract_scaled_fp64(&motor->vector, vector, scale, &motor->vector);
+ bgc_vector3_subtract_scaled_fp64(&motor->momentum, &momentum, scale, &motor->momentum);
+}
+
+// ================= Is Vector ================== //
+
+inline int bt_motor_is_vector_fp32(const BtMotorFP32* motor)
+{
+ return bgc_vector3_are_orthogonal_fp32(&motor->vector, &motor->momentum);
+}
+
+inline int bt_motor_is_vector_fp64(const BtMotorFP64* motor)
+{
+ return bgc_vector3_are_orthogonal_fp64(&motor->vector, &motor->momentum);
+}
+
// ================== Is Screw ================== //
inline int bt_motor_is_screw_fp32(const BtMotorFP32* motor)
diff --git a/butis/screw.c b/butis/screw.c
deleted file mode 100644
index 8036959..0000000
--- a/butis/screw.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "screw.h"
-
-extern inline void bt_screw_reset_fp32(BtScrewFP32* screw);
-extern inline void bt_screw_reset_fp64(BtScrewFP64* screw);
diff --git a/butis/screw.h b/butis/screw.h
deleted file mode 100644
index f140543..0000000
--- a/butis/screw.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _BUTIS_SCREW_H_INCLUDE_
-#define _BUTIS_SCREW_H_INCLUDE_
-
-#include
-
-// =================== Types ==================== //
-
-typedef struct {
- BgcVector3FP32 point, direction;
- float value, momentum;
-} BtScrewFP32;
-
-typedef struct {
- BgcVector3FP64 point, direction;
- double value, momentum;
-} BtScrewFP64;
-
-// =================== Reset ==================== //
-
-inline void bt_screw_reset_fp32(BtScrewFP32* screw)
-{
- screw->point.x1 = 0.0f;
- screw->point.x2 = 0.0f;
- screw->point.x3 = 0.0f;
-
- screw->direction.x1 = 1.0f;
- screw->direction.x2 = 0.0f;
- screw->direction.x3 = 0.0f;
-
- screw->value = 0.0f;
- screw->momentum = 0.0f;
-}
-
-inline void bt_screw_reset_fp64(BtScrewFP64* screw)
-{
- screw->point.x1 = 0.0;
- screw->point.x2 = 0.0;
- screw->point.x3 = 0.0;
-
- screw->direction.x1 = 1.0;
- screw->direction.x2 = 0.0;
- screw->direction.x3 = 0.0;
-
- screw->value = 0.0f;
- screw->momentum = 0.0f;
-}
-
-#endif