Re: 円を描画する新しい関数の要望 ( No.1 ) |
- 名前:管理人 日時:2016/07/25 02:34
↓こちらのような記述で「矩形の範囲内に入る最大の楕円」が描画できます
DrawOval( 矩形の中心X座標, 矩形の中心Y座標, 矩形の幅, 矩形の高さ, GetColor( 255,255,255 ), TRUE ) ;
よろしければお試しください
|
Re: 円を描画する新しい関数の要望 ( No.2 ) |
- 名前:てきやく 日時:2016/07/25 02:57
ご返答ありがとうございます。
しかしDrawOval関数では、中心座標の関係で直径が偶数になる楕円が描画できません。
|
Re: 円を描画する新しい関数の要望 ( No.3 ) |
- 名前:管理人 日時:2016/07/30 02:42
ご返信が遅くなり申し訳ありません
> しかしDrawOval関数では、中心座標の関係で直径が偶数になる楕円が描画できません。
確かに…
アンチエイリアス付きの楕円描画関数である DrawOvalAA は座標や半径を float 型で指定できるので
直径が偶数になる楕円の描画もできます
// 楕円を描画する( アンチエイリアス付き )
// x, y : 中心座標
// rx, ry : 横と縦の半径
// posnum : 何角形で円を表現するか、の値( 本関数は多角形を使用した擬似的な円の描画なので、この値が大きいほど円に近づきます )
// Color : 色( GetColor で取得できる値 )
// FillFlag : 塗りつぶすかどうか( TRUE:塗りつぶす FALSE:塗りつぶさない )
// LineThickness : FillFlag が FALSE の場合の線の太さ( 1.0f 未満にはできません )
int DrawOvalAA( float x, float y, float rx, float ry, int posnum, unsigned int Color, int FillFlag, float LineThickness = 1.0f ) ;
こちらで問題ないでしょうか?
|
Re: 円を描画する新しい関数の要望 ( No.4 ) |
- 名前:てきやく(解決) 日時:2016/07/30 05:48
動作を確認してみたところこちらの環境ではなぜか、座標を整数で指定した場合はドットとドットの間、○.5で指定した場合は通常と同じくドットの中心が円の中心になるという描画がされました。
ただ、配布するなどといった予定もありませんし、今回の用途ではこちらの関数を補正しつつ使用したいと思います。
ご回答ありがとうございました。
(もし余裕がありましたら、ソフトウェアレンダリングモードでも動作する関数として今後追加いただければありがたいです。)
|
Re: 円を描画する新しい関数の要望 ( No.5 ) |
- 名前:管理人 日時:2016/08/01 02:50
|
Re: 円を描画する新しい関数の要望 ( No.6 ) |
- 名前:てきやく(解決) 日時:2016/08/01 10:22
更新版ありがとうございます。
アンチエイリアスなしのものと同じ位置に描画されることを確認しました。
FillFlagをTRUEにしていても縁の分ですこし大きく描画されますが、これは仕様ですよね。(FillFlagがFALSEの場合と同じ大きさになります)
> この関数をソフトウエアレンダリングで実現するには……
いえ、ソフトウエアレンダリングモードでも使用できるようにと追加を要望したのは、
「指定した矩形の範囲内に入る最大の楕円を描画する関数(アンチエイリアシングなし)」のほうです。
紛らわしい書き方をして申し訳ありません。
アンチエイリアス付きの関数がソフトウエアレンダリング側に存在しない理由はよくわかりました。
|
Re: 円を描画する新しい関数の要望 ( No.7 ) |
- 名前:管理人 日時:2016/08/07 04:29
> FillFlagをTRUEにしていても縁の分ですこし大きく描画されますが、これは仕様ですよね。(FillFlagがFALSEの場合と同じ大きさになります)
はい、DrawCircle や DrawOval と全く同じ大きさに描画されるように調整しています
( 例えば、以下のように記述した場合、アンチエイリアス描画による差異を除いてはほぼ重なるようになっています )
DrawOval( 100, 100, 32, 24, GetColor( 255,255,255 ), TRUE ) ;
DrawOvalAA( 100.0f, 100.0f, 32.0f, 24.0f, 128, GetColor( 0,255, 0 ), TRUE ) ;
> いえ、ソフトウエアレンダリングモードでも使用できるようにと追加を要望したのは、
> 「指定した矩形の範囲内に入る最大の楕円を描画する関数(アンチエイリアシングなし)」のほうです。
やはりアンチエイリアス版では役不足でしたか… (・・;
DrawCircle と DrawOval のソースを確認してみたところ、奇数直径の円の描画もそれほど手間なく
実装できそうだったので、ご所望の関数を追加してみました
よろしければこちらのバージョンをダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
以下の関数を追加しました
// 指定の矩形に収まる円( 楕円 )を描画する
int DrawOval_Rect( int x1, int y1, int x2, int y2, unsigned int Color, int FillFlag ) ;
注釈の通り x1, y1 を矩形の左上座標、x2, y2 を矩形の右下座標とした場合の、その矩形にすっぽり
収まる円( 楕円 )を描画します
( 因みに x2, y2 については DrawBox などと同じように描かれる範囲は x2 - 1, y2 - 1 となります )
丁度以下のような記述をした場合に DrawBox で描画した矩形の上下左右の端にぴったり収まる円が
描画されるようになっています
DrawBox( 10, 10, 100, 100, GetColor( 255,255,255 ), TRUE ) ;
DrawOval_Rect( 10, 10, 100, 100, GetColor( 255,255,255 ), FALSE ) ;
よろしければお試しください m(_ _)m
|
Re: 円を描画する新しい関数の要望 ( No.8 ) |
- 名前:てきやく(解決) 日時:2016/08/09 18:21
実装ありがとうございます!
正しく動作することも確認できました。
指定した大きさによっては他の画像編集ソフトウェアなどと描画結果が食い違うこともありましたが、
そのようなソフトウェアは(理想の)円の縁がピクセルの端部を通る実装なのに対し、
DXライブラリはピクセルの中央を通る実装なのだろうということで納得しました。
|
|