tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
131
Task/Quaternion-type/C/quaternion-type-1.c
Normal file
131
Task/Quaternion-type/C/quaternion-type-1.c
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
|
||||
typedef struct quaternion
|
||||
{
|
||||
double q[4];
|
||||
} quaternion_t;
|
||||
|
||||
|
||||
quaternion_t *quaternion_new(void)
|
||||
{
|
||||
return malloc(sizeof(quaternion_t));
|
||||
}
|
||||
|
||||
quaternion_t *quaternion_new_set(double q1,
|
||||
double q2,
|
||||
double q3,
|
||||
double q4)
|
||||
{
|
||||
quaternion_t *q = malloc(sizeof(quaternion_t));
|
||||
if (q != NULL) {
|
||||
q->q[0] = q1; q->q[1] = q2; q->q[2] = q3; q->q[3] = q4;
|
||||
}
|
||||
return q;
|
||||
}
|
||||
|
||||
|
||||
void quaternion_copy(quaternion_t *r, quaternion_t *q)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (r == NULL || q == NULL) return;
|
||||
for(i = 0; i < 4; i++) r->q[i] = q->q[i];
|
||||
}
|
||||
|
||||
|
||||
double quaternion_norm(quaternion_t *q)
|
||||
{
|
||||
size_t i;
|
||||
double r = 0.0;
|
||||
|
||||
if (q == NULL) {
|
||||
fprintf(stderr, "NULL quaternion in norm\n");
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
for(i = 0; i < 4; i++) r += q->q[i] * q->q[i];
|
||||
return sqrt(r);
|
||||
}
|
||||
|
||||
|
||||
void quaternion_neg(quaternion_t *r, quaternion_t *q)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (q == NULL || r == NULL) return;
|
||||
for(i = 0; i < 4; i++) r->q[i] = -q->q[i];
|
||||
}
|
||||
|
||||
|
||||
void quaternion_conj(quaternion_t *r, quaternion_t *q)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (q == NULL || r == NULL) return;
|
||||
r->q[0] = q->q[0];
|
||||
for(i = 1; i < 4; i++) r->q[i] = -q->q[i];
|
||||
}
|
||||
|
||||
|
||||
void quaternion_add_d(quaternion_t *r, quaternion_t *q, double d)
|
||||
{
|
||||
if (q == NULL || r == NULL) return;
|
||||
quaternion_copy(r, q);
|
||||
r->q[0] += d;
|
||||
}
|
||||
|
||||
|
||||
void quaternion_add(quaternion_t *r, quaternion_t *a, quaternion_t *b)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (r == NULL || a == NULL || b == NULL) return;
|
||||
for(i = 0; i < 4; i++) r->q[i] = a->q[i] + b->q[i];
|
||||
}
|
||||
|
||||
|
||||
void quaternion_mul_d(quaternion_t *r, quaternion_t *q, double d)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (r == NULL || q == NULL) return;
|
||||
for(i = 0; i < 4; i++) r->q[i] = q->q[i] * d;
|
||||
}
|
||||
|
||||
bool quaternion_equal(quaternion_t *a, quaternion_t *b)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for(i = 0; i < 4; i++) if (a->q[i] != b->q[i]) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
#define A(N) (a->q[(N)])
|
||||
#define B(N) (b->q[(N)])
|
||||
#define R(N) (r->q[(N)])
|
||||
void quaternion_mul(quaternion_t *r, quaternion_t *a, quaternion_t *b)
|
||||
{
|
||||
size_t i;
|
||||
double ri = 0.0;
|
||||
|
||||
if (r == NULL || a == NULL || b == NULL) return;
|
||||
R(0) = A(0)*B(0) - A(1)*B(1) - A(2)*B(2) - A(3)*B(3);
|
||||
R(1) = A(0)*B(1) + A(1)*B(0) + A(2)*B(3) - A(3)*B(2);
|
||||
R(2) = A(0)*B(2) - A(1)*B(3) + A(2)*B(0) + A(3)*B(1);
|
||||
R(3) = A(0)*B(3) + A(1)*B(2) - A(2)*B(1) + A(3)*B(0);
|
||||
}
|
||||
#undef A
|
||||
#undef B
|
||||
#undef R
|
||||
|
||||
|
||||
void quaternion_print(quaternion_t *q)
|
||||
{
|
||||
if (q == NULL) return;
|
||||
printf("(%lf, %lf, %lf, %lf)\n",
|
||||
q->q[0], q->q[1], q->q[2], q->q[3]);
|
||||
}
|
||||
58
Task/Quaternion-type/C/quaternion-type-2.c
Normal file
58
Task/Quaternion-type/C/quaternion-type-2.c
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
int main()
|
||||
{
|
||||
size_t i;
|
||||
double d = 7.0;
|
||||
quaternion_t *q[3];
|
||||
quaternion_t *r = quaternion_new();
|
||||
|
||||
quaternion_t *qd = quaternion_new_set(7.0, 0.0, 0.0, 0.0);
|
||||
q[0] = quaternion_new_set(1.0, 2.0, 3.0, 4.0);
|
||||
q[1] = quaternion_new_set(2.0, 3.0, 4.0, 5.0);
|
||||
q[2] = quaternion_new_set(3.0, 4.0, 5.0, 6.0);
|
||||
|
||||
printf("r = %lf\n", d);
|
||||
|
||||
for(i = 0; i < 3; i++) {
|
||||
printf("q[%u] = ", i);
|
||||
quaternion_print(q[i]);
|
||||
printf("abs q[%u] = %lf\n", i, quaternion_norm(q[i]));
|
||||
}
|
||||
|
||||
printf("-q[0] = ");
|
||||
quaternion_neg(r, q[0]);
|
||||
quaternion_print(r);
|
||||
|
||||
printf("conj q[0] = ");
|
||||
quaternion_conj(r, q[0]);
|
||||
quaternion_print(r);
|
||||
|
||||
printf("q[1] + q[2] = ");
|
||||
quaternion_add(r, q[1], q[2]);
|
||||
quaternion_print(r);
|
||||
|
||||
printf("q[2] + q[1] = ");
|
||||
quaternion_add(r, q[2], q[1]);
|
||||
quaternion_print(r);
|
||||
|
||||
|
||||
printf("q[0] * r = ");
|
||||
quaternion_mul_d(r, q[0], d);
|
||||
quaternion_print(r);
|
||||
|
||||
printf("q[0] * (r, 0, 0, 0) = ");
|
||||
quaternion_mul(r, q[0], qd);
|
||||
quaternion_print(r);
|
||||
|
||||
|
||||
printf("q[1] * q[2] = ");
|
||||
quaternion_mul(r, q[1], q[2]);
|
||||
quaternion_print(r);
|
||||
|
||||
printf("q[2] * q[1] = ");
|
||||
quaternion_mul(r, q[2], q[1]);
|
||||
quaternion_print(r);
|
||||
|
||||
|
||||
free(q[0]); free(q[1]); free(q[2]); free(r);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue