現在、jruby/java2dグラフ描画/レイアウトアプリケーションをmacruby/cocoaに移植しています。したがって、開いているNSBezierPathと閉じているNSBezierPathの交点を取得する必要があります。
java2dでは、次のトリックを使用しました。両方のパスを平坦化し、各セグメントに対して単純な線交差テストを実行しました。
では、NSBezierPathを一連の直線に変換する簡単な方法はありますか?
私の現在のアルゴリズムは、containsPointがtrueであるNSPointが見つかるまで、(バイナリ検索の方法で)行をたどるだけです。ただし、直線に対してのみ機能します。java2dで実装したものは、カーブしたパスでも機能しました。
def getIntersection edge, path
out = edge.source
ins = edge.target
until (out.dist(ins) < 1.0)
mid = out + ((ins - out) * 0.5)
if (path.containsPoint (NSMakePoint(mid.x, mid.y)))
ins = mid
else
out = mid
end
end
return out
end