ページ 1 / 1
DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 14:24
by いろは193102
質問内容は件名の通りです。
以下のようなプログラムを書いてみましたが、どうしても図形が点々として不格好になってしまいます。
点の数をもっと増やしてより綺麗な図形を作りたいのですが、どうかアドバイスお願いします。
コード:
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if( DxLib_Init() == -1 )
{
return -1;
}
int a=5,b=6;
int y=0,x=0,y1=0,x1=0,i=0,cr;
cr=GetColor(255,255,255);
for(i=1;i<360;i++){
y=(int)(200*sin((double)i*3.14159/180*a));
x=(int)(200*sin((double)i*3.14159/180*b));
DrawPixel(x+300,250-y,cr);
}
WaitKey() ;
DxLib_End() ;
return 0 ;
}
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 16:19
by YuO
いろは193102 さんが書きました:点の数をもっと増やしてより綺麗な図形を作りたいのですが、どうかアドバイスお願いします。
そうしたいのであれば,その通りにやれば良いと思うのですが……。
点の数は,結局の所ループの回数で決定されます。なので,
いろは193102 さんが書きました:コード:
for(i=1;i<360;i++){
y=(int)(200*sin((double)i*3.14159/180*a));
x=(int)(200*sin((double)i*3.14159/180*b));
DrawPixel(x+300,250-y,cr);
}
このループの回数を増やせばよいです。
ただし,iはループ回数だけでなく角度にも使われているので,その分の補正が必要になります。
例えば,上限を360でなく3600と10倍にしたならば,角度として与える値はiの代わりに10分の1の値,つまりは(i/10.0)にする必要があります。
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 17:41
by みけCAT
オフトピック
いろは193102 さんが書きました:DxLibのDrawPixelでリサージュ図形を描きたいです。
ということなので、DrawLineを使って線で補間してはいけないのですね。
The XY Problemの疑いがあるとか無いとか…?
【追記】「より綺麗な図形を作りたい」という目的が書かれているので、The XY Problemとは若干違いそうですね。
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 18:51
by C6b14
これは 5つ山 6つ山 の 正弦波 の ( オシロスコープ的 ) 合成 に なります。
http://csi.nisinippon.com/r.png
コード:
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1)
{
return -1;
}
/////
int a = 5, b = 6;
int y = 0, x = 0, y1 = 0, x1 = 0, i = 0, cr;
cr = GetColor(255, 255, 255);
for (x = 0; x < 640; x++) { DrawPixel(x, 250, GetColor(0, 255, 0)); }//X軸
for (y = 0; y < 480; y++) { DrawPixel(300, y, GetColor(0, 255, 0)); }//Y軸
for (i = 1; i<360; i++) {
y = (int)(200 * sin((double)i*3.14159 / 180 * a));
x = (int)(200 * sin((double)i*3.14159 / 180 * b));
DrawPixel(x + 300, 250 - y, cr);
DrawPixel(x + 300, 480-450 + i, GetColor(255, 0, 0)); // x 正弦波
DrawPixel((640-600)/2 +i, 250 , GetColor(0, 255,0)); // 緑軸 = x 軸
DrawPixel((640-600)/2 +i, 250 - y, GetColor(0, 255, 0)); // y 正弦波
}
/////
WaitKey();
DxLib_End();
return 0;
}
他の方も 言われている いるように "点” では 無理でしょう。 やはり 線で描いて補正 するしかない と思います。
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 19:19
by C6b14
正確に 位置を 計算してないので 正弦波 の位置がずれてます。640x480 の空間に 300,250 を 中心に 振幅 -200~200 の 正弦波 で は?。320,240 を 中心にして 振幅 -240~240 の方がいいでしょう。
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月25日(金) 19:43
by C6b14
過去ログ に 誰か C++ で かかれて たような。 画面 をおおきく 使って for 回数 を増やす とこまで はやっていません。
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2016年11月26日(土) 12:11
by Egg
YuOさんの言う通りに点増やせば、きれいに表示されますよ。
点10,000個
これじゃダメなんですか?
Re: DxLibのDrawPixelでリサージュ図形を描きたいです。
Posted: 2017年1月20日(金) 10:58
by いろは193102
みなさん、多くのご返答ありがとうございました。
返答が遅れてしまいまして誠に申し訳ありません。
プログラムに関する問題は、for文のループ回数を定める変数iの上限と変数x,yの角度を定める変数iの値を反比例的に変化させる事で解決致しました。
ただいま、美しい図形を目にして感動しております。本当にありがとうございます。