// 葉(6e)内部を塗り潰す
// 多角形の隣接する3頂点のなす三角形の内部にあるか否かの判定を利用する
// 凸多角形, 内部に穴なしという制約あり

import java.applet.Applet;
import java.awt.*;

public class leaf6e extends Applet {
    public void paint(Graphics g) {
        final double RADIAN = Math.PI/180.0;
        final double[] X = {40,30,20,10,0,10, 20};
        final double[] Y = { 0, 7,10, 8,0,-5,-10};
        final int N = X.length;        // 葉の尖端の個数
        final int x0 = 50, y0 = 20;    // 多角形を内部に含む矩形の端の座標
        double scale = 5.0;            // スケールファクタ
        double theta = 30;             // 回転角度
        double xx,yy;
        int i,j,k,x,y;
        boolean inside;

        graphics.SetColor(g,0x008800);
        // 描画対象の全ての点(ピクセル)に対して内部/外部を判定する
        for (xx=0; xx<x0; xx+=0.1) {
        for (yy=-y0; yy<y0; yy+=0.1) {
            inside = false;
            for (i=0; i<=N-2; i++) {
            for (j=i+1; j<=N-1; j++) {
            for (k=j+1; k<=N; k++) {
                if (INSIDE(xx,yy,X[i],Y[i],X[j],Y[j],X[k%N],Y[k%N])) {
                    inside = true; break;
                }
            }}}
            if (inside) { 
                x = (int)(graphics.RotateX(xx,yy,theta)*scale);
                y = (int)(graphics.RotateY(xx,yy,theta)*scale);
                graphics.DrawPoint(g,x,y);
            }
        }}
    }

    // A(a_x,a_y), B(b_x,b_y), C(c_x,c_y) を頂点とする三角形の符号付き面積 Δ(A,B,C) を計算する
    static double DELTA(double a_x, double a_y, double b_x, double b_y, double c_x, double c_y) {
        double epsilon = 0.00001;  // 誤差
        double delta;

        delta = (b_x-a_x)*(c_y-a_y)-(c_x-a_x)*(b_y-a_y);
        if (Math.abs(delta)// Δ(A,B,C)=0
        else return delta;
    }

    // 点 P(x,y) が A(a_x,a_y), B(b_x,b_y), C(c_x,c_y) を頂点とする三角形の内部にあるか否か判定する
    static boolean INSIDE(double x, double y, double a_x, double a_y, double b_x, double b_y, double c_x, double c_y) {
        if (DELTA(x,y,a_x,a_y,b_x,b_y)>0 &&
            DELTA(x,y,b_x,b_y,c_x,c_y)>0 &&
            DELTA(x,y,c_x,c_y,a_x,a_y)>0) return true;
        else return false;
    }
}