OpenSiv3D icon indicating copy to clipboard operation
OpenSiv3D copied to clipboard

LineString::calculateRoundBuffer() でサイズが1のときに円を返す提案

Open Raclamusi opened this issue 1 year ago • 3 comments

サイズが1の LineString に対して .calculateRoundBuffer() を呼んだとき、現在は空のポリゴンが返りますが、円のポリゴンを返すようにすることを提案します。 この方がより自然な挙動だと思います。

# include <Siv3D.hpp>

void Main()
{
	const LineString lineString
	{
		Vec2{ 400, 300 },
	};

	// 円ができるほうが自然ではないか?
	const auto polygon = lineString.calculateRoundBuffer(10);

	while (System::Update())
	{
		polygon.draw();
	}
}

実装は、以下のコードの条件を points.size() < 1 に変更するだけです。

https://github.com/Siv3D/OpenSiv3D/blob/a5a6d7bf1e0399a53607eebd956472fd15026c55/Siv3D/src/Siv3D/Polygon/PolygonDetail.cpp?ts=4#L1293-L1296

Raclamusi avatar Feb 29 '24 17:02 Raclamusi

良さそうです。PR お願いします。

Reputeless avatar Feb 29 '24 17:02 Reputeless

PR ありがとうございます。これは .calculateRoundBuffer() だけでなく .calculaeBuffer() も 1 頂点に対応したいですね。やってみて問題が無さそうであれば後者もお願いします。

Reputeless avatar Mar 01 '24 01:03 Reputeless

1頂点の .calculaeBuffer() は、下図のようにポリゴンが潰れてしまうから空のポリゴンを返す方が自然だと思っていたので、.calculateRoundBuffer() についてのみ提案しました。

スクリーンショット

しかし、boost::geometry::buffer() は1頂点の linestring に対して正方形を返します。 そもそも向きが定まらないので潰れようがないという解釈をすると、こちらの方が自然なのかもしれません。

何より、ある Vec2 型変数 p について LineString{ p }.calculateBuffer()LineString{ p, p }.calculateBuffer() の結果は等しいほうが良いと思うので、.calculateBuffer() についても実装してみます。

Raclamusi avatar Mar 01 '24 04:03 Raclamusi