トップページ > 記事閲覧
DrawQuadrangleAAの結果がずれて描画されてしま
名前:にこよう 日時: 2019/09/15 20:59

こんにちは、いつもお世話になっております。 二つの DrawQuadrangleAA を描画すると一片が重なって描画されてしまいます mの中に2が格納されているので、二つの図形の距離は2ピクセルの隙間を持っているはずなのですが... float a, b, c, d, e, f, g, h; a = 109.17f; b = 125.0f; c = 117.60f; d = 156.63f; e = 126.04f; f = 125.00f; g = 117.60f; h = 93.34f; float i = 8.95134163f; float j = 33.5675316f; float k = i - (e - c); // 隙間(x) float l = j - (d - b); // 隙間(y) float m = sqrtf(k*k + l*l); // 二つの四角同士の距離 DrawQuadrangleAA(a, b, c, d, e, f, g, h, col.white, FALSE); DrawQuadrangleAA(a + i, b - j, c + i, d - j, e + i, f - j, g + i, h - j, col.white, FALSE);
メンテ

Page: 1 |

Re: DrawQuadrangleAAの結果がずれて描画されてしま ( No.1 )
名前:管理人 日時:2019/09/16 03:29

すみません、sqrt で二つの四角の距離を計算する、という部分について理解できていないのですが とりあえず重なっている頂点( 左下側の四角形の上の頂点と右上側の四角形の左の頂点、 左下側の四角形の右の頂点と右上側の四角形の下の頂点 )の座標はそれぞれ 左下側の四角形の上の頂点 x = 117.599998 y = 93.3399963 右上側の四角形の左の頂点 x = 118.121338 y = 91.4324646 左下側の四角形の右の頂点 x = 126.040001 y = 125.000000 右上側の四角形の下の頂点 x = 126.5551338 y = 123.062469 となっていて、縦方向には2ピクセルぶん隙間がありますが、斜めの線となっているので 斜め線同士の距離は1ピクセルとなり、接している状態となります ( DrawQuadrangleAA ではなく DrawQuadrangle で描画すると、隙間の無いぴったり接する描画結果となります ) そして、すみません、AA系の関数はジャギを無くして綺麗に見せることが主な目的となっていて、 描画結果の正確さはAA無しの通常の描画関数より劣り、±1ピクセル程度の誤差が発生します ( 特に DrawQuadrangleAA は線で描かれた四角形の画像を変形させて描画する方式なので、誤差が大きくなります ) なので、正確な描画結果を得たい場合は AA 無しの関数を使用してください m(_ _;m
メンテ
Re: DrawQuadrangleAAの結果がずれて描画されてしま ( No.2 )
名前:にこよう 日時:2019/09/16 12:05

変数や説明が分かりにくくてすみませんm(__)m 少し検証してみたので補足させてください.... 結論だけ書くと反時計回りに指定すると思ったような描画をできないのですが、時計回りにすると数値通りの(期待通りの) 図形を描画することが出来るのだと思います お手数ですが、一度abとefの数値を入れ替えて描画してみていただけないでしょうか? 変数mについては、kとlが図形同士のx,y軸に沿った距離を表しており、それを直角三角形として斜辺を求めることで図形同士の最短距離が求めているつもりです >( DrawQuadrangleAA ではなく DrawQuadrangle で描画すると、隙間の無いぴったり接する描画結果となります ) float型の値なので、切り詰められて少しだけ隙間が狭くなってしまったのだと思います。 あと、塗りつぶしフラグを立てると何故か隙間ができてしまいます
メンテ
Re: DrawQuadrangleAAの結果がずれて描画されてしま ( No.3 )
名前:管理人 日時:2019/09/17 06:09

検証ありがとうございます > お手数ですが、一度abとefの数値を入れ替えて描画してみていただけないでしょうか? おお、確かに 思えば処理自体も時計回りで座標が指定されることを想定したものとなっているので、 時計回りに座標が指定された場合は誤差が少なくなるのだと思います なので、反時計回りの座標が指定された場合は時計回りの座標の指定に置き換える処理を加えてみました https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) なので↑のバージョンでは反時計回りの座標が指定された場合も時計回りで座標を指定した場合と同等の精度で描画されます > 変数mについては、kとlが図形同士のx,y軸に沿った距離を表しており、それを直角三角形として斜辺を求めることで図形同士の最短距離が求めているつもりです すみません、考えてみたのですが、図解していただかないと理解は難しそうです… > あと、塗りつぶしフラグを立てると何故か隙間ができてしまいます こちらはこちらで、にこようさんも仰られている通り float型の値を int型に変換された状態で 描画されるので、小数部が削られてしまったことによる誤差が発生しているのだと思います
メンテ
Re: DrawQuadrangleAAの結果がずれて描画されてしま ( No.4 )
名前:にこよう (解決) 日時:2019/09/18 01:54

>なので↑のバージョンでは反時計回りの座標が指定された場合も時計回りで座標を指定した場合と同等の精度で描画されます 修正ありがとうございます、ほぼほぼイメージ通りの図形を描画することが出来ましたm(__)m 変数の意味はおそらくもう不要だと思うのでこれで解決とさせていただきます (説明等下手ですみません(-_-;))
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存