Created
December 10, 2018 07:07
-
-
Save phlummox/95dfc36f500f2fce4f7033c67d46e4fc to your computer and use it in GitHub Desktop.
Slightly tidied code for Voronoi applet using Manhattan distance metric (original at http://www.nirarebakun.com/voro/eman.html)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//includeawt(s) | |
import java.awt.Graphics; | |
import java.applet.Applet; | |
import java.awt.Color; | |
public class man extends Applet{ | |
final static Color BLACK_COL=Color.black; | |
final static Color GREEN_COL=Color.green; | |
final static Color BLUE_COL=Color.blue; | |
final static Color YELLOW_COL = Color.yellow; | |
int N,rectHeight,rectWidth; | |
// function to make initial screen | |
public void init() { | |
// taka is hight, haba is width | |
rectWidth = (int) ((double) Double.valueOf(getParameter("habap"))); | |
rectHeight = (int) ((double) Double.valueOf(getParameter("takap"))); | |
// N is number of the generators | |
N = (int) (4 + 16 * Math.random()); | |
} | |
//function of Euclidean distance | |
// distance between (ad,bd) and (ad2,bd2) | |
public static double dist(double ad,double bd,double ad2,double bd2){ | |
double dis1=Math.abs(ad-ad2)+Math.abs(bd-bd2); | |
return dis1; | |
} | |
//x-coordinate of intersection of two lines y=as x+bs and y= ask x+bsk | |
public static double intersection_xcoord(double as,double bs,double ask,double bsk){ | |
double aaa1; | |
aaa1=(bsk-bs)/(as-ask); | |
return aaa1; | |
} | |
//y-coordinate of intersection of two lines y=as x+bs and y= ask x+bsk | |
public static double intersection_ycoord(double as2,double bs2,double ask2,double bsk2){ | |
double aaa2; | |
aaa2=(bs2/as2-bsk2/ask2)/(1.0/as2-1.0/ask2); | |
return aaa2; | |
} | |
//subroutine of sort | |
// reorder te1[],te2[],te3[] such that te1[0]<te1[1]<...<te1[NN-1] | |
static void heapv(double te1[],double te2[],double te3[],int NN){ | |
int kk,kks,ii,jj,mm; | |
double b1,b2,b3,c1,c2,c3; | |
kks=(int)(NN/2); | |
for(kk=kks;kk>=1;kk--){ | |
ii=kk; | |
b1=te1[ii-1];b2=te2[ii-1];b3=te3[ii-1]; | |
while(2*ii<=NN){ | |
jj=2*ii; | |
if(jj+1<=NN){ | |
if(te1[jj-1]<te1[jj]){ | |
jj++; | |
} | |
} | |
if(te1[jj-1]<=b1){ | |
break; | |
} | |
te1[ii-1]=te1[jj-1];te2[ii-1]=te2[jj-1];te3[ii-1]=te3[jj-1]; | |
ii=jj; | |
}//wend | |
te1[ii-1]=b1;te2[ii-1]=b2;te3[ii-1]=b3; | |
}//next kk | |
for(mm=NN-1;mm>=1;mm--){ | |
c1=te1[mm];c2=te2[mm];c3=te3[mm]; | |
te1[mm]=te1[0];te2[mm]=te2[0];te3[mm]=te3[0]; | |
ii=1; | |
while(2*ii<=mm){ | |
kk=2*ii; | |
if(kk+1<=mm){ | |
if(te1[kk-1]<=te1[kk]){ | |
kk++; | |
} | |
} | |
if(te1[kk-1]<=c1){ | |
break; | |
} | |
te1[ii-1]=te1[kk-1];te2[ii-1]=te2[kk-1];te3[ii-1]=te3[kk-1]; | |
ii=kk; | |
}//wend | |
te1[ii-1]=c1;te2[ii-1]=c2;te3[ii-1]=c3; | |
}//next mm | |
} | |
//painting subroutine | |
public void paint(Graphics g) { | |
g.setColor(BLACK_COL); | |
g.fillRect(1, 1, rectWidth, rectHeight); | |
g.setColor(BLUE_COL); | |
// int k; | |
// (x1,y1) is coordinates of generators | |
final double x1[] = new double[100]; | |
final double y1[] = new double[100]; | |
int x[] = new int[100]; | |
int y[] = new int[100]; | |
double s[] = new double[100]; | |
// decide the location of the generators by using random variables | |
for (int k = 0; k < N; k++) { | |
x1[k] = Math.random() * (rectWidth - 30) + 15; | |
y1[k] = Math.random() * (rectHeight - 30) + 15; | |
x[k] = (int) (x1[k] + 0.5); | |
y[k] = (int) (y1[k] + 0.5); | |
s[k] = Math.pow(x1[k] * x1[k] + y1[k] * y1[k], 0.5); | |
} | |
g.setColor(GREEN_COL); | |
// plot generators | |
for (int k = 0; k < N; k++) { | |
g.fillOval(x[k] - 2, y[k] - 2, 4, 4); | |
} | |
//the concept is very close to that of the ordinary Voronoi diagram | |
//following algorithm is for the ordinary Voronoi diagram | |
//i=1,...,N-1 | |
// j=i+1,...,N | |
// Consider a bisector of p(i) and p(j) | |
// k=1,...,N except for i and j | |
// Consider a bisector of p(i) and p(k) | |
// Calculate the points of intersection of bisector(i,j) and bisector(i,k) | |
// next k | |
// Sort the points of intersections in terms of x coordinates | |
// k=1,...,the number of intervals of the points of intersections | |
// Let c be a midpoint of the interval of the points of intersection. | |
// Let d be d(c,p(i)) | |
// h=1,...,N except for i and j | |
// Let d' be d(c,p(h)) | |
// If d'<d then shout (Out!) | |
// next h | |
// If we did not shout, then draw the interval of the points of intersection | |
// next k | |
// next j | |
//next i | |
// but the bisector of Manhattan Voronoi diagram is not line. | |
// it is conbination of horizontal half-line, diagonal line segment and | |
// horizontal half-line (type 1) or | |
// vertical half-line, diagonal line segment and vertical half-line(type | |
// 2) | |
// (See Okabe et al. Spatial tessellations 2nd ed. Fig. 3.7.2) | |
// this conbination type is decided by the difference of x-coordinate | |
// and difference of y-coordinate. | |
// that is, if difference of x-coordinates is larger than the difference | |
// of y-coordinates then type 2 and | |
// if difference of y-coordinates is larger than the difference of | |
// x-coordinates then type 1 | |
// (I don't consider the case that the differences are exactly same | |
// because the probability is 0 since generators are made from random | |
// variables.) | |
for (int i = 1; i <= N - 1; i++) { | |
for (int j = i + 1; j <= N; j++) { | |
double x1max, x1min; | |
double kx[] = new double[100]; | |
double ky[] = new double[100]; | |
double kz[] = new double[100]; | |
int l; | |
// the differences of y-coordinate is larger than the | |
// differences of x-coordinate | |
if (Math.abs(x1[i - 1] - x1[j - 1]) < Math.abs(y1[i - 1] - y1[j - 1])) {// y | |
x1max = x1[i - 1]; | |
x1min = x1[j - 1]; | |
if (x1[i - 1] < x1[j - 1]) { | |
x1max = x1[j - 1]; | |
x1min = x1[i - 1]; | |
} | |
final double cp2 = (y1[i - 1] + y1[j - 1]) / 2; | |
final double cpx = (x1[i - 1] + x1[j - 1]) / 2; | |
// if the differences of y-coordinate is | |
// larger than the differences of x-coordinate | |
// and if (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
if ((x1[i - 1] - x1[j - 1]) * (y1[i - 1] - y1[j - 1]) > 0) {// yAQE | |
final double di = -1.0 + Math.random() / 1000.0; | |
final double yst = di * (x1min - cpx) + cp2; | |
final double yen = di * (x1max - cpx) + cp2; | |
l = 1; | |
kx[l - 1] = x1min; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
l++; | |
kx[l - 1] = x1max; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
for (int k = 1; k <= N; k++) { | |
final double b = -di * cpx + cp2; | |
final double a = di; | |
if (k != i && k != j) { | |
double x1maxk = x1[i - 1]; | |
double x1mink = x1[k - 1]; | |
if (x1[i - 1] < x1[k - 1]) { | |
x1maxk = x1[k - 1]; | |
x1mink = x1[i - 1]; | |
} | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
// if the differences of y-coordinate is | |
// larger than the differences of x-coordinate | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
// and if | |
// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
final double di2k = -Math.random() / 800.0; | |
{ | |
final double ak = /* dik; ak= */ di2k; | |
final double bk = /* | |
* -dik*cpxk+cp2k; | |
* bk= | |
*/ -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} | |
{ | |
final double di3k = -Math.random() / 800.0; | |
double ak = di3k; | |
double bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
// if the differences of y-coordinate is | |
// larger than the differences of | |
// x-coordinate | |
// and if | |
// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
double di2k = Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
double di3k = Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1i-x1j)*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
// if the differences of x-coordinate is larger | |
// than the differences of y-coordinate | |
// the code continue until every cases are done. | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 800.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if(k!=i && k!=j | |
} // k | |
final double di2 = -Math.random() / 800.0; | |
l++; | |
kx[l - 1] = 0.0; | |
ky[l - 1] = di2 * (kx[l - 1] - x1min) + yst; | |
for (int k = 1; k <= N; k++) { | |
final double b = -di2 * x1min + yst; | |
final double a = di2; | |
if (k != i && k != j) { | |
// double x1maxk =x1[i-1]; | |
// double x1mink=x1[k-1]; | |
// if(x1[i-1]<x1[k-1]){ | |
// //x1maxk=x1[k-1]; | |
// //x1mink=x1[i-1]; | |
// } | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak = dik; | |
final double bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=i && k!=j | |
} // k | |
final double di3 = -Math.random() / 800.0; | |
l++; | |
kx[l - 1] = rectWidth; | |
ky[l - 1] = di3 * (kx[l - 1] - x1max) + yen; | |
for (int k = 1; k <= N; k++) { | |
final double b = -di3 * x1max + yen; | |
final double a = di3; | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yAQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yAQE | |
final double di = 1.0 + Math.random() / 1000.0; | |
final double yen, yst; | |
yst = di * (x1min - cpx) + cp2; | |
yen = di * (x1max - cpx) + cp2; | |
l = 1; | |
kx[l - 1] = x1min; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
l++; | |
kx[l - 1] = x1max; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
double a, b; | |
a = di; | |
b = -di * cpx + cp2; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double x1maxk = x1[i - 1]; | |
double x1mink = x1[k - 1]; | |
if (x1[i - 1] < x1[k - 1]) { | |
x1maxk = x1[k - 1]; | |
x1mink = x1[i - 1]; | |
} | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
final double di2 = Math.random() / 800.0; | |
l++; | |
kx[l - 1] = 0.0; | |
ky[l - 1] = di2 * (kx[l - 1] - x1min) + yst; | |
a = di2; | |
b = -di2 * x1min + yst; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
double dik = -1.0 + Math.random() / 1000.0; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
// double ystk=dik*(x1mink-cpxk)+cp2k; | |
// double yenk=dik*(x1maxk-cpxk)+cp2k; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
final double di3 = Math.random() / 800.0; | |
l++; | |
kx[l - 1] = rectWidth; | |
ky[l - 1] = di3 * (kx[l - 1] - x1max) + yen; | |
a = di3; | |
b = -di3 * x1max + yen; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yAQE | |
for (int u = 1; u <= l; u++) { | |
kz[u - 1] = 0; | |
} | |
heapv(kx, ky, kz, l); | |
for (int k = 1; k <= l - 1; k++) { | |
int k2 = k + 1; | |
double xx, yy2; | |
xx = (kx[k - 1] + kx[k2 - 1]) / 2.0; | |
yy2 = (ky[k - 1] + ky[k2 - 1]) / 2.0;// di*(xx-xx)+cp2; | |
double ds; | |
ds = dist(xx, yy2, x1[i - 1], y1[i - 1]); | |
int br2 = 0; | |
for (int u = 1; u <= N; u++) { | |
if (u != i && u != j) { | |
double us; | |
us = dist(xx, yy2, x1[u - 1], y1[u - 1]); | |
if (us < ds) { | |
br2 = br2 + 1; | |
} | |
} | |
} // next u | |
if (br2 == 0) { | |
g.setColor(YELLOW_COL); | |
g.drawLine((int) kx[k - 1], (int) ky[k - 1], (int) kx[k2 - 1], (int) ky[k2 - 1]); | |
} // if br2<3 | |
} // next k | |
} // y | |
else {// x | |
for (int u = 1; u <= N; u++) { | |
s[u - 1] = x1[u - 1]; | |
x1[u - 1] = y1[u - 1]; | |
y1[u - 1] = s[u - 1]; | |
} | |
x1max = x1[i - 1]; | |
x1min = x1[j - 1]; | |
if (x1[i - 1] < x1[j - 1]) { | |
x1max = x1[j - 1]; | |
x1min = x1[i - 1]; | |
} | |
final double cp2, cpx; | |
cp2 = (y1[i - 1] + y1[j - 1]) / 2; | |
cpx = (x1[i - 1] + x1[j - 1]) / 2; | |
if ((x1[i - 1] - x1[j - 1]) * (y1[i - 1] - y1[j - 1]) > 0) {// yAQE | |
final double di = -1.0 + Math.random() / 1000.0; | |
// final double yen,yst; | |
final double yst = di * (x1min - cpx) + cp2; | |
final double yen = di * (x1max - cpx) + cp2; | |
l = 1; | |
kx[l - 1] = x1min; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
l++; | |
kx[l - 1] = x1max; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
double a, b; | |
a = di; | |
b = -di * cpx + cp2; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double x1maxk = x1[i - 1]; | |
double x1mink = x1[k - 1]; | |
if (x1[i - 1] < x1[k - 1]) { | |
x1maxk = x1[k - 1]; | |
x1mink = x1[i - 1]; | |
} | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = -Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1i-x1j)*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 800.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if(k!=i && k!=j | |
} // k | |
final double di2 = -Math.random() / 800.0; | |
l++; | |
kx[l - 1] = 0.0; | |
ky[l - 1] = di2 * (kx[l - 1] - x1min) + yst; | |
a = di2; | |
b = -di2 * x1min + yst; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=i && k!=j | |
} // k | |
final double di3 = -Math.random() / 800.0; | |
l++; | |
kx[l - 1] = rectWidth; | |
ky[l - 1] = di3 * (kx[l - 1] - x1max) + yen; | |
a = di3; | |
b = -di3 * x1max + yen; | |
for (int k = 1; k <= N; k++) { | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 yAQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 yAQE | |
final double di = 1.0 + Math.random() / 1000.0; | |
final double yst = di * (x1min - cpx) + cp2; | |
final double yen = di * (x1max - cpx) + cp2; | |
l = 1; | |
kx[l - 1] = x1min; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
l++; | |
kx[l - 1] = x1max; | |
ky[l - 1] = di * (kx[l - 1] - cpx) + cp2; | |
// final double a = di; | |
// double b=-di*cpx+cp2; | |
// a=di; | |
for (int k = 1; k <= N; k++) { | |
final double b = -di * cpx + cp2; | |
final double a = di; | |
if (k != i && k != j) { | |
double x1maxk = x1[i - 1]; | |
double x1mink = x1[k - 1]; | |
if (x1[i - 1] < x1[k - 1]) { | |
x1maxk = x1[k - 1]; | |
x1mink = x1[i - 1]; | |
} | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ystk = dik * (x1mink - cpxk) + cp2k; | |
final double yenk = dik * (x1maxk - cpxk) + cp2k; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * x1mink + ystk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * x1maxk + yenk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1min | |
&& intersection_xcoord(a, b, ak, bk) < x1max) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
final double di2 = Math.random() / 800.0; | |
l++; | |
kx[l - 1] = 0.0; | |
ky[l - 1] = di2 * (kx[l - 1] - x1min) + yst; | |
// a=di2; | |
for (int k = 1; k <= N; k++) { | |
final double a = di2; | |
final double b = -di2 * x1min + yst; | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > 0 | |
&& intersection_xcoord(a, b, ak, bk) < x1min) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
final double di3 = Math.random() / 800.0; | |
l++; | |
kx[l - 1] = rectWidth; | |
ky[l - 1] = di3 * (kx[l - 1] - x1max) + yen; | |
// a=di3; | |
for (int k = 1; k <= N; k++) { | |
final double a = di3; | |
final double b = -di3 * x1max + yen; | |
if (k != i && k != j) { | |
double y1maxk = y1[i - 1]; | |
double y1mink = y1[k - 1]; | |
if (y1[i - 1] < y1[k - 1]) { | |
y1maxk = y1[k - 1]; | |
y1mink = y1[i - 1]; | |
} | |
final double cp2k = (y1[i - 1] + y1[k - 1]) / 2.0; | |
final double cpxk = (x1[i - 1] + x1[k - 1]) / 2.0; | |
if (Math.abs(x1[i - 1] - x1[k - 1]) < Math.abs(y1[i - 1] - y1[k - 1])) {// yk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// yQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// yQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// yQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yQE | |
} // yk | |
else {// xk | |
if ((x1[i - 1] - x1[k - 1]) * (y1[i - 1] - y1[k - 1]) > 0) {// xQE | |
final double dik = -1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = -800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = -800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
else {// (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])<0 | |
// xQE | |
final double dik = 1.0 + Math.random() / 1000.0; | |
final double xstk, xenk; | |
xstk = (y1mink - cp2k) / dik + cpxk; | |
xenk = (y1maxk - cp2k) / dik + cpxk; | |
double ak, bk; | |
ak = dik; | |
bk = -dik * cpxk + cp2k; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di2k = 800.0 + Math.random() / 800.0; | |
ak = di2k; | |
bk = -di2k * xstk + y1mink; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
final double di3k = 800.0 + Math.random() / 800.0; | |
ak = di3k; | |
bk = -di3k * xenk + y1maxk; | |
if (intersection_xcoord(a, b, ak, bk) > x1max | |
&& intersection_xcoord(a, b, ak, bk) < rectWidth) { | |
l++; | |
kx[l - 1] = intersection_xcoord(a, b, ak, bk); | |
ky[l - 1] = intersection_ycoord(a, b, ak, bk); | |
} | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0 | |
// xQE | |
} // xk | |
} // if k!=j | |
} // k | |
} // (x1[i-1]-x1[j-1])*(y1[i-1]-y1[j-1])>0@yAQE | |
for (int u = 1; u <= l; u++) { | |
kz[u - 1] = 0; | |
} | |
heapv(kx, ky, kz, l); | |
for (int k = 1; k <= l - 1; k++) { | |
int k2 = k + 1; | |
final double xx, yy2; | |
xx = (kx[k - 1] + kx[k2 - 1]) / 2.0; | |
yy2 = (ky[k - 1] + ky[k2 - 1]) / 2.0;// di*(xx-xx)+cp2; | |
double ds = dist(xx, yy2, x1[i - 1], y1[i - 1]); | |
int br2 = 0; | |
for (int u = 1; u <= N; u++) { | |
if (u != i && u != j) { | |
double us = dist(xx, yy2, x1[u - 1], y1[u - 1]); | |
if (us < ds) { | |
br2 = br2 + 1; | |
} | |
} | |
} // next u | |
if (br2 == 0) { | |
g.setColor(YELLOW_COL); | |
g.drawLine((int) ky[k - 1], (int) kx[k - 1], (int) ky[k2 - 1], (int) kx[k2 - 1]); | |
} // if br2<3 | |
} // next k | |
for (int u = 1; u <= N; u++) { | |
s[u - 1] = x1[u - 1]; | |
x1[u - 1] = y1[u - 1]; | |
y1[u - 1] = s[u - 1]; | |
} | |
for (int u = 1; u <= l; u++) { | |
s[u - 1] = kx[u - 1]; | |
kx[u - 1] = ky[u - 1]; | |
ky[u - 1] = s[u - 1]; | |
} | |
} // x | |
} // next j | |
} // next i | |
g.setColor(GREEN_COL); | |
g.drawString("N=" + N, 15, 15); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment