Skip to content

Commit 442a106

Browse files
authored
ImVec2/ImVec4: add basic algebra (#49)
1 parent 97c4844 commit 442a106

File tree

2 files changed

+198
-0
lines changed

2 files changed

+198
-0
lines changed

vector_helpers.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package cimgui
2+
3+
// implement vector operations
4+
5+
// Vec2:
6+
7+
// Add returns a sum of v and another.
8+
func (v ImVec2) Add(another ImVec2) ImVec2 {
9+
return ImVec2{
10+
X: v.X + another.X,
11+
Y: v.Y + another.Y,
12+
}
13+
}
14+
15+
// Sub returns the vector v - another.
16+
func (v ImVec2) Sub(another ImVec2) ImVec2 {
17+
return ImVec2{
18+
X: v.X - another.X,
19+
Y: v.Y - another.Y,
20+
}
21+
}
22+
23+
// Mul returns the vector v*k.
24+
func (v ImVec2) Mul(k float32) ImVec2 {
25+
return ImVec2{
26+
X: v.X * k,
27+
Y: v.Y * k,
28+
}
29+
}
30+
31+
// Div returns the vector v/k.
32+
func (v ImVec2) Div(k float32) ImVec2 {
33+
return ImVec2{
34+
X: v.X / k,
35+
Y: v.Y / k,
36+
}
37+
}
38+
39+
// Vec4
40+
41+
// Add returns the rectangle r translated by p.
42+
func (v ImVec4) Add(p ImVec2) ImVec4 {
43+
return ImVec4{
44+
X: v.X + p.X,
45+
Y: v.Y + p.Y,
46+
Z: v.Z + p.X,
47+
W: v.W + p.Y,
48+
}
49+
}
50+
51+
// Sub returns the vec4 v translated by -p.
52+
func (v ImVec4) Sub(p ImVec2) ImVec4 {
53+
return v.Add(p.Mul(-1))
54+
}

vector_helpers_test.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package cimgui
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestImVec2_Add(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
p ImVec2
12+
q ImVec2
13+
want ImVec2
14+
}{
15+
{"Add nothing", ImVec2{0, 0}, ImVec2{0, 0}, ImVec2{0, 0}},
16+
{"Add 1, 5", ImVec2{0, 0}, ImVec2{1, 5}, ImVec2{1, 5}},
17+
{"(20, 4) + (8, 8)", ImVec2{20, 4}, ImVec2{8, 8}, ImVec2{28, 12}},
18+
{"positive + negative", ImVec2{20, 4}, ImVec2{-8, -8}, ImVec2{12, -4}},
19+
{"negative + negative", ImVec2{-20, -4}, ImVec2{-8, -8}, ImVec2{-28, -12}},
20+
{"float + float", ImVec2{20.5, 4.5}, ImVec2{8.5, 8.5}, ImVec2{29, 13}},
21+
}
22+
23+
for _, tt := range tests {
24+
t.Run(tt.name, func(t *testing.T) {
25+
if got := tt.p.Add(tt.q); !reflect.DeepEqual(got, tt.want) {
26+
t.Errorf("%#v.Add(%#v) = %v, want %v", tt.p, tt.q, got, tt.want)
27+
}
28+
})
29+
}
30+
}
31+
32+
func TestImVec2_Div(t *testing.T) {
33+
tests := []struct {
34+
name string
35+
p ImVec2
36+
k float32
37+
want ImVec2
38+
}{
39+
{"Simplest", ImVec2{0, 0}, 1, ImVec2{0, 0}},
40+
{"Divide by 2", ImVec2{2, 2}, 2, ImVec2{1, 1}},
41+
{"divide by -2", ImVec2{2, 2}, -2, ImVec2{-1, -1}},
42+
{"divide by float", ImVec2{2.5, 2.5}, 2, ImVec2{1.25, 1.25}},
43+
}
44+
45+
for _, tt := range tests {
46+
t.Run(tt.name, func(t *testing.T) {
47+
if got := tt.p.Div(tt.k); !reflect.DeepEqual(got, tt.want) {
48+
t.Errorf("%#v.Div(%#v) = %v, want %v", tt.p, tt.k, got, tt.want)
49+
}
50+
})
51+
}
52+
}
53+
54+
func TestImVec2_Mul(t *testing.T) {
55+
tests := []struct {
56+
name string
57+
p ImVec2
58+
k float32
59+
want ImVec2
60+
}{
61+
{"multiply by 1", ImVec2{1, 1}, 1, ImVec2{1, 1}},
62+
{"multiply by -1", ImVec2{1, 1}, -1, ImVec2{-1, -1}},
63+
{"multiply by 2", ImVec2{1, 1}, 2, ImVec2{2, 2}},
64+
{"multiply by float", ImVec2{1.5, 1.5}, 2, ImVec2{3, 3}},
65+
{"multiply by 0", ImVec2{1, 1}, 0, ImVec2{0, 0}},
66+
}
67+
for _, tt := range tests {
68+
t.Run(tt.name, func(t *testing.T) {
69+
if got := tt.p.Mul(tt.k); !reflect.DeepEqual(got, tt.want) {
70+
t.Errorf("%#v.Mul(%#v) = %v, want %v", tt.p, tt.k, got, tt.want)
71+
}
72+
})
73+
}
74+
}
75+
76+
func TestImVec2_Sub(t *testing.T) {
77+
tests := []struct {
78+
name string
79+
p, q ImVec2
80+
want ImVec2
81+
}{
82+
{"Simplest", ImVec2{0, 0}, ImVec2{0, 0}, ImVec2{0, 0}},
83+
{"positive - positive", ImVec2{20, 4}, ImVec2{8, 8}, ImVec2{12, -4}},
84+
{"positive - negative", ImVec2{20, 4}, ImVec2{-8, -8}, ImVec2{28, 12}},
85+
{"negative - positive", ImVec2{-20, -4}, ImVec2{8, 8}, ImVec2{-28, -12}},
86+
{"negative - negative", ImVec2{-20, -4}, ImVec2{-8, -8}, ImVec2{-12, 4}},
87+
{"float - float", ImVec2{20.5, 4.5}, ImVec2{8.5, 8.5}, ImVec2{12, -4}},
88+
}
89+
90+
for _, tt := range tests {
91+
t.Run(tt.name, func(t *testing.T) {
92+
if got := tt.p.Sub(tt.q); !reflect.DeepEqual(got, tt.want) {
93+
t.Errorf("%#v.Sub(%#v) = %v, want %v", tt.p, tt.q, got, tt.want)
94+
}
95+
})
96+
}
97+
}
98+
99+
func TestImVec4_Add(t *testing.T) {
100+
tests := []struct {
101+
name string
102+
p ImVec4
103+
q ImVec2
104+
want ImVec4
105+
}{
106+
{"Simplest", ImVec4{0, 0, 0, 0}, ImVec2{0, 0}, ImVec4{0, 0, 0, 0}},
107+
{"positive + positive", ImVec4{20, 4, 0, 0}, ImVec2{8, 8}, ImVec4{28, 12, 8, 8}},
108+
{"positive + negative", ImVec4{20, 4, 0, 0}, ImVec2{-8, -8}, ImVec4{12, -4, -8, -8}},
109+
{"negative + positive", ImVec4{-20, -4, 0, 0}, ImVec2{8, 8}, ImVec4{-12, 4, 8, 8}},
110+
{"negative + negative", ImVec4{-20, -4, 0, 0}, ImVec2{-8, -8}, ImVec4{-28, -12, -8, -8}},
111+
{"float + float", ImVec4{20.5, 4.5, 0, 0}, ImVec2{8.5, 8.5}, ImVec4{29, 13, 8.5, 8.5}},
112+
}
113+
114+
for _, tt := range tests {
115+
t.Run(tt.name, func(t *testing.T) {
116+
if got := tt.p.Add(tt.q); !reflect.DeepEqual(got, tt.want) {
117+
t.Errorf("%#v.Add(%#v) = %v, want %v", tt.p, tt.q, got, tt.want)
118+
}
119+
})
120+
}
121+
}
122+
123+
func TestImVec4_Sub(t *testing.T) {
124+
tests := []struct {
125+
name string
126+
p ImVec4
127+
q ImVec2
128+
want ImVec4
129+
}{
130+
{"Simplest", ImVec4{0, 0, 0, 0}, ImVec2{0, 0}, ImVec4{0, 0, 0, 0}},
131+
{"numbers; no change", ImVec4{20, 4, 50, 6}, ImVec2{0, 0}, ImVec4{20, 4, 50, 6}},
132+
{"numbers; change", ImVec4{20, 4, 50, 6}, ImVec2{10, 2}, ImVec4{10, 2, 40, 4}},
133+
{"floats; no change", ImVec4{20.5, 4.5, 50.5, 6.5}, ImVec2{0, 0}, ImVec4{20.5, 4.5, 50.5, 6.5}},
134+
{"floats; change", ImVec4{20.5, 4.5, 50.5, 6.5}, ImVec2{10.5, 2.5}, ImVec4{10, 2, 40, 4}},
135+
}
136+
137+
for _, tt := range tests {
138+
t.Run(tt.name, func(t *testing.T) {
139+
if got := tt.p.Sub(tt.q); !reflect.DeepEqual(got, tt.want) {
140+
t.Errorf("%#v.Sub(%#v) = %v, want %v", tt.p, tt.q, got, tt.want)
141+
}
142+
})
143+
}
144+
}

0 commit comments

Comments
 (0)