Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
vadere
vadere
Commits
65033203
Commit
65033203
authored
Nov 13, 2016
by
Benedikt Zoennchen
Browse files
add adpative triangulation implementation
parent
c6e15f01
Changes
8
Hide whitespace changes
Inline
Side-by-side
VadereUtils/src/org/vadere/util/delaunay/BowyerWatson.java
0 → 100644
View file @
65033203
package
org.vadere.util.delaunay
;
import
org.apache.commons.lang3.tuple.ImmutablePair
;
import
org.apache.commons.lang3.tuple.ImmutableTriple
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.apache.commons.lang3.tuple.Triple
;
import
org.vadere.util.geometry.shapes.VCircle
;
import
org.vadere.util.geometry.shapes.VLine
;
import
org.vadere.util.geometry.shapes.VPoint
;
import
org.vadere.util.geometry.shapes.VRectangle
;
import
org.vadere.util.geometry.shapes.VTriangle
;
import
javax.swing.*
;
import
java.awt.*
;
import
java.util.*
;
import
java.util.List
;
import
java.util.function.BiFunction
;
import
java.util.function.Predicate
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
import
java.util.stream.Stream
;
/**
* @author Benedikt Zoennchen
*
* This class is for computing the DelaunayTriangulation using the BowyerWatson-Algorithm. In average the algorithm should perfom in O(n log(n)) but
* in degenerated cases its runtime can be in O(n^2) where n is the number of points.
*/
public
class
BowyerWatson
<
P
extends
VPoint
>
{
private
List
<
Triple
<
P
,
P
,
P
>>
triangles
;
private
Collection
<
P
>
points
;
private
List
<
P
>
initPoints
;
private
final
BiFunction
<
Double
,
Double
,
P
>
pointConstructor
;
public
BowyerWatson
(
final
Collection
<
P
>
points
,
final
BiFunction
<
Double
,
Double
,
P
>
pointConstructor
)
{
this
.
points
=
points
;
this
.
pointConstructor
=
pointConstructor
;
}
public
void
execute
()
{
P
max
=
points
.
parallelStream
().
reduce
(
pointConstructor
.
apply
(
Double
.
MIN_VALUE
,
Double
.
MIN_VALUE
),
(
a
,
b
)
->
pointConstructor
.
apply
(
Math
.
max
(
a
.
getX
(),
b
.
getX
()),
Math
.
max
(
a
.
getY
(),
b
.
getY
())));
P
min
=
points
.
parallelStream
().
reduce
(
pointConstructor
.
apply
(
Double
.
MIN_VALUE
,
Double
.
MIN_VALUE
),
(
a
,
b
)
->
pointConstructor
.
apply
(
Math
.
min
(
a
.
getX
(),
b
.
getX
()),
Math
.
min
(
a
.
getY
(),
b
.
getY
())));
VRectangle
bound
=
new
VRectangle
(
min
.
getX
(),
min
.
getY
(),
max
.
getX
()-
min
.
getX
(),
max
.
getY
()-
min
.
getY
());
init
(
bound
);
points
.
stream
().
forEach
(
point
->
handle
(
point
));
cleanUp
();
}
public
List
<
Triple
<
P
,
P
,
P
>>
getTriangles
()
{
return
triangles
;
}
public
List
<
VTriangle
>
getVTriangles
()
{
return
triangles
.
stream
().
map
(
this
::
pointsToTriangle
).
collect
(
Collectors
.
toList
());
}
public
Set
<
VLine
>
getEdges
()
{
return
triangles
.
parallelStream
().
flatMap
(
triangle
->
Stream
.
of
(
new
VTriangle
(
triangle
.
getLeft
(),
triangle
.
getMiddle
(),
triangle
.
getRight
()).
getLines
())).
collect
(
Collectors
.
toSet
());
}
private
void
init
(
final
VRectangle
bound
)
{
triangles
=
new
ArrayList
<>();
initPoints
=
new
ArrayList
<>();
Triple
<
P
,
P
,
P
>
superTriangle
=
getSuperTriangle
(
bound
);
triangles
.
add
(
superTriangle
);
initPoints
.
add
(
superTriangle
.
getLeft
());
initPoints
.
add
(
superTriangle
.
getMiddle
());
initPoints
.
add
(
superTriangle
.
getRight
());
}
private
Triple
<
P
,
P
,
P
>
getSuperTriangle
(
final
VRectangle
bound
)
{
double
gap
=
1.0
;
double
max
=
Math
.
max
(
bound
.
getWidth
(),
bound
.
getHeight
());
P
p1
=
pointConstructor
.
apply
(
bound
.
getX
()
-
max
-
gap
,
bound
.
getY
()
-
gap
);
P
p2
=
pointConstructor
.
apply
(
bound
.
getX
()
+
2
*
max
+
gap
,
bound
.
getY
()
-
gap
);
P
p3
=
pointConstructor
.
apply
(
bound
.
getX
()
+
(
max
+
2
*
gap
)/
2
,
bound
.
getY
()
+
2
*
max
+
gap
);
return
ImmutableTriple
.
of
(
p1
,
p2
,
p3
);
}
private
void
handle
(
final
P
point
)
{
HashSet
<
Line
>
edges
=
new
HashSet
<>();
Map
<
Boolean
,
List
<
Triple
<
P
,
P
,
P
>>>
partition
=
triangles
.
parallelStream
().
collect
(
Collectors
.
partitioningBy
(
t
->
pointsToTriangle
(
t
).
isInCircumscribedCycle
(
point
)));
List
<
Triple
<
P
,
P
,
P
>>
badTriangles
=
partition
.
get
(
true
);
triangles
=
partition
.
get
(
false
);
IntStream
s
;
HashSet
<
Line
>
toRemove
=
new
HashSet
<>();
// duplicated edges
badTriangles
.
stream
().
flatMap
(
t
->
getEdges
(
t
).
stream
()).
forEach
(
line
->
{
if
(!
edges
.
add
(
line
))
{
toRemove
.
add
(
line
);
}
});
toRemove
.
stream
().
forEach
(
removeEdge
->
edges
.
remove
(
removeEdge
));
// identifier ?
edges
.
stream
().
forEach
(
edge
->
triangles
.
add
(
Triple
.
of
(
edge
.
p1
,
edge
.
p2
,
point
)));
}
private
List
<
Line
>
getEdges
(
Triple
<
P
,
P
,
P
>
triangle
)
{
List
<
Line
>
list
=
new
ArrayList
<>();
list
.
add
(
new
Line
(
triangle
.
getLeft
(),
triangle
.
getMiddle
()));
list
.
add
(
new
Line
(
triangle
.
getMiddle
(),
triangle
.
getRight
()));
list
.
add
(
new
Line
(
triangle
.
getRight
(),
triangle
.
getLeft
()));
return
list
;
}
private
void
cleanUp
()
{
triangles
=
triangles
.
stream
().
filter
(
triangle
->
!
isTriangleConnectedToInitialPoints
(
triangle
)).
collect
(
Collectors
.
toList
());
}
private
boolean
isTriangleConnectedToInitialPoints
(
final
Triple
<
P
,
P
,
P
>
trianglePoints
)
{
return
Stream
.
of
(
pointsToTriangle
(
trianglePoints
).
getLines
()).
anyMatch
(
edge
->
{
VPoint
p1
=
new
VPoint
(
edge
.
getP1
().
getX
(),
edge
.
getP1
().
getY
());
VPoint
p2
=
new
VPoint
(
edge
.
getP2
().
getX
(),
edge
.
getP2
().
getY
());
return
initPoints
.
stream
().
anyMatch
(
initPoint
->
p1
.
equals
(
initPoint
)
||
p2
.
equals
(
initPoint
));
});
}
private
VTriangle
pointsToTriangle
(
Triple
<
P
,
P
,
P
>
points
)
{
return
new
VTriangle
(
points
.
getLeft
(),
points
.
getMiddle
(),
points
.
getRight
());
}
private
class
Line
{
final
P
p1
;
final
P
p2
;
private
Line
(
P
p1
,
P
p2
)
{
this
.
p1
=
p1
;
this
.
p2
=
p2
;
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(
this
==
o
)
return
true
;
if
(
o
==
null
||
getClass
()
!=
o
.
getClass
())
return
false
;
Line
line
=
(
Line
)
o
;
return
(
p1
.
equals
(
line
.
p1
)
&&
p2
.
equals
(
line
.
p2
))
||
(
p2
.
equals
(
line
.
p1
)
&&
p1
.
equals
(
line
.
p2
));
}
@Override
public
int
hashCode
()
{
return
p1
.
hashCode
()
*
p2
.
hashCode
();
}
}
// TODO: the following code can be deleted, this is only for visual checks
public
static
void
main
(
String
[]
args
)
{
// TODO Auto-generated method stub
int
height
=
1000
;
int
width
=
1000
;
int
max
=
Math
.
max
(
height
,
width
);
Set
<
VPoint
>
points
=
new
HashSet
<>();
/*points.add(new VPoint(20,20));
points.add(new VPoint(20,40));
points.add(new VPoint(75,53));
points.add(new VPoint(80,70));*/
Random
r
=
new
Random
();
for
(
int
i
=
0
;
i
<
10000
;
i
++)
{
VPoint
point
=
new
VPoint
(
width
*
r
.
nextDouble
(),
height
*
r
.
nextDouble
());
points
.
add
(
point
);
}
BowyerWatson
<
VPoint
>
bw
=
new
BowyerWatson
<
VPoint
>(
points
,
(
x
,
y
)
->
new
VPoint
(
x
,
y
));
bw
.
execute
();
Set
<
VLine
>
edges
=
bw
.
getEdges
();
JFrame
window
=
new
JFrame
();
window
.
setDefaultCloseOperation
(
WindowConstants
.
EXIT_ON_CLOSE
);
window
.
setBounds
(
0
,
0
,
max
,
max
);
window
.
getContentPane
().
add
(
new
Lines
(
edges
,
points
,
max
));
window
.
setVisible
(
true
);
}
private
static
class
Lines
extends
JComponent
{
private
Set
<
VLine
>
edges
;
private
Set
<
VPoint
>
points
;
private
final
int
max
;
public
Lines
(
final
Set
<
VLine
>
edges
,
final
Set
<
VPoint
>
points
,
final
int
max
){
this
.
edges
=
edges
;
this
.
points
=
points
;
this
.
max
=
max
;
}
public
void
paint
(
Graphics
g
)
{
Graphics2D
g2
=
(
Graphics2D
)
g
;
g2
.
setBackground
(
Color
.
white
);
g2
.
setStroke
(
new
BasicStroke
(
1.0f
));
g2
.
setColor
(
Color
.
gray
);
edges
.
stream
().
forEach
(
edge
->
{
Shape
k
=
new
VLine
(
edge
.
getP1
().
getX
(),
edge
.
getP1
().
getY
(),
edge
.
getP2
().
getX
(),
edge
.
getP2
().
getY
());
g2
.
draw
(
k
);
});
points
.
stream
().
forEach
(
point
->
{
VCircle
k
=
new
VCircle
(
point
.
getX
(),
point
.
getY
(),
1.0
);
g2
.
draw
(
k
);
});
}
}
public
void
removeTriangleIf
(
final
Predicate
<
Triple
<
P
,
P
,
P
>>
predicate
)
{
triangles
.
removeIf
(
predicate
);
}
}
VadereUtils/src/org/vadere/util/geometry/shapes/VTriangle.java
View file @
65033203
...
...
@@ -22,18 +22,14 @@ public class VTriangle extends VPolygon {
public
final
VPoint
p2
;
public
final
VPoint
p3
;
public
final
VLine
[]
lines
;
/**
* Neighboring triangles of point 1
*/
public
final
List
<
VTriangle
>
neighbors1
;
/**
* Neighboring triangles of point 2
*/
public
final
List
<
VTriangle
>
neighbors2
;
/**
* Neighboring triangles of point 3
* The centroid will be saved for performance boost, since this object is immutable.
*/
public
final
List
<
VTriangle
>
neighbors3
;
private
VPoint
centroid
;
private
VPoint
center
;
/**
* Creates a triangle. Points must be given in ccw order.
...
...
@@ -49,9 +45,7 @@ public class VTriangle extends VPolygon {
this
.
p2
=
p2
;
this
.
p3
=
p3
;
this
.
neighbors1
=
new
LinkedList
<
VTriangle
>();
this
.
neighbors2
=
new
LinkedList
<
VTriangle
>();
this
.
neighbors3
=
new
LinkedList
<
VTriangle
>();
lines
=
new
VLine
[]{
new
VLine
(
p1
,
p2
),
new
VLine
(
p2
,
p3
),
new
VLine
(
p3
,
p1
)
};
}
public
VPoint
midPoint
()
{
...
...
@@ -69,6 +63,38 @@ public class VTriangle extends VPolygon {
||
l3
.
ptSegDist
(
p1
)
<
GeometryUtils
.
DOUBLE_EPS
;
}
@Override
public
VPoint
getCentroid
()
{
if
(
centroid
==
null
)
{
centroid
=
super
.
getCentroid
();
}
return
centroid
;
}
public
VPoint
getCenter
(){
if
(
center
==
null
)
{
double
d
=
2
*
(
p1
.
getX
()
*
(
p2
.
getY
()
-
p3
.
getY
())
+
p2
.
getX
()
*
(
p3
.
getY
()
-
p1
.
getY
())
+
p3
.
getX
()
*
(
p1
.
getY
()
-
p2
.
getY
()));
double
x
=
((
p1
.
getX
()
*
p1
.
getX
()
+
p1
.
getY
()
*
p1
.
getY
())
*
(
p2
.
getY
()
-
p3
.
getY
())
+
(
p2
.
getX
()
*
p2
.
getX
()
+
p2
.
getY
()
*
p2
.
getY
())
*
(
p3
.
getY
()
-
p1
.
getY
())
+
(
p3
.
getX
()
*
p3
.
getX
()
+
p3
.
getY
()
*
p3
.
getY
())
*
(
p1
.
getY
()
-
p2
.
getY
()))
/
d
;
double
y
=
((
p1
.
getX
()
*
p1
.
getX
()
+
p1
.
getY
()
*
p1
.
getY
())
*
(
p3
.
getX
()
-
p2
.
getX
())
+
(
p2
.
getX
()
*
p2
.
getX
()
+
p2
.
getY
()
*
p2
.
getY
())
*
(
p1
.
getX
()
-
p3
.
getX
())
+
(
p3
.
getX
()
*
p3
.
getX
()
+
p3
.
getY
()
*
p3
.
getY
())
*
(
p2
.
getX
()
-
p1
.
getX
()))
/
d
;
center
=
new
VPoint
(
x
,
y
);
}
return
center
;
}
public
double
getCircumscribedRadius
()
{
return
getCenter
().
distance
(
p1
);
}
public
boolean
isInCircumscribedCycle
(
final
VPoint
point
)
{
return
getCenter
().
distance
(
point
)
<
getCircumscribedRadius
();
}
/**
* Computes the inward facing normal vector for the given points of the
* triangle.
...
...
@@ -94,4 +120,8 @@ public class VTriangle extends VPolygon {
return
this
.
p1
.
equals
(
point
)
||
this
.
p2
.
equals
(
point
)
||
this
.
p3
.
equals
(
point
);
}
public
VLine
[]
getLines
()
{
return
lines
;
}
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/FixedParameters.java
0 → 100644
View file @
65033203
package
org.vadere.util.triangulation.adaptive
;
/**
* Created by Matimati-ka on 29.03.2016.
*/
public
class
FixedParameters
{
public
final
static
int
NPOINTS
=
100000
;
public
final
static
int
SAMPLENUMBER
=
10
;
public
final
static
int
SAMPLEDIVISION
=
10
;
public
final
static
double
QUALITYMEASUREMENT
=
0.95
;
public
final
static
double
QUALITYTOLERANCE
=
0.00001
;
public
final
static
int
SEGMENTDIVISION
=
0
;
public
final
static
double
TTOL
=
0.1
;
public
final
static
double
FSCALE
=
1.2
;
public
final
static
double
DELTAT
=
0.2
;
public
final
static
boolean
LOG
=
false
;
public
final
static
double
DENSITYWEIGHT
=
1
.;
public
static
final
double
MINIMUM
=
0.5
;
public
static
final
double
Parts
=
250
;
public
static
final
long
TimeLimit
=
60000
;
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/IndexedVLine.java
0 → 100644
View file @
65033203
package
org.vadere.util.triangulation.adaptive
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.vadere.util.geometry.shapes.VLine
;
public
class
IndexedVLine
extends
VLine
{
private
final
IndexedVPoint
p1
;
private
final
IndexedVPoint
p2
;
public
IndexedVLine
(
IndexedVPoint
p1
,
IndexedVPoint
p2
)
{
super
(
p1
,
p2
);
this
.
p1
=
p1
;
this
.
p2
=
p2
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
obj
==
null
)
return
false
;
if
(
obj
==
this
)
return
true
;
if
(
obj
.
getClass
()
!=
getClass
())
return
false
;
IndexedVLine
line
=
(
IndexedVLine
)
obj
;
return
line
.
getP1
().
equals
(
getP1
())
&&
line
.
getP2
().
equals
(
getP2
())
||
line
.
getP2
().
equals
(
getP1
())
&&
line
.
getP1
().
equals
(
getP2
());
}
@Override
public
int
hashCode
()
{
return
p1
.
hashCode
()
*
p2
.
hashCode
();
}
public
Pair
<
Integer
,
Integer
>
getId
()
{
return
Pair
.
of
(
p1
.
getId
(),
p2
.
getId
());
}
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/IndexedVPoint.java
0 → 100644
View file @
65033203
package
org.vadere.util.triangulation.adaptive
;
import
org.vadere.util.geometry.shapes.VPoint
;
/**
* Created by bzoennchen on 10.11.16.
*/
public
class
IndexedVPoint
extends
VPoint
{
private
int
id
;
public
IndexedVPoint
(
final
VPoint
point
,
final
int
id
){
this
(
point
.
getX
(),
point
.
getY
(),
id
);
}
public
IndexedVPoint
(
final
double
x
,
final
double
y
,
final
int
id
){
super
(
x
,
y
);
this
.
id
=
id
;
}
@Override
public
IndexedVPoint
subtract
(
VPoint
point
)
{
return
new
IndexedVPoint
(
super
.
subtract
(
point
),
id
);
}
public
int
getId
()
{
return
id
;
}
public
void
setId
(
int
id
)
{
this
.
id
=
id
;
}
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/Parameters.java
0 → 100755
View file @
65033203
package
org.vadere.util.triangulation.adaptive
;
/**
* Created by Matimati-ka on 27.09.2016.
*/
public
class
Parameters
{
final
static
double
TOL
=
.
1
;
final
static
double
FSCALE
=
1.2
;
final
static
double
DELTAT
=
0.2
;
public
final
static
double
h0
=
0.15
;
public
final
static
boolean
uniform
=
false
;
public
final
static
String
method
=
"Density"
;
// "Distmesh" or "Density"
final
static
double
qualityMeasurement
=
0.875
;
final
static
double
MINIMUM
=
0.25
;
final
static
double
DENSITYWEIGHT
=
2
;
final
static
int
NPOINTS
=
100000
;
final
static
int
SAMPLENUMBER
=
10
;
final
static
int
SAMPLEDIVISION
=
10
;
static
final
int
SEGMENTDIVISION
=
0
;
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/PerssonStrangDistmesh.java
0 → 100755
View file @
65033203
package
org.vadere.util.triangulation.adaptive
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.vadere.util.delaunay.BowyerWatson
;
import
org.vadere.util.geometry.shapes.VLine
;
import
org.vadere.util.geometry.shapes.VPoint
;
import
org.vadere.util.geometry.shapes.VRectangle
;
import
org.vadere.util.geometry.shapes.VShape
;
import
org.vadere.util.geometry.shapes.VTriangle
;
import
java.awt.geom.PathIterator
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
import
static
java
.
lang
.
Math
.
pow
;
public
class
PerssonStrangDistmesh
{
private
List
<
IndexedVPoint
>
points
=
new
ArrayList
<>();
private
List
<
IndexedVPoint
>
oldPoints
=
new
ArrayList
<>();
private
BowyerWatson
<
IndexedVPoint
>
triangulation
;
private
Function
<
VPoint
,
Double
>
fd
;
private
Function
<
VPoint
,
Double
>
fh
;
// Parameters
private
double
h0
;
private
double
geps
;
private
double
deps
;
/*
Konstruktor für den Algorithmus von Persson und Strang
*/
public
PerssonStrangDistmesh
(
VRectangle
box
,
Collection
<?
extends
VShape
>
obstacles
,
double
h0
,
boolean
uniform
,
Function
<
VPoint
,
Double
>
density
,
String
method
)
{
long
now
=
System
.
currentTimeMillis
();
this
.
h0
=
h0
;
this
.
geps
=
.
001
*
h0
;
this
.
deps
=
1.4901
e
-
8
*
h0
;
double
MAXDENSITY
=
calculateMaxDensity
(
density
,
box
);
fd
=
v
->
{
double
value
=
box
.
distance
(
v
);
for
(
VShape
obstacle
:
obstacles
)
{
value
=
doDDiff
(
value
,
obstacle
.
distance
(
v
));
}
return
value
;
};
if
(
uniform
)
{
fh
=
v
->
1.0
;
}
else
{
fh
=
v
->
{
double
result
;
switch
(
method
)
{
case
"Distmesh"
:
result
=
0.15
-
0.2
*
box
.
distance
(
v
);
double
last
=
-
box
.
distance
(
v
);
for
(
VShape
obstacle
:
obstacles
)
{
if
(
Math
.
max
(
box
.
getWidth
(),
box
.
getHeight
())
<=
10
)
{
result
=
doDUnion
(
result
,
0.06
+
0.2
*
obstacle
.
distance
(
v
));
last
+=
obstacle
.
distance
(
v
);
}
else
{
result
=
doDUnion
(
result
,
0.06
+
0.2
*
obstacle
.
distance
(
v
)
*
10
/
Math
.
max
(
box
.
getWidth
(),
box
.
getHeight
()));
last
+=
obstacle
.
distance
(
v
)
*
10
/
Math
.
max
(
box
.
getWidth
(),
box
.
getHeight
());
}
}
last
/=
obstacles
.
size
();
result
=
doDUnion
(
result
,
last
);
break
;
case
"Density"
:
result
=
1
/
(
Parameters
.
MINIMUM
+
(
density
.
apply
(
v
)
/
MAXDENSITY
)
*
Parameters
.
DENSITYWEIGHT
);
break
;
default
:
throw
new
RuntimeException
(
"Method not accepted"
);
}
return
result
;
};
}
generatePoints
(
box
);
removePointsAndRejection
();
addFixPointsOnBoundary
(
new
ArrayList
<
VShape
>()
{{
addAll
(
obstacles
);
add
(
box
);
}});
setOldPointsToInf
();
work
();
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"mm:ss:SSS"
);
System
.
out
.
println
(
sdf
.
format
(
date
)
+
" Minuten:Sekunden:Millisekunden"
);
}
/*
Berechnet die maximale Dichte des Szenarios anhand von Stichproben
*/
private
double
calculateMaxDensity
(
Function
<
VPoint
,
Double
>
density
,
VRectangle
bbox
)
{
double
maxDensity
=
0
;
double
[][]
means
=
new
double
[
Parameters
.
SAMPLEDIVISION
][
Parameters
.
SAMPLEDIVISION
];
Random
random
=
new
Random
();
for
(
int
i
=
0
;
i
<
Parameters
.
SAMPLENUMBER
;
i
++)
{
for
(
int
j
=
0
;
j
<
Parameters
.
NPOINTS
;
j
++)
{
double
x
=
random
.
nextInt
((
int
)
(
bbox
.
getMaxX
()
-
bbox
.
getMinX
())
+
1
);
double
y
=
random
.
nextInt
((
int
)
(
bbox
.
getMaxY
()
-
bbox
.
getMinY
())
+
1
);
int
xi
=
(
int
)
Math
.
floor
(
x
/(
bbox
.
getMaxX
()-
bbox
.
getMinX
())*(
Parameters
.
SAMPLEDIVISION
-
1
));
int
yi
=
(
int
)
Math
.
floor
(
y
/(
bbox
.
getMaxY
()-
bbox
.
getMinY
())*(
Parameters
.
SAMPLEDIVISION
-
1
));
means
[
yi
][
xi
]
=
(
means
[
yi
][
xi
]
+
density
.
apply
(
new
VPoint
(
x
,
y
)))/
2
;
if
(
maxDensity
<
means
[
yi
][
xi
])
maxDensity
=
means
[
yi
][
xi
];
}
}
return
maxDensity
;
}
/*
Stellt den Verlauf der Iterationen dar. Innerhalb der while(true) passiert eine Iteration des Algorithmus
*/
private
void
work
()
{
while
(
true
)
{
if
(
largeMovement
())
{
copyPoints
();
long
now
=
System
.
currentTimeMillis
();
triangulation
=
new
BowyerWatson
<>(
points
,
(
x
,
y
)
->
new
IndexedVPoint
(
x
,
y
,
-
1
));
triangulation
.
execute
();
triangulation
.
removeTriangleIf
(
t
->
fd
.
apply
(
new
VTriangle
(
t
.
getLeft
(),
t
.
getMiddle
(),
t
.
getRight
()).
midPoint
())
<
-
geps
);
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" Bowyer-Watson-Algo"
);
}
long
now
=
System
.
currentTimeMillis
();
HashMap
<
IndexedVLine
,
Integer
>
reversedLines
=
createBars
();
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" CreateBars"
);
now
=
System
.
currentTimeMillis
();
List
<
IndexedVLine
>
lines
=
new
ArrayList
<>(
reversedLines
.
keySet
());
date
=
new
Date