フィリピンのクロスワードとは何ですか。
カラーフィリピンクロスワード-グリッド内のこの種のパズルで、数字を使用して画像が暗号化されています。 グリッドにある各番号には、1つを除いて、ペアがあります。 線が次の条件を満たすように、数字のペアを選択して線に接続する必要があります。
-各行の長さは、その端にある数字に対応する必要があります。
-線は互いに交差して同じセルを通過してはなりません。
-線は垂直および水平方向に進むことができ、屈折することができますが、斜めに行くことはできません。
-接続された数字のペアは同じ色でなければなりません。
ユニットにはペアがないため、デフォルトで塗りつぶされます。 クロスワードパズルを解いた結果、数字のすべてのペア(単位を除く)が線で接続されている場合、画像が取得されます。
画像処理
作業は、さまざまな形式のカラー写真のコレクションから始まりました。 十分な数(4000以上)の画像を収集した後、半手動半自動の処理がそれらの処理に始まりました。
処理手順は、Gdiplusライブラリを使用してC ++で実装されました。その高レベルのインターフェイスを使用すると、画像ストレージ形式に関する深い知識がなくてもファイルを読み取って作成できます。 ファイルを読み込んだ後、操作の便宜のために、情報は行列の形でメモリに表示されます。配列の各要素は、r、g、b-特定のピクセルのプロパティに関する情報を格納します。
簡単な例で使用例を示します。 3x5ピクセルの画像を撮ってみましょう(ハブでのプレゼンテーションのために、画像はスケーリングされます)。
以下の手順のコードを使用して読んでください。
ReadImageFile
void ReadImageFile(wchar_t filename[]) { Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartupOutput output; ULONG_PTR token; Gdiplus::Color color; Gdiplus::Bitmap* bitmap; // GDI+. Gdiplus::GdiplusStartup(&token, &input, &output); bitmap = new Gdiplus::Bitmap(filename); int w = bitmap->GetWidth(); int h = bitmap->GetHeight(); for (int i = 0; i < w; i++) for (int j = 0; j < h; j++) { bitmap->GetPixel(i, j, &color); printf("Pixel [%d %d]: %d %d %d\n", i, j, (unsigned)color.GetRed(), (unsigned)color.GetGreen(), (unsigned)color.GetBlue() ); } delete bitmap; // GDI+. Gdiplus::GdiplusShutdown(token); }
実行結果:
処理に含まれるもの:
- すべての形式をpng形式でキャストします。
- 剪定。 特定の数の写真には、エッジの周りに白いフィールドがありますが、これには関心がありません。
- 「ピクセル」の外観にする。 フィリピンのクロスワードパズルを解いた結果として得られた画像はグリッドの形で表示されるため、画像の高さと幅は100ピクセル以下でなければなりません(最初にこの幅と高さの制限を選択しましたが、コレクション)。
- RGB表記で3つのパラメーター(r、g、b)が同時に30未満異なる「類似色」-1つの色に結合する必要があります。その結果、ユーザーは色を明確に区別できます。 それ以外の場合、目で「類似した」色の数字は区別できません。 たとえば、このような2つの隣接ピクセル:
思い起こさせる:
- 可能であれば、画像が花であふれないようにしてください-15色まで。
- 重複を削除します。 読み取りの結果、画像はハッシュ値と見なされ、残りと比較されます。 ハッシュ値が幅、高さ、色数と一致する場合、画像はテイクと見なされ、それ以上は考慮されません。
もちろん、処理の各段階の後に、すべてが適切かどうかを目で確認し、うまくいかなかった手ですべてを修正する必要があります。
タスク生成
楽しみが始まります。 各ピクチャに対してタスクを生成する必要があります(タスクは、数値のグリッドであり、解法の過程でペアを接続する必要があります)。 各タスクには1つのソリューションのみが必要です。 このタスクの世代検証アルゴリズムを書くのに3か月かかりました。 このアルゴリズムは、2つの主要な手順によって実装されます。
-タスク生成手順、それ自体の内部でrand()を使用してランダム性を生成します。
-タスク検証手順。
-
画像は、行列の形でメモリに表示されます。配列の各要素は、r、g、b-特定のピクセルのプロパティに関する情報を格納します。 このマトリックスの複数の再帰トラバーサルを実行するプロセスの各手順。 直線を取得するのに十分なほど簡単に実装できますが、この場合、クロスワードパズルは面白くないでしょう。 クロスワードパズルで線を繰り返し曲げるために、かなり混乱しなければなりませんでした。
アルゴリズムは面倒です。ソースコードを提供する理由はありません。トップレベルの説明をします。
各画像について、サイクルはNの可能な反復で始まります。 任意の形式の擬似コードでの反復について説明します。
for(...) // { int cnt_try = 0; // - do { cnt_try++; = _(); _ = _(); if(_ == 0) // _(); }while(_ != 0 && cnt_try <= N); }
アプリケーションコーディング
このアプリケーションを実装するために、黒と白のフィリピンのクロスワードFCrossに実装したエンジンをベースとして使用しました。 作業プラットフォーム-マーマレードSDK、プログラミング言語-C ++。
新しいニーズのためにそれを終えて、私は色フィリピンのクロスワードを解くためのアプリケーションを得ました。
Facebook統合と画像ホスティング
解決済みのクロスワードパズル(写真)をFacebookの壁に投稿する機会をユーザーに提供したいと思います。 これを行うには、developers.facebook.comにアプリケーションを登録する必要があります。特に、アプリケーションがユーザーに要求するアクセス許可を指定する必要があります。 私のスクリプトでは、デフォルトのパーミッションで十分です- 「public_profile」、「user_friends」。 ダイアログのスクリプトに従って壁に投稿する場合、追加の許可の確認は必要ありません。
この場合、アプリケーションに追加の許可が必要な場合は、Facebookチームによる確認を必要とせずに、アプリケーションのFacebook承認機能を使用できます。更新する必要があります。
画像を投稿する機能は、APIパブリッシングメソッドの入力パラメーターにURLを指定することで提供されます。 したがって、画像をパブリックホスティングに保存する必要があります。これは、私が提案した要件を満たす必要があります。
-プライマリダウンロードファイルを一括処理する機能。
-高可用性;
-高い信頼性-1か月以内に閉じたくない。
-PNGファイルは、広告のあるWebページではなく、URLで開く必要があります。
-URLはハッシュを取得することによって生成されるのではなく、アップロードされる元の画像の名前と明確に簡単に一致できることが重要です。
数分間インターネットを閲覧した後、 Google Cloud Storageに決めました。 有料で、これらの条件をすべてカバーします。 とりわけ、このプラットフォームは、オブジェクトの操作を簡素化するコマンドコンソールを提供します。 私の場合、4000以上の画像があり、1つのコマンド(gsutil -m acl ch)で直接リンクを介してすべてのオブジェクトにアクセスできるようにしたときに使用しました。
そのため、画像URLはハッシュによって生成されるのではなく、ファイル名に基づいて生成されるため、アプリケーションは、発行の直前にランタイムで常に画像へのリンクを取得できます。 ターゲットファイルが置かれているフォルダーへのURLパスの静的な部分のみをハードコーディングする必要があります。
Facebookと統合するために、Marmalade SDKの標準アセンブリに含まれるs3eFacebook APIが使用されました 。
公開後のダイアログは次のようになります。
まとめると
この作業の結果は、私自身が時々プレイするアプリケーションです。 作業の過程で、考えは繰り返しプロジェクトをやめるようになりましたが、私はそれを論理的な終わりに持ったことを後悔していません。