# 基本数据结构
- 曲线由分段圆弧组成
- 直线可以看作是一种特殊的半径为无穷大的圆弧
# 优良性质
引理 分段圆弧扩展之后的曲线依然是分段圆弧
- 直线扩展后还是直线
- 半径为$R$的圆扩展$d$后是半径为$R+d$的圆
- 转接点扩展$d$后产生的新的曲线是圆$d$
- 综上,无论怎么扩展,扩展前后曲线类型不变
In [2]:
from deplete.colloids import *
L, C = Line([0,2], [3,5]), Circle(3, [0,0], [0, pi/2])
subplot(121)
L.draw()
L.extend(0.1).draw()
axis('square');
subplot(122)
C.draw()
C.extend(0.1).draw()
axis('square');
In [3]:
c=triangloid(1, 1, 0.2, -0.4)
c.draw(label='colloid')
title('Naive idea')
for seg in c:
seg.extend(0.1).draw()
axis('equal');
# 处理转折点
- 如果顺拐,即$a_i\times a_{i+1}>0$,转折段扩展出圆弧
- 如果逆拐,即$a_i\times a_{i+1}<0$,转折段可以扩展出圆弧,但是直线更适合处理,因为终究需要剪除
In [4]:
c.draw(label='colloid')
title('Considering Turning points')
c.offset_raw(0.1).draw_each()
axis('equal');
# 终极扩展方式
- 问题:我们现在的曲线,已经包含了扩展后的边界,但是有部分面积被环绕了多次
- 解决方法:剪除重复的正面积,保留真正的边界
- 简化方法:即最大的正边界
- BUG: 某些凹陷严重情形下扩展会有bug,蚀刻时也会有bug
In [10]:
off=linspace(0, 0.4, 5)
for o in off:
c.offset(o).draw(label='Offset {:.1f}'.format(o))
legend(loc="upper right")
axis('equal');
# 曲线相交
Depletion把两个当成一个整体
In [11]:
import pandas as pd
area=[c.offset(o).area() for o in off]
peri=[c.offset(o).perimeter() for o in off]
pd.DataFrame({"Offset": off, "Area": area, "Perimeter": peri})
Out[11]:
Comments
comments powered by Disqus