一个实际问题:如何确定内壁面
起因
大概两个月前,有人问我这个问题,对于一个腔室,如何通过算法确定其内壁。虽然对于具体的实现过程不了解,但是从抽象的角度看应该比较简单,所以给出了一些看法。
由于当时在看计算机图形学,想起来了模型的光照问题,仿照着似乎给出了解决办法,也就是在腔室中设置一个光源,通过遮挡算法获得可见面,然后通过拓扑的方法获得这个面的延拓,也就是微分流形中的可定向曲面,毕竟一般来说内壁面总是封闭的,也就是紧致集。这样从原则上似乎可以解决问题,不过具体的实现不知道如何进行,无法真正解决问题,也就不了了之了。
重新考虑
今天在路上忽然想起来这个问题,结合泛函分析的内容,给出了几个可行方法,但是感觉不太对,似乎少了一些情形,最终意识到这个问题是非常困难的,如果进行数学形式化的话,是一个关于欧氏距离的最优化问题。
描述起来就是对于一个数据集,选择到给定区域中任意一点的距离满足最小条件的元素的并。
这个描述可能过于抽象了,逐步解释,不失一般性,首先简化为二维问题。自然的,考虑内壁面可以在极坐标下进行,沿某一角度走一圈最靠近内部点的那个点就是壁面的点,只不过,可能出现遮挡的情形,这样就缺少了一些点,需要补充进去,这就通过选择不同的内部点实现,最后取并集,就可以认为取到了所有点。下面几幅图说明了这个道理。
黑点是选择的内部点,
绿线是对应于角度的直线,
红圈是满足最小距离的壁面上的点,
蓝×是不满足条件的壁面上的点。
遮挡
不同的内部点
这种方法虽然也讲得通,其实就很难实现了,因为壁面的形状太复杂了,很难找到简单的识别方法。
由此想到的
为什么泛函分析,或者最优化中总是考虑凸集,可能就是这个原因,凸集确保了最小距离原则的有效性,不然像这个壁面鼓出来一块,显然是非凸,处理起来就非常麻烦,选取最小距离的点可能不完全,需要引入抽象的集合运算。集合运算又会导致对集合的描述,但是,假使我可以描述出内部了,我又干嘛多此一举去找壁面呢?直接对集合取边界不就行了。
从中也可以看出描述集合是很困难的事情,几乎就等于壁面的描述方程,所以这个描述往往是得不到的。
所以,很多实际问题其中的困难程度是非常大的,虽然从直观上看很容易理解,但是想要将这个过程描述清楚,变成算法是非常困难的。
集合运算的计算复杂度非常高,因为他是逐点处理的,对于每一点都可以进行不同的处理,就像p近邻算法一样,称之为非参数的方法。所以一般很难优化。