add tk_rad_equal/tk_normalize_rad

This commit is contained in:
lixianjing 2025-03-29 09:04:05 +08:00
parent e9fb746333
commit 51caf64c6c
4 changed files with 124 additions and 2 deletions

View File

@ -1,4 +1,8 @@
# 最新动态 # 最新动态
2025/03/29
* 增加函数 tk_rad_equal/tk_normalize_rad
2025/03/28 2025/03/28
* 修复edit切换控件的时候光标延迟消失和改为默认回车按钮不切换控件(感谢智明提供补丁) * 修复edit切换控件的时候光标延迟消失和改为默认回车按钮不切换控件(感谢智明提供补丁)
* 修复在小程序中tab切换控件无效的问题(感谢智明提供补丁) * 修复在小程序中tab切换控件无效的问题(感谢智明提供补丁)

View File

@ -2675,3 +2675,24 @@ bool_t tk_str_indexable(const char* str) {
return ret; return ret;
} }
double tk_normalize_rad(double value) {
const double two_pi = 2 * M_PI;
value = fmod(value, two_pi);
if (value < 0) {
value += two_pi;
}
return value;
}
bool_t tk_rad_equal(double rad1, double rad2, double epsilon) {
rad1 = tk_normalize_rad(rad1);
rad2 = tk_normalize_rad(rad2);
double diff = fabs(rad1 - rad2);
double alt_diff = fabs(2 * M_PI - diff);
return (diff <= epsilon) || (alt_diff <= epsilon);
}

View File

@ -1344,6 +1344,34 @@ ret_t tk_mergesort(void* base, size_t nmemb, size_t size, tk_compare_t cmp);
*/ */
const char* tk_strs_bsearch(const char** strs, uint32_t nr, const char* str, bool_t case_sensitive); const char* tk_strs_bsearch(const char** strs, uint32_t nr, const char* str, bool_t case_sensitive);
/**
* @method tk_str_indexable
*
* > '['']'
* @param {const char*} str
* @return {bool_t} TRUE表示可索引
*/
bool_t tk_str_indexable(const char* str);
/**
* @method tk_normalize_rad
* 02*PI之间的值
* @param {double} value ()
* @return {double}
*/
double tk_normalize_rad(double value);
/**
* @method tk_rad_equal
*
* > 02*PI之间
* @param {double} rad1 1()
* @param {double} rad2 2()
* @param {double} epsilon
* @return {bool_t} TRUE表示相等
*/
bool_t tk_rad_equal(double rad1, double rad2, double epsilon);
#define TK_STRDUP(str) ((str) != NULL) ? tk_strdup(str) : NULL #define TK_STRDUP(str) ((str) != NULL) ? tk_strdup(str) : NULL
#define TK_STRNDUP(str, len) ((str) != NULL) ? tk_strndup(str, len) : NULL #define TK_STRNDUP(str, len) ((str) != NULL) ? tk_strndup(str, len) : NULL
@ -1378,8 +1406,6 @@ ret_t xml_file_expand(const char* filename, str_t* s, const char* data);
ret_t tk_date_time_format_impl(const date_time_t* dt, const char* format, str_t* result, ret_t tk_date_time_format_impl(const date_time_t* dt, const char* format, str_t* result,
tk_on_result_t translate_callback); tk_on_result_t translate_callback);
bool_t tk_str_indexable(const char* str);
END_C_DECLS END_C_DECLS
#endif /*TK_UTILS_H*/ #endif /*TK_UTILS_H*/

View File

@ -1992,3 +1992,74 @@ TEST(Utils, tk_strs_bsearch) {
} }
} }
} }
TEST(Utils, tk_str_indexable) {
ASSERT_EQ(tk_str_indexable("abc"), FALSE);
ASSERT_EQ(tk_str_indexable(""), FALSE);
ASSERT_EQ(tk_str_indexable("[]"), FALSE);
ASSERT_EQ(tk_str_indexable("[1]"), TRUE);
ASSERT_EQ(tk_str_indexable("[123]"), TRUE);
ASSERT_EQ(tk_str_indexable("[-123]"), TRUE);
}
TEST(Utils, tk_normalize_rad) {
double twopi = 2 * M_PI;
ASSERT_DOUBLE_EQ(tk_normalize_rad(0), 0);
ASSERT_DOUBLE_EQ(tk_normalize_rad(1), 1);
ASSERT_DOUBLE_EQ(tk_normalize_rad(2), 2);
ASSERT_DOUBLE_EQ(tk_normalize_rad(3), 3);
ASSERT_DOUBLE_EQ(tk_normalize_rad(4), 4);
ASSERT_DOUBLE_EQ(tk_normalize_rad(5), 5);
ASSERT_DOUBLE_EQ(tk_normalize_rad(6), 6);
ASSERT_DOUBLE_EQ(tk_normalize_rad(0 + twopi), 0);
ASSERT_DOUBLE_EQ(tk_normalize_rad(1 + twopi), 1);
ASSERT_DOUBLE_EQ(tk_normalize_rad(2 + twopi), 2);
ASSERT_DOUBLE_EQ(tk_normalize_rad(3 + twopi), 3);
ASSERT_DOUBLE_EQ(tk_normalize_rad(4 + twopi), 4);
ASSERT_DOUBLE_EQ(tk_normalize_rad(5 + twopi), 5);
ASSERT_DOUBLE_EQ(tk_normalize_rad(6 + twopi), 6);
ASSERT_DOUBLE_EQ(tk_normalize_rad(0 - twopi), 0);
ASSERT_DOUBLE_EQ(tk_normalize_rad(1 - twopi), 1);
ASSERT_DOUBLE_EQ(tk_normalize_rad(2 - twopi), 2);
ASSERT_DOUBLE_EQ(tk_normalize_rad(3 - twopi), 3);
ASSERT_DOUBLE_EQ(tk_normalize_rad(4 - twopi), 4);
ASSERT_DOUBLE_EQ(tk_normalize_rad(5 - twopi), 5);
ASSERT_DOUBLE_EQ(tk_normalize_rad(6 - twopi), 6);
}
TEST(Utils, tk_compare_rad) {
double twopi = 2 * M_PI;
ASSERT_EQ(tk_rad_equal(0, 0, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(1, 1, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(2, 2, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(3, 3, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(4, 4, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(5, 5, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(6, 6, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(0, 0 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(1, 1 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(2, 2 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(3, 3 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(4, 4 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(5, 5 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(6, 6 + twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(0, 0 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(1, 1 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(2, 2 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(3, 3 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(4, 4 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(5, 5 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(6, 6 - twopi, 0.0001), TRUE);
ASSERT_EQ(tk_rad_equal(0, 0 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(1, 1 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(2, 2 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(3, 3 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(4, 4 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(5, 5 - twopi + 1, 0.0001), FALSE);
ASSERT_EQ(tk_rad_equal(6, 6 - twopi + 1, 0.0001), FALSE);
}