|
> 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
|
|