- ベストアンサー
簡単なペイントソフトを作っているのですが・・・
winXP、C++Builder4を使用しています。 Canvasなどを使って、マウスを押し続けているときにだけ描線が描かれるプログラムを書きました。 次に追加したいのが、ペイントソフトなどにある「消しゴム」のような機能(描かれた線を消す)なんですが、何をどう使えばいいのかわかりません。 また、消しゴム機能が出来たら、次に指定した範囲の線分を移動させる機能を作りたいと考えています。あわせて、どのようにすればいいか教えていただきたいです。 初心者のつまらない質問かもしれませんが、お知恵を拝借させてください。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なるほど。3Dまで発展させるための習作でしたか。それなら私のいっていた方法はダメです。 それでしたら線を管理するクラスを作った方が良いと思います。 No.3さんの仰るように内部にSTLのVectorでも持って線を構成する座標を保存します。あとはそれに特定の座標が線に含まれているかどうかの判定関数と指定されたコンテクストに描画する関数でも付けてやればとりあえずは何とかなりますね。 あ、それを束ねる管理クラスもあった方が良いと思いますが。 移動は選択された範囲内の座標で背景色でない座標をピックアップしてその各座標を各線に対して君のかい?と尋ねてまわって移動させる線を決定、そのあと移動量を各座標に反映させるといいでしょうね。 消去は座標をピックアップするところまでは同じでその後単純にVectorから要素を削除してやって、何もなくなったら線そのものを削除でいいのでは。 もちろん効率化のためにはいろいろ方法があります。座標を保存するときに複数の座標を一つの変数に入れたり、線の管理クラスに基本座標を持たせてみたりなどなど。そのあたりは有る程度分かるようになってから他人が書いたゲーム用のライブラリでも見てみると頭が痛くなるような事やってますよ(笑) ただし↑だとなめらかな線を構成するのが非常に難しいですよね。私は必要としなかったので何とも言えませんがベジェ曲線なども使えるようにしたほうがいいと思います。
その他の回答 (3)
- qKAZp
- ベストアンサー率47% (71/148)
うろ覚えですが、Builder4のチュートリアルって、こんな感じの描画ソフトを作りませんでしたっけ? マウスは、常に座標を出力し続けていますので、わざわざタイマーを使わなくてもいいですね。 後は、マウス座標をどんどん配列なりベクターなりコンテナなりに納めていけばいいと思いますよ。 ドラッグ中の線分を1本として、別々の配列(なりコンテナなり)に納めるようにしておけば、線分の移動も楽でしょう。 どっちかというと、CADの感覚でしょうか? 後は、マウスの指示で、最も近いポイントをもった要素を探すだけ(だけって言うほど簡単ではなさそうですが) こり出すとすごいことになりそうですね。
お礼
アドバイスありがとうございます。 配列、ベクター、コンテナ、どうやら勉強しなければならないことが見えてきました。基本的な知識をもう少し増やして再度挑戦してみたいと思います。
- KamoPlat
- ベストアンサー率46% (23/50)
あ!申し訳ありません。 「描線」でしたね。勝手に法線だと読んでしまいました(汗) つまり手書きの線ですね? 消しゴム機能ですが、基本的に背景色で塗りつぶせばOKでしょう。 次ぎに移動ですが、手書きの線を座標の管理でやるのは面倒ですのでマウスを押し始めてから押し終わるまでを一回の動作としてその結果を保存して、レイヤーにしてしまってはいかがでしょうか。 こうすれば線分の移動が楽に出来ます。但しレイヤー数が増えると重くなりますが。 もしくはWindous付属のペイントみたいに指定範囲の全ての絵を切り取って移動させるように線分の独立した移動機能を捨てるなら軽い物が出来ます。
補足
返信ありがとうございます。 私は今大学生で、研究室で使っている3次元グラフィック系の実験装置とそれを動かすためのプログラムを発展させるためにCを勉強し始めたばかりなんです。 最終的目標としてもっと高度なプログラムを扱うことになるんですが、その前の段階として2次元での描画ソフトを作ろうとしています。 それで、消しゴム機能なんですが、今後発展させるための勉強として、 ・描線の通る位置をタイマーで短い時間ごとに記録する ・「消しゴム」によって指定した範囲内に含まれた描線を消去する というやり方でやってみたいんですが、何か良い方法はありますでしょうか? とりあえず、Formに直接描画するのではなく、Imageに描くようにしてみたんですが、、、
- KamoPlat
- ベストアンサー率46% (23/50)
「線分を移動させる機能」が欲しいのでしたらペイント系で考えずにベクター系、座標を記憶しておいて描画。を使う方が良いと思います。 入力された線分の始点終点を記録しておいて消しゴムが線分上に有ったらそれを削除、で線分の消去が可能です。 もし部分削除(線分の分割)をしたいならまた違いますが。 簡単な物なら↑のようにするのが手っ取り早いと思います。線の数が増えたりもっと発展させる予定があるなら私は未経験ですので何とも言えませんが、少なくとも始点終点でなく式に変えておいたり制御点が追加出来るようにしないといけないと思います(汗)
お礼
ありがとうございます。 大変参考になりました。もう少し基礎的な勉強が必要になりそうですが、問題点とやるべきことがはっきりできたのでがんばってみます。