Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
177
Task/Quaternion-type/Seed7/quaternion-type.seed7
Normal file
177
Task/Quaternion-type/Seed7/quaternion-type.seed7
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
$ include "seed7_05.s7i";
|
||||
include "float.s7i";
|
||||
include "math.s7i";
|
||||
|
||||
|
||||
# Define the quaternion number data type.
|
||||
const type: quaternion is new object struct
|
||||
var float: a is 0.0;
|
||||
var float: b is 0.0;
|
||||
var float: c is 0.0;
|
||||
var float: d is 0.0;
|
||||
end struct;
|
||||
|
||||
|
||||
# Create a quaternion number from its real and imaginary parts.
|
||||
const func quaternion: quaternion
|
||||
(in float: a, in float: b, in float: c, in float: d) is func
|
||||
result
|
||||
var quaternion: aQuaternion is quaternion.value;
|
||||
begin
|
||||
aQuaternion.a := a;
|
||||
aQuaternion.b := b;
|
||||
aQuaternion.c := c;
|
||||
aQuaternion.d := d;
|
||||
end func;
|
||||
|
||||
|
||||
# Helper function for str().
|
||||
const func string: signed (in float: number, in string: part) is func
|
||||
result
|
||||
var string: stri is str(number) & part;
|
||||
begin
|
||||
if number > 0.0 then
|
||||
stri := "+" & stri;
|
||||
elsif number = 0.0 then
|
||||
stri := "";
|
||||
end if;
|
||||
end func;
|
||||
|
||||
|
||||
# Convert a quaternion number to a string.
|
||||
const func string: str (in quaternion: number) is func
|
||||
result
|
||||
var string: stri is "";
|
||||
begin
|
||||
if number.a <> 0.0 then
|
||||
stri &:= str(number.a);
|
||||
end if;
|
||||
stri &:= signed(number.b, "i");
|
||||
stri &:= signed(number.c, "j");
|
||||
stri &:= signed(number.d, "k");
|
||||
end func;
|
||||
|
||||
|
||||
# Compute the norm of a quaternion number.
|
||||
const func float: norm (in quaternion: number) is func
|
||||
result
|
||||
var float: qnorm is 0.0;
|
||||
begin
|
||||
qnorm := sqrt(
|
||||
number.a ** 2.0 + number.b ** 2.0 +
|
||||
number.c ** 2.0 + number.d ** 2.0
|
||||
);
|
||||
end func;
|
||||
|
||||
|
||||
# Compute the negative of a quaternion number.
|
||||
const func quaternion: - (in quaternion: number) is func
|
||||
result
|
||||
var quaternion: negatedNumber is quaternion.value;
|
||||
begin
|
||||
negatedNumber.a := -number.a;
|
||||
negatedNumber.b := -number.b;
|
||||
negatedNumber.c := -number.c;
|
||||
negatedNumber.d := -number.d;
|
||||
end func;
|
||||
|
||||
|
||||
# Compute the conjugate of a quaternion number.
|
||||
const func quaternion: conjugate (in quaternion: number) is func
|
||||
result
|
||||
var quaternion: conjugateNumber is quaternion.value;
|
||||
begin
|
||||
conjugateNumber.a := number.a;
|
||||
conjugateNumber.b := -number.b;
|
||||
conjugateNumber.c := -number.c;
|
||||
conjugateNumber.d := -number.d;
|
||||
end func;
|
||||
|
||||
|
||||
# Add a float to a quaternion number.
|
||||
const func quaternion: (in quaternion: number) + (in float: real) is func
|
||||
result
|
||||
var quaternion: sum is quaternion.value;
|
||||
begin
|
||||
sum.a := number.a + real;
|
||||
sum.b := number.b;
|
||||
sum.c := number.c;
|
||||
sum.d := number.d;
|
||||
end func;
|
||||
|
||||
|
||||
# Add a quaternion number to a float.
|
||||
const func quaternion: (in float: real) + (in quaternion: number) is
|
||||
return number + real;
|
||||
|
||||
|
||||
# Add two quaternion numbers.
|
||||
const func quaternion: (in quaternion: number1) + (in quaternion: number2) is func
|
||||
result
|
||||
var quaternion: sum is quaternion.value;
|
||||
begin
|
||||
sum.a := number1.a + number2.a;
|
||||
sum.b := number1.b + number2.b;
|
||||
sum.c := number1.c + number2.c;
|
||||
sum.d := number1.d + number2.d;
|
||||
end func;
|
||||
|
||||
|
||||
# Multiply a float and a quaternion number.
|
||||
const func quaternion: (in float: real) * (in quaternion: number) is func
|
||||
result
|
||||
var quaternion: product is quaternion.value;
|
||||
begin
|
||||
product.a := number.a * real;
|
||||
product.b := number.b * real;
|
||||
product.c := number.c * real;
|
||||
product.d := number.d * real;
|
||||
end func;
|
||||
|
||||
|
||||
# Multiply a quaternion number and a float.
|
||||
const func quaternion: (in quaternion: number) * (in float: real) is
|
||||
return real * number;
|
||||
|
||||
|
||||
# Multiply two quaternion numbers.
|
||||
const func quaternion: (in quaternion: x) * (in quaternion: y) is func
|
||||
result
|
||||
var quaternion: product is quaternion.value;
|
||||
begin
|
||||
product.a := x.a * y.a - x.b * y.b - x.c * y.c - x.d * y.d;
|
||||
product.b := x.a * y.b + x.b * y.a + x.c * y.d - x.d * y.c;
|
||||
product.c := x.a * y.c - x.b * y.d + x.c * y.a + x.d * y.b;
|
||||
product.d := x.a * y.d + x.b * y.c - x.c * y.b + x.d * y.a;
|
||||
end func;
|
||||
|
||||
|
||||
# Allow quaternions to be written using write(), writeln() etc.
|
||||
enable_output(quaternion);
|
||||
|
||||
|
||||
# Demonstrate quaternion numbers.
|
||||
const proc: main is func
|
||||
local
|
||||
const quaternion: q is quaternion(1.0, 2.0, 3.0, 4.0);
|
||||
const quaternion: q1 is quaternion(2.0, 3.0, 4.0, 5.0);
|
||||
const quaternion: q2 is quaternion(3.0, 4.0, 5.0, 6.0);
|
||||
const float: r is 7.0;
|
||||
begin
|
||||
writeln(" q = " <& q);
|
||||
writeln("q1 = " <& q1);
|
||||
writeln("q2 = " <& q2);
|
||||
writeln(" r = " <& r <& "\n");
|
||||
|
||||
writeln("norm(q) = " <& norm(q));
|
||||
writeln("-q = " <& -q);
|
||||
writeln("conjugate(q) = " <& conjugate(q));
|
||||
writeln("q + r = " <& q + r);
|
||||
writeln("r + q = " <& r + q);
|
||||
writeln("q1 + q2 = " <& q1 + q2);
|
||||
writeln("q2 + q1 = " <& q2 + q1);
|
||||
writeln("q * r = " <& q * r);
|
||||
writeln("r * q = " <& r * q);
|
||||
writeln("q1 * q2 = " <& q1 * q2);
|
||||
writeln("q2 * q1 = " <& q2 * q1);
|
||||
end func;
|
||||
Loading…
Add table
Add a link
Reference in a new issue