関数の面積分

 投稿者:島村1243  投稿日:2019年 4月 1日(月)17時26分42秒
  二次元のxy直交軸座標系において、三角形ABCの頂点座標が
 A点座標:(x1,y1)
 B点座標:(x2,y2)
 C点座標:(x3,y3)
で与えられ、かつ、その三角形ABC内の(x,y)点において関数f(x,y)が
 f(x,y)=1+x+y
で与えられているとき、その三角形内におけるf(x,y)の面積分
 Σf(x,y)dxdy
を近似計算するプログラムを次の様に考えています。

Nを大きい数に指定して
 (手順1)xの変動領域(x1~x3)の最大値をXmax、(x1~X3)の最小値をXminiとし、又、同様に
     yの変動領域(y1~y3)の最大値をYmax、(y1~y3)の最小値をYminiとして
     dx=(Xmax-Xmini)/N
     dy=(Ymax-Ymini)/N
  微小面積dS=dx*dy
   を求める。
 (手順2)点(x,y)の位置が三角形の内部に在ることを判断する。
 (手順3)(x,y)点におけるf(x,y)を計算する。
 (手順4)Σ{f(x,y)*dS}を求める。

とすれば良い様に思うのですが、三角形ABCの位置座標が任意の場合、(2)の判断方法が複雑で、プログラムが思い付きません。(座標変換等の考慮が必要???)
何か良いお知恵が有りましたらご教示お願い致します。
 

Re: 関数の面積分

 投稿者:しばっち  投稿日:2019年 4月 1日(月)19時54分21秒
  > No.4664[元記事へ]

島村1243さんへのお返事です。

>  (手順2)点(x,y)の位置が三角形の内部に在ることを判断する。
>  (手順3)(x,y)点におけるf(x,y)を計算する。
>  (手順4)Σ{f(x,y)*dS}を求める。
>
> とすれば良い様に思うのですが、三角形ABCの位置座標が任意の場合、(2)の判断方法が複雑で、プログラムが思い付きません。(座標変換等の考慮が必要???)
> 何か良いお知恵が有りましたらご教示お願い致します。


三角形の内部かどうかの判断をしたいのなら、以前作成していたもので下記にいくつか記してみました。
計算方法によって精度が違います。ぜひお試しください。


SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 1,1,1
CLEAR
SET POINT STYLE 1
RANDOMIZE
LET X1=RND
LET Y1=RND
LET X2=RND
LET Y2=RND
LET X3=RND
LET Y3=RND
SET LINE COLOR 1
PLOT LINES:X1,Y1;X2,Y2;X3,Y3;X1,Y1
FOR I=1 TO 10000
   LET PX=RND
   LET PY=RND
   IF AREA4(X1,Y1,X2,Y2,X3,Y3,PX,PY)<>0 THEN
      SET POINT COLOR 4
   ELSE
      SET POINT COLOR 3
   END IF
   PLOT POINTS: PX,PY
NEXT I
END

EXTERNAL FUNCTION AREA(X1,Y1,X2,Y2,X3,Y3,PX,PY) !'面積
LET T=TRIANGLE(X1,Y1,X2,Y2,X3,Y3)
LET A=TRIANGLE(X1,Y1,X2,Y2,PX,PY)
LET B=TRIANGLE(X2,Y2,X3,Y3,PX,PY)
LET C=TRIANGLE(X1,Y1,X3,Y3,PX,PY)
ASK BITMAP SIZE XSIZE,YSIZE
IF ABS(A+B+C-T)<1/SQR(XSIZE^2+YSIZE^2) THEN LET AREA=-1 ELSE LET AREA=0
END FUNCTION

EXTERNAL FUNCTION TRIANGLE(X1,Y1,X2,Y2,X3,Y3)
LET TRIANGLE=ABS(X1*Y2+X2*Y3+X3*Y1-X2*Y1-X3*Y2-Y3*X1)/2
END FUNCTION

EXTERNAL FUNCTION AREA2(OX,OY,AX,AY,BX,BY,X,Y) !'ベクトル
LET A=AX-OX
LET B=BX-OX
LET C=AY-OY
LET D=BY-OY
LET PX=X-OX
LET PY=Y-OY
LET DET=A*D-B*C
IF DET=0 THEN
   LET AREA2=0
   EXIT FUNCTION
END IF
LET S=(D*PX-B*PY)/DET
IF S<0 THEN
   LET AREA2=0
   EXIT FUNCTION
END IF
LET T=(A*PY-C*PX)/DET
IF T<0 THEN
   LET AREA2=0
   EXIT FUNCTION
END IF
IF S+T<=1 THEN LET AREA2=-1 ELSE LET AREA2=0
END FUNCTION

EXTERNAL FUNCTION AREA3(X1,Y1,X2,Y2,X3,Y3,PX,PY) !'外積
DIM P(3),P0(3),P1(3),P2(3),P3(3),N1(3),N2(3),N3(3),L(3),M(3)
LET P(1)=PX
LET P(2)=PY
LET P(3)=PZ
LET P1(1)=X1
LET P1(2)=Y1
LET P1(3)=Z1
LET P2(1)=X2
LET P2(2)=Y2
LET P2(3)=Z2
LET P3(1)=X3
LET P3(2)=Y3
LET P3(3)=Z3
MAT L=P1-P
MAT M=P2-P
MAT N1=CROSS(L,M)
MAT L=P2-P
MAT M=P3-P
MAT N2=CROSS(L,M)
MAT L=P3-P
MAT M=P1-P
MAT N3=CROSS(L,M)
LET AREA3=-1
FOR I=1 TO 3
   IF SGN(N1(I))<>SGN(N2(I)) OR SGN(N2(I))<>SGN(N3(I)) THEN LET AREA3=0
NEXT I
END FUNCTION

EXTERNAL  FUNCTION AREA4(X1,Y1,X2,Y2,X3,Y3,PX,PY) !'内角の和
OPTION ANGLE DEGREES
LET LX=X1-PX
LET LY=Y1-PY
LET MX=X2-PX
LET MY=Y2-PY
LET NX=X3-PX
LET NY=Y3-PY
LET S=ACOS((LX*MX+LY*MY)/SQR(LX*LX+LY*LY)/SQR(MX*MX+MY*MY))
LET S=S+ACOS((NX*MX+NY*MY)/SQR(NX*NX+NY*NY)/SQR(MX*MX+MY*MY))
LET S=S+ACOS((NX*LX+NY*LY)/SQR(NX*NX+NY*NY)/SQR(LX*LX+LY*LY))
IF ABS(S-360)<1 THEN LET AREA4=-1 ELSE LET AREA4=0
END FUNCTION
 

Re: 関数の面積分

 投稿者:島村1243  投稿日:2019年 4月 1日(月)20時26分36秒
  しばっち様へのお返事です。

> 三角形の内部かどうかの判断をしたいのなら、以前作成していたもので下記にいくつか記してみました。
> 計算方法によって精度が違います。ぜひお試しください。

早速に素晴らしいプログラムをご教示頂き、有難う御座います。
プログラムを読み解き利用させていただきます。
感謝!感謝!です。
 

戻る