サンプル 3DVIEW4.BASにて 山中和義 2006/10/25 15:13:27 └INV関数の引数が特異行列であるか,または,... 白石 和夫 2006/10/25 18:11:02
サンプル 3DVIEW4.BASにて 山中和義 2006/10/25 15:13:27 ツリーへ
サンプル 3DVIEW4.BASにて |
返事を書く |
山中和義 2006/10/25 15:13:27 | |
法線ベクトルを算出している箇所を次のように変更した場合、エラーがでます。
EXTYPE3009 引数が定義域外の値 EXTERNAL SUB makeNormal(N()) DIM m(4,4),A(4) MAT m=TRANSFORM MAT READ A DATA 0,0,1,0 !Z軸の正方向 MAT m=INV(m) MAT m=TRN(m) MAT A=A*m MAT REDIM A(3) MAT N=(1/SQR(DOT(A,A)))*A !正規化 END SUB |
└INV関数の引数が特異行列であるか,または,... 白石 和夫 2006/10/25 18:11:02 ツリーへ
Re: サンプル 3DVIEW4.BASにて |
返事を書く |
白石 和夫 2006/10/25 18:11:02 | |
INV関数の引数が特異行列であるか,または,それに近い行列であるとき,EXTYPE3009になります。
回避策は, (1)独自に逆行列を求めるルーチンを作成する か (2)makeNormalの呼び出し元に例外処理を導入する,たとえば, ! 面を描く EXTERNAL PICTURE side(v) ! vは面の表の向きを示す DIM N(3) WHEN exception IN CALL makeNormal(N) MAT N=v*N IF N(3)>0 THEN ! 外側が手前なら面を描く CALL setBrightness(N) PLOT AREA: -1,0; 1,0; 0, SQR(3) END IF USE END WHEN END PICTURE のようにして,現在変形が特異行列である場合には面を描かない。 等の対策を考えてみてください。 |