winXP、C++Builder4を使用しています。
Canvasなどを使って、マウスを押し続けているときにだけ描線が描かれるプログラムを書きました。
次に追加したいのが、ペイントソフトなどにある「消しゴム」のような機能(描かれた線を消す)なんですが、何をどう使えばいいのかわかりません。
また、消しゴム機能が出来たら、次に指定した範囲の線分を移動させる機能を作りたいと考えています。あわせて、どのようにすればいいか教えていただきたいです。
初心者のつまらない質問かもしれませんが、お知恵を拝借させてください。よろしくお願いします。
No.1
- 回答日時:
「線分を移動させる機能」が欲しいのでしたらペイント系で考えずにベクター系、座標を記憶しておいて描画。
を使う方が良いと思います。入力された線分の始点終点を記録しておいて消しゴムが線分上に有ったらそれを削除、で線分の消去が可能です。
もし部分削除(線分の分割)をしたいならまた違いますが。
簡単な物なら↑のようにするのが手っ取り早いと思います。線の数が増えたりもっと発展させる予定があるなら私は未経験ですので何とも言えませんが、少なくとも始点終点でなく式に変えておいたり制御点が追加出来るようにしないといけないと思います(汗)
No.2
- 回答日時:
あ!申し訳ありません。
「描線」でしたね。勝手に法線だと読んでしまいました(汗)
つまり手書きの線ですね?
消しゴム機能ですが、基本的に背景色で塗りつぶせばOKでしょう。
次ぎに移動ですが、手書きの線を座標の管理でやるのは面倒ですのでマウスを押し始めてから押し終わるまでを一回の動作としてその結果を保存して、レイヤーにしてしまってはいかがでしょうか。
こうすれば線分の移動が楽に出来ます。但しレイヤー数が増えると重くなりますが。
もしくはWindous付属のペイントみたいに指定範囲の全ての絵を切り取って移動させるように線分の独立した移動機能を捨てるなら軽い物が出来ます。
この回答への補足
返信ありがとうございます。
私は今大学生で、研究室で使っている3次元グラフィック系の実験装置とそれを動かすためのプログラムを発展させるためにCを勉強し始めたばかりなんです。
最終的目標としてもっと高度なプログラムを扱うことになるんですが、その前の段階として2次元での描画ソフトを作ろうとしています。
それで、消しゴム機能なんですが、今後発展させるための勉強として、
・描線の通る位置をタイマーで短い時間ごとに記録する
・「消しゴム」によって指定した範囲内に含まれた描線を消去する
というやり方でやってみたいんですが、何か良い方法はありますでしょうか?
とりあえず、Formに直接描画するのではなく、Imageに描くようにしてみたんですが、、、
No.3
- 回答日時:
うろ覚えですが、Builder4のチュートリアルって、こんな感じの描画ソフトを作りませんでしたっけ?
マウスは、常に座標を出力し続けていますので、わざわざタイマーを使わなくてもいいですね。
後は、マウス座標をどんどん配列なりベクターなりコンテナなりに納めていけばいいと思いますよ。
ドラッグ中の線分を1本として、別々の配列(なりコンテナなり)に納めるようにしておけば、線分の移動も楽でしょう。
どっちかというと、CADの感覚でしょうか?
後は、マウスの指示で、最も近いポイントをもった要素を探すだけ(だけって言うほど簡単ではなさそうですが)
こり出すとすごいことになりそうですね。
アドバイスありがとうございます。
配列、ベクター、コンテナ、どうやら勉強しなければならないことが見えてきました。基本的な知識をもう少し増やして再度挑戦してみたいと思います。
No.4ベストアンサー
- 回答日時:
なるほど。
3Dまで発展させるための習作でしたか。それなら私のいっていた方法はダメです。それでしたら線を管理するクラスを作った方が良いと思います。
No.3さんの仰るように内部にSTLのVectorでも持って線を構成する座標を保存します。あとはそれに特定の座標が線に含まれているかどうかの判定関数と指定されたコンテクストに描画する関数でも付けてやればとりあえずは何とかなりますね。
あ、それを束ねる管理クラスもあった方が良いと思いますが。
移動は選択された範囲内の座標で背景色でない座標をピックアップしてその各座標を各線に対して君のかい?と尋ねてまわって移動させる線を決定、そのあと移動量を各座標に反映させるといいでしょうね。
消去は座標をピックアップするところまでは同じでその後単純にVectorから要素を削除してやって、何もなくなったら線そのものを削除でいいのでは。
もちろん効率化のためにはいろいろ方法があります。座標を保存するときに複数の座標を一つの変数に入れたり、線の管理クラスに基本座標を持たせてみたりなどなど。そのあたりは有る程度分かるようになってから他人が書いたゲーム用のライブラリでも見てみると頭が痛くなるような事やってますよ(笑)
ただし↑だとなめらかな線を構成するのが非常に難しいですよね。私は必要としなかったので何とも言えませんがベジェ曲線なども使えるようにしたほうがいいと思います。
ありがとうございます。
大変参考になりました。もう少し基礎的な勉強が必要になりそうですが、問題点とやるべきことがはっきりできたのでがんばってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- マウス・キーボード PCのタッチ画面とタッチペンの対応 2 2023/01/14 16:01
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
- PowerPoint(パワーポイント) パワーポイント。2つの矢印のワイプ&消滅の順番に実施、これの繰り返し 2 2023/07/25 09:13
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Wi-Fi・無線LAN インターネット回線について質問です。 夕方から自宅のWi-Fiが使えなくなっています。 再起動したら 3 2022/06/28 03:29
- 画像編集・動画編集・音楽編集 ワード。頂点の編集。 4 2022/09/28 14:14
- JavaScript 変数のスコープの問題? 3 2022/06/23 09:32
- Excel(エクセル) win10でexcel2003は動かないのか 8 2023/07/20 10:15
- その他(音楽・ダンス・舞台芸能) 手描き動画の楽曲使用について 2 2023/02/11 00:59
- 美術・アート ペンタブとオフィス系ソフト 1 2022/10/08 19:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
c言語でキーボードから2点の座...
-
エクセルである点からの距離で...
-
ガウシアンフィルタのCプログラム
-
C言語 配列で座標
-
交差する2線分の交点座標の求め方
-
エクセルで回転する座標の出し方
-
C言語について質問です 画像の...
-
緊急 ベーシックで国旗の作り方...
-
【C#】アクションゲームの地...
-
マインクラフト(pc版)で座標...
-
Cで回転プログラムの高速化を
-
位置座標からx軸となす角度(ラ...
-
MATLABの画像処理、2本の直線の...
-
回転する矩形同士の当たり判定...
-
最小二乗平面
-
画像の円形内による画素検出に...
-
Excel VBA ・・・教えてください
-
虚数は我々日常生活の身近なと...
-
ピクチャボックスの座標取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
エクセルで回転する座標の出し方
-
エクセルである点からの距離で...
-
3次元空間上の2つの座標から...
-
閉図形の座標の配列が右回りか...
-
ダイアログ内コントロールの位...
-
始点、終点の二つの座標と半径...
-
座標を持った平面範囲に座標を...
-
空間上の二点を結ぶ直線上に任...
-
エクセルシート上のマウスポイ...
-
多角形の内部かどうか判定する方法
-
ワード上Shapeの位置情報を統一...
-
Excel VBA で自在に図形を変化...
-
OpenCvSharp4による画像判定解...
-
C言語 配列で座標
-
シーケンサー(PLC?)で制...
-
以下のプログラムは重心を求め...
-
交差する2線分の交点座標の求め方
-
VB6のPrinter.ScaleWidth に対...
おすすめ情報