4
|
1
|
|
2 // written in the D programming language
|
|
3
|
|
4 module chipmunkd.cpVect;
|
|
5
|
|
6 import chipmunkd.cpVect_h;
|
|
7 import chipmunkd.chipmunk_types_h;
|
|
8
|
|
9 cpFloat
|
|
10 cpvlength(const cpVect v)
|
|
11 {
|
|
12 return cpfsqrt( cpvdot(v, v) );
|
|
13 }
|
|
14
|
|
15 cpVect
|
|
16 cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t)
|
|
17 {
|
|
18 cpFloat omega = cpfacos(cpvdot(v1, v2));
|
|
19
|
|
20 if(omega){
|
|
21 cpFloat denom = 1.0f/cpfsin(omega);
|
|
22 return cpvadd(cpvmult(v1, cpfsin((1.0f - t)*omega)*denom), cpvmult(v2, cpfsin(t*omega)*denom));
|
|
23 } else {
|
|
24 return v1;
|
|
25 }
|
|
26 }
|
|
27
|
|
28 cpVect
|
|
29 cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a)
|
|
30 {
|
|
31 cpFloat angle = cpfacos(cpvdot(v1, v2));
|
|
32 return cpvslerp(v1, v2, cpfmin(a, angle)/angle);
|
|
33 }
|
|
34
|
|
35 cpVect
|
|
36 cpvforangle(const cpFloat a)
|
|
37 {
|
|
38 return cpv(cpfcos(a), cpfsin(a));
|
|
39 }
|
|
40
|
|
41 cpFloat
|
|
42 cpvtoangle(const cpVect v)
|
|
43 {
|
|
44 return cpfatan2(v.y, v.x);
|
|
45 }
|
|
46
|
13
|
47 import std.string:format;
|
|
48
|
|
49 string
|
|
50 cpvstr(const cpVect v)
|
|
51 {
|
|
52 return .format("(%s,%s)",v.x, v.y);
|
|
53 } |