canvas


しんちゃん  2015-05-13 16:57:35  No: 47287

おはようございます。
Delphi XE5を使用しています。
Delphi初心者です。

グラフィックのプログラムについて教えてください。
imageコンポーネントのcanvasを利用して
線、円弧、円を描いてのですが
重複している部分が消えてしまいます。
また、描いたオブジェクトが全て表示されていません。
(表示範囲が小さいようです。)

2点について、アドバイスいただけますでしょうか。


deldel  2015-05-13 19:02:16  No: 47288

こういった御質問は入門レベルですので、逆にレスが付きにくいかと・・・
「Delphi 入門」などでググるといくらでも出てくると思いますよ
例えば...
http://kakinotane.s7.xrea.com/delphi/d2/d021.html
ここの335とか...
https://books.google.co.jp/books?id=PbIgHHqhrIcC&pg=PA238&lpg=PA238&dq=delphi%E5%9B%B3%E5%BD%A2%E6%8F%8F%E7%94%BB&source=bl&ots=Q0L9V790Vb&sig=Y0Z9yua6jN_uxsNYyq4C6P2IhII&hl=ja&sa=X&ei=YKFSVZyhDea2mwXQk4HABw&ved=0CCoQ6AEwAg#v=onepage&q=delphi%E5%9B%B3%E5%BD%A2%E6%8F%8F%E7%94%BB&f=false


しんちゃん  2015-05-18 23:43:53  No: 47289

あれから色々なサイトを検索してトライしているのですが
思うように描画出来ませんでした。

例えば以下のコードの場合、原点(0,0)から
点(1000,1000)は描画するのでずが
それ以外が全く描画されません。
初歩的なことで、このサイトでは
ご迷惑でしょうが、アドバイスお願いします。

FormにImageコンポーネントを配置(height=161  width=257)
FormにButtonコンポーネントを配置する。
そのOnClickイベントに以下を記述する。
Image1.canvas.pen.style := psSolid;
Image1.canvas.MoveTo(0,0);
Image1.canvas.LineTo(1000,1000);
Image1.canvas.LineTo(50,50);
Image1.canvas.Ellipse(50,50,1000,1000);


deldel  2015-05-19 00:59:30  No: 47290

どういう図形を描画したいのか分かりませんが、
まず、
  Image1.canvas.LineTo(1000,1000);
  Image1.canvas.LineTo(50,50);
は、
  Image1.canvas.MoveTo(0,0);
  Image1.canvas.LineTo(1000,1000);
で書いた直線の上に書いてますので、見た目には書いてないように思ってしまいますね・・・。

あと、最後に書いた円は中を塗りつぶしているので、
以下のようにすると何か分かってくるかもです。
 Image1.canvas.pen.style := psSolid;
 Image1.canvas.brush.style := bsClear;
 Image1.canvas.MoveTo(0,0);
 Image1.canvas.LineTo(1000,1000);
 Image1.canvas.LineTo(50,150);
 Image1.canvas.Ellipse(50,50,1000,1000);


deldel  2015-05-19 01:02:20  No: 47291

あ、あと、width,heightが小さすぎるかと。
例えば1000にしてみてください。


しんちゃん  2015-05-19 01:48:10  No: 47292

Deldelさん、
低レベルのご質問にお付き合い頂きましてありがとうございます。

Imageのサイズが小さい為、見えていなっかようです。
そこで、ご質問ですがImageのheigth、widthはそのままで縮尺を利用して
現状のimageのサイズに収まるように
描画はできますか?


deldel  2015-05-19 01:54:44  No: 47293

例えば、一旦TBitmapを作成してこれに描画し、StretchBltで
Bitmapの内容をImage1に縮小描画すればできますが、
詳しくは、やはり書籍や色々なサイトで勉強されるのが良いかと思います。


TS  2015-05-19 06:33:07  No: 47294

Fusaさんのサイト内の

16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"Canvasに実数座標で描画"
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00459.html

これを使用するか、理解して応用できれば、縮尺を使用できると思います。


しんちゃん  2015-05-20 03:43:54  No: 47295

TSさん、deldelさんアドバイス本当にありがとうございます。
少しずつですが、イメージ通りになってきました。
そこで、もうひとつ初歩的なご質問を聞いて下さい。
円弧の関数はArcがありますが
利用しにくいのでサイトを調べていましたら
AngleArcという関数があるようなのですが
AngleArc(中心のX座標、中心のY座標、半径、開始角度、終了角度);
と記述しコンパイルすると未定義の識別子'AngleArc'というエラーが
発生します。
この関数は使用できないのでしょうか?


通りすがり  2015-05-20 05:44:02  No: 47296

XE5ですよね?
http://docwiki.embarcadero.com/Libraries/XE5/ja/Vcl.Graphics.TCanvas.AngleArc
使えますよ(手元のXE5で確認済)。


TS  2015-05-20 06:48:30  No: 47297

interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,         System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

上記は  新規のusesの状態ですが、「Vcl.Graphics,」
クレヨンさんのコードにもこの記載がありますか。


しんちゃん  2015-05-25 19:17:21  No: 47298

通りすがりさん、TSさんご回答ありがとございます。
急遽、出張が入りましてご連絡遅れました。申し訳ありません。

ご指摘頂きましたuseを追加し、コンパイルしたところ
致命的エラーが発生しました。
(Vcl.Graphcs.dcuがみつかりません。)

行ったことはuse節にVcl.graphcsを追加しただけです。
何か他にすることが有るようですが
もし、良ければ教えていただけませんでしょうか。


au  2015-05-25 20:17:12  No: 47299

エラーが投稿の通りなら綴りを間違ってるかと
Vcl.Graphics です。Vcl.Graphcsじゃないです。iが抜けてます


tor  2015-05-25 20:37:23  No: 47300

もっとも、ヨョヌヲサがなかったら他のヤテのメソッドも利用できていないはずなので、何かおかしいですね……
念のため確認ですが、
ヲサヲサチチィ中心のリ座標、中心のル座標、半径、開始角度、終了角度ゥサ
これは
ノアョョチチィョョョゥヲサとしていますか?
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイオィ月ゥ アアコウキコイク シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」 。。「。 ン

さん、アドバイスありがとございます。
確認しましたが節への定義はしっかり、
ヨョヌになっていました。
ファイルをどこかにインストール
しないといけないのですか?
そのファイルがどこにあるかもわからないのですが‥
スススススススススススススススススススススススススススススススススススススススス
ニコ 通りすがり
トコ イーアオッーオッイオィ月ゥ アウコアカコウキ  書込者ノト:ロ 」。 。 ン

最小限のソースを構成した上で、エラーメッセージをコピペするといいと思いますよ。
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイオィ月ゥ アカコイケコウケ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」 。。「 ン

通りすがりさん、お返事ありがとうございます。
以下がエラーメッセージとコードです。
ュュュュュュュュュュュュュュ
【エラーメッセージ】
ロ致命的エラーンヲサニヤョィキゥコヲサファイルヲサァヨョヌョァヲサが見つかりません

【コード】
ヲサニヤサ

ヲサヲサラャヲサヘャヲサモユャヲサヨャヲサテャヲサヌャヲサテャヲサニャ
ヲサヲサトャヲサモテャヲサナテャヲサヨョヌサ

ヲサヲサヤヤヲサスヲサィヤニゥ
ヲサヲサヲサヲサノアコヲサヤノサ
ヲサヲサヲサヲサツアコヲサヤツサ
ヲサヲサヲサヲサヲサツアティモコヲサヤマゥサ
ヲサヲサ
ヲサヲサヲサヲサヲサミヲサ宣言ヲサ
ヲサヲサ
ヲサヲサヲサヲサヲサミヲサ宣言ヲサ
ヲサヲササ

ヲサヲサヤコヲサヤヤサ

、メヲサェョ

ヲサヤヤョツアティモコヲサヤマゥサ

ヲサヲサ゜ャヲサ゜ャヲサ゜ヲサコヲサヤニサ
ヲサヲサャ゜ヲサコヲサモサ
ヲサヲサヲサコヲサノサ
ヲサヲサャヲサャヲサャヲサヲサコヲサモサ

ヲサヲサアャヲサイャヲサアャヲサイヲサコヲサノサ
ヲサヲサヲサコヲササ
ヲサヲサャヲサャヲサャヲサ゜ャヲサ゜ヲサコヲサモサ

ヲサヲサノアョテョミョモヲサヲサヲサコスヲサモサ
ヲサヲサノアョテョミョテヲサヲサヲサコスヲサツサ
ヲサヲサノアョテョツョモヲサコスヲサテサ
ヲサヲサノアョテョヘヤィーャヲサーゥサ
ヲサヲサノアョテョフヤィイーーャヲサーゥサ
ヲサヲサノアョテョフヤィイーーャヲサアーーゥサ
ヲサヲサノアョテョフヤィーャヲサアーーゥサ
ヲサヲサノアョテョフヤィーャヲサーゥサ

ヲサヲサノアョテョミョモヲサヲサヲサコスヲサモサ
ヲサヲサノアョテョミョテヲサヲサヲサコスヲサツサ
ヲサヲサノアョテョツョモヲサコスヲサテサ
ヲサヲサノアョテョナィオーャヲサオーャヲサアーーャヲサアーーゥサ
ヲサヲサノアョテョチチィアーャヲサアーャヲサオャヲサーャヲサアクーゥサ
ヲサヲサノアョメサ

サヲサ

゜゜゜゜゜゜゜゜゜゜ヲサヲサナモナヤヲサモヲサモヲサからの情報ャヲサウイルス定義データベースのバージョンヲサアアカキケヲサィイーアオーオイオゥヲサ゜゜゜゜゜゜゜゜゜゜

このメッセージはヲサナモナヤヲサモヲサモヲサによって検査済みです。

コッッュョ
スススススススススススススススススススススススススススススススススススススススス
ニコ 通りすがり
トコ イーアオッーオッイオィ月ゥ アカコエオコーキ  書込者ノト:ロ 」。 。 ン

ヌスヨョヌのエイリアスが指定されているようなので、単にからヨョヌを削除すればよさそうです。
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイオィ月ゥ アカコオオコアウ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」 。。「 ン

通りすがりさん、アドバイスありがとございます。
からヨョを削除してコンパイルすると
ロエラーンョィオイゥコ未定義の識別子コチチ
ロ致命的エラーンヘョィオイゥコニヤョユニットはコンパイルできませんでした。ヲサ

と表示されてしまいました。
何がおかしいのだろう??
私のおつむか。。。ヲサ
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーオッイオィ月ゥ アカコオケコーー  書込者ノト:ロ 」 ァ」ハノ

 ン

ヌとヨョヌを両方指定したら、本来は「識別子の多重定義」が出るはずです。
それが出なかったということは……これ、実はリナオでコンパイルしていないんじゃないですか?
(先頭のの書き方も、リナ以前のトのものですし)
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーオッイオィ月ゥ アキコークコイイ  書込者ノト:ロ 」 ァ」ハノ

 ン

ちなみに、リナ以前の例えばトキとかだとまだヤテョチチは存在しません。
いつから追加されたのか正確なところは知りませんが、手元のトのヘルプで
自分の使っているバージョンにその関数が存在するか確認することをおすすめします。
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイオィ月ゥ イーコエカコオー シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「。」 「  ン

さん、ご指摘ありがとうございます。

ご質問する時にバージョン入力を間違ってしまいました。
申し訳ありませんでした。
リナオでコンパイル出来ました。
トキではコンパイルできないわけですね。

チチ関数ですが上記のコードを実行すると
点ィーャーゥから点ィアーャアーゥまで線が引かれました。
線は引かず点ィアーャアーゥを中心に半径オで開始角度ー度から終了角度アクー度の
円弧を描けますかソ
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーオッイオィ月ゥ イアコーウコウエ  書込者ノト:ロ 「。ァ、 ン

円弧の部分だけが欲しいならチでいいんじゃないでしょうか。
ー度からアクー度なら要は水平ですから、計算も難しくないですし。
中心の座標をィャヲサゥ、半径をとしたら
リアスュャヲサルアスュャヲサリイスォャヲサルイスォヲサで
あとはヲサリウスリイャヲサリエスリアャヲサルウスルエスヲサとすればいいのかな?
逆になっちゃったらリウとリエを入れ換えで。
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイオィ月ゥ イイコアクコエア シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「。」 「  ン

さん、アドバイスありがとうございます。
開始角度と終了角度がー度、アクー度とは限らない為、
トファイルからデータィファイルの円弧データは
円弧の中心点、半径、開始角度、終了角度ゥを
取得してチチを使用したかったのですが
難しいですかね。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアオッーオッイオィ月ゥ イウコアオコオア  書込者ノト:ロ 「。ァ、 ン

一般化するなら
リウスォティ開始角度ゥェャヲサルウスォモィ開始角度ゥェ
リエスォティ終了角度ゥェャヲサルエスォモィ終了角度ゥェ
とすればいいです。一度作って関数にしてしまえば後は使いまわせますね。
モャヲサテヲサの引数はラジアン単位なので、トヤメで変換するのを忘れずに。
スススススススススススススススススススススススススススススススススススススススス
ニコ しんちゃん
トコ イーアオッーオッイカィ火ゥ アオコアイコオア シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「。」 「  ン
モコ 

さん、ご回答ありがとうございました。
お陰さまでようやくイメージしたようになりました。
初歩的なくだらない質問に最後まで
お付き合い頂きましてありがとうございます。
本当に助かりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加