Loading [MathJax]/extensions/tex2jax.js
symbolic4
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
vector.c
Go to the documentation of this file.
1 
2 /*
3 
4  Copyright (c) 2019 Hannes Eberhard
5 
6  Permission is hereby granted, free of charge, to any person obtaining a copy
7  of this software and associated documentation files (the "Software"), to deal
8  in the Software without restriction, including without limitation the rights
9  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  copies of the Software, and to permit persons to whom the Software is
11  furnished to do so, subject to the following conditions:
12 
13  The above copyright notice and this permission notice shall be included in all
14  copies or substantial portions of the Software.
15 
16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  SOFTWARE.
23 
24  */
25 
26 #include "symbolic4.h"
27 
28 uint8_t vector_magnitude(expression** result, expression* source, bool persistent) {
29 
30  uint8_t i;
31 
34  new_literal(1, 1, 2));
35 
36  for (i = 0; i < source->child_count; i++) {
38  copy_expression(source->children[i]),
39  new_literal(1, 2, 1)));
40  }
41 
42  simplify(*result, true);
43 
44  if (!persistent) free_expression(source, false);
45 
46  return RETS_SUCCESS;
47 
48 }
49 
50 uint8_t vector_normalized(expression** result, expression* source, expression* magnitude, bool persistent) {
51 
52  uint8_t i;
53  expression* source_magnitude;
54  expression* factor;
55 
56  vector_magnitude(&source_magnitude, source, true);
57 
59  copy_expression(magnitude),
60  source_magnitude);
61 
63 
64  for (i = 0; i < source->child_count; i++) {
66  copy_expression(factor),
67  copy_expression(source->children[i])));
68  }
69 
70  simplify(*result, true);
71 
72  if (!persistent) {
73  free_expression(source, false);
74  free_expression(magnitude, false);
75  }
76 
77  return RETS_SUCCESS;
78 
79 }
80 
81 uint8_t vector_angle(expression** result, expression* source_1, expression* source_2, bool persistent) {
82 
83  expression* source_1_magnitude;
84  expression* source_2_magnitude;
85  expression* dot_product;
86 
87  ERROR_CHECK(vector_magnitude(&source_1_magnitude, source_1, true));
88  ERROR_CHECK(vector_magnitude(&source_2_magnitude, source_2, true));
89 
90  ERROR_CHECK(vector_dot_product(&dot_product, source_1, source_2, true));
91 
94  dot_product,
96  source_1_magnitude,
97  source_2_magnitude)));
98 
99  simplify(*result, true);
100 
101  if (!persistent) {
102  free_expression(source_1, false);
103  free_expression(source_2, false);
104  }
105 
106  return RETS_SUCCESS;
107 
108 }
109 
110 uint8_t vector_dot_product(expression** result, expression* source_1, expression* source_2, bool persistent) {
111 
112  uint8_t i;
113 
115 
116  for (i = 0; i < source_1->child_count; i++) {
118  copy_expression(source_1->children[i]),
119  copy_expression(source_2->children[i])));
120  }
121 
122  simplify(*result, true);
123 
124  if (!persistent) {
125  free_expression(source_1, false);
126  free_expression(source_2, false);
127  }
128 
129  return RETS_SUCCESS;
130 
131 }
132 
133 uint8_t vector_cross_product(expression** result, expression* source_1, expression* source_2, bool persistent) {
134 
135  uint8_t i, j, k;
136 
137  *result = new_expression(EXPT_STRUCTURE, EXPI_LIST, 0);
138 
139  for (i = 0; i < source_1->child_count; i++) {
140  j = (i + 1) % 3;
141  k = (i + 2) % 3;
144  copy_expression(source_1->children[j]),
145  copy_expression(source_2->children[k])),
147  copy_expression(source_1->children[k]),
148  copy_expression(source_2->children[j]))));
149  }
150 
151  simplify(*result, true);
152 
153  if (!persistent) {
154  free_expression(source_1, false);
155  free_expression(source_2, false);
156  }
157 
158  return RETS_SUCCESS;
159 
160 }
161 
162 uint8_t vector_triple_product(expression** result, expression* source_1, expression* source_2, expression* source_3, bool persistent) {
163 
164  ERROR_CHECK(vector_cross_product(result, copy_expression(source_1), copy_expression(source_2), false));
165  ERROR_CHECK(vector_dot_product(result, copy_expression(*result), copy_expression(source_3), false));
166 
167  *result = new_expression(EXPT_FUNCTION, EXPI_ABS, 1, *result);
168 
169  simplify(*result, true);
170 
171  return RETS_SUCCESS;
172 
173 }
EXPI_LIST
Definition: expression.h:90
EXPT_FUNCTION
Definition: expression.h:35
symbolic4.h
EXPI_EXPONENTATION
Definition: expression.h:53
vector_triple_product
uint8_t vector_triple_product(expression **result, expression *source_1, expression *source_2, expression *source_3, bool persistent)
Definition: vector.c:162
EXPI_ABS
Definition: expression.h:55
expression
Definition: expression.h:112
vector_dot_product
uint8_t vector_dot_product(expression **result, expression *source_1, expression *source_2, bool persistent)
Definition: vector.c:110
EXPT_STRUCTURE
Definition: expression.h:36
ERROR_CHECK
#define ERROR_CHECK(F)
Check if the return status of a function is RETS_ERROR. If so, return RETS_ERROR.
Definition: foundation.h:31
vector_magnitude
uint8_t vector_magnitude(expression **result, expression *source, bool persistent)
Definition: vector.c:28
vector_normalized
uint8_t vector_normalized(expression **result, expression *source, expression *magnitude, bool persistent)
Definition: vector.c:50
vector_angle
uint8_t vector_angle(expression **result, expression *source_1, expression *source_2, bool persistent)
Definition: vector.c:81
RETS_SUCCESS
Definition: foundation.h:67
free_expression
void free_expression(expression *source, bool persistent)
Definition: expression.c:315
EXPI_MULTIPLICATION
Definition: expression.h:51
EXPT_OPERATION
Definition: expression.h:34
copy_expression
expression * copy_expression(const expression *source)
Returns a deep copy of an expression.
Definition: expression.c:286
EXPI_SUBTRACTION
Definition: expression.h:50
vector_cross_product
uint8_t vector_cross_product(expression **result, expression *source_1, expression *source_2, bool persistent)
Definition: vector.c:133
simplify
uint8_t simplify(expression *source, bool recursive)
Definition: simplify.c:1117
append_child
void append_child(expression *parent, expression *child)
Appends a child to an expression.
Definition: expression.c:383
new_expression
expression * new_expression(expression_type type, expression_identifier identifier, uint8_t child_count,...)
Allocates and initializes a new expression with the arguments provided.
Definition: expression.c:183
EXPI_ARCCOS
Definition: expression.h:62
new_literal
expression * new_literal(int8_t sign, uintmax_t numerator, uintmax_t denominator)
Allocates and initializes a new literal expression.
Definition: expression.c:225
EXPI_ADDITION
Definition: expression.h:49
expression::child_count
uint8_t child_count
Definition: expression.h:119
expression::children
struct expression ** children
Definition: expression.h:124
EXPI_DIVISION
Definition: expression.h:52