トップページ > 記事閲覧
DrawLine関数について
名前:てきやく 日時: 2016/01/30 17:09

いくつもトピックを作ってしまい申し訳ありませんが、また不具合と思われるものの報告です。 DrawLine関数を使用して斜めの線を引いた際の挙動に違和感があります。 以下の検証用コードは (400,300)を中心にした半径240の円の90°区切り以外の点から線を中心に向かって引くものです。 #define _USE_MATH_DEFINES #include <cmath> #include "DxLib.h" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); SetUse3DFlag(FALSE); if (SetBackgroundColor(255, 255, 255) == -1 || DxLib_Init() == -1)return -1; for(int i = 1; i < 360; i++)if(i % 90 != 0)DrawLine(int(400+cos(M_PI*i/180)*240), int(300+sin(M_PI*i/180)*240), 400, 300, GetColor(0, 0, 0)); WaitKey(); DxLib_End(); return 0; } スクリーンショット fastpic.jp/images.php?file=2517347287.png 期待通りの動作ならば中心付近は(400,300)の1ドットを除いて全て黒くなると思うのですが、いかがでしょうか?
メンテ

Page: 1 |

Re: DrawLine関数について ( No.1 )
名前:管理人 日時:2016/01/31 23:13

ご指摘ありがとうございます ソフトウエアレンダリング時の DrawLine の処理に一部誤りがありました 修正版をアップしましたので、よろしければお試しください 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)」をして下さい)
メンテ
Re: DrawLine関数について ( No.2 )
名前:てきやく 日時:2016/02/01 20:34

上記の件に関しては修正されていることを確認できました、ありがとうございます。 いろいろと試していると、Thicknessが2以上の場合に不具合と思われるものを発見しました。 一部ドットが欠けるというものと、描画する方向によって始点・終点と描画される線の関係性が変わるというものです。 以下は検証コードです #include "DxLib.h" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); SetUse3DFlag(FALSE); if(SetBackgroundColor(255, 255, 255) == -1 || DxLib_Init() == -1)return -1; int x1, y1; int dx, dy; x1 = 12; y1 = 6; dx = 6; dy = 6; for(int i = 0; i < 6; i++){ // 右下へ向かう線を描画 DrawPixel(x1+dx, y1+dy, GetColor(255, 0, 0)); // 目的地点に赤い点を描画 DrawLine( x1, y1, x1+dx, y1+dy, GetColor(0, 0, 0), i + 1); DrawPixel(x1, y1, GetColor(0, 255, 0)); // 始点に重ねて緑の点を描画 x1 += 20; } x1 = 12; y1 = 26; dx = -6; dy = 6; for(int i = 0; i < 6; i++){ // 左下へ向かう線を描画 DrawPixel(x1+dx, y1+dy, GetColor(255, 0, 0)); // 目的地点に赤い点を描画 DrawLine( x1, y1, x1+dx, y1+dy, GetColor(0, 0, 0), i + 1); DrawPixel(x1, y1, GetColor(0, 255, 0)); // 始点に重ねて緑の点を描画 x1 += 20; } WaitKey(); DxLib_End(); return 0; } スクリーンショット fastpic.jp/images.php?file=2845735333.png
メンテ
Re: DrawLine関数について ( No.3 )
名前:管理人 日時:2016/02/02 02:56

太さが2以上の線分の描画機能はおまけのようなものなので、1ピクセル単位の精度はありません 1ピクセル単位の精度を持つ『太さが2以上の線分の描画機能』を実現するにはコードを1から 作り直さなければいけないのですが、今のところその作業をする予定はありません なので、申し訳ありませんが太さが2以上の線分については現状が仕様となります m(_ _;m
メンテ
Re: DrawLine関数について ( No.4 )
名前:てきやく(解決) 日時:2016/02/02 19:27

承知いたしました。 精密な太い線を書かなければならない用があるわけではないので問題ありません。 ご回答ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存