Skip to content

Instantly share code, notes, and snippets.

@phlummox
Created December 10, 2018 07:07
Show Gist options
  • Save phlummox/95dfc36f500f2fce4f7033c67d46e4fc to your computer and use it in GitHub Desktop.
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)
//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