新しく発言する EXIT インデックスへ
サンプル3DVIEW4.BASにて

  サンプル 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
のようにして,現在変形が特異行列である場合には面を描かない。
等の対策を考えてみてください。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。