Arcの最初の引数に、負の数を設定すると、
円は正しく描画されるのですが、
始点と終点の設定がうまくできなくなります。
負の値を設定できないと、書きたいところに弧を描けません。
どうすれば良いのでしょうか。
ちなみにWINAPIのarcでも同様です。
わたしはその辺、ほとんど知りませんけど、
確か、終点が描画されないとか、そんな仕様があると聞いた気がします。
WindowsAPIのものとTCanvasのメソッドのものはおんなじ物なので、
APIの仕様は、Canvasのメソッドでも変わらずです。
終点にSetPixelとかで点を打つとか…。
終点が描画されないのではなくて、始点がある位置に固定されてしまいます。
また終点の位置もでたらめです。描きたいのは「C」
を短くしたような太さのある帯です。
負の値が必要ということは、Canvasの座標系を変更したのでしょうか。
たとえば、
Canvas.Arc(0, 0, 50, 100, 50, 0, 50, 100);
とすればCの形になりますよ。
# w=50, h=100のサイズになります
負の値を与えなければならない理由はありますか?
x1,y1,x2,y2で指定した矩形の中心が(0,0)より負の領域にあるということでしょうか。
もう1つ。
もし、自前で書きたいのであれば、ブレゼンハムや、ミッチェナーのアルゴリズムを用いると高速に楕円を描画できます。
# 整数のみで円・楕円・直線を書くことができます。
」「ブレゼンハム」「ミッチェナーで検索してみてください。いろいろ出てきます。
素人考えだと、ただ、"丸を書いて右側に穴を開ければいいじゃん"なんておもうんですけど…。
角度が違うのなら、穴を開ける代わりに扇形を書くとかでもいいし…。
背景が透過されないのが気になるのなら、TransParentをTrueにしたTBitmapを使えばいいですし。
いろいろ考えてくださってありがとうございます。
説明がまずかったようですが、描きたいのは、「C」というより「(」に近いもので、あんまり曲がってないものです。
そうするとx1,y1,x2,y2で指定した矩形の中心が正であっても、x1が負になると思うのですが。
ならばなおさら、円を描いて不要な部分を消したほうがいいような気がするんですけど…。
ああ、しつこいですね^^;
ところで、それだと負数になるとか以前に、そもそも円ではないので、Arcでは描けないのではないでしょうか?
(半円だとか、1/4円だとかいうのなら、上のように円を書いてから不要部分を消したほうがらくだと思いますけど)
曲線を描くのならなんだかもう少し簡単な方法があるような気がしますけど…、
Arcじゃなきゃできませんか?
描けます。(こちらこそひつこくてすみません(^_^))
円はキャンバスのぎりぎりまで描かれています。その円の円周から円に沿って外側に一部分だけ「(」を書きたい訳です。(つまりキャンバスより大きな四角形に内接する円の一部。)
とりあえず不要な部分を消す方向で考えてみたいと思います。
クリッピング、というものを使えば描画範囲を制限できるんですよね。
それでやってみたいと思います。
> そうするとx1,y1,x2,y2で指定した矩形の中心が正であっても、x1が負になると思うのですが。
なりません。
中心が正であれば、X=0の軸、Y=0の軸上の点を指定すれば負の数にはなりませんから。
# 矩形に沿って指定する必要はありませんので
(のような形というと、y1の値が負数ですよね。これを0にするように描画して、後から移動するというのが簡単です。クリッピングも同じような考えです。
移動する、というとどのような方法があるのでしょうか。
arcのリージョンを作成することはできないようですし、パスをregionに変換するにもarcはパスの中ではwin95などでは使えないようです。(当方はWin2000ですが。)
教えていただけるとありがたいです。
移動だと語弊がありますね。すみません。
複写のことです。
バッファ用キャンバスを用意して、そちらに書いておき、必要な箇所を描画したい位置にコピーします。
もし、描画したい位置に画像があるなら、さきにその部分をバッファにコピーして、それからArcで描画し、コピーすればOKでしょう。
難しい事しなくても、本当に出来ませんか?
例えば、にしのさんの例を-20移動させてArc(-20,0,30,100,30,0,30,100)としても
同じ形で描かれますけど、、、、。
canvas.Arc(-x1 div 2, ....)
を
canvas.Arc(-(x1 div 2), ....)
としたら、-のパラメータでもOKでした。お騒がせしました。
たかみちえさん、にしのさん、Takuさんどうもありがとうございました。
ところで、一番目の表記の仕方はなぜいけないのでしょうか。delphi初心者なのでよくわからないんですが。
x1の型と値はなんでしょうか。
こちらでは問題なく動いています。
# delphi5, winxp pro
環境依存かもしれませんので、環境も教えてください。
環境はdelphi7,win2000です。
x1は今までintegerだと思ってましたが、byte型です。
integerにすれば問題ありませんでした。
最初からbyteをintegeのように使わない方が良かったのかも知れません。
ありがとうございました。
編集 削除