DxLibのDrawPixelでリサージュ図形を描きたいです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いろは193102

DxLibのDrawPixelでリサージュ図形を描きたいです。

#1

投稿記事 by いろは193102 » 8年前

質問内容は件名の通りです。
以下のようなプログラムを書いてみましたが、どうしても図形が点々として不格好になってしまいます。
点の数をもっと増やしてより綺麗な図形を作りたいのですが、どうかアドバイスお願いします。

コード:

#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 ;
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#2

投稿記事 by YuO » 8年前

いろは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)にする必要があります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#3

投稿記事 by みけCAT » 8年前

オフトピック
いろは193102 さんが書きました:DxLibのDrawPixelでリサージュ図形を描きたいです。
ということなので、DrawLineを使って線で補間してはいけないのですね。

The XY Problemの疑いがあるとか無いとか…?
【追記】「より綺麗な図形を作りたい」という目的が書かれているので、The XY Problemとは若干違いそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#4

投稿記事 by C6b14 » 8年前

これは 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;
}
他の方も 言われている いるように "点” では 無理でしょう。 やはり 線で描いて補正 するしかない と思います。

C6b14

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#5

投稿記事 by C6b14 » 8年前

正確に 位置を 計算してないので 正弦波 の位置がずれてます。640x480 の空間に 300,250 を 中心に 振幅 -200~200 の 正弦波 で は?。320,240 を 中心にして 振幅 -240~240 の方がいいでしょう。

C6b14

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#6

投稿記事 by C6b14 » 8年前

過去ログ に 誰か C++ で かかれて たような。 画面 をおおきく 使って for 回数 を増やす とこまで はやっていません。

Egg

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#7

投稿記事 by Egg » 8年前

YuOさんの言う通りに点増やせば、きれいに表示されますよ。
点10,000個


これじゃダメなんですか?

いろは193102

Re: DxLibのDrawPixelでリサージュ図形を描きたいです。

#8

投稿記事 by いろは193102 » 8年前

 みなさん、多くのご返答ありがとうございました。
 返答が遅れてしまいまして誠に申し訳ありません。
 プログラムに関する問題は、for文のループ回数を定める変数iの上限と変数x,yの角度を定める変数iの値を反比例的に変化させる事で解決致しました。
 ただいま、美しい図形を目にして感動しております。本当にありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る