ホーム » メモ » 内積で誤差?

2016年3月
 12345
6789101112
13141516171819
20212223242526
2728293031  

カテゴリー

アーカイブ

ブログ統計情報

  • 77,369 アクセス



内積で誤差?

以前書いたコードで次の様にしていた.

デバッグ版では単位ベクトルにすると誤差が大きい様に感じたが,リリース版ではそれ程でもない?


double	Naiseki	(const P3& p1,const P3& p2)
{
  //	→ →  →  →
  //	a・b=|a||b|cosθ
  //	a.x*b.x+a.y*b.y+a.z*b.z=sqrt(ax*ax+ay*ay+az*az)*sqrt(bx*bx+by*by+bz*bz)*cosθ
  //	...	a,bのベクトルが単位ベクトルの時
  //		sqrt(ax...) と sqrt(bx...) は 1
  //	a.x*b.x+a.y*b.y+a.z*b.z=1*1*cosθ
  //	a.x*b.x+a.y*b.y+a.z*b.z=cosθ
  //	→ →
  //	a・b=ax*bx+ay*by+az*bz
  P3	p1u = p1.Uni() ;
  P3	p2u = p2.Uni() ;
  //	return	(p1u.x*p2u.x+p1u.y*p2u.y+p1u.z*p2u.z) ;
  //	誤差の補正
  double	dp = p1u.x*p2u.x+p1u.y*p2u.y+p1u.z*p2u.z ;
  if (dp<-1 || 1<dp) {
    if (dp < -1.)	{	dp = -1. ;	}
    if (dp >  1.)	{	dp =  1. ;	}
    }
  return	dp ;
  }
 
P3	Gaiseki	(const P3& p1,const P3& p2)
{
  //	→ →  →  →
  //	a×b=|a||b|sinθ・c
  //	→ →
  //	a×b=(ay*bz-az*by,az*bx-ax*bz,ax*by-ay*bx)
  P3	pt ;
  pt.x = p1.y * p2.z - p1.z * p2.y ;
  pt.y = p1.z * p2.x - p1.x * p2.z ;
  pt.z = p1.x * p2.y - p1.y * p2.x ;
  return	pt ;
  }
Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。