GDI + GraphicsPathが比較的複雑で、その中に「穴」があるとします。テキストは、文字 "O"のような良い例です。私はこの道を変えて、「穴」を含めて完全に埋めることができるようにしたい。これどうやってするの?GDI +パスの簡単な「ブロック」アウトラインを取得するにはどうすればよいですか?
3
A
答えて
1
は、ここで私が思いついたことを、Delphiで、部分的なソリューションです。これは、パス全体が単一のサブパスに「包含」されている場合にのみ機能します。これは、単にサブパスを反復し、最大のサブパスと同じ新しいパスを返します。これは、上記の問題へのユニバーサルソリューションではありませんが、それは手でケースのために働く、そして将来的には他の誰かを助けるかもしれない:
function BlockPath(Path: IGPGraphicsPath): IGPGraphicsPath;
var
PathIterator: IGPGraphicsPathIterator;
SubPath: IGPGraphicsPath;
I: Integer;
IsClosed: Boolean;
BiggestPath: IGPGraphicsPath;
BiggestRect, BoundsRect: TGPRectF;
begin
Result := TGPGraphicsPath.Create;
SubPath := TGPGraphicsPath.Create;
PathIterator := TGPGraphicsPathIterator.Create(Path);
PathIterator.Rewind;
BiggestPath := nil;
BiggestRect.Width := 0;
BiggestRect.Height := 0;
for I := 0 to PathIterator.SubpathCount - 1 do
begin
SubPath.Reset;
PathIterator.NextSubPath(SubPath, IsClosed);
SubPath.GetBounds(BoundsRect);
if (BoundsRect.Width >= BiggestRect.Width) and
(BoundsRect.Height >= BiggestRect.Height) then
begin
BiggestRect := BoundsRect;
BiggestPath := SubPath.Clone;
end;
end;
if BiggestPath <> nil then
begin
Result.AddPath(BiggestPath, True);
end;
end;
コメントと改善は歓迎されています。
2
コーディ、
私はあなたがまだ答えを受け入れていたことを見ていなかったので、私はそれができますかどうかを確認するために、ここで、このC#の機能を入れています。それはテストされています。
上記のバージョンと少し違う:このルーチンは、最大の境界領域を持つパスを探します。したがって、2つのテストを渡すための "マスター"パスは必要ないため、上記バージョンより少し寛大です。それが維持する価値があることを証明する。
.NETであなただけ書くことができますので、私は、拡張メソッドにこれを作った:
GraphicsPath solid = LetterPath.ToSolidPath();
戻り値はその内部が骨抜きされた(すごい、私が使用して取得していない新しいGraphicsPathですその言葉は非常に頻繁に)。
/// <summary>
/// Removes all subpaths (holes) from a graphics path, leaving only the largest whole path behind
/// </summary>
public static GraphicsPath ToSolidPath(this GraphicsPath path)
{
GraphicsPath BiggestPath = null;
GraphicsPath SubPath = new GraphicsPath();
RectangleF BoundsRect = RectangleF.Empty;
RectangleF BiggestRect = RectangleF.Empty;
bool bIsClosed = false;
var pathIterator = new GraphicsPathIterator(path);
pathIterator.Rewind();
for (int i = 0; i < pathIterator.SubpathCount; i++)
{
SubPath.Reset();
pathIterator.NextSubpath(SubPath, out bIsClosed);
BoundsRect = SubPath.GetBounds();
if (BoundsRect.Width * BoundsRect.Height > BiggestRect.Width * BiggestRect.Height)
{
BiggestRect = BoundsRect;
BiggestPath = (GraphicsPath)SubPath.Clone();
}
}
return BiggestPath;
}
関連する問題
- 1. 単一パスから上位パスを取得するにはどうすればよいですか?
- 2. Python:行と列の小計を簡単に取得するにはどうすればよいですか?
- 3. 相対パスを取得するにはどうすればよいですか?
- 4. 画像パスを取得するにはどうすればよいですか?
- 5. Java JUnitでアウトライン仕様を取得するにはどうすればよいですか?
- 6. WPF/GDI interop:正しいアルファを取得するにはどうすればよいですか?
- 7. スパイスパイダーをプログラムで簡単なスクリプトのように実行するにはどうすればよいですか?
- 8. Perlプログラムの絶対パスを相対パスから取得するにはどうすればよいですか?
- 9. 不可能:アーカイブされていないパスを取得するにはどうすればよいですか?
- 10. リンククリックでアウトラインを削除するにはどうすればよいですか?
- 11. イメージにアウトラインを追加するにはどうすればよいですか?
- 12. SQL - この簡単なクエリを簡略化するにはどうすればよいですか?
- 13. 簡単なマリオのようなゲームで、スプライトを「ジャンプ」させるにはどうすればいいですか?
- 14. 繰り返されない単純なコードを取得するにはどうすればよいですか?
- 15. Finderで選択されたファイルのposixパスを取得するにはどうすればよいですか?
- 16. シンプルなサイトの簡単なサイト検索を設定するにはどうすればよいですか?
- 17. 私のパス上のプログラムのリストをPerlから取得するにはどうすればよいですか?
- 18. どうすればいいのですか(簡単?)linqクエリ
- 19. スタックオーバーフローのようなきれいなURLを取得するにはどうすればよいですか?
- 20. EpiServerでブロックの名前を取得するにはどうすればよいですか?
- 21. Androidのネイティブコードから一時フォルダへのパスを取得するにはどうすればよいですか?
- 22. Androidローカルデバイスからのテキストタイプファイルの名前とパスを取得するにはどうすればよいですか?
- 23. シングルイメージファイルをインストールする簡単なインストーラを作成するにはどうすればよいですか?
- 24. ASP.NET MVC3のエリアで簡単なルートを設定するにはどうすればよいですか?
- 25. テーブルWebページの簡単なフォームをHTMLで作成するにはどうすればよいですか?
- 26. アクティブな分を取得するにはどうすればよいですか?
- 27. データベースのデータをデータクラスにバインドするにはどうすればよいですか?簡単な例として
- 28. メーラーのアセットパイプラインでスタイルシートの絶対パスを取得するにはどうすればよいですか?
- 29. C#で登録済みのCOMサーバーのパスを取得するにはどうすればよいですか?
- 30. ワークフローでHP ALMのRequirementとTestSetFolderのパスを取得するにはどうすればよいですか?
+1興味深い質問です。確かに当初考えていたものより複雑です:) – leppie
質問:パスとしてそれを保持する必要がありますか?ビットマップの結果が許容範囲内であれば、はるかに簡単になります。 –
おそらくビットマップが機能するかもしれません。私はその解決方法をどちらかの方法で見ることに興味があります。 – jthurman