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
2db821e0
Commit
2db821e0
authored
Nov 13, 2016
by
Benedikt Zoennchen
Browse files
add adpative triangulation implementation
parent
43e77c48
Changes
9
Show whitespace changes
Inline
Side-by-side
VadereUtils/src/org/vadere/util/delaunay/BowyerWatson.java
0 → 100644
View file @
2db821e0
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 @
2db821e0
...
@@ -171,6 +171,10 @@ public class VTriangle extends VPolygon {
...
@@ -171,6 +171,10 @@ public class VTriangle extends VPolygon {
return
getCircumcenter
().
distance
(
point
)
<
getCircumscribedRadius
();
return
getCircumcenter
().
distance
(
point
)
<
getCircumscribedRadius
();
}
}
public
boolean
isInCircumscribedCycle
(
final
VPoint
point
)
{
return
getCircumcenter
().
distance
(
point
)
<
getCircumscribedRadius
();
}
/**
/**
* Computes the inward facing normal vector for the given points of the
* Computes the inward facing normal vector for the given points of the
* triangle.
* triangle.
...
@@ -196,10 +200,6 @@ public class VTriangle extends VPolygon {
...
@@ -196,10 +200,6 @@ public class VTriangle extends VPolygon {
return
this
.
p1
.
equals
(
point
)
||
this
.
p2
.
equals
(
point
)
||
this
.
p3
.
equals
(
point
);
return
this
.
p1
.
equals
(
point
)
||
this
.
p2
.
equals
(
point
)
||
this
.
p3
.
equals
(
point
);
}
}
public
VLine
[]
getLines
()
{
return
lines
;
}
public
Stream
<
VLine
>
getLineStream
()
{
public
Stream
<
VLine
>
getLineStream
()
{
return
Arrays
.
stream
(
getLines
());
return
Arrays
.
stream
(
getLines
());
}
}
...
@@ -215,4 +215,8 @@ public class VTriangle extends VPolygon {
...
@@ -215,4 +215,8 @@ public class VTriangle extends VPolygon {
public
String
toString
()
{
public
String
toString
()
{
return
p1
+
"-"
+
p2
+
"-"
+
p3
;
return
p1
+
"-"
+
p2
+
"-"
+
p3
;
}
}
public
VLine
[]
getLines
()
{
return
lines
;
}
}
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/IndexedVLine.java
0 → 100644
View file @
2db821e0
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 @
2db821e0
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
;
}
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/PSDistmesh.java
View file @
2db821e0
...
@@ -96,7 +96,7 @@ public class PSDistmesh {
...
@@ -96,7 +96,7 @@ public class PSDistmesh {
}
}
public
boolean
hasMaximalSteps
()
{
public
boolean
hasMaximalSteps
()
{
return
steps
>=
Parameters
.
MAX_NUMBER_OF_STEPS
;
return
steps
>=
1000
;
}
}
/**
/**
...
...
VadereUtils/src/org/vadere/util/triangulation/adaptive/Parameters.java
View file @
2db821e0
...
@@ -5,17 +5,16 @@ package org.vadere.util.triangulation.adaptive;
...
@@ -5,17 +5,16 @@ package org.vadere.util.triangulation.adaptive;
*/
*/
public
class
Parameters
{
public
class
Parameters
{
final
static
double
TOL
=
.
1
;
final
static
double
TOL
=
.
1
;
final
static
double
FSCALE
=
1.
0
;
final
static
double
FSCALE
=
1.
2
;
final
static
double
DELTAT
=
0.2
;
final
static
double
DELTAT
=
0.2
;
public
final
static
double
h0
=
0.15
;
public
final
static
double
h0
=
0.15
;
public
final
static
boolean
uniform
=
false
;
public
final
static
boolean
uniform
=
false
;
public
final
static
String
method
=
"D
istmesh
"
;
// "Distmesh" or "Density"
public
final
static
String
method
=
"D
ensity
"
;
// "Distmesh" or "Density"
final
static
double
qualityMeasurement
=
0.
9
5
;
final
static
double
qualityMeasurement
=
0.
87
5
;
final
static
double
MINIMUM
=
0.25
;
final
static
double
MINIMUM
=
0.25
;
final
static
double
DENSITYWEIGHT
=
2
;
final
static
double
DENSITYWEIGHT
=
2
;
final
static
int
NPOINTS
=
100000
;
final
static
int
NPOINTS
=
100000
;
final
static
int
SAMPLENUMBER
=
10
;
final
static
int
SAMPLENUMBER
=
10
;
final
static
int
SAMPLEDIVISION
=
10
;
final
static
int
SAMPLEDIVISION
=
10
;
static
final
int
SEGMENTDIVISION
=
0
;
static
final
int
SEGMENTDIVISION
=
0
;
final
static
int
MAX_NUMBER_OF_STEPS
=
20
;
}
}
VadereUtils/src/org/vadere/util/triangulation/adaptive/PerssonStrangDistmesh.java
View file @
2db821e0
package
org.vadere.util.triangulation.adaptive
;
package
org.vadere.util.triangulation.adaptive
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.vadere.util.
triangulation
.BowyerWatson
3
;
import
org.vadere.util.
delaunay
.BowyerWatson
;
import
org.vadere.util.geometry.shapes.VLine
;
import
org.vadere.util.geometry.shapes.VLine
;
import
org.vadere.util.geometry.shapes.VPoint
;
import
org.vadere.util.geometry.shapes.VPoint
;
import
org.vadere.util.geometry.shapes.VRectangle
;
import
org.vadere.util.geometry.shapes.VRectangle
;
...
@@ -18,9 +18,9 @@ import java.util.stream.IntStream;
...
@@ -18,9 +18,9 @@ import java.util.stream.IntStream;
import
static
java
.
lang
.
Math
.
pow
;
import
static
java
.
lang
.
Math
.
pow
;
public
class
PerssonStrangDistmesh
{
public
class
PerssonStrangDistmesh
{
private
List
<
VPoint
>
points
=
new
ArrayList
<>();
private
List
<
Indexed
VPoint
>
points
=
new
ArrayList
<>();
private
List
<
VPoint
>
oldPoints
=
new
ArrayList
<>();
private
List
<
Indexed
VPoint
>
oldPoints
=
new
ArrayList
<>();
private
BowyerWatson
3
triangulation
;
private
BowyerWatson
<
IndexedVPoint
>
triangulation
;
private
Function
<
VPoint
,
Double
>
fd
;
private
Function
<
VPoint
,
Double
>
fd
;
private
Function
<
VPoint
,
Double
>
fh
;
private
Function
<
VPoint
,
Double
>
fh
;
...
@@ -38,6 +38,7 @@ public class PerssonStrangDistmesh {
...
@@ -38,6 +38,7 @@ public class PerssonStrangDistmesh {
boolean
uniform
,
boolean
uniform
,
Function
<
VPoint
,
Double
>
density
,
Function
<
VPoint
,
Double
>
density
,
String
method
)
{
String
method
)
{
long
now
=
System
.
currentTimeMillis
();
this
.
h0
=
h0
;
this
.
h0
=
h0
;
this
.
geps
=
.
001
*
h0
;
this
.
geps
=
.
001
*
h0
;
this
.
deps
=
1.4901
e
-
8
*
h0
;
this
.
deps
=
1.4901
e
-
8
*
h0
;
...
@@ -87,10 +88,6 @@ public class PerssonStrangDistmesh {
...
@@ -87,10 +88,6 @@ public class PerssonStrangDistmesh {
addAll
(
obstacles
);
addAll
(
obstacles
);
add
(
box
);
add
(
box
);
}});
}});
}
public
void
execude
()
{
long
now
=
System
.
currentTimeMillis
();
setOldPointsToInf
();
setOldPointsToInf
();
work
();
work
();
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
...
@@ -128,36 +125,22 @@ public class PerssonStrangDistmesh {
...
@@ -128,36 +125,22 @@ public class PerssonStrangDistmesh {
{
{
while
(
true
)
while
(
true
)
{
{
//double maxMove = largeMovement();
if
(
largeMovement
())
if
(
largeMovement
())
{
{
copyPoints
();
copyPoints
();
long
now
=
System
.
currentTimeMillis
();
long
now
=
System
.
currentTimeMillis
();
triangulation
=
new
BowyerWatson
3
(
points
);
triangulation
=
new
BowyerWatson
<>
(
points
,
(
x
,
y
)
->
new
IndexedVPoint
(
x
,
y
,
-
1
)
);
triangulation
.
execute
();
triangulation
.
execute
();
//System.out.println("different edges:" + triangulation.getTriangles().stream().flatMap(t -> t.getLineStream()).collect(Collectors.toSet()).size());
triangulation
.
removeTriangleIf
(
t
->
fd
.
apply
(
new
VTriangle
(
t
.
getLeft
(),
t
.
getMiddle
(),
t
.
getRight
()).
midPoint
())
<
-
geps
);
Set
<
VLine
>
setLine
=
new
HashSet
<>(
triangulation
.
getTriangles
().
stream
().
flatMap
(
t
->
t
.
getLineStream
()).
collect
(
Collectors
.
toList
()));
System
.
out
.
println
(
"different edges:"
+
setLine
.
size
());
//triangulation.setTriangles(triangulation.getTriangles().parallelStream().filter(p ->
// fd.apply(p.midPoint()) < -geps).collect(Collectors.toList()));
int
size
=
triangulation
.
getTriangles
().
size
();
/*triangulation.removeTriangleIf(triple -> fd.apply(
new VTriangle(triple.getLeft(), triple.getMiddle(), triple.getRight()).midPoint()) >= -geps);*/
triangulation
.
setTriangles
(
triangulation
.
getTriangles
().
parallelStream
().
filter
(
p
->
fd
.
apply
(
p
.
midPoint
())
<
-
geps
).
collect
(
Collectors
.
toList
()));
System
.
out
.
println
(
"deleted:"
+
(
size
-
triangulation
.
getTriangles
().
size
()));
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" Bowyer-Watson-Algo"
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" Bowyer-Watson-Algo"
);
}
}
long
now
=
System
.
currentTimeMillis
();
long
now
=
System
.
currentTimeMillis
();
HashMap
<
VLine
,
Integer
>
reversedLines
=
createBars
();
HashMap
<
Indexed
VLine
,
Integer
>
reversedLines
=
createBars
();
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
Date
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" CreateBars"
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" CreateBars"
);
now
=
System
.
currentTimeMillis
();
now
=
System
.
currentTimeMillis
();
List
<
VLine
>
lines
=
new
ArrayList
<>(
reversedLines
.
keySet
());
List
<
Indexed
VLine
>
lines
=
new
ArrayList
<>(
reversedLines
.
keySet
());
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
date
=
new
Date
(
System
.
currentTimeMillis
()
-
now
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" CompleteLineList"
);
System
.
out
.
println
(
new
SimpleDateFormat
(
"mm:ss:SSS"
).
format
(
date
)
+
" CompleteLineList"
);
now
=
System
.
currentTimeMillis
();
now
=
System
.
currentTimeMillis
();
...
@@ -196,12 +179,10 @@ public class PerssonStrangDistmesh {
...
@@ -196,12 +179,10 @@ public class PerssonStrangDistmesh {
private
void
doEuler
(
double
[][]
array
)
private
void
doEuler
(
double
[][]
array
)
{
{
points
=
IntStream
.
range
(
0
,
points
.
size
()).
parallel
().
mapToObj
(
i
->
{
points
=
IntStream
.
range
(
0
,
points
.
size
()).
parallel
().
mapToObj
(
i
->
{
if
(
points
.
get
(
i
).
identifier
!=
-
1
)
{
if
(
points
.
get
(
i
).
getId
()
!=
-
1
)
return
new
VPoint
(
array
[
i
][
0
]
*
Parameters
.
DELTAT
+
points
.
get
(
i
).
getX
(),
Parameters
.
DELTAT
*
array
[
i
][
1
]
+
points
.
get
(
i
).
getY
(),
i
);
return
new
IndexedVPoint
(
array
[
i
][
0
]
*
Parameters
.
DELTAT
+
points
.
get
(
i
).
getX
(),
Parameters
.
DELTAT
*
array
[
i
][
1
]
+
points
.
get
(
i
).
getY
(),
i
);
else
}
else
{
return
points
.
get
(
i
);
return
points
.
get
(
i
);
}
}).
collect
(
Collectors
.
toList
());
}).
collect
(
Collectors
.
toList
());
}
}
...
@@ -221,7 +202,7 @@ public class PerssonStrangDistmesh {
...
@@ -221,7 +202,7 @@ public class PerssonStrangDistmesh {
path
.
next
();
path
.
next
();
path
.
currentSegment
(
coordinates
);
path
.
currentSegment
(
coordinates
);
VPoint
[]
points
=
divLine
(
coordinates
[
0
],
coordinates
[
1
],
tempCoords
[
0
],
tempCoords
[
1
],
Parameters
.
SEGMENTDIVISION
);
Indexed
VPoint
[]
points
=
divLine
(
coordinates
[
0
],
coordinates
[
1
],
tempCoords
[
0
],
tempCoords
[
1
],
Parameters
.
SEGMENTDIVISION
);
if
(
coordinates
[
0
]
==
tempCoords
[
0
]
&&
coordinates
[
1
]
==
tempCoords
[
1
])
{
if
(
coordinates
[
0
]
==
tempCoords
[
0
]
&&
coordinates
[
1
]
==
tempCoords
[
1
])
{
break
;
break
;
}
}
...
@@ -234,15 +215,15 @@ public class PerssonStrangDistmesh {
...
@@ -234,15 +215,15 @@ public class PerssonStrangDistmesh {
/*
/*
Unterteilt eine Linie eines Objekts in Fixpunkte
Unterteilt eine Linie eines Objekts in Fixpunkte
*/
*/
private
VPoint
[]
divLine
(
double
x1
,
double
y1
,
double
x2
,
double
y2
,
int
segments
)
private
Indexed
VPoint
[]
divLine
(
double
x1
,
double
y1
,
double
x2
,
double
y2
,
int
segments
)
{
{
VPoint
[]
points
=
new
VPoint
[
segments
+
1
];
Indexed
VPoint
[]
points
=
new
Indexed
VPoint
[
segments
+
1
];
double
dX
=
(
x1
-
x2
)/
segments
;
double
dX
=
(
x1
-
x2
)/
segments
;
double
dY
=
(
y1
-
y2
)/
segments
;
double
dY
=
(
y1
-
y2
)/
segments
;
for
(
int
i
=
1
;
i
<
points
.
length
;
i
++)
for
(
int
i
=
1
;
i
<
points
.
length
;
i
++)
{
{
points
[
i
]
=
new
VPoint
(
x2
+
i
*
dX
,
y2
+
i
*
dY
,
-
1
);
points
[
i
]
=
new
Indexed
VPoint
(
x2
+
i
*
dX
,
y2
+
i
*
dY
,
-
1
);
}
}
return
points
;
return
points
;
}
}
...
@@ -254,7 +235,7 @@ public class PerssonStrangDistmesh {
...
@@ -254,7 +235,7 @@ public class PerssonStrangDistmesh {
{
{
double
ave
=
0
;
double
ave
=
0
;
int
i
=
0
;
int
i
=
0
;
for
(
VTriangle
v
:
triangulation
.
getTriangles
())
{
for
(
VTriangle
v
:
triangulation
.
get
V
Triangles
())
{