アダプティブテッセレーション。これには多くのアルゴリズムがあります。しかし、ここに1つあります。
def line_angle((x0,y0),(x1,y1)):
return atan2(y1-y0,x1-x0)
def adaptive_bezier(p0,p1,p2,lev=32):
p01 = midpoint(p0,p1)
p12 = midpoint(p1,p2)
m = midpoint(p01, p12)
da = abs(line_angle(p0,p1) - line_angle(p1,p2))
if da <= max_tolerance or lev <= 0:
yield m
else:
for p in adaptive_bezier(p0,p01,m,lev-1): yield p
for p in adaptive_bezier(m,p12,p2,lev-1): yield p
このように三角形をテッセレーションする場合、問題は複雑になります。エッジベジエの角度に応じて、適応テッセレータアルゴリズムを駆動する必要があります。テッセレーション時に三角形を分割する方法は3つあります。
2 edges one edge 3 edges
-------- --------- --------
\ ...// \ | / \ / \ /
\/___/ \ | / \____/
\ / \ | / \ /
\/ \|/ \/
これらのパターンのテッセレーション結果を定義すれば、問題はありません。ウィキペディアの記事では、片方のエッジを持つテッセレーションのみが説明されています。
1つのエッジ分割の場合を検討することにより、他の2つのテッセレーション結果を取得できます。
「2つのエッジ」は、最初に1つのエッジを分割し、次に別のエッジを分割することによってまっすぐに取得できます。
「3つのエッジ」を見つけるにはもう少し手間がかかります。しかし、あなたは「2つのエッジ」を見ることができます-ケースはあなたにミッドエッジをもたらします。二次ベジェ三角形の場合、そこに現れるダイヤモンドの平均合計です。
-------- /\
\ / / \
\____/ -____-
\ / \ /
\/ \/