エディタ製作日記1030

アバター
TOMY
記事: 53
登録日時: 11年前
住所: 愛知県
連絡を取る:

エディタ製作日記1030

投稿記事 by TOMY » 10年前

早朝に大急ぎで完成させたプログラム。
気づいたら相当夜中まで組んでたので慌てて寝て朝に組んでみた。まだ実験してないので正しいか分からない。
今日もまた残業だよ・・・・

CODE:

 //保持しているチェックポイント情報から自動でコースのデータ(左右の壁の情報となる点座標)を作成。
 void CourseData::CreateCourse(){
	 D3DXVECTOR2	AB,BC;			//生成に必要となる線分ベクトル2本分
	 D3DXVECTOR2	VecAdd;			//法線っていうか2つのベクトルの外積の解
	 float			theta;			//条件式の比較用にいる角度(radian)
	 int			count = 0;		//現在生成中の要素番号カウント用。
	while((m_UseCPCount >= 3) && (count < (m_UseCPCount - 2) )){		//最低3点以上の情報がある場合にのみマップを自動生成。もう一つの条件は生成用のカウントがオーバーフローをしないため。
		
		//まず3点抽出し、2本の線分ベクトルを作る。
		AB = m_CheckPoint[count + 1] - m_CheckPoint[count];
		BC = m_CheckPoint[count + 2] - m_CheckPoint[count + 1];

		//正規化して計算しやすくする
		D3DXVec2Normalize(&AB, &AB);
		D3DXVec2Normalize(&BC, &BC);

		//2つのベクトルの角度(ラジアン)を求める
		theta = acos(D3DXVec2Dot(&AB,&BC));							//角度
		if(D3DXVec2Add(&VecAdd,&AB,&BC) < 0) theta = theta * (-1);	//左の条件にあってたら角度は-


		//2つのなす角が90°(2分のπ)以下なら点座標は垂直ではなく、2つのなす角の中間。(バグを防ぐための例外処理)
		if(fabs(theta) <  (PI / 2)){			//求めている角度自体 ±0~PI までなので絶対値で確認。
			theta = theta / 2;					//現在の角度の半分
		}else{
			theta = PI / 2;						//90°以上なら垂直(90°)な位置に点座標をおく。
		}

		//作成したベクトルを条件に合わせてまず回転させる
		D3DXVECTOR2 OldABVec = AB;
		
		//右の壁
		m_RightWallPoint[count].x = OldABVec.x * cos(theta) - OldABVec.y * sin(theta) * m_CPWidth[count];	//シメにチェックポイントごとの幅の長さを掛ける。
		m_RightWallPoint[count].y = OldABVec.x * sin(theta) + OldABVec.y * cos(theta) * m_CPWidth[count];	

		//左の壁
		m_LeftWallPoint[count].x = OldABVec.x * cos(theta) - OldABVec.y * sin(theta) * (-m_CPWidth[count]);	//反対側には-の幅の長さを掛ける。
		m_LeftWallPoint[count].y = OldABVec.x * sin(theta) + OldABVec.y * cos(theta) * (-m_CPWidth[count]);	

		count++;
	}
	//最後に周回コースか、片道コースかのフラグを元に終点も座標を確定する。周回コースなら始点へ。
	if(m_LoopFlg){
		//ループなら座標は始点へ戻る。
		AB = m_CheckPoint[count + 1] - m_CheckPoint[count];
		BC = m_CheckPoint[0] - m_CheckPoint[count + 1];

		D3DXVec2Normalize(&AB, &AB);
		D3DXVec2Normalize(&BC, &BC);

		theta = acos(D3DXVec2Dot(&AB,&BC));							
		if(D3DXVec2Add(&VecAdd,&AB,&BC) < 0) theta = theta * (-1);	

		if(fabs(theta) <  (PI / 2)){			
			theta = theta / 2;					
		}else{
			theta = PI / 2;						
		}

		D3DXVECTOR2 OldABVec = AB;

		m_RightWallPoint[count].x = OldABVec.x * cos(theta) - OldABVec.y * sin(theta) * m_CPWidth[count];	
		m_RightWallPoint[count].y = OldABVec.x * sin(theta) + OldABVec.y * cos(theta) * m_CPWidth[count];	

		m_LeftWallPoint[count].x = OldABVec.x * cos(theta) - OldABVec.y * sin(theta) * (-m_CPWidth[count]);	
		m_LeftWallPoint[count].y = OldABVec.x * sin(theta) + OldABVec.y * cos(theta) * (-m_CPWidth[count]);	
	}

 }
考えてみれば元のクラスと、自動生成のアルゴリズムを記載した仕様書無いとこんなプログラム見せられた所で何も理解できないよね。
後で上げないと・・・
最後に編集したユーザー TOMY on 2013年10月30日(水) 07:44 [ 編集 1 回目 ]

コメントはまだありません。