• ベストアンサー

簡単なペイントソフトを作っているのですが・・・

winXP、C++Builder4を使用しています。 Canvasなどを使って、マウスを押し続けているときにだけ描線が描かれるプログラムを書きました。 次に追加したいのが、ペイントソフトなどにある「消しゴム」のような機能(描かれた線を消す)なんですが、何をどう使えばいいのかわかりません。 また、消しゴム機能が出来たら、次に指定した範囲の線分を移動させる機能を作りたいと考えています。あわせて、どのようにすればいいか教えていただきたいです。 初心者のつまらない質問かもしれませんが、お知恵を拝借させてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KamoPlat
  • ベストアンサー率46% (23/50)
回答No.4

なるほど。3Dまで発展させるための習作でしたか。それなら私のいっていた方法はダメです。 それでしたら線を管理するクラスを作った方が良いと思います。 No.3さんの仰るように内部にSTLのVectorでも持って線を構成する座標を保存します。あとはそれに特定の座標が線に含まれているかどうかの判定関数と指定されたコンテクストに描画する関数でも付けてやればとりあえずは何とかなりますね。 あ、それを束ねる管理クラスもあった方が良いと思いますが。 移動は選択された範囲内の座標で背景色でない座標をピックアップしてその各座標を各線に対して君のかい?と尋ねてまわって移動させる線を決定、そのあと移動量を各座標に反映させるといいでしょうね。 消去は座標をピックアップするところまでは同じでその後単純にVectorから要素を削除してやって、何もなくなったら線そのものを削除でいいのでは。 もちろん効率化のためにはいろいろ方法があります。座標を保存するときに複数の座標を一つの変数に入れたり、線の管理クラスに基本座標を持たせてみたりなどなど。そのあたりは有る程度分かるようになってから他人が書いたゲーム用のライブラリでも見てみると頭が痛くなるような事やってますよ(笑) ただし↑だとなめらかな線を構成するのが非常に難しいですよね。私は必要としなかったので何とも言えませんがベジェ曲線なども使えるようにしたほうがいいと思います。

kunimi923
質問者

お礼

ありがとうございます。 大変参考になりました。もう少し基礎的な勉強が必要になりそうですが、問題点とやるべきことがはっきりできたのでがんばってみます。

その他の回答 (3)

  • qKAZp
  • ベストアンサー率47% (71/148)
回答No.3

うろ覚えですが、Builder4のチュートリアルって、こんな感じの描画ソフトを作りませんでしたっけ? マウスは、常に座標を出力し続けていますので、わざわざタイマーを使わなくてもいいですね。 後は、マウス座標をどんどん配列なりベクターなりコンテナなりに納めていけばいいと思いますよ。 ドラッグ中の線分を1本として、別々の配列(なりコンテナなり)に納めるようにしておけば、線分の移動も楽でしょう。 どっちかというと、CADの感覚でしょうか? 後は、マウスの指示で、最も近いポイントをもった要素を探すだけ(だけって言うほど簡単ではなさそうですが) こり出すとすごいことになりそうですね。

kunimi923
質問者

お礼

アドバイスありがとうございます。 配列、ベクター、コンテナ、どうやら勉強しなければならないことが見えてきました。基本的な知識をもう少し増やして再度挑戦してみたいと思います。

  • KamoPlat
  • ベストアンサー率46% (23/50)
回答No.2

あ!申し訳ありません。 「描線」でしたね。勝手に法線だと読んでしまいました(汗) つまり手書きの線ですね? 消しゴム機能ですが、基本的に背景色で塗りつぶせばOKでしょう。 次ぎに移動ですが、手書きの線を座標の管理でやるのは面倒ですのでマウスを押し始めてから押し終わるまでを一回の動作としてその結果を保存して、レイヤーにしてしまってはいかがでしょうか。 こうすれば線分の移動が楽に出来ます。但しレイヤー数が増えると重くなりますが。 もしくはWindous付属のペイントみたいに指定範囲の全ての絵を切り取って移動させるように線分の独立した移動機能を捨てるなら軽い物が出来ます。

kunimi923
質問者

補足

返信ありがとうございます。 私は今大学生で、研究室で使っている3次元グラフィック系の実験装置とそれを動かすためのプログラムを発展させるためにCを勉強し始めたばかりなんです。 最終的目標としてもっと高度なプログラムを扱うことになるんですが、その前の段階として2次元での描画ソフトを作ろうとしています。 それで、消しゴム機能なんですが、今後発展させるための勉強として、 ・描線の通る位置をタイマーで短い時間ごとに記録する ・「消しゴム」によって指定した範囲内に含まれた描線を消去する というやり方でやってみたいんですが、何か良い方法はありますでしょうか? とりあえず、Formに直接描画するのではなく、Imageに描くようにしてみたんですが、、、

  • KamoPlat
  • ベストアンサー率46% (23/50)
回答No.1

「線分を移動させる機能」が欲しいのでしたらペイント系で考えずにベクター系、座標を記憶しておいて描画。を使う方が良いと思います。 入力された線分の始点終点を記録しておいて消しゴムが線分上に有ったらそれを削除、で線分の消去が可能です。 もし部分削除(線分の分割)をしたいならまた違いますが。 簡単な物なら↑のようにするのが手っ取り早いと思います。線の数が増えたりもっと発展させる予定があるなら私は未経験ですので何とも言えませんが、少なくとも始点終点でなく式に変えておいたり制御点が追加出来るようにしないといけないと思います(汗)

関連するQ&A

  • ペイントについて

    OSはWINXPです。 ペイントで簡単な絵を描いてブログに乗せたい のですが、ペイントってマウス操作で書きますよね? マウスだと字はもちろんのこと簡単な線すら ギザギザになって描かれます。 しかし、ネットでペイント操作方法を見ると とても上手な絵が描かれてます。 マウスでそんなに上手に描かれるものでしょうか? 変な質問かもしれませんが、お答えお願いいたします。

  • ペイントソフトを作りたい

    キャンバスが回転できる。 ペンタブレットに対応。 線補正機能つき。 グレースケール専用で機能もシンプル(MSペイントにレイヤー機能を付けてくらい)。 PSDファイルが扱える。 と、こんな感じのwindowsアプリを作りたいです。 プログラムは初心者で今日から勉強を始めようと思ってるんですが、どの言語(ツール)を選んだらいいでしょうか? ちなみに使用osはxpです。よろしくおねがいします。

  • ペイント 6.1 で消しゴムの大きさを変えたい

    XPに入っていたペイントのバージョンでは消しゴムの大きさを選ぶことができましたが、 ウインドウズ7になってバージョン6.1のペイントには消しゴムの大きさを選択できません。 そのため、広い範囲の汚れを消そうと思うと、何度もマウスで消しゴムを移動させなければなりません。6.1でも消しゴムの大きさを変えることができますか?また範囲を指定してその囲いの中を消す方法がありますでしょうか?

  • ペイントの使い方

    ペイントというソフトについて教えてください。 次のようなことをするにはどうすればよいのでしょうか。 ・平行な直線(線分)を何本も引く。(シフトキーを押しながら引くと、縦線・横線・45度の角度の線が引けることはわかるのですが、もっと自由な角度で引きたい) ・同じ長さの直線(線分)を何本も引く。 ・同じ大きさの円をいくつも描く。 質問しながらなんですが、ペイントってそもそも上記のようなことをするのに向いていない気がするのです。(^_^;) しかし、パソコン初心者の母から質問されて「できない」って断言することも私にはしかねるので、なにかやり方があったら教えてください。 もちろん、できないならできないで仕方ないので、そうご回答ください。 OSはWindows98SEまたはWindows Meです。

  • OpenGLを使ったプログラムについて

    BorlandC++Builder4を使っています。 OpenGLを使って3次元グラフィックを扱うソフトの開発を目標にしており、勉強を始めたばかりなのですが、現在は最終目標の前段階として、OpenGLを使って2次元のペイントソフトを作ろうとしています。 【プログラムの機能・概要】 ・マウスを使っての描画 ・消しゴムのような消去機能 ・指定範囲内の描線の切り取り&移動機能 他にも色の取得や選択など機能を追加していく予定ではありますが、とりあえず上の3つの基本機能を作ろうとしています。切り取り&移動は消去機能が完成した後かな、という感じです。 【プログラムの骨子】 ・OpenGLPanelとTimerをForm上に配置 ・OnMouseDownイベント時に、左クリックで描画開始、右クリックでクリックした座標の指定した範囲の周囲にある描線を消去開始 ・OnMouseMoveイベント時に、左クリックしている間は描線表示、右クリックでクリックしている間は周囲の描線を消去 ・OnMouseUpイベント時に、左クリックUpで描画終了、右クリックUpで消去終了 ・Timerで、描画中のマウス座標を指定時間ごとに記録 考えたのはこんな感じなんですが、これでペイントソフトとして機能させることは可能でしょうか?足りない部分があれば指摘をお願いします。 【わからないこと】 ・座標の記録方法(どのような関数を用いてどんな風に記述すればよいか) ・OnMouseDown、OnMouseMoveの各イベントで、保存した座標を呼び出す方法 glVertex*()を使うことになると思うんですが、具体的にどのように記述すればいいのかわかりません。 ちょっと混乱していて質問自体におかしいところが多いかもしれませんが、どんなことでも構わないのでアドバイス宜しくお願いします。

  • Windousのペイントを削除してしまったようです

    間違ってWindousのペイントを削除してしまったようです。消しゴム機能が必要なのですが再インストールは出来ますか?それとも他のソフトをインストールしかないですか?どのソフトも高機能らしく私向きではありません。使うのは消しゴムだけなのですが・・・・。何か良い知恵をお願いします。

  • 【ペイント】機能が消えてしまいました。

    プログラムの追加と削除をしていたら、【ペイント】機能が消えてしまいました。復活させようと、システムの復元をしてもできませんでした。 なにかよい方法を教えてください。

  • キャプチャソフトと、ペイントが合体したようなソフトはありますか?

    キャプチャが出来て、なおかつ、Windowsに入っているペイントのような、色を指定して、四角く囲んだり文字を入れたりできるようなソフトを探しています。 キャプチャソフトをいくつかダウンロードしたのですが、キャプチャは出来ても線が引けなかったり、逆にそれが出来るけど、キャプチャの種類が少ない(スクリーンキャプチャしかない)など、これといったソフトがありません。 希望は ●キャプチャの種類が豊富(スクリーンは勿論、範囲指定も欲しい) ●Windowsのペイントぐらいの機能が欲しい ●キャプチャを、いくつかためておける それらを含むソフトを探しています。

  • 手書き感覚で簡単な図を書くソフト

    お客さんに簡単なスケッチを書いてメールするときに、いつも、 手書きで紙の上にスケッチ(ほんとうに簡単な平面図)を書いて、 スキャナーで撮ってメールしていますが、すこし面倒なので、 手書き感覚でマウスを使ってWEB上にスケッチが書けて、メールができるようなソフトを教えてください。 WinXPに標準に入っているペイントツールの鉛筆の機能のようなものです。(ペイントツールの鉛筆よりももう少し太い線が書きたい)

  • ペイントソフトSAIの再生機能について

    現在ペイントソフトSAIを使っています。 ユーザーライセンスを購入し、正規版として使っています。 少し前まで古いPCでSAI・OpenCanvas2つのソフトを体験版で利用しておりました。体験版なので当然機能は制限されていました。 今はSAIを購入して使っているのでOpenCanvasを使う予定はまったくありません。2つ使って使いやすいほうを選びました。 そこで、タイトルの再生機能というものなのですが、 OpenCanvasにはイベント機能(確かそのような名前)というものがあり、絵の描き始め(キャンバスを準備した段階)から保存するまでの間に描いたものを動画のように再生してくれる機能があります。 youtubeやニコニコ動画などで絵描きさんが描いている手順(筆の動きなど)をアップしてくださっているようなのがペイントソフトそのもので再生される感じです。再生が終わればそのまま、いつもどおりのソフトとして編集できます。 そのような機能はSAIにはないのでしょうか? 今まで体験版だったために機能が使えないと思っていたのですが、ライセンスを購入した後も見つけることができず、そして機能(があれば)の名前がわからないため検索することもできません。 「イベント機能 SAI」などで検索してみましたが、「実際の行事」のほうのイベントがヒットし情報が得られないのです。 もし、知っていらっしゃる方がいれば教えていただきたいです。 機能がついていない又は追加することができるのであればそちらも教えてほしいです。 よろしくお願いします。

専門家に質問してみよう