プログラマーである場合のメモの書き方

教師が学生に専門大学で手書きでテクニカルノートを作成させると、次のような結果になります。







2つの抽象的なシートの写真







これは、カスタム手書きで手書きテキストを生成するプログラムの結果です。 ペンの太さとペーストの色を変更したり、一緒にまたは別々に文字を書いたり、多くの異なる言語での書き込みをサポートしたり、それらの多くの音節で単語を転送したりできます。 C ++ / Qtで書かれており、WindowsおよびLinux用のバージョンがあります。 次は、手書き文字の小さな分析、それを模倣するさまざまな方法の説明、プログラムの最も興味深い瞬間の分析、およびリポジトリへのリンクです。







個々の手書きの文章を生成するソフトウェアが難しいのはなぜですか? 事実、手書きの文章は非常に可変的であり、印刷のような厳格な事前決定はありません。 手書きの文章をもっともらしくするためには、少なくとも次の機能を考慮する必要があります。









これはすべて、筆記の方法、筆記用具の種類、下地、筆記の速さ、一般的な手、筆記者の気分と幸福などに影響されます。 つまり、膨大な数の要因を考慮するだけでなく、プログラムのユーザーが自由にそれらを構成できるようにする必要があります。







これは通常どのように行われますか?



実際には、必要なときにこれがすべて考慮されることはめったにありません。 たとえば、ハガキや招待状の小さな手書きの印刷には、通常のOpenType手書きフォントが使用されます。 ただし、特定の条件下では、これは要約に適している場合があります。 ネットワークでは、個々のフォントを自分で作成してMS Wordから印刷する方法についての指示見つけることができます。英語を話すユーザーには、手書きフォントのジェネレーター全体があります。







しかし、この方法では、妥当性が低下します。キャラクターはまったく同じになり、線は完全に滑らかになります。 私の経験では、大多数のアブストラクトの特徴であるvyviglaznostとカオスはありません。きちんとしたアブストラクトでも、そのような非の打ちどころは不自然です。







そして、より良い方法は?



主なアイデアは次のとおりです。印刷されたテキストを取得し、各文字について手書きのグリフを取得し、それを適切な場所の仮想用紙に配置します。 同時に、同じシンボルに対して複数のグリフが必要であり、特定のグリフをランダムに選択する必要があります。そうしないと、OpenTypeフォントと同じ問題が発生します。 次に、用紙全体と単一の線または記号の両方にさまざまな歪みを導入することができます。 おそらく、入力されたグリフからすぐに準備ができたセットを取得するような方法でグリフを歪めることが可能です。







リガチャーと、それに応じて、互いに隣接する文字の影響を考慮する文字の組み合わせを使用して、すべて同じことができます。 ネタバレ:残念ながら、私のプログラムは合字をサポートしておらず、グリフを歪めることはできません。







私はソフトウェア生成が良いアイデアであると最初に決めたわけではなく、原稿を作成するための独自のプログラムを書きました。 BruiseHandwriterプログラム、およびScribeサービスを知っています。 それにも関わらず、独自のプログラムを書くことを勧めるいくつかの欠点があります:たとえば、Synakakは文字ごとにグリフが1つしかなく、使い勝手にいくつかの問題があります。







ベクターまたはビットマップフォント?



私たちは個々の手紙について話しているので、グリフをプログラムに打ち込む可能性を提供する必要があります。 かなり明白な解決策は、ユーザーがテンプレートを印刷して入力し、完成したテンプレートのスキャンからグリフを取得できるようにすることです。 ただし、このためには、次のタスクを解決する必要があります。









難しいのは、それを行うだけではなく、さまざまな特性、スキャン設定、さまざまな用紙を備えた無数のスキャナーで効率的にそれを行うことです。 私はそのような膨大な仕事を引き受けるべきではないと決めました。







したがって、私のプログラムはベクトルグラフィックスを使用します。 フォント作成アルゴリズムは次のとおりです。ユーザーはお気に入りのベクターエディターを開き、目的のグリフを描画し(タブレットを使用することが望ましい)、保存してからプログラムに読み込みます。 このソリューションの欠点は次のとおりです。









ただし、さまざまなボーナスがあります。









シートに文字を配置する



シンボルは異なります。一部は厳密に線内に配置され、一部はその端からはみ出し、その他は上部または下部の境界線上にあります。 シンボルの突出部分は、隣接するシンボルの上または下に配置できます。 そのため、キャラクターを正しく配置するには、そのキャラクターのどの部分がライン内にあり、他のキャラクターをどのように配置する必要があるかを知る必要があります。







フォントエデイタイのスクリーションショット

黄色の四角形は、行内にある文字の一部です







フォントエディターでは、文字列と他の文字に対する文字の位置を設定するだけで、黄色の枠で文字の境界線を示すことができます。 そして、もちろん、シンボルと特定のグリフが割り当てられます。







連続書き込み用のデータ



黄色の境界線に加えて、2つの円形ポインターもフォントエディターで目立ちます。 これらは、隣接する文字からの接続線が来るポイントです。 はい、単語のスペルを継続するために、それらの隣の文字は単純に直線で接続されています。 理論的には、スプラインを使用する方が良いでしょうが、長いテールなしで文字を書く場合、プログラムがユーザーにポニーテールを描画することを考えると、これは印象的ではありません。







部分的なフォント作成の自動化



これをすべてキャラクターごとに手動で指定するには-自分で撃つことができます。 独自のフォントを作成するプロセスを何らかの形で簡素化する必要があります。







まず、グリフの自動読み込みがあります。 お気に入りのベクターエディターからグリフを保存するときは、特定のテンプレートに従ってファイルに名前を付けるだけで十分で、プログラムはそれを目的の文字に割り当てます。 パターンは次のとおりです。キャラクター自体、必要に応じて番号。 下線で区切ることができます。 また、Windowsでは大文字と小文字の違いはあまり見られないため、大文字には接頭辞「UP_」を追加する必要があります。 確かに、このようなトリックはすべてのシンボルで機能するわけではありません。 ファイル名にすべてを使用できるわけではないため、禁止文字の代わりに名前を書くことができます。







第二に、連続スペルでは、接続線は原則として、文字の最初の行の先頭に入り、最後の行の末尾から出ます。 原則として、ベクターエディターは、線が描画された順序で線に関する情報を保存するため、最初に描画された線と最後に描画された線がわかります。 つまり、ラウンドポインターの配置に関するほとんどの作業でプログラムを使用できます。 そしてそれを取ります。







そして第三に、プログラムは、グリフの境界に沿って配置するだけで、黄色の長方形自体を示すこともできます。 これはしばしば間違っていますが、正しく配信されたデータの少なくとも一部はすでにユーザーの生活を楽にします。







音節によるワードラップ



単語を音節に正しく分割するために、DymchenkoとVarsanofievの修正におけるP. Hristovのアルゴリズムが使用されます。 要するに、正規表現を使用すると、2つの文字グループが記述され、その間にハイフンが必要です。 次に、これらのルールを連続して適用する特定の単語が音節に分割され、エッジに最も近いハイフンが選択され、ハイフンの右部分全体が新しい行に転送されます。







そのようなルールはロシア語にはすでに存在しています。 それらは完全に正確ではありませんが、すべての転送の99%をカバーすると思われます。 また、他のいくつかの言語用に開発できると思います。 しかし、皆のためではありません。 たとえば、英語では、音節による単語の翻訳には、より複雑なアルゴリズムが必要です。 単語はスペルではなく音声で転送されます。







ロシア語のルールは次のとおりです。









ここで、Lは任意の文字、Gは母音、Cは子音、Xはセット「b」の文字です。 ユーザーにソースコードを変更せずにルールを変更する機会を与えるために、別のファイルにそれらを配置します。







移行ルールフアイル

1つの文字が単語を分割しないように、元の規則を多少変更することを許可しました。







その他の機能



ベクトルグラフィックスを使用すると、特にラインのパラメーターを変更して、エッジを丸めたり、角を滑らかにしたりすることができます。 さらに、シートとフォントの設定をカスタマイズする機能をユーザーに何らかの形で制限する理由はありません。 スクリーンショットを見ると、メイン設定のおおよそのアイデアが得られます。







設定のスクリリオンシステム







要約のいくつかの写真



クリック可能:







写真1







写真2







写真3







ソースコード



約束どおり-リポジトリへのリンク: https : //github.com/aizenbit/Scribbler








All Articles