Skip to content

Commit c7473d8

Browse files
authored
Merge pull request #68 from ichiro-its/hotfix/fix-map-function
[Hotfix] - Fix Map Function
2 parents 1b77713 + c6d79eb commit c7473d8

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

include/keisan/number.impl.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ T map(
5353
const T & value, const T & source_min, const T & source_max,
5454
const T & target_min, const T & target_max)
5555
{
56-
return target_min + scale(value - source_min, source_max - source_min, target_max - target_min);
56+
auto source_val = value;
57+
source_val = std::min(source_val, std::max(source_min, source_max));
58+
source_val = std::max(source_val, std::min(source_min, source_max));
59+
60+
return target_min +
61+
scale(source_val - source_min, source_max - source_min, target_max - target_min);
5762
}
5863

5964
template<typename T>

test/number_test.cpp

+37-11
Original file line numberDiff line numberDiff line change
@@ -63,35 +63,61 @@ TEST(NumberTest, ScaleFloatingPoint)
6363
TEST(NumberTest, MapIntegral)
6464
{
6565
EXPECT_EQ(ksn::map(5, 2, 4, 0, 1), 1) <<
66-
"5 - 2 = 3\n"
66+
"min(5, max(2, 4)) = 4\n"
67+
"max(4, min(2, 4)) = 4\n"
68+
"4 - 2 = 2\n"
6769
"4 - 2 = 2\n"
6870
"1 - 0 = 1\n"
69-
"scale(3, 2, 1) = 1\n"
71+
"scale(2, 2, 1) = 1\n"
7072
"1 + 0 = 1";
7173

72-
EXPECT_EQ(ksn::map(0, -2, -4, 0, 1), -1) <<
73-
"0 - (-2) = 2\n"
74+
EXPECT_EQ(ksn::map(0, -2, -4, 0, 1), 0) <<
75+
"min(0, max(-2, -4)) = -2\n"
76+
"max(-2, min(-2, -4)) = -2\n"
77+
"-2 - (-2) = 0\n"
7478
"-4 - (-2) = -2\n"
7579
"1 - 0 = 1\n"
76-
"scale(2, -2, 1) = -1\n"
77-
"-1 + 0 = -1";
80+
"scale(0, -2, 1) = 0\n"
81+
"0 + 0 = 0";
82+
83+
EXPECT_EQ(ksn::map(10, 3, 11, -2, 2), -2) <<
84+
"min(10, max(3, 11)) = 10\n"
85+
"max(10, min(3, 11)) = 10\n"
86+
"10 - 3 = 7\n"
87+
"11 - 3 = 8\n"
88+
"2 - (-2) = 4\n"
89+
"scale(7, 8, 4) = 0\n"
90+
"0 + (-2) = -2";
7891
}
7992

8093
TEST(NumberTest, MapFloatingPoint)
8194
{
8295
EXPECT_DOUBLE_EQ(ksn::map(0.5, 0.2, 0.8, 1.0, 3.2), 2.1) <<
96+
"min(0.5, max(0.2, 0.8)) = 0.5\n"
97+
"max(0.5, min(0.2, 0.8)) = 0.5\n"
8398
"0.5 - 0.2 = 0.3\n"
8499
"0.8 - 0.2 = 0.6\n"
85100
"3.2 - 1.0 = 2.2\n"
86-
"scale(0.3, 0.6, 2.2) = 1.1\n"
101+
"scale(0.5, 0.6, 2.2) = 1.1\n"
87102
"1.1 + 1.0 = 2.1";
88103

89-
EXPECT_DOUBLE_EQ(ksn::map(-0.1, 0.2, 0.8, -3.2, -1.0), -4.3) <<
90-
"-0.1 - 0.2 = -0.3\n"
104+
EXPECT_DOUBLE_EQ(ksn::map(-0.1, 0.2, 0.8, -3.2, -1.0), -3.2) <<
105+
"min(-0.1, max(0.2, 0.8)) = -0.1\n"
106+
"max(-0.1, min(0.2, 0.8)) = 0.2\n"
107+
"0.2 - 0.2 = 0.0\n"
91108
"0.8 - 0.2 = 0.6\n"
92109
"-1.0 - (-3.2) = 2.2\n"
93-
"scale(-0.3, 0.6, 2.2) = -1.1\n"
94-
"-1.1 + (-3.2) = -4.3";
110+
"scale(0.0, 0.6, 2.2) = 0.0\n"
111+
"0.0 + (-3.2) = -3.2";
112+
113+
EXPECT_DOUBLE_EQ(ksn::map(-1.5, 5.0, -2.5, 7.0, 13.0), 12.2) <<
114+
"min(-1.5, max(5.0, -2.5)) = -1.5\n"
115+
"max(-1.5, min(5.0, -2.5)) = -1.5\n"
116+
"-1.5 - 5.0 = -6.5\n"
117+
"-2.5 - 5.0 = -7.5\n"
118+
"13.0 - 7.0 = 6.0\n"
119+
"scale(-6.5, -7.5, 6.0) = 5.2\n"
120+
"5.2 + 7.0 = 12.2";
95121
}
96122

97123
TEST(NumberTest, ClampIntegral)

0 commit comments

Comments
 (0)