【課題】直線を回転させる

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

【課題】直線を回転させる

#1

投稿記事 by エース » 13年前

下記のようにプログラムを書いたのですが直線が短くなったり長くなったり上下に動いたりして回転してくれません。
指定した軸を中心にくるくると回転させたいのですがどうすればいいでしょうか。

計算式はここを参考にしました
http://imagingsolution.blog107.fc2.com/ ... y-111.html

コード:

#define PI	3.1415926535897932384626433832795f
#include "DxLib.h"
#include <math.h>


    //x1 , y1 : 描画する線の起点座標
    //x2 , y2 : 描画する線の終点座標
    //Cx , Cy  :  軸
    //degree   :  角度
	int Turn_Line(int x1, int y1, int x2, int y2, int Cx, int Cy, int degree){

		double rad = degree * PI / 180.0;
		
		int X1 = x1*cos(rad)-y1*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
		int Y1 = y1*sin(rad)+y1+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);
		int X2 = x2*cos(rad)-y2*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
		int Y2 = y2*sin(rad)+y2+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);

		DrawLine( X1, Y1, X2, Y2, -1, 2 ) ; 
		
		return 0;
	
	}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

    SetDrawScreen( DX_SCREEN_BACK );

    int i=0;

	while(!ProcessMessage() && !ClearDrawScreen()){

		Turn_Line(100, 100, 200, 100, 150, 100, i);
		ScreenFlip();
		i++;
    }
    DxLib_End();
    return 0;
}

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

Re: 【課題】直線を回転させる

#2

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

まず、x1,y1,x2,y2を-cx,-cyだけずらします。
ずらした座標を原点を中心に回転させます。
回転させた座標をcx,cyずらして戻します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

エース

Re: 【課題】直線を回転させる

#3

投稿記事 by エース » 13年前

変な回転になってしまいました。
回転というより短くなったり長くなったりかな?

コード:

#define PI	3.1415926535897932384626433832795f
#include "DxLib.h"
#include <math.h>


    //x1 , y1 : 描画する線の起点座標
    //x2 , y2 : 描画する線の終点座標
	//Cx , Cy  :  軸
    //degree   :  角度
	int Turn_Line(int x1, int y1, int x2, int y2, int Cx, int Cy, int degree){

		double rad = degree * PI / 180.0;
		
		int X1 = (x1-Cx)*(cos(rad)-sin(rad))+Cx;
		int Y1 = (y1-Cy)*(sin(rad)+cos(rad))+Cy;
		int X2 = (x2-Cx)*(cos(rad)-sin(rad))+Cx;
		int Y2 = (y2-Cy)*(sin(rad)+cos(rad))+Cy;

		DrawLine( X1, Y1, X2, Y2, -1, 2 ) ; 
		
		return 0;
	
	}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

    SetDrawScreen( DX_SCREEN_BACK );

    int i=0;

	while(!ProcessMessage() && !ClearDrawScreen()){

		Turn_Line(100, 100, 200, 100, 150, 100, i);
		ScreenFlip();
		i++;
    }
    DxLib_End();
    return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【課題】直線を回転させる

#4

投稿記事 by softya(ソフト屋) » 13年前

元の式と全然違ってしまっています。
int X1 = x1*cos(rad)-y1*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);

int X1 = (x1-Cx)*(cos(rad)-sin(rad))+Cx;

yはどこへ?

cx,cyの計算と回転は分けて書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エース

Re: 【課題】直線を回転させる

#5

投稿記事 by エース » 13年前

こうゆうことでしょうか?
でもこうすると直線自体が回転しません。

コード:

#define PI  3.1415926535897932384626433832795f
#include "DxLib.h"
#include <math.h>
 
 
    //x1 , y1 : 描画する線の起点座標
    //x2 , y2 : 描画する線の終点座標
    //Cx , Cy  :  軸
    //degree   :  角度
    int Turn_Line(int x1, int y1, int x2, int y2, int Cx, int Cy, int degree){
 
        double rad = degree * PI / 180.0;
        x1=x1-Cx;
		y1=y1-Cy;
		x2=x2-Cx;
		y2=y2-Cy;
        int X1 = x1*cos(rad)-y1*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
        int Y1 = y1*sin(rad)+y1+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);
        int X2 = x2*cos(rad)-y2*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
        int Y2 = y2*sin(rad)+y2+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);
        
		X1=X1-Cx;
		Y1=Y1-Cy;
		X2=X2-Cx;
		Y2=Y2-Cy;

        DrawLine( X1, Y1, X2, Y2, -1, 2 ) ; 
        
        return 0;
    
    }
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
 
    SetDrawScreen( DX_SCREEN_BACK );
 
    int i=0;
 
    while(!ProcessMessage() && !ClearDrawScreen()){
 
        Turn_Line(100, 100, 200, 100, 150, 100, i);
        ScreenFlip();
        i++;
    }
    DxLib_End();
    return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【課題】直線を回転させる

#6

投稿記事 by softya(ソフト屋) » 13年前

回転式にCx、Cyが出てくるのは間違いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エース

Re: 【課題】直線を回転させる

#7

投稿記事 by エース » 13年前

有難うございます。
これでよかったです。

コード:

#define PI  3.1415926535897932384626433832795f
#include "DxLib.h"
#include <math.h>
 
 
    //x1 , y1 : 描画する線の起点座標
    //x2 , y2 : 描画する線の終点座標
    //Cx , Cy  :  軸
    //degree   :  角度
    int Turn_Line(int x1, int y1, int x2, int y2, int Cx, int Cy, int degree){
 
        double rad = degree * PI / 180.0;
        x1=x1-Cx;
        y1=y1-Cy;
        x2=x2-Cx;
        y2=y2-Cy;
        int X1 = x1*cos(rad)-y1*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
        int Y1 = y1*sin(rad)+y1+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);
        int X2 = x2*cos(rad)-y2*sin(rad)+Cx-Cx*cos(rad)+Cy*sin(rad);
        int Y2 = y2*sin(rad)+y2+cos(rad)+Cy-Cx*sin(rad)-Cy*cos(rad);
        
        X1=X1-Cx;
        Y1=Y1-Cy;
        X2=X2-Cx;
        Y2=Y2-Cy;
 
        DrawLine( X1, Y1, X2, Y2, -1, 2 ) ; 
        
        return 0;
    
    }
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
 
    SetDrawScreen( DX_SCREEN_BACK );
 
    int i=0;
 
    while(!ProcessMessage() && !ClearDrawScreen()){
 
        Turn_Line(100, 100, 200, 100, 150, 100, i);
        ScreenFlip();
        i++;
    }
    DxLib_End();
    return 0;
}

閉鎖

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