質問

 投稿者:ゆう  投稿日:2008年10月19日(日)09時43分19秒
  グラフを描いています。
2つの関数f(x)とg(x)によって囲まれた図形を塗りつぶしたいのですが、どうやってやったら出来ますか?回答お願いします。
 

Re: 質問

 投稿者:山中和義  投稿日:2008年10月19日(日)11時51分12秒
  > No.23[元記事へ]

ゆうさんへのお返事です。


!連立不等式f(x)>0、g(x,y)<0の領域

DEF f(x)=x^2-3*x-1 !関数の定義 y=f(x)
DEF g(x,y)=5*x^2-6*x*y+5*y^2-25 !関数の定義 f(x,y)=0

LET a=-5 !x=[a,b] ※xy座標の表示領域
LET b=5
LET c=a !y=[c,d]
LET d=b


SET WINDOW a,b,c,d !表示領域を設定する
DRAW grid(1,1) !座標を描く
ASK PIXEL SIZE (a,c; b,d) w,h !画像の縦横の大きさ(ドット単位)を調べる
PRINT w;h

LET cEps=(b-a)/(w-1) !座標間隔
PRINT cEps

DEF ha(f)=MOD(f,cEps*10) !評価関数
SUB hatch(t, x,y,c) !ハッチ形状なら点(x,y)を描く
   LET flg=0
   IF (t=1 OR t=5) AND ha(y)<cEps THEN LET flg=1 !横
   IF (t=2 OR t=5) AND ha(x)<cEps THEN LET flg=1 !縦
   IF (t=3 OR t=6) AND ha(x+y)<cEps THEN LET flg=1 !左斜め
   IF (t=4 OR t=6) AND ha(x-y)<cEps THEN LET flg=1 !右斜め
   IF t=0 OR flg=1 THEN !t=0はベタ塗り
      SET POINT COLOR c
      PLOT POINTS: x,y
   END IF
END SUB


!条件を満たす領域を描く
SET POINT STYLE 1 !ドット形式
FOR j=1 TO h !画面全体を走査する
   LET y=WORLDY(j) !ドットをxy座標に変換する
   FOR i=1 TO w
      LET x=WORLDX(i)

      WHEN EXCEPTION IN
      !不等式が示す領域 ※y>f(x)はf(x)>0、y<f(x)はf(x)<0を意味する
         IF y>f(x) THEN CALL hatch(4, x,y,4) !条件を満たすなら
         IF g(x,y)<0 THEN CALL hatch(3, x,y,2)

         !連立不等式が示す領域
         !IF y>f(x) AND g(x,y)<0 THEN CALL hatch(5, x,y,2) !条件を満たすなら
      USE
      END WHEN

   NEXT i
NEXT j



!曲線を描く ※y=f(x)
FOR x=a TO b STEP cEps
   WHEN EXCEPTION IN
      PLOT LINES: x,f(x); !折れ線で近似する
   USE
      PLOT LINES
   END WHEN
NEXT x
PLOT LINES
PLOT TEXT ,AT -2,4: "f(x)"


!曲線を描く ※連続なf(x,y)=0
SET POINT COLOR 1
FOR y=c TO d STEP cEps
   LET x=a
   LET z=g(x,y)
   FOR x=a TO b STEP cEps
      LET z0=z
      LET z=g(x,y)
      IF z0*z<0 THEN  PLOT POINTS: x,y !符号が変われば
   NEXT x
NEXT y
PLOT TEXT ,AT -3,-3: "g(x)"


END
 

戻る