|
Project Information
Members
|
About
"libneet" is 2D graphics library written for this book. http://www.amazon.co.jp/dp/479800958X Source/Data http://libneet.ysnet.org/libneet.zip (libneet_conf.hを書き換えて使ってね http://code.google.com/p/libneet/wiki/FullscratchBookData 本書で使われたデータ等はこちら。 Errata P.231~、CTexMapSideの未実装だった部分のコードはこちら。 bool CTexMapSide::Add( TTexMapVertex* v1, TTexMapVertex* v2 )
{
m_side[ m_num ].v1 = v1;
m_side[ m_num ].v2 = v2;
m_num++;
return true;
}
void CTexMapSide::Get( TTexMapVertex** v1, TTexMapVertex** v2, int index )
{
*v1 = m_side[index].v1;
*v2 = m_side[index].v2;
}
bool CTexMapSide::Intersection( int index, double y, double* x, double* sx, double* sy )
{
TTexMapVertex *v1,*v2;
Get( &v1,&v2, index );
// 横線だった場合は弾く
if (v1->dy == v2->dy) return false;
// 頂点とスキャンが交差しないように、念のため誤差(?)を作る
y += 0.00123456789;
// 辺の範囲内?
if ( ((y <= v1->dy) && (y >= v2->dy)) ||
((y >= v1->dy) && (y <= v2->dy)) )
{
// 上下端と交差
if (y == v1->dy)
{
*x = v1->dx;
*sx = v1->sx;
*sy = v1->sy;
return true;
}
if (y == v2->dy)
{
*x = v2->dx;
*sx = v2->sx;
*sy = v2->sy;
return true;
}
if (v2->dy < v1->dy) SWAP( &v1, &v2 );
double m = (y - v1->dy) / (v2->dy - v1->dy);
*x = v1->dx + m*(v2->dx - v1->dx);
*sx = v1->sx + m*(v2->sx - v1->sx);
*sy = v1->sy + m*(v2->sy - v1->sy);
return true;
}
return false;
}
|