apriltag源码阅读

笔记 TBD

-- unionfind.h 和 unionfind.c - done

并查集的实现

-- zarray.h 和 zarray.c - done

基本数据结构的管理

Defines a structure which acts as a resize-able array ala Java’s ArrayList.

-- zhash.h 和 zhash.c - done

哈希表实现

A hash table for structs and primitive types that stores entries by value.

比较巧妙的

void zhash_iterator_init(zhash_t *zh, zhash_iterator_t *zit)
{
    zit->zh = zh;
    zit->czh = zh;
    zit->last_entry = -1;
}
void zhash_iterator_init_const(const zhash_t *zh, zhash_iterator_t *zit)
{
    zit->zh = NULL;
    zit->czh = zh;
    zit->last_entry = -1;
}

然后判断的时候

void zhash_iterator_remove(zhash_iterator_t *zit)
{
    assert(zit->zh); // can't call _remove on a iterator with const zhash
    zhash_t *zh = zit->zh;

-- string_utils.h 和 string_utils.c - done

字符串处理相关函数

-- svd22.h 和 svd22.c - doing

计算奇异值和向量,用于计算一个2x2矩阵的奇异值分解(Singular Value Decomposition,SVD)

-- doubles.h doubles_floats_impl.h floats.h - doing

其实就是实现类似于模板的函数,关键在于下面三句话

#define TRRFN(root, suffix) root ## suffix
#define TRFN(root, suffix) TRRFN(root, suffix)
#define TFN(suffix) TRFN(TNAME, suffix)

用的时候只需要 #include "doubles.h" 或者 "floats.h" 就可以了

-- matd.h 和 matd.c - doing

Defines a matrix structure for holding double-precision values with data in row-major order (i.e. index = row*ncols + col)

nrows and ncols are 1-based counts with the exception that a scalar (non-matrix) is represented with nrows=0 and/or ncols=0

-- debug_print.h - done

下面这个用法很常见,在别的地方也见到过
#define debug_print(fmt, ...) \
    do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, strrchr("/"__FILE__,'/')+1, \
                            __LINE__, __func__, ##__VA_ARGS__); fflush(stderr);} while (0)

-- math_util.h - done

注意一些坑 比如

static inline int mod_positive(int vin, int mod) {
    return (vin % mod + mod) % mod;
}

-- time_util.c 和 time_util.h 时间处理相关函数,被 timeprofile.h(性能分析器) 包含 - done

主要是翻译区别好

ms - millisecond 毫秒

us - microseconds 微秒

ns - nanoseconds 纳秒

-- postscript_utils.h - done

以 PostScript 语言编写命令,以渲染图像

-- getopt.h 和 getopt.c - doing

解析参数命令

-- zmaxheap.h 和 zmaxheap.c - done

大顶堆实现