Dia 0.97.2の半円状の矢印が消える問題の修正パッチ

Dia 0.97.2-1には、ジグザグ線の先端の矢印の形状が開いた半円の場合、先端のY座標によっては表示されなくなってしまう不具合がある。例えば、UMLシートのReceptacle(要求I/F、Required I/F)の先端を上向きか下向きにして、Y座標が10〜50の間に先端を持って行くと、先端が消えてしまう。これは表示上だけの問題ではなく、その状態で図を画像ファイルとしてエクスポートすると、Diaがクラッシュしてしまうこともある。

筆者はMacPortsのDia 0.97.2-1とFreeBSDの0.97.1とでこの現象を確認した。

それを修正するパッチを作ったので、公開する。
patch-arrow.diff(MacPortsでのみテスト済み)

MacPortsでこれを使うには、
/opt/local/var/macports/sources/rsync.macports.org/release/ports/gnome/dia/Portfile

patchfiles patch-arrow.diff
という行を足して、Portfileがあるディレクトリにfilesというサブディレクトリを作って、そこにこのパッチを置く。


Cairo PNG出力したらangleが不正というエラーがコンソールに出力されたので、たまたま原因箇所を突き止めることができた。-1<=0<=1の範囲に収まるはずの(a - b) / cの値が、doubleの精度の問題でたまたまこれをはみ出すことがあり、asin()がNaNを返すようである。
((8.75-9.15)/0.4 < -1)がtrueとなってしまうのでは、asin()を使う限りは、それぞれの値を100倍してlongにキャストして四則演算してdoubleに戻すくらいしか回避方法が思い付かない。おそらく、asin()にこういう割り算の結果を含めるのではなく、atan2()を使うのが正しいと思う。そこまでできたらDiaのメインサイトにupしたのだが、実に惜しい。

なお、同じ箇所の(a - b) / cをa / c - b / cに書き換える方法でも、かなりマシになるが、やはり範囲外になることがある。また、3.14をM_PIに直すのは、この問題に対しては効果が無い。