DXライブラリ,座標軸の反転

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

DXライブラリ,座標軸の反転

#1

投稿記事 by 田中 » 12年前

田中です.
以前楕円を回転させて描画する方法について質問させていただきました.
ありがとうございました.
またDXライブラリについて質問です.

DXライブラリを用いて描画する際に,
・ 画面の左上を原点
・ 右方向がx軸正方向
・ 下方向がy軸正方向
というルールがあると思うのですが,これを
・ 画面の左下を原点
・ 右方向がx軸正方向
・ 上方向がy軸正方向
という風に設定変更する関数というのはございませんか?

描画関数のy座標を全て,
(画面の高さーy座標)
と書き換えれば良いと思うのですが,
いちいちそうするのも大変なので何か知恵をお借りできないかと思い質問させて頂きました.

よろしくお願い致します.

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

Re: DXライブラリ,座標軸の反転

#2

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

とりあえずバッファに描画して反転する方法を試してみましたが、これは文字がひっくり返るので失敗です。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1) return -1;//初期化と裏画面化

	int hDrawBuf=MakeScreen(640,480,FALSE);
	SetDrawScreen( hDrawBuf );

	while(ProcessMessage()==0 && ClearDrawScreen()==0) {


		DrawString(100,100,"(100,100)",GetColor(255,255,255));
		DrawString(300,100,"(300,100)",GetColor(255,255,255));
		DrawString(100,300,"(100,300)",GetColor(255,255,255));
		DrawString(300,300,"(300,300)",GetColor(255,255,255));



		SetDrawScreen( DX_SCREEN_BACK );
		DrawExtendGraph(0,480,640,0,hDrawBuf,FALSE);
        ScreenFlip();
        SetDrawScreen( hDrawBuf );
    }

    DxLib_End();
    return 0;
}
とりあえず、使用している描画関数のラッパを作るという案を提示します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

田中

Re: DXライブラリ,座標軸の反転

#3

投稿記事 by 田中 » 12年前

またまたみけ様,ありがとうございます.

>とりあえず、使用している描画関数のラッパを作るという案を提示します。
なるほど!ラッパというのググったら出てきました.

コード:

int	DrawLine2(int x1, int y1, int x2, int y2,int Color, int Thickness = 1 ){
	DrawLine(x1,-y1+screen_height,x2,-y2+screen_height,Color,Thickness);
	return 0;
}
こんな感じでDrawLineやDrawCircleを無事に反転させて描画することが出来るようになりました.
ただ以前作成していただいた,DrawOval2を反転させてもなんかうまくいかないです(´Д⊂
angleが悪さしているのかよくわからないんですけど,90°?回転しちゃいます.
どうしたらいいでしょうか?

コード:

int DrawOval2(int cx,int cy,int rx,int ry,int color,float angle,int thickness=1) {
    float sine,cosine;
    const int BUNKATU=512;
    float px,py;
    sine=sin(angle);
    cosine=cos(angle);
    px=cosine*rx;py=sine*rx;
    if(rx<0)rx=-rx;
    if(ry<0)ry=-ry;
    for(int i=1;i<=BUNKATU;i++) {
        float nowangle=i*2.0*DX_PI_F/BUNKATU;
        float rawx,rawy;
        float x,y;
        rawx=rx*cos(nowangle);
        rawy=ry*sin(nowangle);
        x=cosine*rawx-sine*rawy;
        y=sine*rawx+cosine*rawy;
        DrawLine(cx+(int)px,cy+(int)py,cx+(int)x,cy+(int)y,color,thickness);
        px=x;py=y;
    }
    // エラーチェック省略
    return 0;
}
失敗してるやつ↓

コード:

int DrawOval3(int cx,int cy,int rx,int ry,int color,float angle,int thickness=1){
	DrawOval2(cx,screen_height-cy,rx,ry,color,angle,thickness);
	return 0;
}

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

Re: DXライブラリ,座標軸の反転

#4

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

コード:

int DrawOval3(int cx,int cy,int rx,int ry,int color,float angle,int thickness=1){
    DrawOval2(cx,screen_height-cy,rx,ry,color,-angle,thickness);
    return 0;
}
としてみてください。(angleの符号を反転)
(未検証です。失敗したらごめんなさい)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

田中

Re: DXライブラリ,座標軸の反転

#5

投稿記事 by 田中 » 12年前

みけCAT先生

ありがとうございました.
無事に解決致しました.
また何かありましたらよろしくお願い致します.

閉鎖

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