気づいたら相当夜中まで組んでたので慌てて寝て朝に組んでみた。まだ実験してないので正しいか分からない。
今日もまた残業だよ・・・・
//保持しているチェックポイント情報から自動でコースのデータ(左右の壁の情報となる点座標)を作成。
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]);
}
}
後で上げないと・・・