以下是 PerfectTIN 中最复杂的六个功能,有望在几周内投入生产:
32 32 testptin.cpp(319): testmatrix
36 39 tincanvas.cpp(90): TinCanvas::tick
53 53 mainwindow.cpp(126): MainWindow::tick
56 60 perfecttin.cpp(185): main
58 58 fileio.cpp(457): readPtin
62 62 pointlist.cpp(61): pointlist::checkTinConsistency
两个数字不同的地方,是因为switch
陈述。
testmatrix
由连续的几个 order-2 和 order-1 for-loops 组成,不难理解。让我感到困惑的是,在我在 Bezitopo 写它多年之后再看它,就是为什么它在 83 之前修改了一些东西。
这两种tick
方法每秒运行 20 次并检查多个条件。我在复杂性方面遇到了一些麻烦,但是这些错误并不比菜单项在不应该变灰时变灰更糟糕,或者 TIN 显示看起来很不稳定。
TIN 存储为一种变体翼边结构,由点、边和三角形组成,这些点、边和三角形都相互指向。checkTinConsistency
必须尽可能复杂,因为结构很复杂,并且有几种方法可能是错误的。
PerfectTIN 中最难发现的错误是并发错误,而不是圈错误。
Bezitopo 中最复杂的函数(我通过从 Bezitopo 复制代码来启动 PerfectTIN):
49 49 tin.cpp(537): pointlist::tryStartPoint
50 50 ptin.cpp(237): readPtin
51 51 convertgeoid.cpp(596): main
54 54 pointlist.cpp(117): pointlist::checkTinConsistency
73 80 bezier.cpp(1070): triangle::subdivide
92 92 bezitest.cpp(7963): main
main
inbezitest
只是一长串 if 语句:如果我应该测试三角形,则运行testtriangle
. 如果我应该测试测量单位,然后运行testmeasure
. 等等。
复杂性subdivide
部分是因为舍入误差很少会产生函数必须检查的一些错误的条件。
现在tryStartPoint
曾经是其中的一部分maketin
(现在只有 11 的复杂度),而且复杂度更高。我将循环的内部分解为一个单独的函数,因为我必须从 GUI 调用它并在其间更新屏幕。