// 葉(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;
}
}