summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/CMakeLists.txt8
-rw-r--r--examples/datavisualization/CMakeLists.txt13
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.cpp118
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.h59
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.pro23
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.cpp114
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.h55
-rw-r--r--examples/datavisualization/audiolevels/doc/images/audiolevels-example.pngbin120978 -> 0 bytes
-rw-r--r--examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc98
-rw-r--r--examples/datavisualization/audiolevels/main.cpp56
-rw-r--r--examples/datavisualization/bars/bars.pro17
-rw-r--r--examples/datavisualization/bars/doc/images/bars-example.pngbin238712 -> 0 bytes
-rw-r--r--examples/datavisualization/bars/doc/src/bars.qdoc228
-rw-r--r--examples/datavisualization/bars/graphmodifier.h113
-rw-r--r--examples/datavisualization/bars/main.cpp336
-rw-r--r--examples/datavisualization/custominput/custominput.pro20
-rw-r--r--examples/datavisualization/custominput/custominput.qrc5
-rw-r--r--examples/datavisualization/custominput/custominputhandler.cpp65
-rw-r--r--examples/datavisualization/custominput/custominputhandler.h47
-rw-r--r--examples/datavisualization/custominput/data/data.txt1060
-rw-r--r--examples/datavisualization/custominput/doc/images/custominput-example.pngbin62422 -> 0 bytes
-rw-r--r--examples/datavisualization/custominput/doc/src/custominput.qdoc87
-rw-r--r--examples/datavisualization/custominput/main.cpp102
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.cpp186
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.h71
-rw-r--r--examples/datavisualization/customitems/customitemgraph.cpp331
-rw-r--r--examples/datavisualization/customitems/customitemgraph.h69
-rw-r--r--examples/datavisualization/customitems/customitems.pro19
-rw-r--r--examples/datavisualization/customitems/customitems.qrc12
-rw-r--r--examples/datavisualization/customitems/doc/images/customitems-example.pngbin109729 -> 0 bytes
-rw-r--r--examples/datavisualization/customitems/doc/src/customitems.qdoc86
-rw-r--r--examples/datavisualization/customitems/main.cpp139
-rw-r--r--examples/datavisualization/customproxy/customproxy.pro25
-rw-r--r--examples/datavisualization/customproxy/customproxy.qrc5
-rw-r--r--examples/datavisualization/customproxy/data/raindata.txt158
-rw-r--r--examples/datavisualization/customproxy/doc/images/customproxy-example.pngbin173744 -> 0 bytes
-rw-r--r--examples/datavisualization/customproxy/doc/src/customproxy.qdoc122
-rw-r--r--examples/datavisualization/customproxy/main.cpp55
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.cpp169
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.h62
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.cpp144
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.h91
-rw-r--r--examples/datavisualization/customproxy/variantbardataproxy.h79
-rw-r--r--examples/datavisualization/customproxy/variantdataset.cpp74
-rw-r--r--examples/datavisualization/customproxy/variantdataset.h68
-rw-r--r--examples/datavisualization/datavisualization.pro24
-rw-r--r--examples/datavisualization/draggableaxes/axesinputhandler.h82
-rw-r--r--examples/datavisualization/draggableaxes/data.cpp175
-rw-r--r--examples/datavisualization/draggableaxes/data.h59
-rw-r--r--examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.pngbin90050 -> 0 bytes
-rw-r--r--examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc133
-rw-r--r--examples/datavisualization/draggableaxes/draggableaxes.pro18
-rw-r--r--examples/datavisualization/draggableaxes/main.cpp77
-rw-r--r--examples/datavisualization/graphgallery/CMakeLists.txt75
-rw-r--r--examples/datavisualization/graphgallery/axesinputhandler.cpp (renamed from examples/datavisualization/draggableaxes/axesinputhandler.cpp)38
-rw-r--r--examples/datavisualization/graphgallery/axesinputhandler.h54
-rw-r--r--examples/datavisualization/graphgallery/bargraph.cpp329
-rw-r--r--examples/datavisualization/graphgallery/bargraph.h26
-rw-r--r--examples/datavisualization/graphgallery/custominputhandler.cpp (renamed from examples/datavisualization/texturesurface/custominputhandler.cpp)56
-rw-r--r--examples/datavisualization/graphgallery/custominputhandler.h76
-rw-r--r--examples/datavisualization/graphgallery/data/layer_1.png (renamed from examples/datavisualization/customitems/layer_1.png)bin34540 -> 34540 bytes
-rw-r--r--examples/datavisualization/graphgallery/data/layer_2.png (renamed from examples/datavisualization/customitems/layer_2.png)bin10553 -> 10553 bytes
-rw-r--r--examples/datavisualization/graphgallery/data/layer_3.png (renamed from examples/datavisualization/customitems/layer_3.png)bin7119 -> 7119 bytes
-rw-r--r--examples/datavisualization/graphgallery/data/license.txt (renamed from examples/datavisualization/texturesurface/license.txt)0
-rw-r--r--examples/datavisualization/graphgallery/data/maptexture.jpg (renamed from examples/datavisualization/texturesurface/maptexture.jpg)bin352922 -> 352922 bytes
-rw-r--r--examples/datavisualization/graphgallery/data/oilrig.obj (renamed from examples/datavisualization/customitems/oilrig.obj)0
-rw-r--r--examples/datavisualization/graphgallery/data/pipe.obj (renamed from examples/datavisualization/customitems/pipe.obj)0
-rw-r--r--examples/datavisualization/graphgallery/data/raindata.txt158
-rw-r--r--examples/datavisualization/graphgallery/data/refinery.obj (renamed from examples/datavisualization/customitems/refinery.obj)0
-rw-r--r--examples/datavisualization/graphgallery/data/topography.png (renamed from examples/datavisualization/texturesurface/topography.png)bin395504 -> 395504 bytes
-rw-r--r--examples/datavisualization/graphgallery/doc/images/graphgallery-example.pngbin0 -> 375425 bytes
-rw-r--r--examples/datavisualization/graphgallery/doc/src/graphgallery.qdoc705
-rw-r--r--examples/datavisualization/graphgallery/graphgallery.pro49
-rw-r--r--examples/datavisualization/graphgallery/graphgallery.qrc13
-rw-r--r--examples/datavisualization/graphgallery/graphmodifier.cpp (renamed from examples/datavisualization/bars/graphmodifier.cpp)203
-rw-r--r--examples/datavisualization/graphgallery/graphmodifier.h87
-rw-r--r--examples/datavisualization/graphgallery/highlightseries.cpp (renamed from examples/datavisualization/texturesurface/highlightseries.cpp)53
-rw-r--r--examples/datavisualization/graphgallery/highlightseries.h35
-rw-r--r--examples/datavisualization/graphgallery/main.cpp52
-rw-r--r--examples/datavisualization/graphgallery/rainfalldata.cpp117
-rw-r--r--examples/datavisualization/graphgallery/rainfalldata.h43
-rw-r--r--examples/datavisualization/graphgallery/scatterdatamodifier.cpp191
-rw-r--r--examples/datavisualization/graphgallery/scatterdatamodifier.h49
-rw-r--r--examples/datavisualization/graphgallery/scattergraph.cpp142
-rw-r--r--examples/datavisualization/graphgallery/scattergraph.h26
-rw-r--r--examples/datavisualization/graphgallery/surfacegraph.cpp346
-rw-r--r--examples/datavisualization/graphgallery/surfacegraph.h26
-rw-r--r--examples/datavisualization/graphgallery/surfacegraphmodifier.cpp647
-rw-r--r--examples/datavisualization/graphgallery/surfacegraphmodifier.h109
-rw-r--r--examples/datavisualization/graphgallery/topographicseries.cpp55
-rw-r--r--examples/datavisualization/graphgallery/topographicseries.h26
-rw-r--r--examples/datavisualization/graphgallery/variantbardatamapping.cpp85
-rw-r--r--examples/datavisualization/graphgallery/variantbardatamapping.h66
-rw-r--r--examples/datavisualization/graphgallery/variantbardataproxy.cpp (renamed from examples/datavisualization/customproxy/variantbardataproxy.cpp)69
-rw-r--r--examples/datavisualization/graphgallery/variantbardataproxy.h48
-rw-r--r--examples/datavisualization/graphgallery/variantdataset.cpp45
-rw-r--r--examples/datavisualization/graphgallery/variantdataset.h41
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.pngbin78536 -> 0 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example.pngbin45381 -> 0 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc196
-rw-r--r--examples/datavisualization/itemmodel/itemmodel.pro15
-rw-r--r--examples/datavisualization/itemmodel/main.cpp304
-rw-r--r--examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.pngbin89048 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc121
-rw-r--r--examples/datavisualization/qmlaxisdrag/main.cpp59
-rw-r--r--examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml55
-rw-r--r--examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.pngbin10429 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml328
-rw-r--r--examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro11
-rw-r--r--examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc12
-rw-r--r--examples/datavisualization/qmlaxisformatter/customformatter.h81
-rw-r--r--examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.pngbin132952 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc126
-rw-r--r--examples/datavisualization/qmlaxisformatter/main.cpp68
-rw-r--r--examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml194
-rw-r--r--examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro16
-rw-r--r--examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc7
-rw-r--r--examples/datavisualization/qmlaxishandling/CMakeLists.txt60
-rw-r--r--examples/datavisualization/qmlaxishandling/customformatter.cpp (renamed from examples/datavisualization/qmlaxisformatter/customformatter.cpp)41
-rw-r--r--examples/datavisualization/qmlaxishandling/customformatter.h55
-rw-r--r--examples/datavisualization/qmlaxishandling/doc/images/qmlaxishandling-example.pngbin0 -> 132862 bytes
-rw-r--r--examples/datavisualization/qmlaxishandling/doc/src/qmlaxishandling.qdoc188
-rw-r--r--examples/datavisualization/qmlaxishandling/main.cpp43
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml298
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml156
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/Data.qml (renamed from examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml)32
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cube.obj (renamed from examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj)0
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cubetexture.pngbin0 -> 3386 bytes
-rw-r--r--examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/main.qml47
-rw-r--r--examples/datavisualization/qmlaxishandling/qmlaxishandling.pro16
-rw-r--r--examples/datavisualization/qmlaxishandling/qmlaxishandling.qrc12
-rw-r--r--examples/datavisualization/qmlaxishandling/qmldir2
-rw-r--r--examples/datavisualization/qmlbars/CMakeLists.txt58
-rw-r--r--examples/datavisualization/qmlbars/doc/images/qmlbars-example.pngbin146667 -> 186928 bytes
-rw-r--r--examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc112
-rw-r--r--examples/datavisualization/qmlbars/main.cpp43
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml34
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Data.qml214
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/main.qml405
-rw-r--r--examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.pngbin73150 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc90
-rw-r--r--examples/datavisualization/qmlcustominput/main.cpp59
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml1106
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml243
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.pro12
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.qrc7
-rw-r--r--examples/datavisualization/qmllegend/doc/images/qmllegend-example.pngbin98023 -> 0 bytes
-rw-r--r--examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc78
-rw-r--r--examples/datavisualization/qmllegend/main.cpp59
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/Data.qml89
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml135
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml63
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/main.qml241
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.pro13
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.qrc8
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.pngbin82347 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc55
-rw-r--r--examples/datavisualization/qmlmultigraph/main.cpp58
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml59
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml221
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.pro12
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc7
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.h59
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.pngbin129028 -> 0 bytes
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc128
-rw-r--r--examples/datavisualization/qmloscilloscope/main.cpp76
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml63
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml338
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc6
-rw-r--r--examples/datavisualization/qmlscatter/CMakeLists.txt53
-rw-r--r--examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.pngbin98086 -> 107603 bytes
-rw-r--r--examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc130
-rw-r--r--examples/datavisualization/qmlscatter/main.cpp33
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml32
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml247
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.pro1
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.qrc1
-rw-r--r--examples/datavisualization/qmlspectrogram/doc/images/qmlspectrogram-example.pngbin80103 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc100
-rw-r--r--examples/datavisualization/qmlspectrogram/main.cpp53
-rw-r--r--examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml304
-rw-r--r--examples/datavisualization/qmlspectrogram/qmlspectrogram.pro12
-rw-r--r--examples/datavisualization/qmlspectrogram/qmlspectrogram.qrc7
-rw-r--r--examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.pngbin334593 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc119
-rw-r--r--examples/datavisualization/qmlsurface/heightmap.pngbin38634 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurface/main.cpp58
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml10040
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml63
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml263
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.pro12
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.qrc10
-rw-r--r--examples/datavisualization/qmlsurfacegallery/CMakeLists.txt60
-rw-r--r--examples/datavisualization/qmlsurfacegallery/datasource.cpp (renamed from examples/datavisualization/qmloscilloscope/datasource.cpp)92
-rw-r--r--examples/datavisualization/qmlsurfacegallery/datasource.h38
-rw-r--r--examples/datavisualization/qmlsurfacegallery/doc/images/qmlsurfacegallery-example.pngbin0 -> 172206 bytes
-rw-r--r--examples/datavisualization/qmlsurfacegallery/doc/src/qmlsurfacegallery.qdoc238
-rw-r--r--examples/datavisualization/qmlsurfacegallery/main.cpp52
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SpectrogramData.qml (renamed from examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/Data.qml)32
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml227
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml430
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml272
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.pngbin0 -> 638731 bytes
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.readme25
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/main.qml57
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.pro (renamed from examples/datavisualization/qmloscilloscope/qmloscilloscope.pro)7
-rw-r--r--examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.qrc10
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.pngbin91579 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc91
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_1.pngbin34540 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_2.pngbin10563 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_3.pngbin13022 -> 0 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/main.cpp63
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml65
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml343
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro12
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc11
-rw-r--r--examples/datavisualization/rotations/doc/images/rotations-example.pngbin69487 -> 0 bytes
-rw-r--r--examples/datavisualization/rotations/doc/src/rotations.qdoc79
-rw-r--r--examples/datavisualization/rotations/main.cpp106
-rw-r--r--examples/datavisualization/rotations/mesh/largesphere.obj1938
-rw-r--r--examples/datavisualization/rotations/mesh/narrowarrow.obj413
-rw-r--r--examples/datavisualization/rotations/rotations.pro17
-rw-r--r--examples/datavisualization/rotations/rotations.qrc6
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.cpp193
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.h67
-rw-r--r--examples/datavisualization/scatter/doc/images/scatter-example.pngbin142496 -> 0 bytes
-rw-r--r--examples/datavisualization/scatter/doc/src/scatter.qdoc157
-rw-r--r--examples/datavisualization/scatter/main.cpp195
-rw-r--r--examples/datavisualization/scatter/scatter.pro17
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.cpp218
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.h80
-rw-r--r--examples/datavisualization/surface/doc/images/surface-example.pngbin149046 -> 0 bytes
-rw-r--r--examples/datavisualization/surface/doc/src/surface.qdoc147
-rw-r--r--examples/datavisualization/surface/main.cpp230
-rw-r--r--examples/datavisualization/surface/mountain.pngbin34540 -> 0 bytes
-rw-r--r--examples/datavisualization/surface/surface.pro20
-rw-r--r--examples/datavisualization/surface/surface.qrc5
-rw-r--r--examples/datavisualization/surface/surfacegraph.cpp279
-rw-r--r--examples/datavisualization/surface/surfacegraph.h99
-rw-r--r--examples/datavisualization/texturesurface/custominputhandler.h102
-rw-r--r--examples/datavisualization/texturesurface/doc/images/texturesurface-example.pngbin157373 -> 0 bytes
-rw-r--r--examples/datavisualization/texturesurface/doc/src/texturesurface.qdoc137
-rw-r--r--examples/datavisualization/texturesurface/highlightseries.h63
-rw-r--r--examples/datavisualization/texturesurface/main.cpp120
-rw-r--r--examples/datavisualization/texturesurface/surfacegraph.cpp101
-rw-r--r--examples/datavisualization/texturesurface/surfacegraph.h63
-rw-r--r--examples/datavisualization/texturesurface/texturedsurface.qrc6
-rw-r--r--examples/datavisualization/texturesurface/texturesurface.pro25
-rw-r--r--examples/datavisualization/texturesurface/topographicseries.cpp84
-rw-r--r--examples/datavisualization/texturesurface/topographicseries.h56
-rw-r--r--examples/datavisualization/volumetric/CMakeLists.txt56
-rw-r--r--examples/datavisualization/volumetric/doc/images/volumetric-example.pngbin177203 -> 169556 bytes
-rw-r--r--examples/datavisualization/volumetric/doc/src/volumetric.qdoc127
-rw-r--r--examples/datavisualization/volumetric/main.cpp58
-rw-r--r--examples/datavisualization/volumetric/volumetric.cpp153
-rw-r--r--examples/datavisualization/volumetric/volumetric.h106
262 files changed, 7135 insertions, 28357 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 00000000..9a9782af
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt_examples_build_begin(EXTERNAL_BUILD)
+
+add_subdirectory(datavisualization)
+
+qt_examples_build_end()
diff --git a/examples/datavisualization/CMakeLists.txt b/examples/datavisualization/CMakeLists.txt
new file mode 100644
index 00000000..4e9514b1
--- /dev/null
+++ b/examples/datavisualization/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+if(TARGET Qt::Quick)
+ qt_internal_add_example(qmlaxishandling)
+ qt_internal_add_example(qmlbars)
+ qt_internal_add_example(qmlscatter)
+ qt_internal_add_example(qmlsurfacegallery)
+endif()
+if(NOT ANDROID AND NOT IOS AND NOT WINRT)
+ qt_internal_add_example(graphgallery)
+ qt_internal_add_example(volumetric)
+endif()
diff --git a/examples/datavisualization/audiolevels/audiolevels.cpp b/examples/datavisualization/audiolevels/audiolevels.cpp
deleted file mode 100644
index 65635fd2..00000000
--- a/examples/datavisualization/audiolevels/audiolevels.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "audiolevelsiodevice.h"
-#include "audiolevels.h"
-
-#include <QtDataVisualization/qbardataproxy.h>
-#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/qbar3dseries.h>
-#include <QtDataVisualization/q3dtheme.h>
-#include <QtDataVisualization/qcustom3dlabel.h>
-
-#include <QtMultimedia/QAudioDeviceInfo>
-#include <QtMultimedia/QAudioInput>
-
-using namespace QtDataVisualization;
-
-AudioLevels::AudioLevels(Q3DBars *graph, QObject *parent)
- : QObject(parent),
- m_graph(graph),
- m_device(0),
- m_audioInput(0)
-{
- // Set up the graph
- m_graph->setBarThickness(0.5f);
- m_graph->setBarSpacing(QSizeF(0.0, 1.0));
- m_graph->valueAxis()->setRange(-100.0f, 100.0f);
- m_graph->valueAxis()->setSegmentCount(20);
- m_graph->valueAxis()->setLabelFormat(QStringLiteral("%d%%"));
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
- m_graph->setSelectionMode(QAbstract3DGraph::SelectionNone);
- m_graph->scene()->activeCamera()->setCameraPosition(-25.0f, 10.0f, 190.0f);
- m_graph->activeTheme()->setType(Q3DTheme::ThemeIsabelle);
- m_graph->activeTheme()->setGridEnabled(true);
- m_graph->activeTheme()->setBackgroundEnabled(false);
- QFont font = m_graph->activeTheme()->font();
- font.setPointSize(10);
- m_graph->activeTheme()->setFont(font);
- QBar3DSeries *series = new QBar3DSeries;
- series->setMesh(QAbstract3DSeries::MeshBar);
- m_graph->addSeries(series);
-
- //! [0]
- QAudioDeviceInfo inputDevice = QAudioDeviceInfo::defaultInputDevice();
-
- if (inputDevice.supportedSampleRates().size() > 0
- && inputDevice.supportedChannelCounts().size() > 0
- && inputDevice.supportedSampleSizes().size() > 0
- && inputDevice.supportedCodecs().size() > 0) {
- QAudioFormat formatAudio;
- formatAudio.setSampleRate(inputDevice.supportedSampleRates().at(0));
- formatAudio.setChannelCount(inputDevice.supportedChannelCounts().at(0));
- formatAudio.setSampleSize(inputDevice.supportedSampleSizes().at(0));
- formatAudio.setCodec(inputDevice.supportedCodecs().at(0));
- formatAudio.setByteOrder(QAudioFormat::LittleEndian);
- formatAudio.setSampleType(QAudioFormat::UnSignedInt);
-
- m_audioInput = new QAudioInput(inputDevice, formatAudio, this);
-#ifdef Q_OS_MAC
- // OS X seems to wait for entire buffer to fill before calling writeData, so use smaller buffer
- m_audioInput->setBufferSize(256);
-#else
- m_audioInput->setBufferSize(1024);
-#endif
-
- m_device = new AudioLevelsIODevice(m_graph->seriesList().at(0)->dataProxy(), this);
- m_device->open(QIODevice::WriteOnly);
-
- m_audioInput->start(m_device);
- } else {
- // No graph content can be shown, so add a custom warning label
- QCustom3DLabel *titleLabel = new QCustom3DLabel("No valid audio input device found",
- QFont(),
- QVector3D(0.2f, 0.2f, 0.0f),
- QVector3D(1.0f, 1.0f, 0.0f),
- QQuaternion());
- titleLabel->setPositionAbsolute(true);
- titleLabel->setFacingCamera(true);
- m_graph->addCustomItem(titleLabel);
- }
- //! [0]
-}
-
-AudioLevels::~AudioLevels()
-{
- if (m_audioInput)
- m_audioInput->stop();
- if (m_device)
- m_device->close();
-}
diff --git a/examples/datavisualization/audiolevels/audiolevels.h b/examples/datavisualization/audiolevels/audiolevels.h
deleted file mode 100644
index f9a7d9e5..00000000
--- a/examples/datavisualization/audiolevels/audiolevels.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef AUDIOLEVELS_H
-#define AUDIOLEVELS_H
-
-#include <QtDataVisualization/q3dbars.h>
-
-using namespace QtDataVisualization;
-
-class AudioLevelsIODevice;
-
-QT_BEGIN_NAMESPACE
-class QAudioInput;
-QT_END_NAMESPACE
-
-class AudioLevels : public QObject
-{
- Q_OBJECT
-
-public:
- AudioLevels(Q3DBars *graph, QObject *parent = 0);
- ~AudioLevels();
-
-private:
- //! [0]
- Q3DBars *m_graph;
- AudioLevelsIODevice *m_device;
- QAudioInput *m_audioInput;
- //! [0]
-};
-
-#endif
diff --git a/examples/datavisualization/audiolevels/audiolevels.pro b/examples/datavisualization/audiolevels/audiolevels.pro
deleted file mode 100644
index de40e636..00000000
--- a/examples/datavisualization/audiolevels/audiolevels.pro
+++ /dev/null
@@ -1,23 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-requires(qtHaveModule(multimedia))
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-TARGET = audiolevels
-
-QT += multimedia
-
-SOURCES += main.cpp \
- audiolevels.cpp \
- audiolevelsiodevice.cpp
-
-HEADERS += audiolevels.h \
- audiolevelsiodevice.h
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp b/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
deleted file mode 100644
index 7cd2bbb3..00000000
--- a/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "audiolevelsiodevice.h"
-#include <QtCore/QDebug>
-
-using namespace QtDataVisualization;
-
-//! [1]
-static const int resolution = 8;
-static const int rowSize = 800;
-static const int rowCount = 7; // Must be odd number
-static const int middleRow = rowCount / 2;
-//! [1]
-
-AudioLevelsIODevice::AudioLevelsIODevice(QBarDataProxy *proxy, QObject *parent)
- : QIODevice(parent),
- m_proxy(proxy),
- m_array(new QBarDataArray)
-{
- // We reuse the existing array for maximum performance, so construct the array here
- //! [0]
- m_array->reserve(rowCount);
- for (int i = 0; i < rowCount; i++)
- m_array->append(new QBarDataRow(rowSize));
- //! [0]
-
- qDebug() << "Total of" << (rowSize * rowCount) << "items in the array.";
-}
-
-// Implementation required for this pure virtual function
-qint64 AudioLevelsIODevice::readData(char *data, qint64 maxSize)
-{
- Q_UNUSED(data);
- Q_UNUSED(maxSize);
- return -1;
-}
-
-//! [2]
-qint64 AudioLevelsIODevice::writeData(const char *data, qint64 maxSize)
-{
- // The amount of new data available.
- int newDataSize = maxSize / resolution;
-
- // If we get more data than array size, we need to adjust the start index for new data.
- int newDataStartIndex = qMax(0, (newDataSize - rowSize));
-
- // Move the old data ahead in the rows (only do first half of rows + middle one now).
- // If the amount of new data was larger than row size, skip copying.
- if (!newDataStartIndex) {
- for (int i = 0; i <= middleRow; i++) {
- QBarDataItem *srcPos = m_array->at(i)->data();
- QBarDataItem *dstPos = srcPos + newDataSize;
- memmove((void *)dstPos, (void *)srcPos, (rowSize - newDataSize) * sizeof(QBarDataItem));
- }
- }
-
- // Insert data in reverse order, so that newest data is always at the front of the row.
- int index = 0;
- for (int i = newDataSize - 1; i >= newDataStartIndex; i--) {
- // Add 0.01 to the value to avoid gaps in the graph (i.e. zero height bars).
- // Also, scale to 0...100
- float value = float(quint8(data[resolution * i]) - 128) / 1.28f + 0.01f;
- (*m_array->at(middleRow))[index].setValue(value);
- // Insert a fractional value into front half of the rows.
- for (int j = 1; j <= middleRow; j++) {
- float fractionalValue = value / float(j + 1);
- (*m_array->at(middleRow - j))[index].setValue(fractionalValue);
- }
- index++;
- }
-
- // Copy the front half of rows to the back half for symmetry.
- index = 0;
- for (int i = rowCount - 1; i > middleRow; i--) {
- QBarDataItem *srcPos = m_array->at(index++)->data();
- QBarDataItem *dstPos = m_array->at(i)->data();
- memcpy((void *)dstPos, (void *)srcPos, rowSize * sizeof(QBarDataItem));
- }
-
- // Reset the proxy array now that data has been updated to trigger a redraw.
- m_proxy->resetArray(m_array);
-
- return maxSize;
-}
-//! [2]
-
-
diff --git a/examples/datavisualization/audiolevels/audiolevelsiodevice.h b/examples/datavisualization/audiolevels/audiolevelsiodevice.h
deleted file mode 100644
index 1a9f57b3..00000000
--- a/examples/datavisualization/audiolevels/audiolevelsiodevice.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef AUDIOLEVELSIODEVICE_H
-#define AUDIOLEVELSIODEVICE_H
-
-#include <QtDataVisualization/qbardataproxy.h>
-#include <QtCore/QIODevice>
-
-using namespace QtDataVisualization;
-
-class AudioLevelsIODevice : public QIODevice
-{
- Q_OBJECT
-public:
- explicit AudioLevelsIODevice(QBarDataProxy *proxy, QObject *parent = 0);
-
-protected:
- qint64 readData(char *data, qint64 maxSize);
- qint64 writeData(const char *data, qint64 maxSize);
-
-private:
- //! [0]
- QBarDataProxy *m_proxy;
- QBarDataArray *m_array;
- //! [0]
-};
-
-#endif
diff --git a/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png b/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
deleted file mode 100644
index ec79eb5a..00000000
--- a/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc b/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
deleted file mode 100644
index 460715b3..00000000
--- a/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
+++ /dev/null
@@ -1,98 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example audiolevels
- \title Audiolevels Example
- \ingroup qtdatavisualization_examples
- \brief Simple application showing real time audio data.
-
- The audiolevels example shows how feed real-time dynamic data to a graph using Q3DBars.
-
- This example reads the audio levels from a microphone and displays those levels
- in a bar graph. To increase the load for demonstration purposes, and to make the
- graph little fancier, slightly modified data is used to fill multiple rows.
-
- \image audiolevels-example.png
-
- The interesting stuff happens in \c AudioLevels and \c AudioLevelsIODevice classes, so we
- concentrate on those and skip explaining the basic Q3DBars functionality - for that see
- \l{Bars Example}.
-
- \include examples-run.qdocinc
-
- \section1 Visualizing Audio Levels
-
- \c AudioLevelsIODevice subclasses QIODevice and is given as input device for QAudioInput
- class, so it receives microphone data.
-
- In the header file for \c AudioLevels class we declare necessary members:
-
- \snippet audiolevels/audiolevels.h 0
-
- And initialize the microphone listening in the source:
-
- \snippet audiolevels/audiolevels.cpp 0
-
- In the header file for \c AudioLevelsIODevice class we store pointers to the data proxy and
- also the data array we give to the proxy, because we reuse the same array to keep memory
- reallocations to the minimum:
-
- \snippet audiolevels/audiolevelsiodevice.h 0
-
- In the source file we define some static constants to define size of the data array and
- the middle row index, as well as the resolution of the visualization. You may need to adjust
- these values to get decent performance in low-end devices:
-
- \snippet audiolevels/audiolevelsiodevice.cpp 1
-
- The \c resolution constant indicates the sample rate, for example, value 8 means every eighth
- byte from audio input is visualized. This is necessary to make the data readable, as it would
- otherwise make the graph scroll too fast.
-
- In the \c AudioLevelsIODevice class constructor we initialize the data array:
-
- \snippet audiolevels/audiolevelsiodevice.cpp 0
-
- The \c AudioLevelsIODevice::writeData function is called whenever there is new audio data
- available to be visualized. There we move the old data along the rows and insert new
- data in the beginning of the rows:
-
- \snippet audiolevels/audiolevelsiodevice.cpp 2
-
- We use a couple of techniques here to improve performance. First, we reuse
- the existing data array, as this allows us to avoid any extra memory allocations in our
- application code. This also means the data array dimensions do not change, which further
- improves efficiency in the bar graph renderer.
- Secondly, since each row is a QList of bar data items, which do not allocate any data that needs
- deletion, we can utilize \c memmove and \c memcpy functions to quickly move and copy data around.
-
- \note In the future versions of Qt Data Visualization, QBarDataItem might get extended so that
- it does allocate some memory to store other optional bar properties besides the value.
- In use cases where those optional properties are used, using \c memmove and \c memcpy could lead to
- memory leaks, so use them with care.
-*/
diff --git a/examples/datavisualization/audiolevels/main.cpp b/examples/datavisualization/audiolevels/main.cpp
deleted file mode 100644
index eeb7baff..00000000
--- a/examples/datavisualization/audiolevels/main.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "audiolevels.h"
-
-#include <QtGui/QGuiApplication>
-#include <QtMultimedia/QAudio>
-
-using namespace QtDataVisualization;
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- Q3DBars window;
-
- if (!window.hasContext()) {
- qWarning() << QStringLiteral("Couldn't initialize the OpenGL context.") ;
- return -1;
- }
-
- window.setFlags(window.flags() ^ Qt::FramelessWindowHint);
- window.resize(800, 500);
- window.setTitle("Qt Data Visualization - Microphone audio levels visualizer");
- window.show();
-
- AudioLevels audioLevels(&window);
-
- return app.exec();
-}
diff --git a/examples/datavisualization/bars/bars.pro b/examples/datavisualization/bars/bars.pro
deleted file mode 100644
index 148fc66e..00000000
--- a/examples/datavisualization/bars/bars.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp graphmodifier.cpp
-HEADERS += graphmodifier.h
-
-QT += widgets
-requires(qtConfig(fontcombobox))
-requires(qtConfig(combobox))
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/bars/doc/images/bars-example.png b/examples/datavisualization/bars/doc/images/bars-example.png
deleted file mode 100644
index c06fe2c1..00000000
--- a/examples/datavisualization/bars/doc/images/bars-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/bars/doc/src/bars.qdoc b/examples/datavisualization/bars/doc/src/bars.qdoc
deleted file mode 100644
index 1d2ad1ae..00000000
--- a/examples/datavisualization/bars/doc/src/bars.qdoc
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example bars
- \title Bars Example
- \ingroup qtdatavisualization_examples
- \brief Using Q3DBars in a widget application.
-
- The bars example shows how to make a 3D bar graph using Q3DBars and combining the use of
- widgets for adjusting several adjustable qualities. The example shows how to:
-
- \list
- \li Create an application with Q3DBars and some widgets
- \li Use QBar3DSeries and QBarDataProxy to set data to the graph
- \li Adjust some graph and series properties using widget controls
- \li Select a row or a column by clicking an axis label
- \endlist
-
- It also demonstrates how having negative bar values affects the graph.
-
- For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
-
- \image bars-example.png
-
- \include examples-run.qdocinc
-
- \section1 Creating the Application
-
- First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container
- for it:
-
- \snippet bars/main.cpp 0
-
- The call to QWidget::createWindowContainer is required, as all data visualization graph classes
- (Q3DBars, Q3DScatter, Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
- as a widget any other way.
-
- Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical
- layout into the horizontal one:
-
- \snippet bars/main.cpp 1
-
- We're not using the vertical layout for anything yet, but we'll get back to it in
- \l {Using widgets to control the graph}
-
- Next, let's create another class to handle the data addition and other interaction with the
- graph. Let's call it \c GraphModifier (See \l {Setting up the graph} and
- \l {Adding data to the graph} for details):
-
- \snippet bars/main.cpp 2
-
- The application main is done and we can show the graph and start the event loop:
-
- \snippet bars/main.cpp 3
-
- \section1 Setting up the Graph
-
- Let's set up the graph in the constructor of the \c GraphModifier class we instantiated in the
- application main:
-
- \snippet bars/graphmodifier.cpp 0
-
- Let's take a closer look at parts of the code.
-
- First we're creating the axes and the series into member variables to support changing them
- easily later on, if we want to:
-
- \snippet bars/graphmodifier.cpp 1
-
- Then we're setting some of the visual qualities for the graph:
-
- \snippet bars/graphmodifier.cpp 2
-
- We're also setting up the axes and setting them to the graph as active axes:
-
- \snippet bars/graphmodifier.cpp 3
-
- We give axis labels a small autorotation angle to make them orient somewhat toward the
- camera. This is done to improve axis label readability at extreme camera angles.
-
- Next we initialize the visual properties of the series.
- Note that the second series is initially not visible:
-
- \snippet bars/graphmodifier.cpp 8
-
- The series need to be added to the graph to show them:
-
- \snippet bars/graphmodifier.cpp 4
-
- Finally, we set the camera angle by calling the same method the camera angle change button
- in the UI uses to cycle through various camera angles:
-
- \snippet bars/graphmodifier.cpp 6
-
- There you can see that the camera is controlled via the scene object of the graph:
-
- \snippet bars/graphmodifier.cpp 10
-
- For more information about using scene and cameras, see Q3DScene and Q3DCamera.
-
- That concludes setting up the graph.
-
- \section1 Adding Data to the Graph
-
- At the end of the constructor there's a call:
-
- \snippet bars/graphmodifier.cpp 9
-
- This method is used to add data to the proxies of the two series:
-
- \snippet bars/graphmodifier.cpp 5
-
- Now the series have data to show.
-
- \section1 Using Widgets to Control the Graph
-
- There isn't much interaction yet, so let's continue by adding some widgets back in the
- application main. Let's just focus on two as an example:
-
- \snippet bars/main.cpp 4
-
- We can use these slider widgets to rotate the graph instead of just using the mouse or
- touch.
-
- Let's add them to the vertical layout we created earlier:
-
- \snippet bars/main.cpp 5
-
- Then we'll connect them to methods in \c GraphModifier:
-
- \snippet bars/main.cpp 6
-
- Here are the methods in \c GraphModifier the signals were connected to. The camera
- is controlled via the scene object. This time we specify the actual camera position
- along the orbit around the center point, instead of specifying a preset camera angle:
-
- \snippet bars/graphmodifier.cpp 7
-
- Now these two sliders can be used to rotate the graph.
-
- And so we have an application in which we can control:
-
- \list
- \li Graph rotation
- \li Label style
- \li Camera preset
- \li Background visibility
- \li Grid visibility
- \li Bar shading smoothness
- \li Visibility of the second bar series
- \li Value axis direction
- \li Axis title visibility and rotation
- \li Data range to be shown
- \li Bar style
- \li Selection mode
- \li Theme
- \li Shadow quality
- \li Font
- \li Font size
- \li Axis label rotation
- \endlist
-
- \section1 Selecting a Row/column by Clicking an Axis Label
-
- Selection by axis label is default functionality for bar graphs. As an example, you can select
- rows by clicking an axis label in the following way:
-
- \list
- \li Change selection mode to \c SelectionRow
- \li Click a year label
- \li The row with the clicked year is selected
- \endlist
-
- You can use the same method with \c SelectionSlice and \c SelectionItem flags, as long as
- you have either \c SelectionRow or \c SelectionColumn set as well.
-
- \section1 Zooming to Selection
-
- As an example of adjusting camera target we have implemented an animation of zooming to
- selection via a button press. Animation initializations are done in the constructor:
-
- \snippet bars/graphmodifier.cpp 12
-
- The function \c{GraphModifier::zoomToSelectedBar()} contains the rest of the functionality:
-
- \snippet bars/graphmodifier.cpp 11
-
- The QPropertyAnimation \c m_animationCameraTarget targets Q3DCamera::target property,
- which takes a value normalized to the range (-1, 1). We figure out where the selected bar
- is relative to axes, and use that as the end value for \c{m_animationCameraTarget}:
-
- \snippet bars/graphmodifier.cpp 13
- \dots
- \snippet bars/graphmodifier.cpp 14
-
- Likewise, we want to angle the camera so that it always points approximately to the center of
- the graph at the end of the animation:
-
- \snippet bars/graphmodifier.cpp 15
-
- \section1 Example Contents
-
-*/
diff --git a/examples/datavisualization/bars/graphmodifier.h b/examples/datavisualization/bars/graphmodifier.h
deleted file mode 100644
index bc223a75..00000000
--- a/examples/datavisualization/bars/graphmodifier.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef GRAPHMODIFIER_H
-#define GRAPHMODIFIER_H
-
-#include <QtDataVisualization/q3dbars.h>
-#include <QtDataVisualization/qbardataproxy.h>
-#include <QtDataVisualization/qabstract3dseries.h>
-
-#include <QtGui/QFont>
-#include <QtCore/QDebug>
-#include <QtCore/QStringList>
-#include <QtCore/QPointer>
-#include <QtCore/QPropertyAnimation>
-
-using namespace QtDataVisualization;
-
-class GraphModifier : public QObject
-{
- Q_OBJECT
-public:
- explicit GraphModifier(Q3DBars *bargraph);
- ~GraphModifier();
-
- void resetTemperatureData();
- void changePresetCamera();
- void changeLabelBackground();
- void changeFont(const QFont &font);
- void changeFontSize(int fontsize);
- void rotateX(int rotation);
- void rotateY(int rotation);
- void setBackgroundEnabled(int enabled);
- void setGridEnabled(int enabled);
- void setSmoothBars(int smooth);
- void setSeriesVisibility(int enabled);
- void setReverseValueAxis(int enabled);
- void setReflection(bool enabled);
-
-public Q_SLOTS:
- void changeRange(int range);
- void changeStyle(int style);
- void changeSelectionMode(int selectionMode);
- void changeTheme(int theme);
- void changeShadowQuality(int quality);
- void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
- void changeLabelRotation(int rotation);
- void setAxisTitleVisibility(bool enabled);
- void setAxisTitleFixed(bool enabled);
- void zoomToSelectedBar();
-
-Q_SIGNALS:
- void shadowQualityChanged(int quality);
- void backgroundEnabledChanged(bool enabled);
- void gridEnabledChanged(bool enabled);
- void fontChanged(QFont font);
- void fontSizeChanged(int size);
-
-private:
- Q3DBars *m_graph;
- float m_xRotation;
- float m_yRotation;
- int m_fontSize;
- int m_segments;
- int m_subSegments;
- float m_minval;
- float m_maxval;
- QStringList m_months;
- QStringList m_years;
- QValue3DAxis *m_temperatureAxis;
- QCategory3DAxis *m_yearAxis;
- QCategory3DAxis *m_monthAxis;
- QBar3DSeries *m_primarySeries;
- QBar3DSeries *m_secondarySeries;
- QAbstract3DSeries::Mesh m_barMesh;
- bool m_smooth;
- QPropertyAnimation m_animationCameraX;
- QPropertyAnimation m_animationCameraY;
- QPropertyAnimation m_animationCameraZoom;
- QPropertyAnimation m_animationCameraTarget;
- float m_defaultAngleX;
- float m_defaultAngleY;
- float m_defaultZoom;
- QVector3D m_defaultTarget;
-};
-
-#endif
diff --git a/examples/datavisualization/bars/main.cpp b/examples/datavisualization/bars/main.cpp
deleted file mode 100644
index 6eb718fa..00000000
--- a/examples/datavisualization/bars/main.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "graphmodifier.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QPushButton>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QFontComboBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
-#include <QtGui/QFontDatabase>
-
-int main(int argc, char **argv)
-{
- //! [0]
- QApplication app(argc, argv);
- Q3DBars *widgetgraph = new Q3DBars();
- QWidget *container = QWidget::createWindowContainer(widgetgraph);
- //! [0]
-
- if (!widgetgraph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = widgetgraph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- //! [1]
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
- //! [1]
-
- widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2013)"));
-
- QComboBox *themeList = new QComboBox(widget);
- themeList->addItem(QStringLiteral("Qt"));
- themeList->addItem(QStringLiteral("Primary Colors"));
- themeList->addItem(QStringLiteral("Digia"));
- themeList->addItem(QStringLiteral("Stone Moss"));
- themeList->addItem(QStringLiteral("Army Blue"));
- themeList->addItem(QStringLiteral("Retro"));
- themeList->addItem(QStringLiteral("Ebony"));
- themeList->addItem(QStringLiteral("Isabelle"));
- themeList->setCurrentIndex(0);
-
- QPushButton *labelButton = new QPushButton(widget);
- labelButton->setText(QStringLiteral("Change label style"));
-
- QCheckBox *smoothCheckBox = new QCheckBox(widget);
- smoothCheckBox->setText(QStringLiteral("Smooth bars"));
- smoothCheckBox->setChecked(false);
-
-
- QComboBox *barStyleList = new QComboBox(widget);
- barStyleList->addItem(QStringLiteral("Bar"), int(QAbstract3DSeries::MeshBar));
- barStyleList->addItem(QStringLiteral("Pyramid"), int(QAbstract3DSeries::MeshPyramid));
- barStyleList->addItem(QStringLiteral("Cone"), int(QAbstract3DSeries::MeshCone));
- barStyleList->addItem(QStringLiteral("Cylinder"), int(QAbstract3DSeries::MeshCylinder));
- barStyleList->addItem(QStringLiteral("Bevel bar"), int(QAbstract3DSeries::MeshBevelBar));
- barStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere));
- barStyleList->setCurrentIndex(4);
-
- QPushButton *cameraButton = new QPushButton(widget);
- cameraButton->setText(QStringLiteral("Change camera preset"));
-
- QPushButton *zoomToSelectedButton = new QPushButton(widget);
- zoomToSelectedButton->setText(QStringLiteral("Zoom to selected bar"));
-
- QComboBox *selectionModeList = new QComboBox(widget);
- selectionModeList->addItem(QStringLiteral("None"),
- int(QAbstract3DGraph::SelectionNone));
- selectionModeList->addItem(QStringLiteral("Bar"),
- int(QAbstract3DGraph::SelectionItem));
- selectionModeList->addItem(QStringLiteral("Row"),
- int(QAbstract3DGraph::SelectionRow));
- selectionModeList->addItem(QStringLiteral("Bar and Row"),
- int(QAbstract3DGraph::SelectionItemAndRow));
- selectionModeList->addItem(QStringLiteral("Column"),
- int(QAbstract3DGraph::SelectionColumn));
- selectionModeList->addItem(QStringLiteral("Bar and Column"),
- int(QAbstract3DGraph::SelectionItemAndColumn));
- selectionModeList->addItem(QStringLiteral("Row and Column"),
- int(QAbstract3DGraph::SelectionRowAndColumn));
- selectionModeList->addItem(QStringLiteral("Bar, Row and Column"),
- int(QAbstract3DGraph::SelectionItemRowAndColumn));
- selectionModeList->addItem(QStringLiteral("Slice into Row"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
- selectionModeList->addItem(QStringLiteral("Slice into Row and Item"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
- selectionModeList->addItem(QStringLiteral("Slice into Column"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
- selectionModeList->addItem(QStringLiteral("Slice into Column and Item"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
- selectionModeList->addItem(QStringLiteral("Multi: Bar, Row, Col"),
- int(QAbstract3DGraph::SelectionItemRowAndColumn
- | QAbstract3DGraph::SelectionMultiSeries));
- selectionModeList->addItem(QStringLiteral("Multi, Slice: Row, Item"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
- | QAbstract3DGraph::SelectionMultiSeries));
- selectionModeList->addItem(QStringLiteral("Multi, Slice: Col, Item"),
- int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
- | QAbstract3DGraph::SelectionMultiSeries));
- selectionModeList->setCurrentIndex(1);
-
- QCheckBox *backgroundCheckBox = new QCheckBox(widget);
- backgroundCheckBox->setText(QStringLiteral("Show background"));
- backgroundCheckBox->setChecked(false);
-
- QCheckBox *gridCheckBox = new QCheckBox(widget);
- gridCheckBox->setText(QStringLiteral("Show grid"));
- gridCheckBox->setChecked(true);
-
- QCheckBox *seriesCheckBox = new QCheckBox(widget);
- seriesCheckBox->setText(QStringLiteral("Show second series"));
- seriesCheckBox->setChecked(false);
-
- QCheckBox *reverseValueAxisCheckBox = new QCheckBox(widget);
- reverseValueAxisCheckBox->setText(QStringLiteral("Reverse value axis"));
- reverseValueAxisCheckBox->setChecked(false);
-
- QCheckBox *reflectionCheckBox = new QCheckBox(widget);
- reflectionCheckBox->setText(QStringLiteral("Show reflections"));
- reflectionCheckBox->setChecked(false);
-
- //! [4]
- QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
- rotationSliderX->setTickInterval(30);
- rotationSliderX->setTickPosition(QSlider::TicksBelow);
- rotationSliderX->setMinimum(-180);
- rotationSliderX->setValue(0);
- rotationSliderX->setMaximum(180);
- QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget);
- rotationSliderY->setTickInterval(15);
- rotationSliderY->setTickPosition(QSlider::TicksAbove);
- rotationSliderY->setMinimum(-90);
- rotationSliderY->setValue(0);
- rotationSliderY->setMaximum(90);
- //! [4]
-
- QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
- fontSizeSlider->setTickInterval(10);
- fontSizeSlider->setTickPosition(QSlider::TicksBelow);
- fontSizeSlider->setMinimum(1);
- fontSizeSlider->setValue(30);
- fontSizeSlider->setMaximum(100);
-
- QFontComboBox *fontList = new QFontComboBox(widget);
- fontList->setCurrentFont(QFont("Times New Roman"));
-
- QComboBox *shadowQuality = new QComboBox(widget);
- shadowQuality->addItem(QStringLiteral("None"));
- shadowQuality->addItem(QStringLiteral("Low"));
- shadowQuality->addItem(QStringLiteral("Medium"));
- shadowQuality->addItem(QStringLiteral("High"));
- shadowQuality->addItem(QStringLiteral("Low Soft"));
- shadowQuality->addItem(QStringLiteral("Medium Soft"));
- shadowQuality->addItem(QStringLiteral("High Soft"));
- shadowQuality->setCurrentIndex(5);
-
- QComboBox *rangeList = new QComboBox(widget);
- rangeList->addItem(QStringLiteral("2006"));
- rangeList->addItem(QStringLiteral("2007"));
- rangeList->addItem(QStringLiteral("2008"));
- rangeList->addItem(QStringLiteral("2009"));
- rangeList->addItem(QStringLiteral("2010"));
- rangeList->addItem(QStringLiteral("2011"));
- rangeList->addItem(QStringLiteral("2012"));
- rangeList->addItem(QStringLiteral("2013"));
- rangeList->addItem(QStringLiteral("All"));
- rangeList->setCurrentIndex(8);
-
- QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget);
- axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible"));
- axisTitlesVisibleCB->setChecked(true);
-
- QCheckBox *axisTitlesFixedCB = new QCheckBox(widget);
- axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed"));
- axisTitlesFixedCB->setChecked(true);
-
- QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget);
- axisLabelRotationSlider->setTickInterval(10);
- axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow);
- axisLabelRotationSlider->setMinimum(0);
- axisLabelRotationSlider->setValue(30);
- axisLabelRotationSlider->setMaximum(90);
-
- //! [5]
- vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally")));
- vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Rotate vertically")));
- vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
- //! [5]
- vLayout->addWidget(labelButton, 0, Qt::AlignTop);
- vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
- vLayout->addWidget(zoomToSelectedButton, 0, Qt::AlignTop);
- vLayout->addWidget(backgroundCheckBox);
- vLayout->addWidget(gridCheckBox);
- vLayout->addWidget(smoothCheckBox);
- vLayout->addWidget(reflectionCheckBox);
- vLayout->addWidget(seriesCheckBox);
- vLayout->addWidget(reverseValueAxisCheckBox);
- vLayout->addWidget(axisTitlesVisibleCB);
- vLayout->addWidget(axisTitlesFixedCB);
- vLayout->addWidget(new QLabel(QStringLiteral("Show year")));
- vLayout->addWidget(rangeList);
- vLayout->addWidget(new QLabel(QStringLiteral("Change bar style")));
- vLayout->addWidget(barStyleList);
- vLayout->addWidget(new QLabel(QStringLiteral("Change selection mode")));
- vLayout->addWidget(selectionModeList);
- vLayout->addWidget(new QLabel(QStringLiteral("Change theme")));
- vLayout->addWidget(themeList);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
- vLayout->addWidget(shadowQuality);
- vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
- vLayout->addWidget(fontList);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
- vLayout->addWidget(fontSizeSlider);
- vLayout->addWidget(new QLabel(QStringLiteral("Axis label rotation")));
- vLayout->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop);
-
- //! [2]
- GraphModifier *modifier = new GraphModifier(widgetgraph);
- //! [2]
-
- //! [6]
- QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &GraphModifier::rotateX);
- QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &GraphModifier::rotateY);
- //! [6]
-
- QObject::connect(labelButton, &QPushButton::clicked, modifier,
- &GraphModifier::changeLabelBackground);
- QObject::connect(cameraButton, &QPushButton::clicked, modifier,
- &GraphModifier::changePresetCamera);
- QObject::connect(zoomToSelectedButton, &QPushButton::clicked, modifier,
- &GraphModifier::zoomToSelectedBar);
-
- QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setBackgroundEnabled);
- QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setGridEnabled);
- QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setSmoothBars);
- QObject::connect(seriesCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setSeriesVisibility);
- QObject::connect(reverseValueAxisCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setReverseValueAxis);
- QObject::connect(reflectionCheckBox, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setReflection);
-
- QObject::connect(modifier, &GraphModifier::backgroundEnabledChanged,
- backgroundCheckBox, &QCheckBox::setChecked);
- QObject::connect(modifier, &GraphModifier::gridEnabledChanged,
- gridCheckBox, &QCheckBox::setChecked);
-
- QObject::connect(rangeList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeRange(int)));
-
- QObject::connect(barStyleList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeStyle(int)));
-
- QObject::connect(selectionModeList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeSelectionMode(int)));
-
- QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeTheme(int)));
-
- QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeShadowQuality(int)));
-
- QObject::connect(modifier, &GraphModifier::shadowQualityChanged, shadowQuality,
- &QComboBox::setCurrentIndex);
- QObject::connect(widgetgraph, &Q3DBars::shadowQualityChanged, modifier,
- &GraphModifier::shadowQualityUpdatedByVisual);
-
- QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
- &GraphModifier::changeFontSize);
- QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
- &GraphModifier::changeFont);
-
- QObject::connect(modifier, &GraphModifier::fontSizeChanged, fontSizeSlider,
- &QSlider::setValue);
- QObject::connect(modifier, &GraphModifier::fontChanged, fontList,
- &QFontComboBox::setCurrentFont);
-
- QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setAxisTitleVisibility);
- QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, modifier,
- &GraphModifier::setAxisTitleFixed);
- QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier,
- &GraphModifier::changeLabelRotation);
- //! [3]
- widget->show();
- return app.exec();
- //! [3]
-}
diff --git a/examples/datavisualization/custominput/custominput.pro b/examples/datavisualization/custominput/custominput.pro
deleted file mode 100644
index 1fe1c57b..00000000
--- a/examples/datavisualization/custominput/custominput.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp scatterdatamodifier.cpp \
- custominputhandler.cpp
-HEADERS += scatterdatamodifier.h \
- custominputhandler.h
-
-QT += widgets
-requires(qtConfig(combobox))
-
-RESOURCES += custominput.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/custominput/custominput.qrc b/examples/datavisualization/custominput/custominput.qrc
deleted file mode 100644
index 8ced2b91..00000000
--- a/examples/datavisualization/custominput/custominput.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>data/data.txt</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/custominput/custominputhandler.cpp b/examples/datavisualization/custominput/custominputhandler.cpp
deleted file mode 100644
index e6fe9aa5..00000000
--- a/examples/datavisualization/custominput/custominputhandler.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "custominputhandler.h"
-
-#include <QtDataVisualization/Q3DCamera>
-
-CustomInputHandler::CustomInputHandler(QObject *parent) :
- QAbstract3DInputHandler(parent)
-{
-}
-
-//! [0]
-void CustomInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
-{
- Q_UNUSED(event);
- setInputPosition(mousePos);
-}
-//! [0]
-
-//! [1]
-void CustomInputHandler::wheelEvent(QWheelEvent *event)
-{
- // Adjust zoom level based on what zoom range we're in.
- int zoomLevel = scene()->activeCamera()->zoomLevel();
- if (zoomLevel > 100)
- zoomLevel += event->angleDelta().y() / 12;
- else if (zoomLevel > 50)
- zoomLevel += event->angleDelta().y() / 60;
- else
- zoomLevel += event->angleDelta().y() / 120;
- if (zoomLevel > 500)
- zoomLevel = 500;
- else if (zoomLevel < 10)
- zoomLevel = 10;
-
- scene()->activeCamera()->setZoomLevel(zoomLevel);
-}
-//! [1]
diff --git a/examples/datavisualization/custominput/custominputhandler.h b/examples/datavisualization/custominput/custominputhandler.h
deleted file mode 100644
index ef07d5ec..00000000
--- a/examples/datavisualization/custominput/custominputhandler.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CUSTOMINPUTHANDLER_H
-#define CUSTOMINPUTHANDLER_H
-
-#include <QtDataVisualization/QAbstract3DInputHandler>
-
-using namespace QtDataVisualization;
-
-class CustomInputHandler : public QAbstract3DInputHandler
-{
- Q_OBJECT
-public:
- explicit CustomInputHandler(QObject *parent = 0);
-
- virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void wheelEvent(QWheelEvent *event);
-};
-
-#endif
diff --git a/examples/datavisualization/custominput/data/data.txt b/examples/datavisualization/custominput/data/data.txt
deleted file mode 100644
index d0689b1f..00000000
--- a/examples/datavisualization/custominput/data/data.txt
+++ /dev/null
@@ -1,1060 +0,0 @@
-# Each line contains 3 floating point values
-# for x, y and z values in the scatter chart
--10.0084,5.01799,-5.04425,
--9.06229,3.07132,-4.54268,
--8.55132,4.19424,-4.03318,
--8.03806,4.75162,-3.99583,
--9.50337,4.90684,-4.21947,
--9.93819,3.42724,-3.58955,
--7.84971,3.15272,-4.90367,
--7.30477,2.91062,-4.11078,
--7.11201,3.68863,-4.52683,
--8.83267,2.96504,-3.61108,
--6.94874,2.49808,-2.92883,
--9.02606,4.7496,-4.18193,
--9.5434,3.15534,-3.83789,
--6.8679,3.66922,-3.58288,
--8.16487,1.82227,-4.64523,
--7.42165,3.18192,-4.22791,
--7.99257,3.06559,-4.33262,
--8.98851,2.64924,-4.44595,
--6.36774,3.96697,-4.38998,
--7.18413,3.32417,-4.04636,
--7.91649,3.46826,-2.78126,
--7.49495,3.12306,-3.14539,
--7.5445,2.85744,-3.68421,
-2.25354,1.36828,-1.32025,
--2.35524,-0.081203,1.23267,
-2.6517,-1.20549,2.73606,
--2.55382,3.48814,-0.454971,
--3.85468,0.263955,0.578276,
-2.85275,1.32315,1.0565,
--0.404099,-2.36811,-1.60324,
-1.58908,0.363782,-0.554303,
-0.251507,0.124637,-0.752568,
--2.45626,-0.722719,-1.11764,
-4.15342,1.92247,-0.954975,
-2.05845,0.643191,-0.121564,
-0.253468,0.814651,3.05732,
-1.51724,0.244303,2.25864,
-1.15,-0.487518,0.815931,
--0.0538979,0.124927,0.251571,
-0.941523,-0.483498,-3.2731,
-3.55074,-1.04714,-0.954301,
--2.43125,-0.964099,-0.658537,
-4.25459,0.163296,2.05563,
--0.612031,1.03234,-0.227175,
-7.8338,-0.847922,-0.959189,
--4.20076,1.44907,0.853836,
--1.59466,-1.27511,-1.5686,
--3.3567,-1.96864,1.83224,
--2.75169,-0.964221,-1.26465,
--2.45624,0.287046,-4.55032,
-2.73649,-1.48789,-0.653082,
-2.73284,2.2912,-2.4933,
--0.854321,-2.04288,3.7516,
--1.35708,-1.84915,2.35985,
--3.25001,-1.64456,-4.45419,
--0.356834,-0.569139,-1.75308,
--0.813569,-0.287899,-0.0535036,
-4.75975,-1.48817,-2.45957,
-4.35294,1.46154,0.814214,
--3.22467,2.76903,0.510435,
-2.49494,1.9286,0.552287,
--0.456521,0.688277,-0.82788,
--2.72568,2.80278,-2.45782,
--1.65023,1.32005,-2.05754,
--1.63551,1.88519,-3.65544,
--1.20008,-0.723785,0.853563,
-1.45448,1.08701,2.17385,
--3.9042,-1.16916,-0.85395,
-3.15645,0.123932,-0.950988,
--1.35924,-2.64015,-0.54254,
--4.15753,1.28294,-4.47502,
--2.7885,2.48535,-0.159651,
--3.44364,0.627232,6.11881,
--1.55639,-0.967484,2.35497,
--0.752853,1.16736,-0.757871,
--0.859974,0.640213,-1.75453,
-0.85744,0.480175,2.97204,
-4.0571,3.24083,-0.183622,
-0.658087,0.841418,0.357839,
--2.13027,0.920836,-2.758,
--0.65825,0.164257,1.69478,
--1.88335,-1.4811,-2.15408,
--1.67331,2.96982,1.85521,
--0.750937,0.282914,-0.758707,
-2.29891,1.16949,2.65927,
-2.69132,2.92632,-0.206126,
--1.65771,3.28846,2.50201,
--0.568799,2.5289,-1.15875,
--1.85383,0.528953,-2.32418,
-0.159422,-2.36165,-0.569393,
--3.96506,0.282374,-0.254519,
-0.150933,-3.88058,-0.759422,
--1.17917,-1.96176,0.95589,
--0.340817,-3.52333,-1.45715,
-3.21784,-2.56593,2.55468,
-0.609650,-2.44153,1.35813,
-1.4594,-1.96511,0.170228,
-3.55017,-2.16882,1.75539,
-2.89487,-0.727481,-0.39588,
--1.65151,-0.603877,0.250508,
--4.35232,-1.32155,-2.31877,
-2.75852,-1.88931,1.77874,
-2.75452,-0.64123,2.45546,
-0.151914,-0.888395,-0.260935,
-0.150593,0.0461652,-0.158206,
--1.22087,-2.92034,-3.78604,
--0.761622,0.161856,3.5586,
--1.88456,-2.48094,0.287091,
-1.25293,2.64374,1.6532,
--0.657609,1.32547,-0.557301,
-3.85995,2.32568,-1.38265,
-1.65572,-2.28977,0.957488,
--2.45312,-2.96071,3.45147,
--1.75259,0.365259,1.60113,
-1.14045,-0.844805,0.359343,
--1.55951,1.65687,-3.10398,
-0.441652,-1.36623,-1.55494,
--3.95762,0.288753,3.7791,
--1.80101,-0.241499,2.29693,
--0.456931,1.64399,1.35559,
--0.691421,-0.723378,2.51839,
--1.20658,-3.04063,-1.552,
--0.958574,1.48688,0.950152,
-1.76319,-1.36072,2.15866,
--3.91301,-0.328932,-2.45524,
-2.9553,3.12703,-2.43321,
-3.55939,-1.48028,0.152252,
--1.41545,3.247,0.779314,
--3.34482,-0.894538,2.09302,
-1.15338,0.362332,-2.7924,
-0.468852,0.120872,1.35593,
-1.98778,-3.32292,-0.758591,
-0.420718,-0.225014,-2.44806,
-0.550207,1.56432,2.25317,
-4.35156,-0.966178,-0.791032,
-3.35179,-1.04981,-0.854089,
-1.70857,-0.281369,-0.254686,
--3.05855,-0.443693,1.30251,
--3.9509,-2.72179,-3.83489,
-2.19632,1.32915,1.15345,
-1.42782,-0.449435,-2.85005,
--2.19053,0.049866,2.87493,
-2.45196,-2.44705,-2.85302,
-4.35263,0.245956,1.12886,
-1.8167,1.85407,-0.714159,
-1.88577,2.04227,-0.959396,
-1.6522,-2.48289,0.355373,
--3.39965,0.286834,-1.68171,
-1.85639,1.47419,2.25749,
--2.5216,-0.88573,-2.69594,
--0.143043,0.28453,-1.75898,
--2.52745,-2.76741,-0.257011,
-0.381448,-1.64793,-0.756889,
-2.30469,-1.28844,-2.79271,
--1.72491,-1.48634,-2.61686,
-0.503342,0.248352,-2.27162,
-0.457491,-1.88183,-0.951124,
--1.23123,0.963519,2.3569,
--0.55709,-0.364372,-1.82528,
-2.73963,-0.567024,-0.496936,
-1.17979,2.76252,-2.35641,
--1.20723,-2.1692,3.14368,
--0.0504301,1.76714,1.64265,
-1.45714,-0.725448,0.739217,
-0.246123,-3.27811,-0.251218,
--0.894632,1.08758,-0.17184,
--2.45217,0.565077,-0.557015,
-2.51301,1.1271,2.25057,
--1.05099,-2.1688,-1.88996,
-1.26945,-2.1225,-1.55031,
--4.30129,-0.760298,0.259868,
--0.157336,-0.237532,-2.69483,
--2.95778,1.36212,-3.65524,
-2.74003,1.16234,2.05928,
-0.955294,-1.52182,-1.05684,
--1.87004,2.72729,-0.550608,
-0.459439,2.88101,-4.4135,
-1.35069,1.08445,-0.808625,
--2.70034,-1.36291,-2.65126,
-0.353099,2.32354,-1.61885,
--0.453359,1.67524,0.122888,
-3.7506,1.12855,-3.86338,
-0.548626,2.63101,0.552261,
--0.753935,-3.52241,-3.21122,
-0.258935,-1.32453,2.25745,
--2.8797,-1.60832,-2.45626,
-0.151838,-0.565264,3.98539,
-2.1508,-1.68734,-1.75076,
--4.23947,-1.92531,2.35438,
-1.95273,-1.32736,0.313398,
-0.533647,0.646686,0.75712,
-0.856619,-0.843249,-0.577773,
--2.15649,-1.64285,-2.31055,
--0.851309,-2.84717,-0.324933,
--3.17772,-0.324817,-0.858394,
-3.45303,5.29449,0.818094,
-1.42912,0.238088,0.385617,
-0.459586,1.7661,-0.153761,
-0.855577,3.16845,-2.19548,
-2.15181,0.729021,-0.955922,
--2.40113,0.665756,-0.521366,
-1.45469,-0.462177,-1.95869,
-0.629115,-1.84769,1.86755,
-3.47576,-0.209875,-0.555502,
-0.295075,-0.840772,4.68895,
--0.253301,-2.49078,2.11749,
--1.15923,-3.163,-3.05671,
-1.45484,0.963654,-0.734942,
-0.354307,0.520772,-1.32278,
-2.65725,0.284589,-0.856856,
--1.2596,0.765493,-1.66469,
--0.656057,-2.16906,3.72144,
--0.251559,-2.36406,-1.89709,
-0.35608,-0.80463,1.85674,
-0.0508692,0.615674,0.856785,
--2.50726,2.28743,-2.05697,
-1.65272,1.29604,2.11481,
--3.2878,-0.244516,0.799732,
--2.18989,-0.847222,-0.264559,
-0.452832,0.960993,2.53691,
--2.43913,1.28957,2.75427,
--1.72889,-3.29414,-2.31426,
-0.952615,-0.0844651,0.346607,
-1.41175,0.889643,0.450356,
-2.13145,1.08697,0.223055,
--2.16002,-0.225505,-0.602641,
-0.54028,1.24765,-0.456129,
-2.55086,-0.56734,-2.65051,
--4.53921,-0.483588,-1.25013,
-3.45413,-0.44258,2.29687,
--0.257456,0.64624,1.65041,
-1.25559,-0.65493,-0.358872,
-1.9599,-1.56965,-4.17044,
-2.75996,-1.98665,3.31794,
-3.05837,1.04847,-0.975536,
--2.95407,1.40294,-2.25825,
-1.38718,0.360709,-2.98211,
-0.481728,-2.48564,3.25864,
--1.15089,0.363522,0.458662,
--2.25551,0.0421839,0.650008,
--1.85862,-0.969237,4.25313,
-1.55797,0.0465051,-3.85709,
-0.0555338,0.682957,-2.45556,
--0.186868,-0.482811,1.96957,
-2.197,-1.5248,-4.20912,
-3.40636,6.26268,-2.05757,
-0.780426,2.68048,-0.852693,
-1.65184,1.68951,-0.892089,
-2.11929,-2.44406,1.21168,
--0.153348,-1.88112,-0.357374,
--0.359393,1.76654,1.63063,
--2.15954,0.0819277,0.757621,
--0.159898,-3.36316,0.359582,
-2.74125,-2.84148,0.355785,
--1.3558,0.27827,-0.588162,
--0.354346,-2.56747,-0.984403,
--2.75082,-3.56807,1.5599,
--2.54708,-0.686147,2.75649,
-1.35138,0.692978,-2.24969,
--1.39826,-0.246682,-1.65876,
--1.46629,-1.44446,4.45293,
--1.89442,3.64549,2.05732,
--0.658093,0.0815129,3.95269,
-2.25603,2.96329,-2.35993,
-1.36323,1.64488,-0.0538547,
-1.75659,2.24227,-2.8522,
--0.0566584,-1.56465,-0.0503143,
--3.8532,-0.822258,-0.345406,
-0.951328,0.329296,-2.52211,
--2.48659,0.410856,-3.55401,
-3.72676,2.36324,3.65589,
-0.559972,0.884984,3.15283,
--1.37624,-1.36007,-2.16578,
-2.05543,0.4472,-0.82911,
--4.75258,1.8779,-1.75376,
-0.15648,2.64039,-2.21467,
--2.0593,-2.56775,1.15037,
--3.70217,2.12375,1.3652,
-1.05566,6.8299,4.02985,
--0.766882,-0.88359,1.35525,
-0.951335,-1.84689,0.178337,
-0.751608,1.1691,4.25273,
--1.36367,0.728904,0.655858,
-3.17581,-0.0844758,-1.75811,
-2.85546,-0.683618,0.653701,
--0.471118,3.04176,-2.35393,
-3.0574,-0.601996,-0.611932,
--0.854024,-0.44532,0.355575,
-0.504700,-1.92888,6.4818,
--1.25515,-1.44466,1.90429,
--1.67201,0.0461708,-0.796655,
-1.45345,-1.66159,-3.48143,
--2.84514,-1.24586,-3.47945,
-0.287402,-0.688276,-3.75664,
-3.35908,0.687828,-1.94406,
--2.39167,1.08322,-1.73508,
-1.52152,1.86032,-1.25351,
-1.55931,3.64414,1.35944,
-1.15954,-1.36058,0.758814,
--1.95325,0.0851092,-0.854106,
--2.25254,-0.523024,1.05486,
--2.68036,-1.32901,1.05877,
--0.485956,-1.52164,2.45303,
--0.0546215,0.640683,-2.85953,
-4.45295,-0.246051,-0.159626,
-3.4523,1.7215,-1.10587,
-3.35142,-1.72053,-0.252105,
-1.74251,2.76108,2.51524,
-2.15054,-2.88101,-1.7527,
--3.70517,-0.0470951,0.258921,
--0.45593,-3.47184,-2.95345,
-3.15988,-2.32107,0.105299,
-0.751449,-2.88762,-3.45245,
-2.9794,0.493172,-0.654683,
--1.87713,-2.48632,-3.534,
-1.65266,3.16008,2.1579,
--1.25239,-0.763119,2.15776,
-3.5572,0.282681,2.44174,
-0.251145,0.520256,2.3184,
--1.78596,-1.36913,-2.50818,
-3.82122,1.04473,0.456159,
-2.45979,-0.722759,-4.05123,
--0.855594,0.163792,-0.553702,
-0.656895,0.529982,3.35129,
-0.857952,-0.0885677,0.695128,
--0.143269,1.12972,-3.155,
--2.95923,0.241767,0.832165,
-0.253329,-0.622952,-0.459799,
-0.151499,2.5297,1.53059,
-0.655464,-1.49902,-1.51071,
-4.7585,1.76425,1.15164,
--1.75063,-1.44645,-3.65525,
-0.850392,0.0417223,-0.340588,
--0.557015,-0.282305,-1.85291,
--4.05639,0.522959,-2.3507,
--0.358137,-0.967852,0.807832,
--1.82056,-0.0483894,0.0541359,
--2.16623,0.129809,-2.52513,
--1.85591,-1.04417,-1.28501,
--1.79647,-3.44045,-1.73399,
-2.25342,0.161308,-0.0517495,
--1.37877,0.243596,-1.52931,
--0.059299,-0.480825,1.7137,
--2.54357,0.286685,-2.11495,
-3.92334,-0.442936,-0.852895,
--0.390023,-1.96437,1.38718,
-1.35263,2.92968,-1.1545,
--2.25892,-2.27429,-0.451533,
--0.2215,-0.126727,0.155541,
-0.715932,1.47509,-3.52895,
--0.382939,3.16461,2.65165,
--1.14437,-1.44682,0.456601,
-0.251892,-1.0431,4.31548,
--2.23281,-2.48698,0.46995,
-0.954231,-3.4323,-1.20233,
-2.75569,-1.66383,-1.95486,
-0.750644,-1.84163,-0.159206,
--0.757387,-1.84192,0.354209,
--2.85509,-2.12151,-0.954754,
--0.888427,-2.8403,-0.157387,
--1.95265,-0.445753,2.17956,
--1.05845,-2.48694,-1.25315,
--2.66497,-1.48251,0.873192,
-2.50491,-1.0833,1.99667,
-0.453931,2.52158,0.456875,
-1.55859,-0.161924,0.256619,
--2.92585,0.368018,0.35908,
-2.95509,-1.56248,-2.74469,
-3.46082,-1.76026,3.05835,
-1.75644,-2.84241,0.507631,
--0.959006,0.649579,1.10824,
-2.63856,2.0417,0.187281,
--0.150004,-0.0838836,-0.949314,
-2.26402,-1.28916,2.85284,
--0.821239,2.68795,-0.317185,
-3.47124,0.840813,-2.65322,
--0.253209,-0.244177,0.457348,
-2.76181,1.64033,-1.95329,
-1.35105,-2.96027,0.659952,
--1.45423,-0.24358,0.832696,
-1.45109,1.64958,-3.45448,
--1.15659,3.08225,1.11445,
-0.806359,1.88298,-2.13001,
-1.15538,3.04545,-0.759437,
--0.450074,1.36121,-0.155042,
--2.80924,-1.24207,2.55513,
-4.48859,2.04394,1.25324,
--0.958741,1.24575,3.65169,
-3.45143,1.3276,2.5144,
--3.25232,1.12514,-1.21425,
--2.45327,0.681109,4.35764,
-0.55395,-0.128353,-3.95705,
--0.352458,3.08882,-0.340631,
-1.35213,-2.92251,-3.31166,
-0.52621,-0.279201,0.959619,
-1.2243,-0.240093,-0.75247,
--1.29854,2.16477,3.3507,
--3.35677,2.36713,3.4585,
-0.957717,-0.885793,1.25827,
-0.150983,1.24269,5.39106,
-1.84986,1.56932,-1.05811,
--1.35563,3.82103,-1.45287,
-1.4544,-2.6453,0.58082,
-2.05908,1.16496,1.44075,
-2.9507,-2.4957,0.153512,
--1.10289,0.763085,-1.65351,
--2.50708,-2.467,1.05892,
-3.55284,-1.8509,-2.55732,
--0.848034,1.24305,-3.7516,
--1.35051,-2.48178,2.85326,
--2.18554,1.48771,-0.155205,
--0.459278,2.68404,2.85727,
-0.854722,1.47322,-3.35951,
--2.23505,-2.24254,0.353203,
-1.42395,-2.32169,0.558188,
-3.65106,1.12201,-4.58409,
-0.11,-0.68782,1.85804,
--1.9551,-0.560204,-2.0577,
-1.85964,1.32737,-4.40673,
--0.616311,0.649737,-0.30189,
--1.55375,1.52043,-3.75629,
-1.85417,0.486964,0.654806,
-3.35638,2.52599,1.94343,
-0.491389,1.40427,-1.31935,
--2.72939,0.844341,1.62621,
--0.525985,1.31415,0.484015,
-2.25998,-1.719,1.25143,
-1.79268,2.46378,-0.951188,
--3.55105,1.04122,3.9501,
-0.954251,1.28296,2.05486,
--3.15267,1.96498,-0.361707,
-1.35358,-0.921098,-1.71743,
--3.16896,-3.08548,0.903411,
-1.25127,-2.44903,2.25616,
--3.88899,0.761334,-1.05751,
--1.05163,-3.89783,-0.883668,
--4.189,1.24176,-2.63816,
-2.45671,-1.84859,0.352808,
--1.59618,2.16255,4.33699,
-2.10913,-1.88673,-0.952497,
--1.85571,-0.287392,0.277176,
-0.751967,1.04568,-1.35427,
-2.85792,1.60982,-2.05454,
--2.13152,-0.260207,-2.15124,
-1.75432,2.28936,0.756254,
-1.95711,-0.681098,-2.38037,
--0.826273,1.08361,1.6515,
--1.85118,1.89481,-0.756754,
--3.0571,2.44795,0.355341,
--0.455122,-3.58071,-2.85209,
--0.95805,0.641282,2.15189,
--1.35515,-0.234803,-0.825819,
-2.12472,-0.0444431,0.651227,
-2.67573,0.223987,2.75712,
-1.65871,-0.163059,1.6513,
--1.85429,0.68862,1.9576,
--3.05186,-2.2804,0.100919,
-3.41813,-1.88775,3.67075,
--0.753778,0.36467,1.55333,
-2.97628,-1.36502,-1.85135,
-0.477128,1.08862,0.858931,
--1.0531,1.0488,2.15218,
-2.66911,-2.08876,-0.182397,
-5.117,-2.84097,-0.953684,
-0.468302,1.88616,2.05369,
--3.16099,-2.76085,-2.75679,
--2.6593,3.52373,-1.24072,
--4.37957,-0.286903,3.63863,
--2.85958,-2.56921,-2.85723,
--0.159735,2.72758,-2.80575,
--0.951849,-0.607465,1.05633,
-1.93077,2.56422,1.25446,
--0.859754,0.248106,0.0584456,
-2.4023,2.56659,-1.2588,
-2.35295,-1.08729,2.7851,
--2.1537,-0.765032,2.83652,
-1.40185,1.29804,2.3588,
--0.991566,1.72049,4.17146,
-3.76736,-1.48837,2.05329,
--0.251896,0.765367,-1.4087,
--1.6228,0.328693,0.0528287,
-2.56735,-3.08103,0.853144,
-0.0531812,-1.96216,1.55734,
--3.77052,0.8421,-0.258953,
-2.35523,0.676643,-1.55789,
-1.16702,2.64474,-1.45533,
-2.55709,-1.56013,2.05351,
--2.15518,3.56253,3.257,
--0.553936,-1.24935,2.65224,
--0.355931,1.32374,0.859863,
--1.92974,1.2482,1.15936,
-0.350652,-2.44371,-1.35611,
-2.98996,-1.08527,-4.30641,
-1.82765,-0.440236,1.25528,
--0.689231,-1.08813,-0.668663,
--0.326426,-0.881857,-1.45371,
--1.0655,2.12466,2.34146,
-3.1563,0.523166,-2.8572,
-0.455505,2.48775,-1.33482,
-0.53939,-0.847333,0.732877,
--0.683025,-0.448889,-1.35747,
--1.7711,-0.125587,-2.55083,
--0.512871,0.520964,1.40731,
-4.93857,-1.6805,-0.127298,
-1.46098,-1.64073,1.35833,
-0.0518058,0.285151,-2.2437,
-1.5587,-1.23067,0.458753,
-3.13089,3.64132,1.45181,
--1.55648,2.167,0.153491,
-3.94451,-2.56372,-1.25276,
-4.15866,0.646921,2.65542,
--2.88189,0.562407,-1.35379,
-1.31686,1.2808,0.804375,
--2.36912,-3.08775,1.28335,
-0.575203,-0.36483,-2.43958,
-0.613108,0.526892,2.75368,
-3.96027,-0.525425,-4.25746,
--0.510821,1.28578,-0.058488,
--0.254704,-3.847,3.15258,
--0.925874,-1.72014,-3.15341,
-0.85704,0.84788,-1.75947,
--3.35712,0.722104,2.15645,
--1.67305,0.681216,1.65726,
--3.64682,0.867926,2.63525,
--0.715921,1.96081,-0.939934,
--2.45646,1.3249,-2.75733,
--1.75798,0.725382,-0.851921,
--2.78528,0.679275,-2.59212,
--2.24551,-3.4597,-1.85735,
-0.85142,2.28058,-3.75328,
--3.85054,2.44519,4.35081,
--3.6553,0.521917,0.293354,
--4.35959,-0.528198,1.55557,
-1.45186,-0.0891161,-0.468118,
-1.85594,-0.761461,-4.68083,
-0.950642,0.526239,-1.30614,
--2.50526,-0.885606,-0.362569,
--2.96569,1.68519,-1.15965,
--3.212,0.260715,1.18472,
-0.950556,-0.282806,0.776252,
-3.66678,1.08585,-2.15646,
--0.806289,1.72784,2.85906,
-0.363827,1.76644,0.931866,
--1.34204,-0.563686,-2.34091,
--2.81333,0.415358,4.28363,
-1.52053,-0.327359,0.35052,
--0.633441,-0.240518,4.05745,
--2.38947,-1.84662,-2.29572,
--1.95744,-0.863705,1.85889,
--0.0509082,-0.164164,3.8571,
-0.156438,-2.64188,1.75836,
--3.85642,1.48025,0.171659,
-0.253545,1.0852,-2.45243,
--4.11318,4.1655,-0.120976,
--1.44928,-0.328222,-0.871279,
--1.90972,-1.8495,-3.16966,
-0.359433,1.3236,-3.95045,
--2.60974,-1.04138,4.25836,
--3.16336,-0.961581,-1.65161,
--0.552909,-1.16942,4.05164,
--3.10918,-1.2402,-0.555073,
-2.25494,1.24432,3.44063,
--1.24998,-1.24928,-4.05493,
-3.05441,1.92762,1.43329,
-0.557032,-2.7688,-3.25463,
--2.05665,1.6357,0.656665,
--0.459042,0.122664,-0.152961,
-2.17715,2.96833,1.1332,
-0.0536573,-2.08635,-0.736471,
--3.15658,1.0818,-0.172166,
--1.95784,0.44402,0.612685,
-0.15168,-0.323951,2.85563,
-0.559356,1.63101,0.558005,
--2.05643,1.84615,-1.87964,
--0.254098,0.368208,1.23061,
-4.6438,-0.209283,0.695869,
--1.95087,-0.859788,0.0539467,
--0.351737,-1.04291,0.869198,
-0.776319,3.04922,-3.55278,
--0.158751,1.12538,-2.59681,
--0.560997,-1.68381,1.56935,
-1.71385,-0.446223,-1.56843,
-4.05142,-1.3243,2.85052,
-1.68685,-1.56305,2.159,
-0.359977,-1.16029,1.25037,
--2.65045,-1.28532,0.459338,
-5.42068,1.52601,-1.35562,
-1.34386,1.68231,-2.75114,
-1.25123,0.43108,0.383897,
--0.952936,3.6889,1.75759,
--3.55855,0.484241,1.15503,
--1.71394,-2.64568,-3.30684,
--2.23513,-2.46812,1.05321,
-0.160986,0.442362,-1.05077,
-2.05433,0.473204,0.823968,
-0.482077,0.0477338,4.21712,
--1.25348,0.767612,0.455813,
-1.61308,2.04125,-2.95433,
--2.05862,-0.444052,1.35177,
--3.2582,0.44354,2.15898,
--1.75935,0.0459283,2.35061,
--4.15501,0.68674,0.802439,
--1.66005,1.12067,0.552901,
--0.150828,3.4151,3.05446,
--0.274381,0.0405946,-1.45463,
-2.94543,-0.360918,1.45895,
--1.42494,1.56503,1.31012,
-3.45402,-1.27808,-4.29049,
--1.14819,0.674339,1.55807,
--0.356159,1.52295,-0.351445,
-0.387809,0.965119,1.84271,
-2.56165,-1.84639,1.65056,
--0.619108,2.24004,-2.92134,
--0.254288,-2.32744,-0.720931,
-3.3508,-2.24501,1.58268,
-1.69434,1.96814,3.97439,
-1.80785,0.685502,-1.55595,
-2.71587,1.76415,-2.98124,
--2.35151,-0.697338,-3.96269,
--1.85759,1.96899,-1.25212,
--4.05922,1.12838,-2.7597,
--2.85434,-1.36487,0.659987,
--1.75616,2.12969,-1.35032,
--2.95985,-0.0854955,3.65545,
--2.46049,2.45378,4.51969,
--0.0577358,0.0427911,0.359068,
--3.25346,0.161829,1.12956,
-3.55498,2.32482,1.33302,
-4.99905,-1.88748,0.450165,
--2.35406,-1.44715,-0.745307,
-2.44217,-0.642981,0.126924,
-1.73283,1.67362,1.91136,
-1.34239,-0.434386,-0.449795,
--0.9813,-2.72962,-3.6889,
-1.29807,-0.448566,2.13911,
-0.654017,3.54591,-1.55982,
--1.55508,-2.64564,0.555,
-1.92722,-0.322513,-2.13691,
-1.35913,-2.84853,-0.470788,
-0.257868,-2.68874,-0.268328,
--2.05043,-1.68405,-3.05075,
-1.65173,-0.446801,-0.75339,
--1.25655,0.965275,-4.15374,
--4.27942,-0.564403,1.45826,
-0.950669,-2.4416,-1.68235,
--0.0541107,0.882274,3.15308,
--1.65016,-0.886156,-3.85588,
-0.355613,0.217671,4.25412,
-0.800472,0.847259,3.11114,
-1.8599,-2.16981,-2.22314,
--2.05061,0.164561,-0.452181,
-0.854144,1.84334,-1.45981,
-1.68547,1.56536,-1.45874,
-1.25244,-0.844991,-2.95475,
--1.92348,2.32119,-1.80444,
--0.645646,2.45193,-3.65332,
-4.45803,0.527732,3.02031,
-2.74572,0.287964,-1.80485,
-0.35961,-2.56437,3.97194,
--0.956828,-1.28915,1.64424,
-0.414971,-0.235061,-2.15757,
--0.0530542,-1.08464,-4.11853,
-3.17203,-1.21013,-3.85806,
-0.758948,0.124698,-3.10188,
--1.65404,-1.16204,-1.65357,
--1.65985,3.84433,4.65101,
-2.83444,-2.69529,-1.65021,
-1.29814,-2.76926,-2.27139,
-0.462382,3.04217,3.45153,
--3.61944,1.04723,-0.638308,
-2.25235,1.64048,2.95175,
--3.05826,-0.76526,-2.38243,
--2.8506,2.12102,-0.659444,
--0.10046,0.0887098,-1.63621,
--1.55585,-1.36073,2.2076,
--0.474968,1.56568,-0.302349,
-0.36584,-2.36102,1.35289,
-0.224784,-0.637694,1.62444,
--0.658172,1.9689,-3.13712,
-0.646334,-1.04672,2.59285,
--2.63054,-1.08263,-0.851087,
-1.45804,-2.56159,-2.66388,
--2.45748,0.0409116,-2.85428,
--0.0561462,-1.24229,-1.25145,
--2.95391,-1.80896,-2.05036,
-4.36778,-0.969951,3.53686,
-2.15582,-1.67173,-0.831609,
--1.27059,-1.14919,1.7569,
--1.57398,-1.28091,-0.251735,
-2.59506,-2.6408,-0.345589,
--1.64147,-0.360324,3.1562,
--0.125427,-0.641484,-3.66095,
--1.9148,1.8885,2.12972,
--2.85768,-2.28782,-1.55719,
--1.37239,-0.485964,-2.22291,
-0.516294,0.281078,0.652612,
--1.13028,0.246659,-2.25636,
-1.7555,-1.41602,0.348449,
-1.5355,-1.32646,-2.82417,
--0.95426,2.0824,-0.383507,
-2.75739,0.241779,0.755701,
-0.752655,0.56204,-1.55738,
-1.1271,-3.76145,4.3701,
-0.326656,-1.24467,2.62222,
--0.259702,2.68152,-3.18542,
-1.88504,-0.760623,4.42592,
-2.51673,4.72252,-1.99239,
--1.66934,-0.129677,-2.49048,
--1.25499,2.36151,-2.98447,
-2.65331,0.0443886,0.108819,
--3.35439,0.0872109,-1.33429,
-3.35597,0.0403626,2.8203,
-4.45191,1.24824,-0.95821,
--0.171441,-1.52622,-4.68253,
-1.19986,1.72992,-3.29566,
--0.451339,1.92976,1.21534,
--0.743119,-0.160688,0.805688,
-2.38678,0.272829,2.75457,
-1.72464,2.08232,-0.950389,
-2.11167,1.56576,1.21969,
-3.05157,-1.56838,-0.450535,
-0.132417,-3.08279,-1.34127,
-1.65441,-0.325204,-0.825145,
-2.05515,-1.8417,1.8561,
--0.555858,1.52007,-0.80122,
--2.05026,1.52773,2.33529,
--2.35231,-3.28716,3.53598,
--2.25771,2.5667,-1.92243,
-0.386884,-3.28674,3.49336,
-0.957272,-1.68124,-1.89095,
-2.99881,2.24992,-0.0535837,
-3.19604,2.92893,-2.16276,
-2.55903,3.12413,2.95022,
--0.570758,-2.85326,-0.339255,
-0.356627,0.641074,0.355538,
--1.15777,-0.162227,-0.455885,
--2.4871,-0.885492,-0.374875,
-1.55464,-1.48929,-0.593706,
--0.852655,-2.08736,-1.18281,
-0.504087,-0.879247,1.35148,
--2.15261,1.04511,-3.25543,
--0.653745,-1.32873,-3.18964,
-0.35973,-0.844255,-1.72034,
--2.11112,0.962572,2.59386,
-1.47531,-0.693626,-3.15249,
--1.35814,0.767202,3.45094,
--3.05812,-1.26298,1.45287,
--1.63927,0.893568,-1.94978,
-0.751992,1.68559,2.3618,
-5.8205,-0.769076,-0.958994,
--2.38512,-0.166005,-1.25855,
--0.556071,-2.28164,1.57032,
-5.89172,-0.244834,0.553728,
--0.468648,-0.927756,-0.737048,
--2.66659,-1.64374,-0.995568,
-0.251499,-1.24569,0.95028,
-0.737721,2.88575,0.448918,
--0.634421,-1.84377,-2.47094,
-0.556349,2.86774,1.62621,
--3.29644,3.28642,-3.45459,
--1.45045,2.52138,2.75329,
-1.87449,-2.68651,3.60371,
--0.656424,-2.56828,1.35509,
-1.95771,-1.48325,-3.85265,
-3.85074,0.0825779,-1.65283,
--1.17278,-1.69258,-1.05875,
-1.25754,-0.0439433,1.3571,
-2.91459,2.08715,0.259842,
-0.748196,2.52132,0.659051,
--1.85745,-1.88355,1.05259,
-1.69311,1.12299,-3.05453,
--2.86301,0.123274,0.559289,
--1.43146,1.64425,-1.95053,
-2.35287,0.414621,-0.950807,
-0.952585,-0.280452,-0.844588,
--1.53836,-1.76396,2.51742,
--3.05431,2.45,-0.26571,
--0.637412,1.12028,-0.587387,
--1.71017,-0.728497,-1.05087,
-0.454027,0.849208,-0.151716,
--3.54846,0.367137,1.1484,
-0.200816,-2.08832,0.255433,
--2.15817,0.725338,0.852676,
--2.45708,-0.725538,-0.859435,
-4.25339,1.84177,-0.555145,
-0.119319,-1.32041,-1.45864,
--3.65177,0.361323,0.351554,
-0.928598,0.321024,-3.64759,
--0.250062,1.84912,7.49887,
-3.59593,0.929451,-2.15224,
-0.658599,2.36796,4.11632,
-0.55841,-1.08657,0.258326,
-1.9419,0.0488641,-3.75375,
-0.0589998,0.521351,-3.85723,
-3.45108,0.562199,4.20946,
--0.255073,2.36504,-3.556,
-1.95848,1.28698,4.25014,
-1.85411,3.12131,0.652769,
--3.3589,0.801817,-1.5591,
-2.48128,-0.163406,1.25243,
-2.52135,0.960467,1.45432,
-0.827496,-0.163021,-0.558886,
--3.45032,-0.0831453,0.851212,
--3.45334,0.855944,1.35596,
--0.834644,0.245598,-1.23878,
-3.64558,1.16831,-0.18559,
--1.45919,-3.08196,-0.329805,
--3.65715,-1.04485,0.159208,
-1.35463,-0.766382,0.558632,
--2.75899,-1.67431,-1.55069,
-1.67539,2.04337,0.912884,
-3.51677,-3.24285,0.170272,
--4.25189,0.56589,-4.35936,
--2.68545,-0.448243,0.540342,
-0.279844,-0.641466,-0.353986,
--3.27626,-3.52006,1.77644,
--0.724096,-1.84647,-2.45271,
--4.18603,0.123376,3.85066,
--4.05156,0.0499386,-0.332945,
-2.69508,2.32777,1.26256,
--0.353726,1.07252,-0.738837,
--0.947178,0.36459,1.55593,
--0.058346,2.44781,-4.35023,
-1.51586,-0.961109,-3.43483,
--2.8852,2.08863,-1.75468,
--0.297867,0.722757,0.91355,
--1.12917,-1.68328,0.175315,
--1.24248,-0.323519,-0.854841,
-0.751943,0.564075,3.95073,
-1.15436,2.81813,0.653114,
--2.55058,-2.56486,0.756618,
-0.959794,0.845224,-0.854001,
--2.15033,0.248556,-3.16151,
-0.353224,-1.68637,0.457949,
--0.753237,-2.48313,-0.355373,
-0.296585,2.04822,0.198473,
--2.4737,0.682952,1.85349,
-1.9027,0.882796,1.45908,
-0.254799,1.92572,-1.70848,
--0.951602,-0.698987,-2.22682,
-0.262582,-2.44093,1.05636,
-0.385415,-0.685667,-3.35928,
-0.055981,0.523585,-3.36093,
--0.0518635,-0.889068,-0.840648,
-0.455171,2.84624,-1.98276,
-2.85475,-0.685697,-2.45695,
--1.05047,-1.92121,0.931666,
--2.75962,-0.164458,-1.55261,
-1.91811,1.65767,3.15004,
--2.25653,0.856735,-4.351,
-1.89178,-0.728669,-3.8803,
--3.25958,-1.16223,-1.85148,
--1.6291,-2.32967,-0.874786,
-3.17524,0.327351,2.15337,
--1.05094,-0.560694,-3.4581,
-0.759785,-1.0801,-0.257876,
--0.4597,-2.2404,2.54341,
-0.242266,0.121832,7.80878,
--1.6573,1.56049,-1.61749,
-1.39912,-2.84395,-0.25965,
-0.552342,1.36924,2.95278,
--1.92932,-0.883981,0.0589583,
--1.9026,0.56297,-0.723523,
--1.25867,-0.529617,2.3503,
-2.16527,-0.723364,-1.45609,
--0.984608,-0.720375,-2.05144,
-0.946803,-0.969188,-3.14625,
-2.7986,-2.36069,1.25827,
-3.37979,-1.11699,-3.55116,
--0.753992,-1.9649,2.98548,
--0.456321,0.525303,-0.109174,
-0.8642,1.53147,-3.34749,
--0.450507,-0.443265,-2.8325,
--3.24876,3.12791,0.576143,
--3.14755,2.84502,-0.45749,
-0.226819,-1.28172,0.939501,
--0.650725,-1.40317,-1.35211,
--0.451625,1.84271,-0.950536,
--1.36693,0.850218,-1.09799,
-2.35374,-0.28759,1.55815,
-2.60577,-2.46765,1.2633,
-1.21562,-1.72153,-0.4034,
--2.43216,3.04268,1.90109,
--1.85365,-0.16523,-2.98947,
--0.953475,-2.76164,2.53396,
-2.55264,-0.645611,3.25479,
--0.675476,-0.724382,-1.4566,
-0.801062,0.16778,2.21815,
-0.680443,0.0407888,3.27279,
--3.75426,-0.247624,0.26307,
-0.427609,-0.322312,0.652005,
--2.17428,-3.68643,0.256619,
-0.456732,-2.44858,3.13051,
-0.524175,-1.88231,-1.93171,
-7.2311,1.8354,-1.2502,
-2.69502,2.25543,-4.25127,
-0.259357,2.28099,-0.476734,
--0.327316,-1.24908,0.78628,
-0.190362,-3.26019,0.0545844,
--1.25409,-0.761609,2.65361,
-2.86816,0.443709,0.556137,
-2.60289,-0.680561,0.248414,
-1.75631,-0.162859,-3.62488,
--0.559754,-0.16222,2.35858,
-0.157552,-1.72639,-0.48056,
-3.69492,-0.848265,-0.256413,
--1.4264,-1.48589,-2.724,
-1.15372,-0.27228,-2.75499,
--1.85159,1.76577,-0.858854,
-0.0580466,-0.41133,1.05649,
--1.25289,0.528142,-0.386138,
--0.858101,-0.245127,1.95078,
--1.95302,-0.0862415,-1.95806,
--2.79133,-0.527094,-0.356931,
-0.110597,0.167534,4.12784,
--0.637771,-0.526587,-1.25734,
--2.311,-0.489068,-2.8594,
--0.352617,-1.23939,-1.85435,
-1.78814,-0.265883,3.35913,
-2.75557,-2.32271,3.15559,
-2.85426,0.443661,0.921828,
--2.14262,0.400863,1.11614,
-4.45496,-0.488668,-3.7533,
-0.754719,-1.44165,0.853323,
--0.856506,1.76559,1.05702,
--0.418565,-0.921031,-2.43699,
--1.29292,-0.282271,-1.62927,
--0.759531,0.566692,-0.750991,
-0.559787,1.72479,-0.26667,
-2.75533,-0.245187,-0.543844,
--2.27924,-1.04154,-4.05156,
-3.35852,-0.561129,-2.98986,
-2.41843,-0.321119,-1.55651,
-0.85431,-0.883719,-2.17826,
-0.417867,0.242995,-0.456326,
--4.17449,-0.720086,0.355145,
--0.577386,0.0440364,-0.950268,
--2.8156,2.92346,0.958713,
--1.65138,0.963561,1.25265,
-1.45117,0.845424,0.252789,
-2.27848,-1.76777,0.117707,
--0.754248,1.08381,-2.15345,
--3.15415,-0.162292,-1.15347,
-2.55396,-1.68912,1.15698,
-0.159561,1.84202,0.428428,
--1.58079,2.04207,3.29578,
--1.05711,-0.843112,-1.98122,
-0.138866,-2.96642,-0.212247,
-2.6778,0.686972,-2.6553,
--0.498291,-0.362846,-1.0538,
-1.19872,0.0476518,-2.42077,
--2.3972,1.40393,-0.1943,
-0.85034,-1.24222,1.5646,
-0.142174,0.249903,-2.75252,
-1.15197,1.32746,-1.70104,
-0.359387,-1.65115,-2.75243,
-0.357917,-1.36406,2.55102,
--1.65268,-0.28339,2.75665,
--3.82681,-3.28984,2.55128,
--2.61371,1.08247,-0.457068,
-1.67152,-2.25527,2.45819,
--0.753832,1.1682,-1.95913,
--2.05131,3.04537,1.91954,
--0.695378,2.88924,1.41965,
-3.25767,-2.76934,-0.354127,
--0.746795,1.36034,1.85953,
-0.859135,1.08222,0.959116,
-1.15898,1.32443,3.41981,
-3.67954,0.447177,-0.414029,
-0.907323,2.12852,1.95837,
--0.683456,-0.247536,1.05621,
--1.67809,0.641544,-1.31143,
--1.30192,-0.677394,-1.95159,
--0.105665,0.365205,-1.2567,
-1.12189,-1.48969,0.957166,
-1.25554,-1.92186,-0.904086,
-0.117786,2.23836,-0.498009,
--2.85788,0.643364,0.55867,
--1.66115,2.56146,-2.28632,
--3.29334,-0.0894367,-0.656519,
-3.15561,-0.769732,1.15695,
-1.25684,0.64652,-2.6002,
-2.65231,-3.52625,1.55617,
--1.8573,-1.76276,-1.74075,
--1.55648,1.2592,2.1585,
--0.555522,2.88068,-2.85423,
--3.14249,-0.288592,-3.35534,
-2.45413,0.0854903,-2.20507,
--2.05464,0.887836,-0.658349,
-1.12708,-0.568106,-3.65865,
--0.59147,-0.685439,0.301612,
-0.473679,0.886411,-1.65386,
-1.65166,0.166741,0.751119,
--0.299287,1.72233,0.618559,
-1.15181,-0.488026,0.124448,
-0.0561315,1.04877,2.15922,
-0.154258,-0.64401,-1.31179,
-1.75863,-1.88571,-2.8537,
-3.35024,1.28154,-1.05461,
--3.71738,-2.88631,-1.05314,
--1.78258,3.08967,0.150476,
-3.47828,-2.524,-2.45502,
--0.159138,0.160633,-0.338796,
--2.15885,-0.82959,1.25022,
--1.95268,-0.841195,-3.19487,
--0.281381,-0.887435,-3.55807,
-0.415164,0.326482,-1.55411,
-1.92868,-2.84771,-0.556196,
-1.05804,1.32866,0.66596,
-2.46545,1.00747,2.35957,
--0.77358,0.284677,-1.38805,
-0.851046,0.960742,-2.70934,
--0.858208,-0.884015,1.16663,
-1.55291,0.282705,-3.18254,
-1.99034,0.286298,-1.75821,
-0.259097,-2.04379,-0.858936,
--1.5956,2.04693,-1.35234,
--0.775432,1.24465,1.95935,
-1.65595,-1.04954,-0.954437,
--2.35417,-1.76095,-0.248306,
-0.855717,-2.92161,3.4496,
--0.717941,2.52993,1.25007,
--3.42927,0.673305,0.995742,
-8.03373,-2.05136,4.02113,
-7.88929,-2.2029,5.0036,
-7.61596,-2.44569,4.54892,
-7.41949,-2.64169,3.82339,
-7.21192,-2.87947,4.89423,
-7.08346,-2.38649,4.19212,
-6.90279,-3.33038,4.9273,
-6.78959,-3.55575,3.55127,
-6.57074,-3.75902,3.32517,
-6.30756,-3.40499,3.78366,
-7.90893,-3.3237,2.48012,
-6.24078,-4.04978,3.47459,
-8.0691,-4.6865,4.08057,
-5.98731,-2.26113,2.82166,
-5.46898,-3.99581,3.25024,
-8.1461,-3.34471,3.42168,
-6.8456,-5.00126,2.36145,
-7.62888,-3.82465,2.7879,
-7.18034,-3.94376,2.74348,
-6.02527,-4.36523,2.56247,
-8.64577,-3.04345,2.62974,
-7.82539,-3.6881,2.96164,
-7.10508,-3.6174,4.22416,
-7.64684,-3.88431,3.9336,
-7.46411,-4.21516,3.32001,
-6.98777,-3.94024,3.14694,
-7.36355,-4.24875,1.72061,
-8.42011,-4.52065,2.62078,
-6.04598,-4.48682,2.74494,
-8.7682,-3.9271,3.82815,
-6.76279,-3.58031,2.92525,
-7.14794,-4.42742,2.62365,
-5.32696,-3.28733,3.34916,
-6.43655,-4.60784,2.41548,
-5.66033,-4.98497,3.72282
diff --git a/examples/datavisualization/custominput/doc/images/custominput-example.png b/examples/datavisualization/custominput/doc/images/custominput-example.png
deleted file mode 100644
index b2656b69..00000000
--- a/examples/datavisualization/custominput/doc/images/custominput-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/custominput/doc/src/custominput.qdoc b/examples/datavisualization/custominput/doc/src/custominput.qdoc
deleted file mode 100644
index 2149bd2f..00000000
--- a/examples/datavisualization/custominput/doc/src/custominput.qdoc
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example custominput
- \title Custom Input Example
- \ingroup qtdatavisualization_examples
- \brief Implementing custom input handler in a widget application.
-
- The Custom Input example shows how to customize the 3D graph controls in a widget application
- using a custom graph input handler to capture and process mouse events.
- The code in this example shows also how the camera is controlled by using QPropertyAnimation
- to animate the camera and item selection is done on mouseover rather than clicking any mouse
- buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as
- the default input handler implements.
-
- \image custominput-example.png
-
- \include examples-run.qdocinc
-
- \section1 Replacing Default Input Handling
-
- The default input handling mechanism is replaced by setting the active input handler of
- Q3DScatter to \c CustomInputHandler that implements the custom behavior.
-
- \snippet custominput/scatterdatamodifier.cpp 0
-
- \section1 Implementing Custom Selection Handling
-
- The on mouseover selection handling is implemented in the \c CustomInputHandler that captures
- the mouse events. It then stores the last known coordinates to the
- QAbstract3DInputHandler::inputPosition property.
-
- \snippet custominput/custominputhandler.cpp 0
-
- As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup
- to retrigger selection so that the selection moves to the item currently under the mouse cursor
- as the camera animates around the graph even when the mouse cursor is not moving.
-
- \snippet custominput/scatterdatamodifier.cpp 1
-
- \section1 Implementing Custom Zoom Handling
-
- The camera has a zoom factor that represents amount of zoom in percentages. In this example the
- zoom range is limited between 10% and 500%. This range is then divided to four subranges where
- \c angleDelta is scaled to different amount of zoom change based on the current subrange.
-
- \snippet custominput/custominputhandler.cpp 1
-
- \section1 Implementing Custom Camera Handling
-
- The camera is animated to constantly rotate around the graph with two animations. The rotation
- around the graph is done with a simple QPropertyAnimation that just increments during 20
- seconds from 0 degrees to 360 degrees and sets the Q3DCamera::xRotation property.
-
- \snippet custominput/scatterdatamodifier.cpp 2
-
- The camera movement up and down is implemented with a QSequentialAnimationGroup that varies
- the Q3DCamera::yRotation property of the camera from 5 degrees to 45 degrees and back with in
- and out easing.
-
- \snippet custominput/scatterdatamodifier.cpp 3
-*/
diff --git a/examples/datavisualization/custominput/main.cpp b/examples/datavisualization/custominput/main.cpp
deleted file mode 100644
index d9e3b403..00000000
--- a/examples/datavisualization/custominput/main.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QPushButton>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
-#include <QtGui/QFontDatabase>
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- Q3DScatter *graph = new Q3DScatter();
- QWidget *container = QWidget::createWindowContainer(graph);
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
-
- widget->setWindowTitle(QStringLiteral("Custom Input Handling"));
-
- QPushButton *cameraButton = new QPushButton(widget);
- cameraButton->setText(QStringLiteral("Toggle Camera Animation"));
-
- QComboBox *shadowQuality = new QComboBox(widget);
- shadowQuality->addItem(QStringLiteral("None"));
- shadowQuality->addItem(QStringLiteral("Low"));
- shadowQuality->addItem(QStringLiteral("Medium"));
- shadowQuality->addItem(QStringLiteral("High"));
- shadowQuality->addItem(QStringLiteral("Low Soft"));
- shadowQuality->addItem(QStringLiteral("Medium Soft"));
- shadowQuality->addItem(QStringLiteral("High Soft"));
- shadowQuality->setCurrentIndex(2);
-
- vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop);
- vLayout->addWidget(shadowQuality, 1, Qt::AlignTop);
-
- ScatterDataModifier *modifier = new ScatterDataModifier(graph);
-
- QObject::connect(cameraButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::toggleCameraAnimation);
-
- QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeShadowQuality(int)));
-
- QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality,
- &QComboBox::setCurrentIndex);
-
- widget->show();
- modifier->start();
- return app.exec();
-}
diff --git a/examples/datavisualization/custominput/scatterdatamodifier.cpp b/examples/datavisualization/custominput/scatterdatamodifier.cpp
deleted file mode 100644
index 3c6abd76..00000000
--- a/examples/datavisualization/custominput/scatterdatamodifier.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-
-#include <QtDataVisualization/QScatterDataProxy>
-#include <QtDataVisualization/QValue3DAxis>
-#include <QtDataVisualization/Q3DScene>
-#include <QtDataVisualization/Q3DCamera>
-#include <QtDataVisualization/QScatter3DSeries>
-#include <QtDataVisualization/Q3DTheme>
-#include <QtCore/qmath.h>
-#include <QtCore/QFile>
-#include <QtCore/QTextStream>
-#include <QtCore/QDebug>
-
-using namespace QtDataVisualization;
-
-ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
- : m_graph(scatter),
- m_inputHandler(new CustomInputHandler())
-{
- m_graph->activeTheme()->setType(Q3DTheme::ThemeDigia);
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
-
- m_graph->setAxisX(new QValue3DAxis);
- m_graph->setAxisY(new QValue3DAxis);
- m_graph->setAxisZ(new QValue3DAxis);
-
- m_graph->axisX()->setRange(-10.0f, 10.0f);
- m_graph->axisY()->setRange(-5.0f, 5.0f);
- m_graph->axisZ()->setRange(-5.0f, 5.0f);
-
- QScatter3DSeries *series = new QScatter3DSeries;
- series->setItemLabelFormat(QStringLiteral("@xLabel, @yLabel, @zLabel"));
- series->setMesh(QAbstract3DSeries::MeshCube);
- series->setItemSize(0.15f);
- m_graph->addSeries(series);
-
- //! [2]
- m_animationCameraX = new QPropertyAnimation(m_graph->scene()->activeCamera(), "xRotation");
- m_animationCameraX->setDuration(20000);
- m_animationCameraX->setStartValue(QVariant::fromValue(0.0f));
- m_animationCameraX->setEndValue(QVariant::fromValue(360.0f));
- m_animationCameraX->setLoopCount(-1);
- //! [2]
-
- //! [3]
- QPropertyAnimation *upAnimation = new QPropertyAnimation(m_graph->scene()->activeCamera(), "yRotation");
- upAnimation->setDuration(9000);
- upAnimation->setStartValue(QVariant::fromValue(5.0f));
- upAnimation->setEndValue(QVariant::fromValue(45.0f));
-
- QPropertyAnimation *downAnimation = new QPropertyAnimation(m_graph->scene()->activeCamera(), "yRotation");
- downAnimation->setDuration(9000);
- downAnimation->setStartValue(QVariant::fromValue(45.0f));
- downAnimation->setEndValue(QVariant::fromValue(5.0f));
-
- m_animationCameraY = new QSequentialAnimationGroup();
- m_animationCameraY->setLoopCount(-1);
- m_animationCameraY->addAnimation(upAnimation);
- m_animationCameraY->addAnimation(downAnimation);
- //! [3]
-
- m_animationCameraX->start();
- m_animationCameraY->start();
-
- // Give ownership of the handler to the graph and make it the active handler
- //! [0]
- m_graph->setActiveInputHandler(m_inputHandler);
- //! [0]
-
- //! [1]
- m_selectionTimer = new QTimer(this);
- m_selectionTimer->setInterval(10);
- m_selectionTimer->setSingleShot(false);
- QObject::connect(m_selectionTimer, &QTimer::timeout, this,
- &ScatterDataModifier::triggerSelection);
- m_selectionTimer->start();
- //! [1]
-}
-
-ScatterDataModifier::~ScatterDataModifier()
-{
- delete m_graph;
-}
-
-void ScatterDataModifier::start()
-{
- addData();
-}
-
-void ScatterDataModifier::addData()
-{
- QList<QVector3D> itemList;
-
- // Read data items from the file to QList
- QTextStream stream;
- QFile dataFile(":/data/data.txt");
- if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- stream.setDevice(&dataFile);
- while (!stream.atEnd()) {
- QString line = stream.readLine();
- if (line.startsWith("#")) // Ignore comments
- continue;
- QStringList strList = line.split(",", Qt::SkipEmptyParts);
- // Each line has three data items: xPos, yPos and zPos value
- if (strList.size() < 3) {
- qWarning() << "Invalid row read from data:" << line;
- continue;
- }
- itemList.append(QVector3D(
- strList.at(0).trimmed().toFloat(),
- strList.at(1).trimmed().toFloat(),
- strList.at(2).trimmed().toFloat()));
- }
- } else {
- qWarning() << "Unable to open data file:" << dataFile.fileName();
- }
-
- // Add data from the QList to datamodel
- QScatterDataArray *dataArray = new QScatterDataArray;
- dataArray->resize(itemList.count());
- QScatterDataItem *ptrToDataArray = &dataArray->first();
- for (int i = 0; i < itemList.count(); i++) {
- ptrToDataArray->setPosition(itemList.at(i));
- ptrToDataArray++;
- }
-
- m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);
-}
-
-void ScatterDataModifier::toggleCameraAnimation()
-{
- if (m_animationCameraX->state() != QAbstractAnimation::Paused) {
- m_animationCameraX->pause();
- m_animationCameraY->pause();
- } else {
- m_animationCameraX->resume();
- m_animationCameraY->resume();
- }
-}
-
-void ScatterDataModifier::triggerSelection()
-{
- m_graph->scene()->setSelectionQueryPosition(m_inputHandler->inputPosition());
-}
-
-void ScatterDataModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality sq)
-{
- int quality = int(sq);
- emit shadowQualityChanged(quality); // connected to a checkbox in main.cpp
-}
-
-void ScatterDataModifier::changeShadowQuality(int quality)
-{
- QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality);
- m_graph->setShadowQuality(sq);
-}
diff --git a/examples/datavisualization/custominput/scatterdatamodifier.h b/examples/datavisualization/custominput/scatterdatamodifier.h
deleted file mode 100644
index 41f09f94..00000000
--- a/examples/datavisualization/custominput/scatterdatamodifier.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef SCATTERDATAMODIFIER_H
-#define SCATTERDATAMODIFIER_H
-
-#include "custominputhandler.h"
-
-#include <QtDataVisualization/q3dscatter.h>
-#include <QtGui/QFont>
-#include <QtCore/QTimer>
-#include <QtCore/QPropertyAnimation>
-#include <QtCore/QSequentialAnimationGroup>
-#include <QtGui/QVector3D>
-
-using namespace QtDataVisualization;
-
-class ScatterDataModifier : public QObject
-{
- Q_OBJECT
-public:
- explicit ScatterDataModifier(Q3DScatter *scatter);
- ~ScatterDataModifier();
-
- void addData();
- void toggleCameraAnimation();
- void start();
-
-public Q_SLOTS:
- void changeShadowQuality(int quality);
- void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
- void triggerSelection();
-
-Q_SIGNALS:
- void shadowQualityChanged(int quality);
-
-private:
- Q3DScatter *m_graph;
- QPropertyAnimation *m_animationCameraX;
- QSequentialAnimationGroup *m_animationCameraY;
- CustomInputHandler *m_inputHandler;
- QTimer *m_selectionTimer;
-};
-
-#endif
diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp
deleted file mode 100644
index 512f059e..00000000
--- a/examples/datavisualization/customitems/customitemgraph.cpp
+++ /dev/null
@@ -1,331 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "customitemgraph.h"
-
-#include <QtDataVisualization/Q3DTheme>
-#include <QtDataVisualization/QCustom3DItem>
-#include <QtDataVisualization/QCustom3DLabel>
-#include <QtGui/QImage>
-
-using namespace QtDataVisualization;
-
-CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label)
- : m_graph(surface),
- m_textField(label),
- m_previouslyAnimatedItem(0)
-{
- QImage layerOneHMap(":/maps/layer_1.png");
- QHeightMapSurfaceDataProxy *layerOneProxy = new QHeightMapSurfaceDataProxy(layerOneHMap);
- QSurface3DSeries *layerOneSeries = new QSurface3DSeries(layerOneProxy);
- layerOneSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
- layerOneProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
- layerOneSeries->setDrawMode(QSurface3DSeries::DrawSurface);
- layerOneSeries->setFlatShadingEnabled(false);
-
- QImage layerTwoHMap(":/maps/layer_2.png");
- QHeightMapSurfaceDataProxy *layerTwoProxy = new QHeightMapSurfaceDataProxy(layerTwoHMap);
- QSurface3DSeries *layerTwoSeries = new QSurface3DSeries(layerTwoProxy);
- layerTwoSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
- layerTwoProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
- layerTwoSeries->setDrawMode(QSurface3DSeries::DrawSurface);
- layerTwoSeries->setFlatShadingEnabled(false);
-
- QImage layerThreeHMap(":/maps/layer_3.png");
- QHeightMapSurfaceDataProxy *layerThreeProxy = new QHeightMapSurfaceDataProxy(layerThreeHMap);
- QSurface3DSeries *layerThreeSeries = new QSurface3DSeries(layerThreeProxy);
- layerThreeSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
- layerThreeProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
- layerThreeSeries->setDrawMode(QSurface3DSeries::DrawSurface);
- layerThreeSeries->setFlatShadingEnabled(false);
-
- m_graph->axisX()->setLabelFormat("%.1f N");
- m_graph->axisZ()->setLabelFormat("%.1f E");
- m_graph->axisX()->setRange(34.0f, 40.0f);
- m_graph->axisY()->setRange(0.0f, 200.0f);
- m_graph->axisZ()->setRange(18.0f, 24.0f);
-
- m_graph->axisX()->setTitle(QStringLiteral("Latitude"));
- m_graph->axisY()->setTitle(QStringLiteral("Height"));
- m_graph->axisZ()->setTitle(QStringLiteral("Longitude"));
-
- m_graph->addSeries(layerOneSeries);
- m_graph->addSeries(layerTwoSeries);
- m_graph->addSeries(layerThreeSeries);
-
- QLinearGradient grOne;
- grOne.setColorAt(0.0, Qt::black);
- grOne.setColorAt(0.38, Qt::darkYellow);
- grOne.setColorAt(0.39, Qt::darkGreen);
- grOne.setColorAt(0.5, Qt::darkGray);
- grOne.setColorAt(1.0, Qt::gray);
- m_graph->seriesList().at(0)->setBaseGradient(grOne);
- m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
-
- QLinearGradient grTwo;
- grTwo.setColorAt(0.385, Qt::blue);
- grTwo.setColorAt(0.395, Qt::white);
- m_graph->seriesList().at(1)->setBaseGradient(grTwo);
- m_graph->seriesList().at(1)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
-
- QLinearGradient grThree;
- grThree.setColorAt(0.0, Qt::white);
- grThree.setColorAt(0.05, Qt::black);
- m_graph->seriesList().at(2)->setBaseGradient(grThree);
- m_graph->seriesList().at(2)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
-
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
-
- connect(m_graph, &QAbstract3DGraph::selectedElementChanged,
- this, &CustomItemGraph::handleElementSelected);
-
- m_selectionAnimation = new QPropertyAnimation(this);
- m_selectionAnimation->setPropertyName("scaling");
- m_selectionAnimation->setDuration(500);
- m_selectionAnimation->setLoopCount(-1);
-
- QFont titleFont = QFont("Century Gothic", 30);
- titleFont.setBold(true);
- QCustom3DLabel *titleLabel = new QCustom3DLabel("Oil Rigs on Imaginary Sea", titleFont,
- QVector3D(0.0f, 1.2f, 0.0f),
- QVector3D(1.0f, 1.0f, 0.0f),
- QQuaternion());
- titleLabel->setPositionAbsolute(true);
- titleLabel->setFacingCamera(true);
- titleLabel->setBackgroundColor(QColor(0x66cdaa));
- m_graph->addCustomItem(titleLabel);
-
- toggleItemOne(true);
- toggleItemTwo(true);
-}
-
-CustomItemGraph::~CustomItemGraph()
-{
- delete m_graph;
-}
-
-void CustomItemGraph::toggleItemOne(bool show)
-{
- //! [1]
- QVector3D positionOne = QVector3D(39.0f, 77.0f, 19.2f);
- //! [1]
- QVector3D positionOnePipe = QVector3D(39.0f, 45.0f, 19.2f);
- QVector3D positionOneLabel = QVector3D(39.0f, 107.0f, 19.2f);
- if (show) {
- //! [0]
- QImage color = QImage(2, 2, QImage::Format_RGB32);
- color.fill(Qt::red);
- //! [0]
- //! [2]
- QCustom3DItem *item = new QCustom3DItem(":/items/oilrig.obj", positionOne,
- QVector3D(0.025f, 0.025f, 0.025f),
- QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 45.0f),
- color);
- //! [2]
- //! [3]
- m_graph->addCustomItem(item);
- //! [3]
- item = new QCustom3DItem(":/items/pipe.obj", positionOnePipe,
- QVector3D(0.005f, 0.5f, 0.005f),
- QQuaternion(),
- color);
- item->setShadowCasting(false);
- m_graph->addCustomItem(item);
-
- QCustom3DLabel *label = new QCustom3DLabel();
- label->setText("Oil Rig One");
- label->setPosition(positionOneLabel);
- label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
- m_graph->addCustomItem(label);
- } else {
- resetSelection();
- //! [4]
- m_graph->removeCustomItemAt(positionOne);
- //! [4]
- m_graph->removeCustomItemAt(positionOnePipe);
- m_graph->removeCustomItemAt(positionOneLabel);
- }
-}
-
-void CustomItemGraph::toggleItemTwo(bool show)
-{
- QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f);
- QVector3D positionTwoPipe = QVector3D(34.5f, 45.0f, 23.4f);
- QVector3D positionTwoLabel = QVector3D(34.5f, 107.0f, 23.4f);
- if (show) {
- QImage color = QImage(2, 2, QImage::Format_RGB32);
- color.fill(Qt::red);
- QCustom3DItem *item = new QCustom3DItem();
- item->setMeshFile(":/items/oilrig.obj");
- item->setPosition(positionTwo);
- item->setScaling(QVector3D(0.025f, 0.025f, 0.025f));
- item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f));
- item->setTextureImage(color);
- m_graph->addCustomItem(item);
- item = new QCustom3DItem(":/items/pipe.obj", positionTwoPipe,
- QVector3D(0.005f, 0.5f, 0.005f),
- QQuaternion(),
- color);
- item->setShadowCasting(false);
- m_graph->addCustomItem(item);
-
- QCustom3DLabel *label = new QCustom3DLabel();
- label->setText("Oil Rig Two");
- label->setPosition(positionTwoLabel);
- label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
- m_graph->addCustomItem(label);
- } else {
- resetSelection();
- m_graph->removeCustomItemAt(positionTwo);
- m_graph->removeCustomItemAt(positionTwoPipe);
- m_graph->removeCustomItemAt(positionTwoLabel);
- }
-}
-
-void CustomItemGraph::toggleItemThree(bool show)
-{
- QVector3D positionThree = QVector3D(34.5f, 86.0f, 19.1f);
- QVector3D positionThreeLabel = QVector3D(34.5f, 116.0f, 19.1f);
- if (show) {
- QImage color = QImage(2, 2, QImage::Format_RGB32);
- color.fill(Qt::darkMagenta);
- QCustom3DItem *item = new QCustom3DItem();
- item->setMeshFile(":/items/refinery.obj");
- item->setPosition(positionThree);
- item->setScaling(QVector3D(0.04f, 0.04f, 0.04f));
- item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f));
- item->setTextureImage(color);
- m_graph->addCustomItem(item);
-
- QCustom3DLabel *label = new QCustom3DLabel();
- label->setText("Refinery");
- label->setPosition(positionThreeLabel);
- label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
- m_graph->addCustomItem(label);
- } else {
- resetSelection();
- m_graph->removeCustomItemAt(positionThree);
- m_graph->removeCustomItemAt(positionThreeLabel);
- }
-}
-
-void CustomItemGraph::toggleSeeThrough(bool seethrough)
-{
- if (seethrough) {
- m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawWireframe);
- m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawWireframe);
- } else {
- m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawSurface);
- m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawSurface);
- }
-}
-
-void CustomItemGraph::toggleOilHighlight(bool highlight)
-{
- if (highlight) {
- QLinearGradient grThree;
- grThree.setColorAt(0.0, Qt::black);
- grThree.setColorAt(0.05, Qt::red);
- m_graph->seriesList().at(2)->setBaseGradient(grThree);
- } else {
- QLinearGradient grThree;
- grThree.setColorAt(0.0, Qt::white);
- grThree.setColorAt(0.05, Qt::black);
- m_graph->seriesList().at(2)->setBaseGradient(grThree);
- }
-}
-
-void CustomItemGraph::toggleShadows(bool shadows)
-{
- if (shadows)
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
- else
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
-}
-
-void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type)
-{
- resetSelection();
- if (type == QAbstract3DGraph::ElementCustomItem) {
- QCustom3DItem *item = m_graph->selectedCustomItem();
- QString text;
- if (qobject_cast<QCustom3DLabel *>(item) != 0) {
- text.append("Custom label: ");
- } else {
- QStringList split = item->meshFile().split("/");
- text.append(split.last());
- text.append(": ");
- }
- int index = m_graph->selectedCustomItemIndex();
- text.append(QString::number(index));
- m_textField->setText(text);
- m_previouslyAnimatedItem = item;
- m_previousScaling = item->scaling();
- m_selectionAnimation->setTargetObject(item);
- m_selectionAnimation->setStartValue(item->scaling());
- m_selectionAnimation->setEndValue(item->scaling() * 1.5f);
- m_selectionAnimation->start();
- } else if (type == QAbstract3DGraph::ElementSeries) {
- QString text = "Surface (";
- QSurface3DSeries *series = m_graph->selectedSeries();
- if (series) {
- QPoint point = series->selectedPoint();
- QString posStr;
- posStr.setNum(point.x());
- text.append(posStr);
- text.append(", ");
- posStr.setNum(point.y());
- text.append(posStr);
- }
- text.append(")");
- m_textField->setText(text);
- } else if (type > QAbstract3DGraph::ElementSeries
- && type < QAbstract3DGraph::ElementCustomItem) {
- int index = m_graph->selectedLabelIndex();
- QString text;
- if (type == QAbstract3DGraph::ElementAxisXLabel)
- text.append("Axis X label: ");
- else if (type == QAbstract3DGraph::ElementAxisYLabel)
- text.append("Axis Y label: ");
- else
- text.append("Axis Z label: ");
- text.append(QString::number(index));
- m_textField->setText(text);
- } else {
- m_textField->setText("Nothing");
- }
-}
-
-void CustomItemGraph::resetSelection()
-{
- m_selectionAnimation->stop();
- if (m_previouslyAnimatedItem)
- m_previouslyAnimatedItem->setScaling(m_previousScaling);
- m_previouslyAnimatedItem = 0;
-}
diff --git a/examples/datavisualization/customitems/customitemgraph.h b/examples/datavisualization/customitems/customitemgraph.h
deleted file mode 100644
index 2b977817..00000000
--- a/examples/datavisualization/customitems/customitemgraph.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CUSTOMITEMGRAPH_H
-#define CUSTOMITEMGRAPH_H
-
-#include <QtDataVisualization/Q3DSurface>
-#include <QtDataVisualization/QSurfaceDataProxy>
-#include <QtDataVisualization/QHeightMapSurfaceDataProxy>
-#include <QtDataVisualization/QSurface3DSeries>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QLabel>
-#include <QtCore/QPropertyAnimation>
-
-using namespace QtDataVisualization;
-
-class CustomItemGraph : public QObject
-{
- Q_OBJECT
-public:
- explicit CustomItemGraph(Q3DSurface *surface, QLabel *label);
- ~CustomItemGraph();
-
- void toggleItemOne(bool show);
- void toggleItemTwo(bool show);
- void toggleItemThree(bool show);
- void toggleSeeThrough(bool seethrough);
- void toggleOilHighlight(bool highlight);
- void toggleShadows(bool shadows);
-
-private:
- void handleElementSelected(QAbstract3DGraph::ElementType type);
- void resetSelection();
-
-private:
- Q3DSurface *m_graph;
- QLabel *m_textField;
- QPropertyAnimation *m_selectionAnimation;
- QCustom3DItem *m_previouslyAnimatedItem;
- QVector3D m_previousScaling;
-};
-
-#endif
diff --git a/examples/datavisualization/customitems/customitems.pro b/examples/datavisualization/customitems/customitems.pro
deleted file mode 100644
index d366e349..00000000
--- a/examples/datavisualization/customitems/customitems.pro
+++ /dev/null
@@ -1,19 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp \
- customitemgraph.cpp
-
-HEADERS += customitemgraph.h
-
-QT += widgets
-
-RESOURCES += customitems.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/customitems/customitems.qrc b/examples/datavisualization/customitems/customitems.qrc
deleted file mode 100644
index 1337c9fc..00000000
--- a/examples/datavisualization/customitems/customitems.qrc
+++ /dev/null
@@ -1,12 +0,0 @@
-<RCC>
- <qresource prefix="/maps">
- <file>layer_1.png</file>
- <file>layer_2.png</file>
- <file>layer_3.png</file>
- </qresource>
- <qresource prefix="/items">
- <file>refinery.obj</file>
- <file>oilrig.obj</file>
- <file>pipe.obj</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/customitems/doc/images/customitems-example.png b/examples/datavisualization/customitems/doc/images/customitems-example.png
deleted file mode 100644
index 2732638e..00000000
--- a/examples/datavisualization/customitems/doc/images/customitems-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/customitems/doc/src/customitems.qdoc b/examples/datavisualization/customitems/doc/src/customitems.qdoc
deleted file mode 100644
index a8d1dac0..00000000
--- a/examples/datavisualization/customitems/doc/src/customitems.qdoc
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example customitems
- \title Custom Items Example
- \ingroup qtdatavisualization_examples
- \brief Adding custom items to a surface graph.
- \since QtDataVisualization 1.1
-
- The custom items example shows how to add your own custom meshes as items to a graph, and how
- to remove them.
-
- \image customitems-example.png
-
- \include examples-run.qdocinc
-
- \section1 Adding Custom Meshes to the Application
-
- We'll add the meshes in a resource file:
-
- \code
- <RCC>
- ...
- <qresource prefix="/items">
- <file>refinery.obj</file>
- <file>oilrig.obj</file>
- </qresource>
- </RCC>
- \endcode
-
- \section1 Adding Custom Item to a Graph
-
- In this example we do not have specific textures for our meshes, so we'll just create a small
- QImage and fill it with a single color:
-
- \snippet customitems/customitemgraph.cpp 0
-
- Then we'll specify the position for the item in a variable. This way we'll be able to use it
- later for removing the correct item:
-
- \snippet customitems/customitemgraph.cpp 1
-
- Then we'll create a new QCustom3DItem with all the parameters:
-
- \snippet customitems/customitemgraph.cpp 2
-
- And finally we'll just add the item:
-
- \snippet customitems/customitemgraph.cpp 3
-
- \section1 Removing Custom Item from a Graph
-
- We'll just call \c removeCustomItemAt() with the position of the item:
-
- \snippet customitems/customitemgraph.cpp 4
-
- \note Removing a custom item from the graph also deletes it. If you want to preserve the item,
- you need to use \c releaseCustomItem() method instead.
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/customitems/main.cpp b/examples/datavisualization/customitems/main.cpp
deleted file mode 100644
index 2261cf54..00000000
--- a/examples/datavisualization/customitems/main.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "customitemgraph.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- Q3DSurface *graph = new Q3DSurface();
- QWidget *container = QWidget::createWindowContainer(graph);
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- container->setMinimumSize(QSize(800, 600));
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayoutLeft = new QVBoxLayout();
- vLayoutLeft->setAlignment(Qt::AlignTop);
- QVBoxLayout *vLayoutRight = new QVBoxLayout();
- vLayoutRight->setAlignment(Qt::AlignTop);
- hLayout->addLayout(vLayoutLeft);
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayoutRight);
-
- QFont font = QFont("Century Gothic", 14);
- QLabel *label = new QLabel("Show:");
- font.setBold(true);
- label->setFont(font);
- vLayoutLeft->addWidget(label);
-
- font.setBold(false);
- QCheckBox *checkboxOne = new QCheckBox("Oil Rig 1");
- checkboxOne->setChecked(true);
- checkboxOne->setFont(font);
- vLayoutLeft->addWidget(checkboxOne);
-
- QCheckBox *checkboxTwo = new QCheckBox("Oil Rig 2");
- checkboxTwo->setChecked(true);
- checkboxTwo->setFont(font);
- vLayoutLeft->addWidget(checkboxTwo);
-
- QCheckBox *checkboxThree = new QCheckBox("Refinery");
- checkboxThree->setFont(font);
- vLayoutLeft->addWidget(checkboxThree);
-
- QLabel *label2 = new QLabel("Visuals:");
- font.setBold(true);
- label2->setFont(font);
- vLayoutRight->addWidget(label2);
-
- QCheckBox *checkboxOneRight = new QCheckBox("See-Through");
- font.setBold(false);
- checkboxOneRight->setFont(font);
- vLayoutRight->addWidget(checkboxOneRight);
-
- QCheckBox *checkboxTwoRight = new QCheckBox("Highlight Oil");
- checkboxTwoRight->setFont(font);
- vLayoutRight->addWidget(checkboxTwoRight);
-
- QCheckBox *checkboxThreeRight = new QCheckBox("Shadows");
- checkboxThreeRight->setFont(font);
- checkboxThreeRight->setChecked(true);
- vLayoutRight->addWidget(checkboxThreeRight);
-
- QLabel *label3 = new QLabel("Selection:");
- font.setBold(true);
- label3->setFont(font);
- vLayoutRight->addWidget(label3);
-
- QLabel *label4 = new QLabel("Nothing");
- font.setBold(false);
- font.setPointSize(11);
- label4->setFont(font);
- vLayoutRight->addWidget(label4);
-
- widget->setWindowTitle(QStringLiteral("Custom Items Example"));
-
- widget->show();
-
- CustomItemGraph *modifier = new CustomItemGraph(graph, label4);
-
- QObject::connect(checkboxOne, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleItemOne);
- QObject::connect(checkboxTwo, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleItemTwo);
- QObject::connect(checkboxThree, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleItemThree);
-
- QObject::connect(checkboxOneRight, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleSeeThrough);
- QObject::connect(checkboxTwoRight, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleOilHighlight);
- QObject::connect(checkboxThreeRight, &QCheckBox::stateChanged,
- modifier, &CustomItemGraph::toggleShadows);
-
- return app.exec();
-}
diff --git a/examples/datavisualization/customproxy/customproxy.pro b/examples/datavisualization/customproxy/customproxy.pro
deleted file mode 100644
index fd5e0852..00000000
--- a/examples/datavisualization/customproxy/customproxy.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp \
- rainfallgraph.cpp \
- variantdataset.cpp \
- variantbardataproxy.cpp \
- variantbardatamapping.cpp \
-
-HEADERS += \
- rainfallgraph.h \
- variantdataset.h \
- variantbardataproxy.h \
- variantbardatamapping.h
-
-RESOURCES += customproxy.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- data/raindata.txt
diff --git a/examples/datavisualization/customproxy/customproxy.qrc b/examples/datavisualization/customproxy/customproxy.qrc
deleted file mode 100644
index 53cd4915..00000000
--- a/examples/datavisualization/customproxy/customproxy.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>data/raindata.txt</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/customproxy/data/raindata.txt b/examples/datavisualization/customproxy/data/raindata.txt
deleted file mode 100644
index 531d66be..00000000
--- a/examples/datavisualization/customproxy/data/raindata.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-# Rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo)
-# Format: year, month, rainfall
-2000,1, 72,
-2000,2, 47,
-2000,3, 37,
-2000,4, 79,
-2000,5, 42,
-2000,6, 73,
-2000,7, 94,
-2000,8, 37,
-2000,9, 17,
-2000,10,69,
-2000,11,42,
-2000,12,42,
-2001,1, 25,
-2001,2, 47,
-2001,3, 20,
-2001,4, 70,
-2001,5, 27,
-2001,6, 40,
-2001,7, 123,
-2001,8, 39,
-2001,9, 66,
-2001,10,55,
-2001,11,29,
-2001,12,12,
-2002,1, 24,
-2002,2, 45,
-2002,3, 27,
-2002,4, 30,
-2002,5, 16,
-2002,6, 98,
-2002,7, 122,
-2002,8, 20,
-2002,9, 50,
-2002,10,24,
-2002,11,22,
-2002,12,12,
-2003,1, 43,
-2003,2, 17,
-2003,3, 26,
-2003,4, 22,
-2003,5, 60,
-2003,6, 14,
-2003,7, 86,
-2003,8, 77,
-2003,9, 69,
-2003,10,49,
-2003,11,23,
-2003,12,44,
-2004,1, 15,
-2004,2, 19,
-2004,3, 10,
-2004,4, 11,
-2004,5, 41,
-2004,6, 29,
-2004,7, 49,
-2004,8, 72,
-2004,9, 50,
-2004,10,18,
-2004,11,19,
-2004,12,40,
-2005,1, 60,
-2005,2, 24,
-2005,3, 12,
-2005,4, 50,
-2005,5, 88,
-2005,6, 32,
-2005,7, 76,
-2005,8, 55,
-2005,9, 92,
-2005,10,35,
-2005,11,105,
-2005,12,59,
-2006,1, 27,
-2006,2, 18,
-2006,3, 17,
-2006,4, 26,
-2006,5, 24,
-2006,6, 18,
-2006,7, 35,
-2006,8, 28,
-2006,9, 80,
-2006,10,52,
-2006,11,43,
-2006,12,44,
-2007,1, 41,
-2007,2, 21,
-2007,3, 30,
-2007,4, 20,
-2007,5, 53,
-2007,6, 29,
-2007,7, 139,
-2007,8, 52,
-2007,9, 51,
-2007,10,24,
-2007,11,47,
-2007,12,33,
-2008,1, 67,
-2008,2, 19,
-2008,3, 30,
-2008,4, 31,
-2008,5, 29,
-2008,6, 79,
-2008,7, 75,
-2008,8, 99,
-2008,9, 34,
-2008,10,52,
-2008,11,60,
-2008,12,20,
-2009,1, 9,
-2009,2, 22,
-2009,3, 11,
-2009,4, 10,
-2009,5, 69,
-2009,6, 30,
-2009,7, 78,
-2009,8, 93,
-2009,9, 70,
-2009,10,32,
-2009,11,56,
-2009,12,23,
-2010,1, 12,
-2010,2, 28,
-2010,3, 55,
-2010,4, 20,
-2010,5, 65,
-2010,6, 26,
-2010,7, 134,
-2010,8, 57,
-2010,9, 51,
-2010,10,53,
-2010,11,8,
-2010,12,9,
-2011,1, 34,
-2011,2, 20,
-2011,3, 30,
-2011,4, 31,
-2011,5, 42,
-2011,6, 78,
-2011,7, 85,
-2011,8, 33,
-2011,9, 42,
-2011,10,87,
-2011,11,41,
-2011,12,72,
-2012,1, 32,
-2012,2, 42,
-2012,3, 30,
-2012,4, 50,
-2012,5, 30,
-2012,6, 70,
-2012,7, 52,
-2012,8, 20,
-2012,9, 99,
-2012,10,70,
-2012,11,69,
-2012,12,49
diff --git a/examples/datavisualization/customproxy/doc/images/customproxy-example.png b/examples/datavisualization/customproxy/doc/images/customproxy-example.png
deleted file mode 100644
index 4f82943a..00000000
--- a/examples/datavisualization/customproxy/doc/images/customproxy-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/customproxy/doc/src/customproxy.qdoc b/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
deleted file mode 100644
index 0952128e..00000000
--- a/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
+++ /dev/null
@@ -1,122 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example customproxy
- \title Custom Proxy Example
- \ingroup qtdatavisualization_examples
- \brief Using Q3DBars with a custom proxy.
-
- The custom proxy example shows how to create a custom proxy to use with Q3DBars.
-
- \image customproxy-example.png
-
- The interesting thing about custom proxy example is the custom dataset and the corresponding
- proxy usage, so we concentrate on that and skip explaining the basic Q3DBars functionality
- - for that see \l{Bars Example}.
-
- This example defines a simple flexible data set \c VariantDataSet where each data item is a
- a variant list. Each item can have multiple different values, identified by their index in
- the list. In this example, the data set is storing monthly rainfall data, where the value in
- index zero is the year, the value in index one is the month, and the value in index two is
- the amount of rainfall in that month.
-
- The custom proxy we provide here is similar to item model based proxies provided by Qt
- Data Visualization in that it requires a mapping to interpret the data.
-
- \include examples-run.qdocinc
-
- \section1 VariantDataSet
-
- \c VariantDataSet class provides a simple API:
-
- \snippet customproxy/variantdataset.h 1
- \dots 0
- \codeline
- \snippet customproxy/variantdataset.h 0
-
- As you can see, the data items are simply QVariantList objects, and the data can be added either
- singly or in lists. The only additional functionality provided is clearing the data set and querying
- for a reference to the data contained in the set. Signals are emitted when data is added or the set
- is cleared.
-
- \section1 VariantBarDataProxy
-
- \c VariantBarDataProxy is a subclass of QBarDataProxy and provides a simple API of just getters
- and setters for the data set and the mapping:
-
- \snippet customproxy/variantbardataproxy.h 0
- \dots 0
- \codeline
- \snippet customproxy/variantbardataproxy.h 1
-
- On the implementation side, the proxy listens for the changes in the data set and the mapping,
- and resolves the data set if any changes are detected. It is not particularly efficient
- implementation in that any change will cause re-resolving of the entire data set, but that is not
- an issue for this example. The interesting part is the \c resolveDataSet() method:
-
- \snippet customproxy/variantbardataproxy.cpp 0
-
- In \c resolveDataSet() method we sort the variant data values into rows and columns based on the
- mapping. This is very similar to how QItemModelBarDataProxy handles mapping, except we use
- list indexes instead of item model roles here. Once the values are sorted, we generate \c QBarDataArray
- out of them, and call \c resetArray() method on the parent class.
-
- \section1 VariantBarDataMapping
-
- \c VariantBarDataMapping stores the mapping information between \c VariantDataSet data item indexes
- and rows, columns, and values of \c QBarDataArray. It also contains the lists of rows and columns to
- be included in the resolved data:
-
- \snippet customproxy/variantbardatamapping.h 0
- \dots 0
- \codeline
- \snippet customproxy/variantbardatamapping.h 1
- \dots 0
- \codeline
- \snippet customproxy/variantbardatamapping.h 2
- \dots 0
- \codeline
- \snippet customproxy/variantbardatamapping.h 3
-
- The primary way to use a \c VariantBarDataMapping object is to give the mappings already at the
- constructor, though they can be set later individually or all together with the \c remap() method.
- A signal is emitted if mapping changes. It is basically a simplified version of the mapping
- functionality of QItemModelBarDataProxy adapted to work with variant lists instead of item models.
-
- \section1 RainfallGraph
-
- \c RainfallGraph class handles the setup of the graph. The interesting part is the \c addDataSet()
- method:
-
- \snippet customproxy/rainfallgraph.cpp 0
-
- The bulk of that method is used for populating the variant data set. Once the set is populated,
- visualizing the data is trivial with the help of our custom proxy:
-
- \snippet customproxy/rainfallgraph.cpp 1
-*/
diff --git a/examples/datavisualization/customproxy/main.cpp b/examples/datavisualization/customproxy/main.cpp
deleted file mode 100644
index 8c0d9346..00000000
--- a/examples/datavisualization/customproxy/main.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "rainfallgraph.h"
-#include <QtGui/QGuiApplication>
-
-using namespace QtDataVisualization;
-
-int main(int argc, char **argv)
-{
- QGuiApplication app(argc, argv);
-
- Q3DBars *rainfall = new Q3DBars;
-
- if (!rainfall->hasContext()) {
- qWarning() << QStringLiteral("Couldn't initialize the OpenGL context.") ;
- return -1;
- }
-
- rainfall->setFlags(rainfall->flags() ^ Qt::FramelessWindowHint);
- rainfall->resize(1000, 800);
- rainfall->setPosition(QPoint(10, 30));
- rainfall->show();
-
- RainfallGraph rainfallgraph(rainfall);
- rainfallgraph.start();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/customproxy/rainfallgraph.cpp b/examples/datavisualization/customproxy/rainfallgraph.cpp
deleted file mode 100644
index 73cb5bee..00000000
--- a/examples/datavisualization/customproxy/rainfallgraph.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "rainfallgraph.h"
-#include <QtDataVisualization/qcategory3daxis.h>
-#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/qbar3dseries.h>
-#include <QtDataVisualization/q3dtheme.h>
-#include <QtGui/QGuiApplication>
-#include <QtGui/QFont>
-#include <QtCore/QDebug>
-#include <QtCore/QTextStream>
-#include <QtCore/QFile>
-
-using namespace QtDataVisualization;
-
-RainfallGraph::RainfallGraph(Q3DBars *rainfall)
- : m_graph(rainfall)
-{
- // In data file the months are in numeric format, so create custom list
- for (int i = 1; i <= 12; i++)
- m_numericMonths << QString::number(i);
-
- m_columnCount = m_numericMonths.size();
-
- m_proxy = new VariantBarDataProxy;
- QBar3DSeries *series = new QBar3DSeries(m_proxy);
- m_graph->addSeries(series);
-
- updateYearsList(2000, 2012);
-
- // Set up bar specifications; make the bars as wide as they are deep,
- // and add a small space between the bars
- m_graph->setBarThickness(1.0f);
- m_graph->setBarSpacing(QSizeF(1.1, 1.1));
-
- // Set axis labels and titles
- QStringList months;
- months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
- m_graph->rowAxis()->setTitle("Year");
- m_graph->columnAxis()->setTitle("Month");
- m_graph->valueAxis()->setTitle("rainfall");
- m_graph->valueAxis()->setLabelFormat("%d mm");
- m_graph->valueAxis()->setSegmentCount(5);
- m_graph->rowAxis()->setLabels(m_years);
- m_graph->columnAxis()->setLabels(months);
-
- // Set bar type to cylinder
- series->setMesh(QAbstract3DSeries::MeshCylinder);
-
- // Set shadows to medium
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
-
- // Set selection mode to bar and column
- m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndColumn | QAbstract3DGraph::SelectionSlice);
-
- // Set theme
- m_graph->activeTheme()->setType(Q3DTheme::ThemeArmyBlue);
-
- // Override font in theme
- m_graph->activeTheme()->setFont(QFont("Century Gothic", 30));
-
- // Override label background for theme
- m_graph->activeTheme()->setLabelBackgroundEnabled(false);
-
- // Set camera position and zoom
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricRightHigh);
-
- // Set window title
- m_graph->setTitle(QStringLiteral("Monthly rainfall in Northern Finland"));
-
- // Set reflections on
- m_graph->setReflection(true);
-}
-
-RainfallGraph::~RainfallGraph()
-{
- delete m_mapping;
- delete m_dataSet;
- delete m_graph;
-}
-
-void RainfallGraph::start()
-{
- addDataSet();
-}
-
-void RainfallGraph::updateYearsList(int start, int end)
-{
- m_years.clear();
- for (int i = start; i <= end; i++)
- m_years << QString::number(i);
-
- m_rowCount = m_years.size();
-}
-
-//! [0]
-void RainfallGraph::addDataSet()
-{
- // Create a new variant data set and data item list
- m_dataSet = new VariantDataSet;
- VariantDataItemList *itemList = new VariantDataItemList;
-
- // Read data from a data file into the data item list
- QTextStream stream;
- QFile dataFile(":/data/raindata.txt");
- if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- stream.setDevice(&dataFile);
- while (!stream.atEnd()) {
- QString line = stream.readLine();
- if (line.startsWith("#")) // Ignore comments
- continue;
- QStringList strList = line.split(",", Qt::SkipEmptyParts);
- // Each line has three data items: Year, month, and rainfall value
- if (strList.size() < 3) {
- qWarning() << "Invalid row read from data:" << line;
- continue;
- }
- // Store year and month as strings, and rainfall value as double
- // into a variant data item and add the item to the item list.
- VariantDataItem *newItem = new VariantDataItem;
- for (int i = 0; i < 2; i++)
- newItem->append(strList.at(i).trimmed());
- newItem->append(strList.at(2).trimmed().toDouble());
- itemList->append(newItem);
- }
- } else {
- qWarning() << "Unable to open data file:" << dataFile.fileName();
- }
-
- //! [1]
- // Add items to the data set and set it to the proxy
- m_dataSet->addItems(itemList);
- m_proxy->setDataSet(m_dataSet);
-
- // Create new mapping for the data and set it to the proxy
- m_mapping = new VariantBarDataMapping(0, 1, 2, m_years, m_numericMonths);
- m_proxy->setMapping(m_mapping);
- //! [1]
-}
-//! [0]
diff --git a/examples/datavisualization/customproxy/rainfallgraph.h b/examples/datavisualization/customproxy/rainfallgraph.h
deleted file mode 100644
index 425dcef6..00000000
--- a/examples/datavisualization/customproxy/rainfallgraph.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef RAINFALLGRAPH_H
-#define RAINFALLGRAPH_H
-
-#include "variantbardataproxy.h"
-#include <QtDataVisualization/q3dbars.h>
-
-using namespace QtDataVisualization;
-
-class RainfallGraph : public QObject
-{
- Q_OBJECT
-public:
- explicit RainfallGraph(Q3DBars *rainfall);
- ~RainfallGraph();
-
- void addDataSet();
- void start();
-
-private:
-
- void updateYearsList(int start, int end);
- Q3DBars *m_graph;
- int m_columnCount;
- int m_rowCount;
- QStringList m_years;
- QStringList m_numericMonths;
- VariantBarDataProxy *m_proxy;
- VariantBarDataMapping *m_mapping;
- VariantDataSet *m_dataSet;
-};
-
-
-#endif
diff --git a/examples/datavisualization/customproxy/variantbardatamapping.cpp b/examples/datavisualization/customproxy/variantbardatamapping.cpp
deleted file mode 100644
index fda2f67e..00000000
--- a/examples/datavisualization/customproxy/variantbardatamapping.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "variantbardatamapping.h"
-
-VariantBarDataMapping::VariantBarDataMapping()
- : QObject(0),
- m_rowIndex(0),
- m_columnIndex(1),
- m_valueIndex(2)
-{
-}
-
-VariantBarDataMapping::VariantBarDataMapping(const VariantBarDataMapping &other)
- : QObject(0),
- m_rowIndex(0),
- m_columnIndex(1),
- m_valueIndex(2)
-{
- operator=(other);
-}
-
-VariantBarDataMapping::VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
- const QStringList &rowCategories,
- const QStringList &columnCategories)
- : QObject(0),
- m_rowIndex(0),
- m_columnIndex(1),
- m_valueIndex(2)
-{
- m_rowIndex = rowIndex;
- m_columnIndex = columnIndex;
- m_valueIndex = valueIndex;
- m_rowCategories = rowCategories;
- m_columnCategories = columnCategories;
-}
-
-VariantBarDataMapping::~VariantBarDataMapping()
-{
-}
-
-VariantBarDataMapping &VariantBarDataMapping::operator=(const VariantBarDataMapping &other)
-{
- m_rowIndex = other.m_rowIndex;
- m_columnIndex = other.m_columnIndex;
- m_valueIndex = other.m_valueIndex;
- m_rowCategories = other.m_rowCategories;
- m_columnCategories = other.m_columnCategories;
-
- return *this;
-}
-
-void VariantBarDataMapping::setRowIndex(int index)
-{
- m_rowIndex = index;
- emit mappingChanged();
-}
-
-int VariantBarDataMapping::rowIndex() const
-{
- return m_rowIndex;
-}
-
-void VariantBarDataMapping::setColumnIndex(int index)
-{
- m_columnIndex = index;
- emit mappingChanged();
-}
-
-int VariantBarDataMapping::columnIndex() const
-{
- return m_columnIndex;
-}
-
-void VariantBarDataMapping::setValueIndex(int index)
-{
- m_valueIndex = index;
- emit mappingChanged();
-}
-
-int VariantBarDataMapping::valueIndex() const
-{
- return m_valueIndex;
-}
-
-void VariantBarDataMapping::setRowCategories(const QStringList &categories)
-{
- m_rowCategories = categories;
- emit mappingChanged();
-}
-
-const QStringList &VariantBarDataMapping::rowCategories() const
-{
- return m_rowCategories;
-}
-
-void VariantBarDataMapping::setColumnCategories(const QStringList &categories)
-{
- m_columnCategories = categories;
- emit mappingChanged();
-}
-
-const QStringList &VariantBarDataMapping::columnCategories() const
-{
- return m_columnCategories;
-}
-
-void VariantBarDataMapping::remap(int rowIndex, int columnIndex, int valueIndex,
- const QStringList &rowCategories,
- const QStringList &columnCategories)
-{
- m_rowIndex = rowIndex;
- m_columnIndex = columnIndex;
- m_valueIndex = valueIndex;
- m_rowCategories = rowCategories;
- m_columnCategories = columnCategories;
- emit mappingChanged();
-}
diff --git a/examples/datavisualization/customproxy/variantbardatamapping.h b/examples/datavisualization/customproxy/variantbardatamapping.h
deleted file mode 100644
index 2f1d5a3d..00000000
--- a/examples/datavisualization/customproxy/variantbardatamapping.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef VARIANTBARDATAMAPPING_H
-#define VARIANTBARDATAMAPPING_H
-
-#include <QtCore/QObject>
-#include <QtCore/QStringList>
-
-class VariantBarDataMapping : public QObject
-{
- Q_OBJECT
- //! [0]
- Q_PROPERTY(int rowIndex READ rowIndex WRITE setRowIndex)
- Q_PROPERTY(int columnIndex READ columnIndex WRITE setColumnIndex)
- Q_PROPERTY(int valueIndex READ valueIndex WRITE setValueIndex)
- Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories)
- Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories)
- //! [0]
-public:
- explicit VariantBarDataMapping();
- VariantBarDataMapping(const VariantBarDataMapping &other);
- //! [1]
- VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
- const QStringList &rowCategories,
- const QStringList &columnCategories);
- //! [1]
- virtual ~VariantBarDataMapping();
-
- VariantBarDataMapping &operator=(const VariantBarDataMapping &other);
-
- void setRowIndex(int index);
- int rowIndex() const;
- void setColumnIndex(int index);
- int columnIndex() const;
- void setValueIndex(int index);
- int valueIndex() const;
-
- void setRowCategories(const QStringList &categories);
- const QStringList &rowCategories() const;
- void setColumnCategories(const QStringList &categories);
- const QStringList &columnCategories() const;
-
- //! [2]
- void remap(int rowIndex, int columnIndex, int valueIndex,
- const QStringList &rowCategories,
- const QStringList &columnCategories);
- //! [2]
-Q_SIGNALS:
- //! [3]
- void mappingChanged();
- //! [3]
-
-private:
- // Indexes of the mapped items in the VariantDataItem
- int m_rowIndex;
- int m_columnIndex;
- int m_valueIndex;
-
- // For row/column items, sort items into these categories. Other categories are ignored.
- QStringList m_rowCategories;
- QStringList m_columnCategories;
-};
-
-#endif
diff --git a/examples/datavisualization/customproxy/variantbardataproxy.h b/examples/datavisualization/customproxy/variantbardataproxy.h
deleted file mode 100644
index 762b5afc..00000000
--- a/examples/datavisualization/customproxy/variantbardataproxy.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef VARIANTBARDATAPROXY_H
-#define VARIANTBARDATAPROXY_H
-
-#include "qbardataproxy.h"
-#include "variantdataset.h"
-#include "variantbardatamapping.h"
-#include <QtCore/QStringList>
-#include <QtCore/QMap>
-#include <QtCore/QPointer>
-
-using namespace QtDataVisualization;
-
-//! [0]
-class VariantBarDataProxy : public QBarDataProxy
-//! [0]
-{
- Q_OBJECT
-
-public:
- explicit VariantBarDataProxy();
- explicit VariantBarDataProxy(VariantDataSet *newSet, VariantBarDataMapping *mapping);
- virtual ~VariantBarDataProxy();
-
- //! [1]
- // Doesn't gain ownership of the dataset, but does connect to it to listen for data changes.
- void setDataSet(VariantDataSet *newSet);
- VariantDataSet *dataSet();
-
- // Map key (row, column, value) to value index in data item (VariantItem).
- // Doesn't gain ownership of mapping, but does connect to it to listen for mapping changes.
- // Modifying mapping that is set to proxy will trigger dataset re-resolving.
- void setMapping(VariantBarDataMapping *mapping);
- VariantBarDataMapping *mapping();
- //! [1]
-
-public Q_SLOTS:
- void handleItemsAdded(int index, int count);
- void handleDataCleared();
- void handleMappingChanged();
-
-private:
- void resolveDataSet();
-
- QPointer<VariantDataSet> m_dataSet;
- QPointer<VariantBarDataMapping> m_mapping;
-
- Q_DISABLE_COPY(VariantBarDataProxy)
-};
-
-#endif
diff --git a/examples/datavisualization/customproxy/variantdataset.cpp b/examples/datavisualization/customproxy/variantdataset.cpp
deleted file mode 100644
index b748f82b..00000000
--- a/examples/datavisualization/customproxy/variantdataset.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "variantdataset.h"
-
-VariantDataSet::VariantDataSet()
- : QObject(0)
-{
-}
-
-VariantDataSet::~VariantDataSet()
-{
- clear();
-}
-
-void VariantDataSet::clear()
-{
- foreach (VariantDataItem *item, m_variantData) {
- item->clear();
- delete item;
- }
- m_variantData.clear();
- emit dataCleared();
-}
-
-int VariantDataSet::addItem(VariantDataItem *item)
-{
- m_variantData.append(item);
- int addIndex = m_variantData.size();
-
- emit itemsAdded(addIndex, 1);
- return addIndex;
-}
-
-int VariantDataSet::addItems(VariantDataItemList *itemList)
-{
- int newCount = itemList->size();
- int addIndex = m_variantData.size();
- m_variantData.append(*itemList);
- delete itemList;
- emit itemsAdded(addIndex, newCount);
- return addIndex;
-}
-
-const VariantDataItemList &VariantDataSet::itemList() const
-{
- return m_variantData;
-}
diff --git a/examples/datavisualization/customproxy/variantdataset.h b/examples/datavisualization/customproxy/variantdataset.h
deleted file mode 100644
index 3e608c39..00000000
--- a/examples/datavisualization/customproxy/variantdataset.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef VARIANTDATASET_H
-#define VARIANTDATASET_H
-
-#include <QtCore/QScopedPointer>
-#include <QtCore/QVariantList>
-
-//! [1]
-typedef QVariantList VariantDataItem;
-typedef QList<VariantDataItem *> VariantDataItemList;
-//! [1]
-
-class VariantDataSet : public QObject
-{
- Q_OBJECT
-
-public:
- explicit VariantDataSet();
- ~VariantDataSet();
-
- //! [0]
- void clear();
-
- int addItem(VariantDataItem *item);
- int addItems(VariantDataItemList *itemList);
-
- const VariantDataItemList &itemList() const;
-
-Q_SIGNALS:
- void itemsAdded(int index, int count);
- void dataCleared();
- //! [0]
-
-private:
- VariantDataItemList m_variantData;
-
- Q_DISABLE_COPY(VariantDataSet)
-};
-
-#endif
diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro
index f9fce6af..ff9af2c5 100644
--- a/examples/datavisualization/datavisualization.pro
+++ b/examples/datavisualization/datavisualization.pro
@@ -2,30 +2,12 @@ TEMPLATE = subdirs
qtHaveModule(quick) {
SUBDIRS += qmlbars \
qmlscatter \
- qmlsurface \
- qmlcustominput \
- qmllegend \
- qmlmultigraph \
- qmloscilloscope \
- qmlsurfacelayers \
- qmlaxisformatter \
- qmlaxisdrag \
- qmlspectrogram
+ qmlaxishandling \
+ qmlsurfacegallery
}
!android:!ios:!winrt {
- SUBDIRS += bars \
- custominput \
- customproxy \
- itemmodel \
- scatter \
- surface \
- rotations \
- draggableaxes \
- customitems \
- texturesurface \
+ SUBDIRS += graphgallery \
volumetric
-
- qtHaveModule(multimedia): SUBDIRS += audiolevels
}
diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.h b/examples/datavisualization/draggableaxes/axesinputhandler.h
deleted file mode 100644
index 8d43c478..00000000
--- a/examples/datavisualization/draggableaxes/axesinputhandler.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef AXESINPUTHANDLER_H
-#define AXESINPUTHANDLER_H
-
-#include <QtDataVisualization/Q3DInputHandler>
-#include <QtDataVisualization/QAbstract3DGraph>
-#include <QtDataVisualization/QValue3DAxis>
-
-using namespace QtDataVisualization;
-
-//! [0]
-class AxesInputHandler : public Q3DInputHandler
-//! [0]
-{
- Q_OBJECT
-
- enum InputState {
- StateNormal = 0,
- StateDraggingX,
- StateDraggingZ,
- StateDraggingY
- };
-
-public:
- explicit AxesInputHandler(QAbstract3DGraph *graph, QObject *parent = 0);
-
- inline void setAxes(QValue3DAxis *axisX, QValue3DAxis *axisZ, QValue3DAxis *axisY) {
- m_axisX = axisX;
- m_axisZ = axisZ;
- m_axisY = axisY;
- }
-
- //! [1]
- inline void setDragSpeedModifier(float modifier) { m_speedModifier = modifier; }
- //! [1]
-
- virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
-
-private:
- void handleElementSelected(QAbstract3DGraph::ElementType type);
- void handleAxisDragging();
-
-private:
- bool m_mousePressed;
- InputState m_state;
- QValue3DAxis *m_axisX;
- QValue3DAxis *m_axisZ;
- QValue3DAxis *m_axisY;
- float m_speedModifier;
-};
-
-#endif
diff --git a/examples/datavisualization/draggableaxes/data.cpp b/examples/datavisualization/draggableaxes/data.cpp
deleted file mode 100644
index f7f4a31e..00000000
--- a/examples/datavisualization/draggableaxes/data.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "data.h"
-
-#include <QtCore/QRandomGenerator>
-#include <QtDataVisualization/QScatterDataProxy>
-#include <QtDataVisualization/Q3DScene>
-#include <QtDataVisualization/Q3DCamera>
-#include <QtDataVisualization/QScatter3DSeries>
-#include <QtDataVisualization/Q3DTheme>
-
-using namespace QtDataVisualization;
-
-const int itemCount = 500;
-
-Data::Data(Q3DScatter *scatter)
- : m_graph(scatter),
- //! [1]
- m_inputHandler(new AxesInputHandler(scatter)),
- //! [1]
- m_autoAdjust(false)
-{
- m_graph->activeTheme()->setType(Q3DTheme::ThemeEbony);
- m_graph->activeTheme()->setLabelBorderEnabled(true);
- m_graph->activeTheme()->setLabelBackgroundColor(QColor(QRgb(0x151550)));
- m_graph->activeTheme()->setLabelTextColor(Qt::lightGray);
- m_graph->activeTheme()->setFont(QFont("Arial Black", 30));
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricRight);
-
- m_graph->axisX()->setRange(-20.0f, 20.0f);
- m_graph->axisY()->setRange(-10.0f, 10.0f);
- m_graph->axisZ()->setRange(-20.0f, 20.0f);
-
- //! [0]
- // Give ownership of the handler to the graph and make it the active handler
- m_graph->setActiveInputHandler(m_inputHandler);
- //! [0]
-
- //! [2]
- // Give our axes to the input handler
- m_inputHandler->setAxes(m_graph->axisX(), m_graph->axisZ(), m_graph->axisY());
- //! [2]
-
- addData();
-}
-
-Data::~Data()
-{
- delete m_graph;
-}
-
-void Data::toggleRanges()
-{
- if (!m_autoAdjust) {
- m_graph->axisX()->setAutoAdjustRange(true);
- m_graph->axisZ()->setAutoAdjustRange(true);
- m_graph->axisY()->setAutoAdjustRange(true);
- m_inputHandler->setDragSpeedModifier(1.5f);
- m_autoAdjust = true;
- } else {
- m_graph->axisX()->setRange(-20.0f, 20.0f);
- m_graph->axisY()->setRange(-10.0f, 10.0f);
- m_graph->axisZ()->setRange(-20.0f, 20.0f);
- m_inputHandler->setDragSpeedModifier(15.0f);
- m_autoAdjust = false;
- }
-}
-
-void Data::addData()
-{
- QScatter3DSeries *series = new QScatter3DSeries;
- series->setMesh(QAbstract3DSeries::MeshCube);
- series->setMeshSmooth(true);
- m_graph->addSeries(series);
-
- QScatter3DSeries *series2 = new QScatter3DSeries;
- series2->setMesh(QAbstract3DSeries::MeshMinimal);
- series2->setMeshSmooth(true);
- m_graph->addSeries(series2);
-
- QScatter3DSeries *series3 = new QScatter3DSeries;
- series3->setMesh(QAbstract3DSeries::MeshSphere);
- series3->setMeshSmooth(true);
- m_graph->addSeries(series3);
-
- QScatter3DSeries *series4 = new QScatter3DSeries;
- series4->setMesh(QAbstract3DSeries::MeshBevelCube);
- series4->setMeshSmooth(true);
- m_graph->addSeries(series4);
-
- QScatter3DSeries *series5 = new QScatter3DSeries;
- series5->setMesh(QAbstract3DSeries::MeshSphere);
- m_graph->addSeries(series5);
-
- QScatterDataArray *dataArray = new QScatterDataArray;
- dataArray->resize(itemCount);
- QScatterDataItem *ptrToDataArray = &dataArray->first();
- for (int i = 0; i < itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
- QScatterDataArray *dataArray2 = new QScatterDataArray;
- dataArray2->resize(itemCount);
- ptrToDataArray = &dataArray2->first();
- for (int i = 0; i < itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
- QScatterDataArray *dataArray3 = new QScatterDataArray;
- dataArray3->resize(itemCount);
- ptrToDataArray = &dataArray3->first();
- for (int i = 0; i < itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
- QScatterDataArray *dataArray4 = new QScatterDataArray;
- dataArray4->resize(itemCount);
- ptrToDataArray = &dataArray4->first();
- for (int i = 0; i < itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
- QScatterDataArray *dataArray5 = new QScatterDataArray;
- dataArray5->resize(itemCount);
- ptrToDataArray = &dataArray5->first();
- for (int i = 0; i < itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
-
- m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);
- m_graph->seriesList().at(1)->dataProxy()->resetArray(dataArray2);
- m_graph->seriesList().at(2)->dataProxy()->resetArray(dataArray3);
- m_graph->seriesList().at(3)->dataProxy()->resetArray(dataArray4);
- m_graph->seriesList().at(4)->dataProxy()->resetArray(dataArray5);
-}
-
-QVector3D Data::randVector()
-{
- return QVector3D(
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f,
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f,
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f);
-}
diff --git a/examples/datavisualization/draggableaxes/data.h b/examples/datavisualization/draggableaxes/data.h
deleted file mode 100644
index 3fb8969e..00000000
--- a/examples/datavisualization/draggableaxes/data.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef DATA_H
-#define DATA_H
-
-#include "axesinputhandler.h"
-
-#include <QtDataVisualization/q3dscatter.h>
-#include <QtGui/QVector3D>
-
-using namespace QtDataVisualization;
-
-class Data : public QObject
-{
- Q_OBJECT
-public:
- explicit Data(Q3DScatter *scatter);
- ~Data();
-
- void toggleRanges();
-
-private:
- void addData();
- QVector3D randVector();
-
-private:
- Q3DScatter *m_graph;
- AxesInputHandler *m_inputHandler;
- bool m_autoAdjust;
-};
-
-#endif
diff --git a/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png b/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png
deleted file mode 100644
index 018694b5..00000000
--- a/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc
deleted file mode 100644
index d5b74ae7..00000000
--- a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc
+++ /dev/null
@@ -1,133 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example draggableaxes
- \title Axis Range Dragging With Labels Example
- \ingroup qtdatavisualization_examples
- \brief Implementing a custom input handler to support axis dragging.
- \since QtDataVisualization 1.1
-
- The Axis Range Dragging example shows how to customize the 3D graph controls in a widget
- application to allow changing axis ranges by clicking on an axis label and dragging. This is
- done by implementing a custom input handler to react to selection signals emitted from the
- graph.
-
- \image draggableaxes-example.png
-
- \include examples-run.qdocinc
-
- \section1 Replacing Default Input Handling
-
- The default input handling mechanism is replaced by setting the active input handler of
- Q3DScatter to \c AxesInputHandler that implements the custom behavior:
-
- \snippet draggableaxes/data.cpp 0
-
- \c m_inputHandler was initialized in the constructor:
-
- \snippet draggableaxes/data.cpp 1
-
- We will also need the pointers to the axes, so we will pass them to our input handler too:
-
- \snippet draggableaxes/data.cpp 2
-
- \section1 Extending Mouse Event Handling
-
- First of all, we inherited our input handler from Q3DInputHandler instead of
- QAbstract3DInputHandler. The reason for doing this is to keep all the functionality of the
- default input handling, and to add our own functionality on top of it:
-
- \snippet draggableaxes/axesinputhandler.h 0
-
- We start extending the default functionality by re-implementing some of the mouse events.
- Let's start with \c {mousePressEvent}. We'll just add button pressed flag for left mouse button
- into it, and keep the rest of the default functionality:
-
- \snippet draggableaxes/axesinputhandler.cpp 0
-
- We'll need to modify \c mouseReleaseEvent too to clear the flag and reset the internal state:
-
- \snippet draggableaxes/axesinputhandler.cpp 1
-
- Then we'll modify \c {mouseMoveEvent}. Here we check if the \c m_mousePressed is \c true and
- our internal state is something other than \c StateNormal. If so, we'll set the input positions
- for mouse move distance calculations and call the axis dragging function (see
- \l {Implementing axis dragging} for details):
-
- \snippet draggableaxes/axesinputhandler.cpp 2
-
- We don't need to change the functionality of mouse wheel, so we will not re-implement that.
-
- \section1 Implementing Axis Dragging
-
- First we need to start listening to the selection signal from the graph. We do that in the
- constructor, and connect it to \c handleElementSelected method:
-
- \snippet draggableaxes/axesinputhandler.cpp 3
-
- In \c handleElementSelected we check the type of the selection and set our internal state based on
- it:
-
- \snippet draggableaxes/axesinputhandler.cpp 4
-
- The actual dragging logic is implemented in \c handleAxisDragging method, which we call from
- \c mouseMoveEvent in case the required conditions are met:
-
- \snippet draggableaxes/axesinputhandler.cpp 5
-
- In \c handleAxisDragging we first get the scene orientation from our active camera:
-
- \snippet draggableaxes/axesinputhandler.cpp 6
-
- Then we calculate the modifiers to mouse move direction based on the orientation:
-
- \snippet draggableaxes/axesinputhandler.cpp 7
-
- After that, we calculate the mouse movement, and modify it based on the y rotation of the
- camera:
-
- \snippet draggableaxes/axesinputhandler.cpp 8
-
- And finally apply the moved distance to the correct axis:
-
- \snippet draggableaxes/axesinputhandler.cpp 9
-
- We also have a function for setting the dragging speed:
-
- \snippet draggableaxes/axesinputhandler.h 1
-
- This is needed, as the mouse movement distance is absolute (in screen coordinates) and we
- need to adjust it to the axis range. The larger the value, the slower the dragging will be.
- Note that on this example we do not take scene zoom level into account when determining the
- drag speed, so you'll notice changes in the range adjustment as you change the zoom level.
-
- The modifier could be adjusted automatically based on the axis range and camera zoom level, but
- we'll leave implementing that as an excercise for the reader.
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/draggableaxes/draggableaxes.pro b/examples/datavisualization/draggableaxes/draggableaxes.pro
deleted file mode 100644
index 2f21aee6..00000000
--- a/examples/datavisualization/draggableaxes/draggableaxes.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp \
- data.cpp \
- axesinputhandler.cpp
-HEADERS += data.h \
- axesinputhandler.h
-
-QT += widgets
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/draggableaxes/main.cpp b/examples/datavisualization/draggableaxes/main.cpp
deleted file mode 100644
index f2d2c703..00000000
--- a/examples/datavisualization/draggableaxes/main.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "data.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QCommandLinkButton>
-#include <QtWidgets/QMessageBox>
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- Q3DScatter *graph = new Q3DScatter();
- QWidget *container = QWidget::createWindowContainer(graph);
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- container->setMinimumSize(800, 600);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
-
- QCommandLinkButton *rangeButton = new QCommandLinkButton(widget);
- rangeButton->setText(QStringLiteral("Toggle axis ranges"));
- rangeButton->setDescription(QStringLiteral("Switch between automatic axis ranges and preset ranges"));
- rangeButton->setIconSize(QSize(0, 0));
-
- vLayout->addWidget(rangeButton, 1, Qt::AlignTop);
-
- widget->setWindowTitle(QStringLiteral("Input Handling for Axes"));
-
- Data *graphData = new Data(graph);
-
- QObject::connect(rangeButton, &QCommandLinkButton::clicked, graphData, &Data::toggleRanges);
-
- widget->show();
- return app.exec();
-}
diff --git a/examples/datavisualization/graphgallery/CMakeLists.txt b/examples/datavisualization/graphgallery/CMakeLists.txt
new file mode 100644
index 00000000..c66fee25
--- /dev/null
+++ b/examples/datavisualization/graphgallery/CMakeLists.txt
@@ -0,0 +1,75 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(graphgallery LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Widgets)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(graphgallery
+ main.cpp
+ bargraph.cpp bargraph.h
+ graphmodifier.cpp graphmodifier.h
+ rainfalldata.cpp rainfalldata.h
+ variantbardatamapping.cpp variantbardatamapping.h
+ variantbardataproxy.cpp variantbardataproxy.h
+ variantdataset.cpp variantdataset.h
+ scattergraph.cpp scattergraph.h
+ scatterdatamodifier.cpp scatterdatamodifier.h
+ axesinputhandler.cpp axesinputhandler.h
+ surfacegraph.cpp surfacegraph.h
+ surfacegraphmodifier.cpp surfacegraphmodifier.h
+ custominputhandler.cpp custominputhandler.h
+ highlightseries.cpp highlightseries.h
+ topographicseries.cpp topographicseries.h
+)
+set_target_properties(graphgallery PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_link_libraries(graphgallery PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Widgets
+ Qt::DataVisualization
+)
+
+set(graphgallery_resource_files
+ "data/raindata.txt"
+ "data/layer_1.png"
+ "data/layer_2.png"
+ "data/layer_3.png"
+ "data/oilrig.obj"
+ "data/pipe.obj"
+ "data/refinery.obj"
+ "data/maptexture.jpg"
+ "data/topography.png"
+)
+
+qt6_add_resources(graphgallery "graphgallery"
+ PREFIX
+ "/"
+ FILES
+ ${graphgallery_resource_files}
+)
+
+install(TARGETS graphgallery
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.cpp b/examples/datavisualization/graphgallery/axesinputhandler.cpp
index 5a839503..3292650e 100644
--- a/examples/datavisualization/draggableaxes/axesinputhandler.cpp
+++ b/examples/datavisualization/graphgallery/axesinputhandler.cpp
@@ -1,43 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "axesinputhandler.h"
#include <QtCore/qmath.h>
AxesInputHandler::AxesInputHandler(QAbstract3DGraph *graph, QObject *parent) :
- Q3DInputHandler(parent),
- m_mousePressed(false),
- m_state(StateNormal),
- m_axisX(0),
- m_axisZ(0),
- m_axisY(0),
- m_speedModifier(15.0f)
+ Q3DInputHandler(parent)
{
//! [3]
// Connect to the item selection signal from graph
diff --git a/examples/datavisualization/graphgallery/axesinputhandler.h b/examples/datavisualization/graphgallery/axesinputhandler.h
new file mode 100644
index 00000000..bb8432ac
--- /dev/null
+++ b/examples/datavisualization/graphgallery/axesinputhandler.h
@@ -0,0 +1,54 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef AXESINPUTHANDLER_H
+#define AXESINPUTHANDLER_H
+
+#include <QtDataVisualization/q3dinputhandler.h>
+#include <QtDataVisualization/qabstract3dgraph.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+
+//! [0]
+class AxesInputHandler : public Q3DInputHandler
+//! [0]
+{
+ Q_OBJECT
+
+ enum InputState {
+ StateNormal = 0,
+ StateDraggingX,
+ StateDraggingZ,
+ StateDraggingY
+ };
+
+public:
+ explicit AxesInputHandler(QAbstract3DGraph *graph, QObject *parent = 0);
+
+ inline void setAxes(QValue3DAxis *axisX, QValue3DAxis *axisZ, QValue3DAxis *axisY) {
+ m_axisX = axisX;
+ m_axisZ = axisZ;
+ m_axisY = axisY;
+ }
+
+ //! [1]
+ inline void setDragSpeedModifier(float modifier) { m_speedModifier = modifier; }
+ //! [1]
+
+ virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
+
+private:
+ void handleElementSelected(QAbstract3DGraph::ElementType type);
+ void handleAxisDragging();
+
+private:
+ bool m_mousePressed = false;
+ InputState m_state = StateNormal;
+ QValue3DAxis *m_axisX = nullptr;
+ QValue3DAxis *m_axisZ = nullptr;
+ QValue3DAxis *m_axisY = nullptr;
+ float m_speedModifier = 15.f;
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/bargraph.cpp b/examples/datavisualization/graphgallery/bargraph.cpp
new file mode 100644
index 00000000..5873c757
--- /dev/null
+++ b/examples/datavisualization/graphgallery/bargraph.cpp
@@ -0,0 +1,329 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "bargraph.h"
+#include "graphmodifier.h"
+
+#include <QtWidgets/qboxlayout.h>
+#include <QtWidgets/qpushbutton.h>
+#include <QtWidgets/qcheckbox.h>
+#include <QtWidgets/qslider.h>
+#include <QtWidgets/qfontcombobox.h>
+#include <QtWidgets/qlabel.h>
+#include <QtWidgets/qradiobutton.h>
+#include <QtWidgets/qbuttongroup.h>
+#include <QtGui/qfontdatabase.h>
+
+using namespace Qt::StringLiterals;
+
+BarGraph::BarGraph()
+{
+ //! [0]
+ m_barsGraph = new Q3DBars();
+ //! [0]
+}
+
+BarGraph::~BarGraph() = default;
+
+bool BarGraph::initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize)
+{
+ if (!m_barsGraph->hasContext())
+ return false;
+
+ //! [1]
+ m_barsWidget = new QWidget;
+ auto *hLayout = new QHBoxLayout(m_barsWidget);
+ m_container = QWidget::createWindowContainer(m_barsGraph, m_barsWidget);
+ m_barsGraph->resize(minimumGraphSize);
+ m_container->setMinimumSize(minimumGraphSize);
+ m_container->setMaximumSize(maximumGraphSize);
+ m_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_container->setFocusPolicy(Qt::StrongFocus);
+ hLayout->addWidget(m_container, 1);
+
+ auto *vLayout = new QVBoxLayout();
+ hLayout->addLayout(vLayout);
+ //! [1]
+
+ auto *themeList = new QComboBox(m_barsWidget);
+ themeList->addItem(u"Qt"_s);
+ themeList->addItem(u"Primary Colors"_s);
+ themeList->addItem(u"Digia"_s);
+ themeList->addItem(u"Stone Moss"_s);
+ themeList->addItem(u"Army Blue"_s);
+ themeList->addItem(u"Retro"_s);
+ themeList->addItem(u"Ebony"_s);
+ themeList->addItem(u"Isabelle"_s);
+ themeList->setCurrentIndex(0);
+
+ auto *labelButton = new QPushButton(m_barsWidget);
+ labelButton->setText(u"Change label style"_s);
+
+ auto *smoothCheckBox = new QCheckBox(m_barsWidget);
+ smoothCheckBox->setText(u"Smooth bars"_s);
+ smoothCheckBox->setChecked(false);
+
+ auto *barStyleList = new QComboBox(m_barsWidget);
+ barStyleList->addItem(u"Bar"_s, QAbstract3DSeries::MeshBar);
+ barStyleList->addItem(u"Pyramid"_s, QAbstract3DSeries::MeshPyramid);
+ barStyleList->addItem(u"Cone"_s, QAbstract3DSeries::MeshCone);
+ barStyleList->addItem(u"Cylinder"_s, QAbstract3DSeries::MeshCylinder);
+ barStyleList->addItem(u"Bevel bar"_s, QAbstract3DSeries::MeshBevelBar);
+ barStyleList->addItem(u"Sphere"_s, QAbstract3DSeries::MeshSphere);
+ barStyleList->setCurrentIndex(4);
+
+ auto *cameraButton = new QPushButton(m_barsWidget);
+ cameraButton->setText(u"Change camera preset"_s);
+
+ auto *zoomToSelectedButton = new QPushButton(m_barsWidget);
+ zoomToSelectedButton->setText(u"Zoom to selected bar"_s);
+
+ auto *selectionModeList = new QComboBox(m_barsWidget);
+ selectionModeList->addItem(u"None"_s,
+ int(QAbstract3DGraph::SelectionNone));
+ selectionModeList->addItem(u"Bar"_s,
+ int(QAbstract3DGraph::SelectionItem));
+ selectionModeList->addItem(u"Row"_s,
+ int(QAbstract3DGraph::SelectionRow));
+ selectionModeList->addItem(u"Bar and Row"_s,
+ int(QAbstract3DGraph::SelectionItemAndRow));
+ selectionModeList->addItem(u"Column"_s,
+ int(QAbstract3DGraph::SelectionColumn));
+ selectionModeList->addItem(u"Bar and Column"_s,
+ int(QAbstract3DGraph::SelectionItemAndColumn));
+ selectionModeList->addItem(u"Row and Column"_s,
+ int(QAbstract3DGraph::SelectionRowAndColumn));
+ selectionModeList->addItem(u"Bar, Row and Column"_s,
+ int(QAbstract3DGraph::SelectionItemRowAndColumn));
+ selectionModeList->addItem(u"Slice into Row"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
+ selectionModeList->addItem(u"Slice into Row and Item"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
+ selectionModeList->addItem(u"Slice into Column"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
+ selectionModeList->addItem(u"Slice into Column and Item"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
+ selectionModeList->addItem(u"Multi: Bar, Row, Col"_s,
+ int(QAbstract3DGraph::SelectionItemRowAndColumn
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->addItem(u"Multi, Slice: Row, Item"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->addItem(u"Multi, Slice: Col, Item"_s,
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->setCurrentIndex(1);
+
+ auto *backgroundCheckBox = new QCheckBox(m_barsWidget);
+ backgroundCheckBox->setText(u"Show background"_s);
+ backgroundCheckBox->setChecked(false);
+
+ auto *gridCheckBox = new QCheckBox(m_barsWidget);
+ gridCheckBox->setText(u"Show grid"_s);
+ gridCheckBox->setChecked(true);
+
+ auto *seriesCheckBox = new QCheckBox(m_barsWidget);
+ seriesCheckBox->setText(u"Show second series"_s);
+ seriesCheckBox->setChecked(false);
+
+ auto *reverseValueAxisCheckBox = new QCheckBox(m_barsWidget);
+ reverseValueAxisCheckBox->setText(u"Reverse value axis"_s);
+ reverseValueAxisCheckBox->setChecked(false);
+
+ auto *reflectionCheckBox = new QCheckBox(m_barsWidget);
+ reflectionCheckBox->setText(u"Show reflections"_s);
+ reflectionCheckBox->setChecked(false);
+
+ //! [3]
+ auto *rotationSliderX = new QSlider(Qt::Horizontal, m_barsWidget);
+ rotationSliderX->setTickInterval(30);
+ rotationSliderX->setTickPosition(QSlider::TicksBelow);
+ rotationSliderX->setMinimum(-180);
+ rotationSliderX->setValue(0);
+ rotationSliderX->setMaximum(180);
+ //! [3]
+ auto *rotationSliderY = new QSlider(Qt::Horizontal, m_barsWidget);
+ rotationSliderY->setTickInterval(15);
+ rotationSliderY->setTickPosition(QSlider::TicksAbove);
+ rotationSliderY->setMinimum(-90);
+ rotationSliderY->setValue(0);
+ rotationSliderY->setMaximum(90);
+
+ auto *fontSizeSlider = new QSlider(Qt::Horizontal, m_barsWidget);
+ fontSizeSlider->setTickInterval(10);
+ fontSizeSlider->setTickPosition(QSlider::TicksBelow);
+ fontSizeSlider->setMinimum(1);
+ fontSizeSlider->setValue(30);
+ fontSizeSlider->setMaximum(100);
+
+ auto *fontList = new QFontComboBox(m_barsWidget);
+ fontList->setCurrentFont(QFont("Times New Roman"));
+
+ auto *shadowQuality = new QComboBox(m_barsWidget);
+ shadowQuality->addItem(u"None"_s);
+ shadowQuality->addItem(u"Low"_s);
+ shadowQuality->addItem(u"Medium"_s);
+ shadowQuality->addItem(u"High"_s);
+ shadowQuality->addItem(u"Low Soft"_s);
+ shadowQuality->addItem(u"Medium Soft"_s);
+ shadowQuality->addItem(u"High Soft"_s);
+ shadowQuality->setCurrentIndex(5);
+
+ auto *rangeList = new QComboBox(m_barsWidget);
+ rangeList->addItem(u"2015"_s);
+ rangeList->addItem(u"2016"_s);
+ rangeList->addItem(u"2017"_s);
+ rangeList->addItem(u"2018"_s);
+ rangeList->addItem(u"2019"_s);
+ rangeList->addItem(u"2020"_s);
+ rangeList->addItem(u"2021"_s);
+ rangeList->addItem(u"2022"_s);
+ rangeList->addItem(u"All"_s);
+ rangeList->setCurrentIndex(8);
+
+ auto *axisTitlesVisibleCB = new QCheckBox(m_barsWidget);
+ axisTitlesVisibleCB->setText(u"Axis titles visible"_s);
+ axisTitlesVisibleCB->setChecked(true);
+
+ auto *axisTitlesFixedCB = new QCheckBox(m_barsWidget);
+ axisTitlesFixedCB->setText(u"Axis titles fixed"_s);
+ axisTitlesFixedCB->setChecked(true);
+
+ auto *axisLabelRotationSlider = new QSlider(Qt::Horizontal, m_barsWidget);
+ axisLabelRotationSlider->setTickInterval(10);
+ axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow);
+ axisLabelRotationSlider->setMinimum(0);
+ axisLabelRotationSlider->setValue(30);
+ axisLabelRotationSlider->setMaximum(90);
+
+ auto *modeGroup = new QButtonGroup(m_barsWidget);
+ auto *modeWeather = new QRadioButton(u"Temperature Data"_s, m_barsWidget);
+ modeWeather->setChecked(true);
+ auto *modeCustomProxy = new QRadioButton(u"Custom Proxy Data"_s, m_barsWidget);
+ modeGroup->addButton(modeWeather);
+ modeGroup->addButton(modeCustomProxy);
+
+ //! [4]
+ vLayout->addWidget(new QLabel(u"Rotate horizontally"_s));
+ vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
+ //! [4]
+ vLayout->addWidget(new QLabel(u"Rotate vertically"_s));
+ vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
+ vLayout->addWidget(labelButton, 0, Qt::AlignTop);
+ vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(zoomToSelectedButton, 0, Qt::AlignTop);
+ vLayout->addWidget(backgroundCheckBox);
+ vLayout->addWidget(gridCheckBox);
+ vLayout->addWidget(smoothCheckBox);
+ vLayout->addWidget(reflectionCheckBox);
+ vLayout->addWidget(seriesCheckBox);
+ vLayout->addWidget(reverseValueAxisCheckBox);
+ vLayout->addWidget(axisTitlesVisibleCB);
+ vLayout->addWidget(axisTitlesFixedCB);
+ vLayout->addWidget(new QLabel(u"Show year"_s));
+ vLayout->addWidget(rangeList);
+ vLayout->addWidget(new QLabel(u"Change bar style"_s));
+ vLayout->addWidget(barStyleList);
+ vLayout->addWidget(new QLabel(u"Change selection mode"_s));
+ vLayout->addWidget(selectionModeList);
+ vLayout->addWidget(new QLabel(u"Change theme"_s));
+ vLayout->addWidget(themeList);
+ vLayout->addWidget(new QLabel(u"Adjust shadow quality"_s));
+ vLayout->addWidget(shadowQuality);
+ vLayout->addWidget(new QLabel(u"Change font"_s));
+ vLayout->addWidget(fontList);
+ vLayout->addWidget(new QLabel(u"Adjust font size"_s));
+ vLayout->addWidget(fontSizeSlider);
+ vLayout->addWidget(new QLabel(u"Axis label rotation"_s));
+ vLayout->addWidget(axisLabelRotationSlider, 0, Qt::AlignTop);
+ vLayout->addWidget(modeWeather, 0, Qt::AlignTop);
+ vLayout->addWidget(modeCustomProxy, 1, Qt::AlignTop);
+
+ //! [2]
+ auto *modifier = new GraphModifier(m_barsGraph, this);
+ //! [2]
+
+ //! [5]
+ QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &GraphModifier::rotateX);
+ //! [5]
+ QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &GraphModifier::rotateY);
+
+ QObject::connect(labelButton, &QPushButton::clicked, modifier,
+ &GraphModifier::changeLabelBackground);
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &GraphModifier::changePresetCamera);
+ QObject::connect(zoomToSelectedButton, &QPushButton::clicked, modifier,
+ &GraphModifier::zoomToSelectedBar);
+
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setGridEnabled);
+ QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setSmoothBars);
+ QObject::connect(seriesCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setSeriesVisibility);
+ QObject::connect(reverseValueAxisCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setReverseValueAxis);
+ QObject::connect(reflectionCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setReflection);
+
+ QObject::connect(modifier, &GraphModifier::backgroundEnabledChanged,
+ backgroundCheckBox, &QCheckBox::setChecked);
+ QObject::connect(modifier, &GraphModifier::gridEnabledChanged,
+ gridCheckBox, &QCheckBox::setChecked);
+
+ QObject::connect(rangeList, &QComboBox::currentIndexChanged, modifier,
+ &GraphModifier::changeRange);
+
+ QObject::connect(barStyleList, &QComboBox::currentIndexChanged, modifier,
+ &GraphModifier::changeStyle);
+
+ QObject::connect(selectionModeList, &QComboBox::currentIndexChanged, modifier,
+ &GraphModifier::changeSelectionMode);
+
+ QObject::connect(themeList, &QComboBox::currentIndexChanged, modifier,
+ &GraphModifier::changeTheme);
+
+ QObject::connect(shadowQuality, &QComboBox::currentIndexChanged, modifier,
+ &GraphModifier::changeShadowQuality);
+
+ QObject::connect(modifier, &GraphModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+ QObject::connect(m_barsGraph, &Q3DBars::shadowQualityChanged, modifier,
+ &GraphModifier::shadowQualityUpdatedByVisual);
+
+ QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
+ &GraphModifier::changeFontSize);
+ QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
+ &GraphModifier::changeFont);
+
+ QObject::connect(modifier, &GraphModifier::fontSizeChanged, fontSizeSlider,
+ &QSlider::setValue);
+ QObject::connect(modifier, &GraphModifier::fontChanged, fontList,
+ &QFontComboBox::setCurrentFont);
+
+ QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setAxisTitleVisibility);
+ QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setAxisTitleFixed);
+ QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier,
+ &GraphModifier::changeLabelRotation);
+
+ QObject::connect(modeWeather, &QRadioButton::toggled, modifier,
+ &GraphModifier::setDataModeToWeather);
+ QObject::connect(modeCustomProxy, &QRadioButton::toggled, modifier,
+ &GraphModifier::setDataModeToCustom);
+ QObject::connect(modeWeather, &QRadioButton::toggled, seriesCheckBox,
+ &QCheckBox::setEnabled);
+ QObject::connect(modeWeather, &QRadioButton::toggled, rangeList,
+ &QComboBox::setEnabled);
+ QObject::connect(modeWeather, &QRadioButton::toggled, axisTitlesVisibleCB,
+ &QCheckBox::setEnabled);
+ QObject::connect(modeWeather, &QRadioButton::toggled, axisTitlesFixedCB,
+ &QCheckBox::setEnabled);
+ QObject::connect(modeWeather, &QRadioButton::toggled, axisLabelRotationSlider,
+ &QSlider::setEnabled);
+
+ return true;
+}
diff --git a/examples/datavisualization/graphgallery/bargraph.h b/examples/datavisualization/graphgallery/bargraph.h
new file mode 100644
index 00000000..004c14eb
--- /dev/null
+++ b/examples/datavisualization/graphgallery/bargraph.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef BARGRAPH_H
+#define BARGRAPH_H
+
+#include <QtDataVisualization/q3dbars.h>
+#include <QtCore/qobject.h>
+
+class BarGraph : public QObject
+{
+ Q_OBJECT
+public:
+ BarGraph();
+ ~BarGraph();
+
+ bool initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize);
+ QWidget *barsWidget() { return m_barsWidget; }
+
+private:
+ Q3DBars *m_barsGraph = nullptr;
+ QWidget *m_container = nullptr;
+ QWidget *m_barsWidget = nullptr;
+};
+
+#endif
diff --git a/examples/datavisualization/texturesurface/custominputhandler.cpp b/examples/datavisualization/graphgallery/custominputhandler.cpp
index e8e693a0..f9f06871 100644
--- a/examples/datavisualization/texturesurface/custominputhandler.cpp
+++ b/examples/datavisualization/graphgallery/custominputhandler.cpp
@@ -1,45 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "custominputhandler.h"
-#include <QtDataVisualization/Q3DCamera>
+#include <QtDataVisualization/q3dcamera.h>
#include <QtCore/qmath.h>
CustomInputHandler::CustomInputHandler(QAbstract3DGraph *graph, QObject *parent) :
- Q3DInputHandler(parent),
- m_highlight(0),
- m_mousePressed(false),
- m_state(StateNormal),
- m_axisX(0),
- m_axisZ(0),
- m_speedModifier(20.0f)
+ Q3DInputHandler(parent)
{
// Connect to the item selection signal from graph
connect(graph, &QAbstract3DGraph::selectedElementChanged, this,
@@ -69,7 +37,7 @@ void CustomInputHandler::wheelEvent(QWheelEvent *event)
float y = (m_axisXMaxValue - m_axisXMinValue) * m_aspectRatio;
m_axisX->setRange(m_axisXMinValue, m_axisXMaxValue);
- m_axisY->setRange(100.0f, y);
+ m_axisY->setRange(100.f, y);
m_axisZ->setRange(m_axisZMinValue, m_axisZMaxValue);
}
//! [1]
@@ -110,7 +78,7 @@ void CustomInputHandler::handleElementSelected(QAbstract3DGraph::ElementType typ
void CustomInputHandler::handleAxisDragging()
{
- float distance = 0.0f;
+ float distance = 0.f;
// Get scene orientation from active camera
float xRotation = scene()->activeCamera()->xRotation();
@@ -126,7 +94,7 @@ void CustomInputHandler::handleAxisDragging()
// Adjust axes
switch (m_state) {
-//! [0]
+ //! [0]
case StateDraggingX:
distance = (move.x() * xMulX - move.y() * xMulY) * m_speedModifier;
m_axisXMinValue -= distance;
@@ -143,7 +111,7 @@ void CustomInputHandler::handleAxisDragging()
}
m_axisX->setRange(m_axisXMinValue, m_axisXMaxValue);
break;
-//! [0]
+ //! [0]
case StateDraggingZ:
distance = (move.x() * zMulX + move.y() * zMulY) * m_speedModifier;
m_axisZMinValue += distance;
@@ -167,18 +135,18 @@ void CustomInputHandler::handleAxisDragging()
void CustomInputHandler::checkConstraints()
{
-//! [2]
+ //! [2]
if (m_axisXMinValue < m_areaMinValue)
m_axisXMinValue = m_areaMinValue;
if (m_axisXMaxValue > m_areaMaxValue)
m_axisXMaxValue = m_areaMaxValue;
// Don't allow too much zoom in
if ((m_axisXMaxValue - m_axisXMinValue) < m_axisXMinRange) {
- float adjust = (m_axisXMinRange - (m_axisXMaxValue - m_axisXMinValue)) / 2.0f;
+ float adjust = (m_axisXMinRange - (m_axisXMaxValue - m_axisXMinValue)) / 2.f;
m_axisXMinValue -= adjust;
m_axisXMaxValue += adjust;
}
-//! [2]
+ //! [2]
if (m_axisZMinValue < m_areaMinValue)
m_axisZMinValue = m_areaMinValue;
@@ -186,7 +154,7 @@ void CustomInputHandler::checkConstraints()
m_axisZMaxValue = m_areaMaxValue;
// Don't allow too much zoom in
if ((m_axisZMaxValue - m_axisZMinValue) < m_axisZMinRange) {
- float adjust = (m_axisZMinRange - (m_axisZMaxValue - m_axisZMinValue)) / 2.0f;
+ float adjust = (m_axisZMinRange - (m_axisZMaxValue - m_axisZMinValue)) / 2.f;
m_axisZMinValue -= adjust;
m_axisZMaxValue += adjust;
}
diff --git a/examples/datavisualization/graphgallery/custominputhandler.h b/examples/datavisualization/graphgallery/custominputhandler.h
new file mode 100644
index 00000000..a28b5851
--- /dev/null
+++ b/examples/datavisualization/graphgallery/custominputhandler.h
@@ -0,0 +1,76 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef CUSTOMINPUTHANDLER_H
+#define CUSTOMINPUTHANDLER_H
+
+#include "highlightseries.h"
+
+#include <QtDataVisualization/q3dinputhandler.h>
+#include <QtDataVisualization/qabstract3dgraph.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+
+class CustomInputHandler : public Q3DInputHandler
+{
+ Q_OBJECT
+
+ enum InputState {
+ StateNormal = 0,
+ StateDraggingX,
+ StateDraggingZ,
+ StateDraggingY
+ };
+
+public:
+ explicit CustomInputHandler(QAbstract3DGraph *graph, QObject *parent = 0);
+
+ inline void setLimits(float min, float max, float minRange) {
+ m_areaMinValue = min;
+ m_areaMaxValue = max;
+ m_axisXMinValue = m_areaMinValue;
+ m_axisXMaxValue = m_areaMaxValue;
+ m_axisZMinValue = m_areaMinValue;
+ m_axisZMaxValue = m_areaMaxValue;
+ m_axisXMinRange = minRange;
+ m_axisZMinRange = minRange;
+ }
+ inline void setAxes(QValue3DAxis *axisX, QValue3DAxis *axisY, QValue3DAxis *axisZ) {
+ m_axisX = axisX;
+ m_axisY = axisY;
+ m_axisZ = axisZ;
+ }
+ inline void setAspectRatio(float ratio) { m_aspectRatio = ratio; }
+ inline void setHighlightSeries(HighlightSeries *series) { m_highlight = series; }
+ inline void setDragSpeedModifier(float modifier) { m_speedModifier = modifier; }
+
+protected:
+ virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void wheelEvent(QWheelEvent *event);
+
+private:
+ void handleElementSelected(QAbstract3DGraph::ElementType type);
+ void handleAxisDragging();
+ void checkConstraints();
+
+private:
+ HighlightSeries *m_highlight = nullptr;
+ bool m_mousePressed = false;
+ InputState m_state = StateNormal;
+ QValue3DAxis *m_axisX = nullptr;
+ QValue3DAxis *m_axisY = nullptr;
+ QValue3DAxis *m_axisZ = nullptr;
+ float m_speedModifier = 20.f;
+ float m_aspectRatio = 0.f;
+ float m_axisXMinValue = 0.f;
+ float m_axisXMaxValue = 0.f;
+ float m_axisXMinRange = 0.f;
+ float m_axisZMinValue = 0.f;
+ float m_axisZMaxValue = 0.f;
+ float m_axisZMinRange = 0.f;
+ float m_areaMinValue = 0.f;
+ float m_areaMaxValue = 0.f;
+};
+
+#endif
diff --git a/examples/datavisualization/customitems/layer_1.png b/examples/datavisualization/graphgallery/data/layer_1.png
index 9138c710..9138c710 100644
--- a/examples/datavisualization/customitems/layer_1.png
+++ b/examples/datavisualization/graphgallery/data/layer_1.png
Binary files differ
diff --git a/examples/datavisualization/customitems/layer_2.png b/examples/datavisualization/graphgallery/data/layer_2.png
index 61631ae8..61631ae8 100644
--- a/examples/datavisualization/customitems/layer_2.png
+++ b/examples/datavisualization/graphgallery/data/layer_2.png
Binary files differ
diff --git a/examples/datavisualization/customitems/layer_3.png b/examples/datavisualization/graphgallery/data/layer_3.png
index 066ffbe7..066ffbe7 100644
--- a/examples/datavisualization/customitems/layer_3.png
+++ b/examples/datavisualization/graphgallery/data/layer_3.png
Binary files differ
diff --git a/examples/datavisualization/texturesurface/license.txt b/examples/datavisualization/graphgallery/data/license.txt
index 749daf31..749daf31 100644
--- a/examples/datavisualization/texturesurface/license.txt
+++ b/examples/datavisualization/graphgallery/data/license.txt
diff --git a/examples/datavisualization/texturesurface/maptexture.jpg b/examples/datavisualization/graphgallery/data/maptexture.jpg
index ae5d66eb..ae5d66eb 100644
--- a/examples/datavisualization/texturesurface/maptexture.jpg
+++ b/examples/datavisualization/graphgallery/data/maptexture.jpg
Binary files differ
diff --git a/examples/datavisualization/customitems/oilrig.obj b/examples/datavisualization/graphgallery/data/oilrig.obj
index c3b6ea57..c3b6ea57 100644
--- a/examples/datavisualization/customitems/oilrig.obj
+++ b/examples/datavisualization/graphgallery/data/oilrig.obj
diff --git a/examples/datavisualization/customitems/pipe.obj b/examples/datavisualization/graphgallery/data/pipe.obj
index 6ccbb286..6ccbb286 100644
--- a/examples/datavisualization/customitems/pipe.obj
+++ b/examples/datavisualization/graphgallery/data/pipe.obj
diff --git a/examples/datavisualization/graphgallery/data/raindata.txt b/examples/datavisualization/graphgallery/data/raindata.txt
new file mode 100644
index 00000000..d9558921
--- /dev/null
+++ b/examples/datavisualization/graphgallery/data/raindata.txt
@@ -0,0 +1,158 @@
+# Rainfall per month from 2010 to 2022 in Northern Finland (Oulu)
+# Format: year, month, rainfall
+2010,1, 0,
+2010,2, 3.4,
+2010,3, 52,
+2010,4, 33.8,
+2010,5, 45.6,
+2010,6, 43.8,
+2010,7, 104.6,
+2010,8, 105.4,
+2010,9, 107.2,
+2010,10,38.6,
+2010,11,17.8,
+2010,12,0,
+2011,1, 8.2,
+2011,2, 1.6,
+2011,3, 27.4,
+2011,4, 15.8,
+2011,5, 57.6,
+2011,6, 85.2,
+2011,7, 127,
+2011,8, 72.2,
+2011,9, 82.2,
+2011,10,62.4,
+2011,11,31.6,
+2011,12,53.8,
+2012,1, 0,
+2012,2, 5,
+2012,3, 32.4,
+2012,4, 57.6,
+2012,5, 71.4,
+2012,6, 60.8,
+2012,7, 109,
+2012,8, 43.6,
+2012,9, 79.4,
+2012,10,117.2,
+2012,11,59,
+2012,12,0.2,
+2013,1, 28,
+2013,2, 19,
+2013,3, 0,
+2013,4, 37.6,
+2013,5, 44.2,
+2013,6, 104.8,
+2013,7, 84.2,
+2013,8, 57.2,
+2013,9, 37.2,
+2013,10,64.6,
+2013,11,77.8,
+2013,12,92.8,
+2014,1, 23.8,
+2014,2, 23.6,
+2014,3, 15.4,
+2014,4, 13.2,
+2014,5, 36.4,
+2014,6, 26.4,
+2014,7, 95.8,
+2014,8, 81.8,
+2014,9, 13.8,
+2014,10,94.6,
+2014,11,44.6,
+2014,12,31,
+2015,1, 37.4,
+2015,2, 21,
+2015,3, 42,
+2015,4, 8.8,
+2015,5, 82.4,
+2015,6, 150,
+2015,7, 56.8,
+2015,8, 67.2,
+2015,9, 131.2,
+2015,10,38.4,
+2015,11,83.4,
+2015,12,47.8,
+2016,1, 12.4,
+2016,2, 34.8,
+2016,3, 29,
+2016,4, 40.4,
+2016,5, 32.4,
+2016,6, 80.2,
+2016,7, 102.6,
+2016,8, 95.6,
+2016,9, 40.2,
+2016,10,7.8,
+2016,11,39.6,
+2016,12,8.8,
+2017,1, 9.4,
+2017,2, 6.6,
+2017,3, 29,
+2017,4, 46.2,
+2017,5, 43.2,
+2017,6, 25.2,
+2017,7, 72.4,
+2017,8, 58.8,
+2017,9, 68.8,
+2017,10,45.8,
+2017,11,36.8,
+2017,12,29.6,
+2018,1, 19.8,
+2018,2, 0.8,
+2018,3, 4,
+2018,4, 23.2,
+2018,5, 13.2,
+2018,6, 62.8,
+2018,7, 33,
+2018,8, 96.6,
+2018,9, 72.6,
+2018,10,48.8,
+2018,11,31.8,
+2018,12,12.8,
+2019,1, 0.2,
+2019,2, 24.8,
+2019,3, 32,
+2019,4, 8.8,
+2019,5, 71.4,
+2019,6, 65.8,
+2019,7, 17.6,
+2019,8, 90,
+2019,9, 50,
+2019,10,77,
+2019,11,27,
+2019,12,43.2,
+2020,1, 28.8,
+2020,2, 45,
+2020,3, 18.6,
+2020,4, 13,
+2020,5, 30.8,
+2020,6, 21.4,
+2020,7, 163.6,
+2020,8, 12,
+2020,9, 102.4,
+2020,10,133.2,
+2020,11,69.8,
+2020,12,40.6,
+2021,1, 0.4,
+2021,2, 21.6,
+2021,3, 24,
+2021,4, 51.4,
+2021,5, 76.4,
+2021,6, 29.2,
+2021,7, 36.4,
+2021,8, 116,
+2021,9, 72.4,
+2021,10,93.4,
+2021,11,21,
+2021,12,10.2,
+2022,1, 8.6,
+2022,2, 6.6,
+2022,3, 5.2,
+2022,4, 15.2,
+2022,5, 37.6,
+2022,6, 45,
+2022,7, 67.4,
+2022,8, 161.6,
+2022,9, 22.8,
+2022,10,75.2,
+2022,11,21.8,
+2022,12,0.2
diff --git a/examples/datavisualization/customitems/refinery.obj b/examples/datavisualization/graphgallery/data/refinery.obj
index ed90c361..ed90c361 100644
--- a/examples/datavisualization/customitems/refinery.obj
+++ b/examples/datavisualization/graphgallery/data/refinery.obj
diff --git a/examples/datavisualization/texturesurface/topography.png b/examples/datavisualization/graphgallery/data/topography.png
index 9349cdb3..9349cdb3 100644
--- a/examples/datavisualization/texturesurface/topography.png
+++ b/examples/datavisualization/graphgallery/data/topography.png
Binary files differ
diff --git a/examples/datavisualization/graphgallery/doc/images/graphgallery-example.png b/examples/datavisualization/graphgallery/doc/images/graphgallery-example.png
new file mode 100644
index 00000000..f3320c8e
--- /dev/null
+++ b/examples/datavisualization/graphgallery/doc/images/graphgallery-example.png
Binary files differ
diff --git a/examples/datavisualization/graphgallery/doc/src/graphgallery.qdoc b/examples/datavisualization/graphgallery/doc/src/graphgallery.qdoc
new file mode 100644
index 00000000..ff7761d2
--- /dev/null
+++ b/examples/datavisualization/graphgallery/doc/src/graphgallery.qdoc
@@ -0,0 +1,705 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \example graphgallery
+ \meta tags {DataVisualization, Q3DBars, Bar Graph, Custom Proxy, Q3DScatter, Scatter Graph, Custom Input Handler, Q3DSurface, Surface Graph, QCustom3DItem, Textured Surface}
+ \title Graph Gallery
+ \ingroup qtdatavisualization_examples
+ \brief Gallery of Bar, Scatter, and Surface graphs.
+
+ \e {Graph Gallery} demonstrates all three graph types and some of their special features.
+ The graphs have their own tabs in the application.
+
+ \image graphgallery-example.png
+
+ \include examples-run.qdocinc
+
+ \section1 Bar Graph
+
+ In the \uicontrol {Bar Graph} tab, create a 3D bar graph using Q3DBars and combine the use of
+ widgets to adjust various bar graph qualities. The example shows how to:
+
+ \list
+ \li Create an application with Q3DBars and some widgets
+ \li Use QBar3DSeries and QBarDataProxy to set data to the graph
+ \li Adjust some graph and series properties using widget controls
+ \li Select a row or a column by clicking an axis label
+ \li Create a custom proxy to use with Q3DBars
+ \endlist
+
+ For information about interacting with the graph, see
+ \l{Qt Data Visualization Interacting with Data}{this page}.
+
+ \section2 Creating the Application
+
+ First, in \c{bargraph.cpp}, instantiate Q3DBars:
+
+ \snippet graphgallery/bargraph.cpp 0
+
+ Then, create the widget, and horizontal and vertical layouts.
+
+ The graph is embedded in a window container using
+ QWidget::createWindowContainer(). This is required because all data
+ visualization graph classes (Q3DBars, Q3DScatter, Q3DSurface) inherit
+ QWindow. This is the only way to use a class inheriting QWindow as a widget.
+
+ Add the graph and the vertical layout to the
+ horizontal one:
+
+ \snippet graphgallery/bargraph.cpp 1
+
+ Next, create another class to handle the data addition and other interaction with the
+ graph:
+
+ \snippet graphgallery/bargraph.cpp 2
+
+ \section2 Setting up the Bar Graph
+
+ Set up the graph in the constructor of the \c GraphModifier class:
+
+ \snippet graphgallery/graphmodifier.cpp 0
+
+ First, create the axes and the series into member variables to support changing them easily:
+
+ \snippet graphgallery/graphmodifier.cpp 1
+
+ Then, set some visual qualities for the graph:
+
+ \snippet graphgallery/graphmodifier.cpp 2
+
+ Set up the axes and make them the active axes of the graph:
+
+ \snippet graphgallery/graphmodifier.cpp 3
+
+ Give axis labels a small autorotation angle with setLabelAutoRotation() to make them orient
+ slightly toward the camera. This improves axis label readability at extreme camera angles.
+
+ Next, initialize the visual properties of the series. Note that the second series is initially
+ not visible:
+
+ \snippet graphgallery/graphmodifier.cpp 4
+
+ Add the series to the graph:
+
+ \snippet graphgallery/graphmodifier.cpp 5
+
+ Finally, set the camera angle by calling the same method the camera angle change button
+ in the UI uses to cycle through various camera angles:
+
+ \snippet graphgallery/graphmodifier.cpp 6
+
+ The camera is controlled via the scene object of the graph:
+
+ \snippet graphgallery/graphmodifier.cpp 7
+
+ For more information about using scene and cameras, see Q3DScene and Q3DCamera.
+
+ \section2 Adding Data to the Graph
+
+ At the end of the constructor, call a method that sets up the data:
+
+ \snippet graphgallery/graphmodifier.cpp 8
+
+ This method adds data to the proxies of the two series:
+
+ \snippet graphgallery/graphmodifier.cpp 9a
+ \dots 0
+ \snippet graphgallery/graphmodifier.cpp 9b
+
+ \section2 Using Widgets to Control the Graph
+
+ Continue by adding some widgets in \c{bargraph.cpp}. Add a slider:
+
+ \snippet graphgallery/bargraph.cpp 3
+
+ Use the slider to rotate the graph instead of just using a mouse or touch. Add it to the
+ vertical layout:
+
+ \snippet graphgallery/bargraph.cpp 4
+
+ Then, connect it to a method in \c GraphModifier:
+
+ \snippet graphgallery/bargraph.cpp 5
+
+ Create a slot in \c GraphModifier for the signal connection. The camera is controlled via the
+ scene object. This time, specify the actual camera position along the orbit around the center
+ point, instead of specifying a preset camera angle:
+
+ \snippet graphgallery/graphmodifier.cpp 10
+
+ You can now use the slider to rotate the graph.
+
+ Add more widgets to the vertical layout to control:
+
+ \list
+ \li Graph rotation
+ \li Label style
+ \li Camera preset
+ \li Background visibility
+ \li Grid visibility
+ \li Bar shading smoothness
+ \li Visibility of the second bar series
+ \li Value axis direction
+ \li Axis title visibility and rotation
+ \li Data range to be shown
+ \li Bar style
+ \li Selection mode
+ \li Theme
+ \li Shadow quality
+ \li Font
+ \li Font size
+ \li Axis label rotation
+ \li Data mode
+ \endlist
+
+ Some widget controls are intentionally disabled when in the \uicontrol {Custom Proxy Data}
+ data mode.
+
+ \section2 Selecting a Row or Column by Clicking an Axis Label
+
+ Selection by axis label is default functionality for bar graphs. As an example, you can select
+ rows by clicking an axis label in the following way:
+
+ \list 1
+ \li Change selection mode to \c SelectionRow
+ \li Click a year label
+ \li The row with the clicked year is selected
+ \endlist
+
+ The same method works with \c SelectionSlice and \c SelectionItem flags, as long as
+ either \c SelectionRow or \c SelectionColumn is set as well.
+
+ \section2 Zooming to Selection
+
+ As an example of adjusting the camera target, implement an animation of zooming to
+ selection via a button press. Animation initializations are done in the constructor:
+
+ \snippet graphgallery/graphmodifier.cpp 11
+
+ Function \c{GraphModifier::zoomToSelectedBar()} contains the zooming functionality.
+ QPropertyAnimation \c m_animationCameraTarget targets Q3DCamera::target property,
+ which takes a value normalized to the range (-1, 1).
+
+ Figure out where the selected bar is relative to axes, and use that as the end value for
+ \c{m_animationCameraTarget}:
+
+ \snippet graphgallery/graphmodifier.cpp 12
+ \dots 0
+ \snippet graphgallery/graphmodifier.cpp 13
+
+ Then, rotate the camera so that it always points approximately to the center of
+ the graph at the end of the animation:
+
+ \snippet graphgallery/graphmodifier.cpp 14
+
+ \section2 Custom Proxy for Data
+
+ By toggling \uicontrol {Custom Proxy Data} data mode on, a custom dataset and the corresponding
+ proxy are taken into use.
+
+ Define a simple flexible data set, \c{VariantDataSet}, where each data item is
+ a variant list. Each item can have multiple values, identified by their index in
+ the list. In this case, the data set is storing monthly rainfall data, where the value in
+ index zero is the year, the value in index one is the month, and the value in index two is
+ the amount of rainfall in that month.
+
+ The custom proxy is similar to itemmodel-based proxies provided by Qt Data Visualization, and
+ it requires mapping to interpret the data.
+
+ \section3 VariantDataSet
+
+ Define the data items as QVariantList objects. Add functionality for clearing the data set and
+ querying for a reference to the data contained in the set. Also, add signals to be emitted when
+ data is added or the set is cleared:
+
+ \snippet graphgallery/variantdataset.h 0
+ \dots 0
+ \codeline
+ \snippet graphgallery/variantdataset.h 1
+
+ \section3 VariantBarDataProxy
+
+ Subclass \c VariantBarDataProxy from QBarDataProxy and provide a simple API of getters and
+ setters for the data set and the mapping:
+
+ \snippet graphgallery/variantbardataproxy.h 0
+ \dots 0
+ \codeline
+ \snippet graphgallery/variantbardataproxy.h 1
+
+ The proxy listens for the changes in the data set and the mapping, and resolves the data set
+ if any changes are detected. This is not a particularly efficient implementation, as any change
+ will cause re-resolving of the entire data set, but that is not an issue for this example.
+
+ In \c resolveDataSet() method, sort the variant data values into rows and columns based on the
+ mapping. This is very similar to how QItemModelBarDataProxy handles mapping, except you use
+ list indexes instead of item model roles here. Once the values are sorted, generate
+ \c QBarDataArray out of them, and call the \c resetArray() method in the parent class:
+
+ \snippet graphgallery/variantbardataproxy.cpp 0
+
+ \section3 VariantBarDataMapping
+
+ Store the mapping information between \c VariantDataSet data item indexes and rows, columns,
+ and values of \c QBarDataArray in \c VariantBarDataMapping. It contains the lists of rows and
+ columns to be included in the resolved data:
+
+ \snippet graphgallery/variantbardatamapping.h 0
+ \dots 0
+ \codeline
+ \snippet graphgallery/variantbardatamapping.h 1
+ \dots 0
+ \codeline
+ \snippet graphgallery/variantbardatamapping.h 2
+ \dots 0
+ \codeline
+ \snippet graphgallery/variantbardatamapping.h 3
+
+ The primary way to use a \c VariantBarDataMapping object is to give the mappings in the
+ constructor, though you can use the \c remap() method to set them later, either individually or
+ all together. Emit a signal if mapping changes. The outcome is a simplified version of the
+ mapping functionality of QItemModelBarDataProxy, adapted to work with variant lists instead of
+ item models.
+
+ \section3 RainfallData
+
+ Handle the setup of QBar3DSeries with the custom proxy in the \c RainfallData class:
+
+ \snippet graphgallery/rainfalldata.cpp 0
+
+ Populate the variant data set in the \c addDataSet() method:
+
+ \snippet graphgallery/rainfalldata.cpp 1
+ \dots
+
+ Add the data set to the custom proxy and set the mapping:
+
+ \snippet graphgallery/rainfalldata.cpp 2
+
+ Finally, add a function for getting the created series for displaying:
+
+ \snippet graphgallery/rainfalldata.h 0
+
+ \section1 Scatter Graph
+
+ In the \uicontrol {Scatter Graph} tab, create a 3D scatter graph using Q3DScatter.
+ The example shows how to:
+
+ \list
+ \li Set up Q3DScatter graph
+ \li Use QScatterDataProxy to set data to the graph
+ \li Create a custom input handler by extending Q3DInputHandler
+ \endlist
+
+ For basic application creation, see \l {Bar Graph}.
+
+ \section2 Setting up the Scatter Graph
+
+ First, set up some visual qualities for the graph in the constructor of the
+ \c ScatterDataModifier:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 0
+
+ None of these are mandatory, but are used to override graph defaults. You can try how it looks
+ with the preset defaults by commenting out the block above.
+
+ Next, create a QScatterDataProxy and the associated QScatter3DSeries. Set a custom label format
+ and mesh smoothing for the series and add it to the graph:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 1
+
+ \section2 Adding Scatter Data
+
+ The last thing to do in the \c ScatterDataModifier constructor is to add data to the graph:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 2
+
+ The actual data addition is done in \c addData() method. First, configure the axes:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 3
+
+ You could do this also in the constructor of \c {ScatterDataModifier}. Doing it here
+ keeps the constructor simpler and the axes' configuration near the data.
+
+ Next, create a data array and populate it:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 4
+ \dots
+ \snippet graphgallery/scatterdatamodifier.cpp 5
+
+ Finally, tell the proxy to start using the data we gave it:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 6
+
+ Now, the graph has the data and is ready for use. For information about adding widgets
+ to control the graph, see \l {Using Widgets to Control the Graph}.
+
+ \section2 Replacing Default Input Handling
+
+ Initialize \c m_inputHandler in the constructor with a pointer to the scatter graph instance:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 7
+
+ Replace the default input handling mechanism by setting the active input handler of
+ Q3DScatter to \c {AxesInputHandler}, which implements the custom behavior:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 8
+
+ The input handler needs access to the axes of the graph, so pass them to it:
+
+ \snippet graphgallery/scatterdatamodifier.cpp 9
+
+ \section2 Extending Mouse Event Handling
+
+ First, inherit the custom input handler from Q3DInputHandler instead of QAbstract3DInputHandler
+ to keep all the functionality of the default input handling, and to add the custom
+ functionality on top of it:
+
+ \snippet graphgallery/axesinputhandler.h 0
+
+ Start extending the default functionality by re-implementing some of the mouse events.
+ First, extend \c {mousePressEvent}. Add a \c{m_mousePressed} flag for the left mouse button
+ to it, and keep the rest of the default functionality:
+
+ \snippet graphgallery/axesinputhandler.cpp 0
+
+ Next, modify \c mouseReleaseEvent to clear the flag, and reset the internal state:
+
+ \snippet graphgallery/axesinputhandler.cpp 1
+
+ Then, modify \c {mouseMoveEvent}. Check if \c m_mousePressed flag is \c {true} and
+ the internal state is something other than \c StateNormal. If so, set the input positions
+ for mouse movement distance calculations, and call the axis dragging function (see
+ \l {Implementing Axis Dragging} for details):
+
+ \snippet graphgallery/axesinputhandler.cpp 2
+
+ \section2 Implementing Axis Dragging
+
+ First, start listening to the selection signal from the graph. Do that in the
+ constructor, and connect it to the \c handleElementSelected method:
+
+ \snippet graphgallery/axesinputhandler.cpp 3
+
+ In \c {handleElementSelected}, check the type of the selection, and set the internal state
+ based on it:
+
+ \snippet graphgallery/axesinputhandler.cpp 4
+
+ The actual dragging logic is implemented in the \c handleAxisDragging method, which is called
+ from \c {mouseMoveEvent}, if the required conditions are met:
+
+ \snippet graphgallery/axesinputhandler.cpp 5
+
+ In \c {handleAxisDragging}, first get the scene orientation from the active camera:
+
+ \snippet graphgallery/axesinputhandler.cpp 6
+
+ Then, calculate the modifiers for mouse movement direction based on the orientation:
+
+ \snippet graphgallery/axesinputhandler.cpp 7
+
+ After that, calculate the mouse movement, and modify it based on the y rotation of the
+ camera:
+
+ \snippet graphgallery/axesinputhandler.cpp 8
+
+ Then, apply the moved distance to the correct axis:
+
+ \snippet graphgallery/axesinputhandler.cpp 9
+
+ Finally, add a function for setting the dragging speed:
+
+ \snippet graphgallery/axesinputhandler.h 1
+
+ This is needed, as the mouse movement distance is absolute in screen coordinates, and you
+ need to adjust it to the axis range. The larger the value, the slower the dragging will be.
+ Note that in this example, the scene zoom level is not taken into account when determining the
+ drag speed, so you'll notice changes in the range adjustment as you change the zoom level.
+
+ You could also adjust the modifier automatically based on the axis range and camera zoom level.
+
+ \section1 Surface Graph
+
+ In the \uicontrol {Surface Graph} tab, create a 3D surface graph using Q3DSurface.
+ The example shows how to:
+
+ \list
+ \li Set up a basic QSurfaceDataProxy and set data for it.
+ \li Use QHeightMapSurfaceDataProxy for showing 3D height maps.
+ \li Use topographic data to create 3D height maps.
+ \li Use three different selection modes for studying the graph.
+ \li Use axis ranges to display selected portions of the graph.
+ \li Set a custom surface gradient.
+ \li Add custom items and labels with QCustom3DItem and QCustom3DLabel.
+ \li Use custom input handler to enable zooming and panning.
+ \li Highlight an area of the surface.
+ \endlist
+
+ For basic application creation, see \l {Bar Graph}.
+
+ \section2 Simple Surface with Generated Data
+
+ First, instantiate a new QSurfaceDataProxy and attach it to a new QSurface3DSeries:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 0
+
+ Then, fill the proxy with a simple square root and sine wave data. Create a new
+ \c QSurfaceDataArray instance, and add \c QSurfaceDataRow elements to it.
+ Set the created \c QSurfaceDataArray as the data array for the QSurfaceDataProxy by calling
+ \c{resetArray()}.
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 1
+
+ \section2 Multiseries Height Map Data
+
+ Create the height map by instantiating a QHeightMapSurfaceDataProxy with a QImage containing
+ the height data. Use QHeightMapSurfaceDataProxy::setValueRanges() to define the
+ value range of the map. In the example, the map is from an imaginary position of
+ 34.0\unicode 0x00B0 N - 40.0\unicode 0x00B0 N and 18.0\unicode 0x00B0 E - 24.0\unicode 0x00B0 E.
+ These values are used to position the map on the axes.
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 2
+
+ Add the other surface layers the same way, by creating a proxy and a series for them using
+ height map images.
+
+ \section2 Topographic Map Data
+
+ The topographic data is obtained from the National Land Survey of Finland. It provides a product
+ called \c{Elevation Model 2 m}, which is suitable for this example.
+ The topography data is from Levi fell. The accuracy of the data is well beyond the need, and
+ therefore it is compressed and encoded into a PNG file. The height value of the original
+ ASCII data is encoded into RGB format using a multiplier, which you will see later in
+ a code extract. The multiplier is calculated by dividing the largest 24-bit value with the
+ highest point in Finland.
+
+ QHeightMapSurfaceDataProxy converts only one-byte values. To utilize the higher accuracy of
+ the data from the National Land Survey of Finland, read the data from the PNG file and decode
+ it into QSurface3DSeries.
+
+ First, define the encoding multiplier:
+
+ \snippet graphgallery/topographicseries.cpp 0
+
+ Then, perform the actual decoding:
+
+ \snippet graphgallery/topographicseries.cpp 1
+
+ Now, the data is usable by the proxy.
+
+ \section2 Selecting the Data Set
+
+ To demonstrate different proxies, \uicontrol {Surface Graph} has three radio buttons to
+ switch between the series.
+
+ With \uicontrol {Sqrt & Sin}, the simple generated series is activated. First, set
+ the decorative features, such as enabling the grid for the surface, and selecting the flat
+ shading mode. Next, define the axis label format and value ranges. Set automatic label rotation
+ to improve label readability at low camera angles. Finally, make sure the correct series is
+ added to the graph and the others are not:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 3
+
+ With \uicontrol {Multiseries Height Map}, the height map series are activated and others
+ disabled. Auto-adjusting Y-axis range works well for the height map surface, so ensure it is
+ set.
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 4
+
+ With \uicontrol {Textured Topography}, the topographic series is activated and others disabled.
+ Activate a custom input handler for this series, to be able to highlight areas on it:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 5
+
+ See \l {Use Custom Input Handler to Enable Zooming and Panning} for information about the
+ custom input handler for this data set.
+
+ \section2 Selection Modes
+
+ The three selection modes supported by Q3DSurface can be used with radio buttons.
+ To activate the selected mode or to clear it, add the following inline methods:
+
+ \snippet graphgallery/surfacegraphmodifier.h 0
+
+ Add \c{QAbstract3DGraph::SelectionSlice} and \c{QAbstract3DGraph::SelectionMultiSeries} flags
+ for the row and column selection modes to support doing a slice selection to all visible series
+ in the graph simultaneously.
+
+ \section2 Axis Ranges for Studying the Graph
+
+ The example has four slider controls for adjusting the min and max values for X and Z
+ axes. When selecting the proxy, these sliders are adjusted to match the axis ranges of the
+ current data set:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 6
+
+ Add support for setting the X range from the widget controls to the graph:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 7
+
+ Add the support for Z range the same way.
+
+ \section2 Custom Surface Gradients
+
+ With the \uicontrol {Sqrt & Sin} data set, custom surface gradients can be taken into use
+ with two push buttons. Define the gradient with QLinearGradient, where the desired colors are
+ set. Also, change the color style to Q3DTheme::ColorStyleRangeGradient to use the gradient.
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 8
+
+ \section2 Adding Custom Meshes to the Application
+
+ Add the mesh files to \c{CMakeLists.txt} for cmake build:
+
+ \badcode
+ set(graphgallery_resource_files
+ ...
+ "data/oilrig.obj"
+ "data/pipe.obj"
+ "data/refinery.obj"
+ ...
+ )
+
+ qt6_add_resources(graphgallery "graphgallery"
+ PREFIX
+ "/"
+ FILES
+ ${graphgallery_resource_files}
+ )
+ \endcode
+
+ Also, add them in the qrc resource file for use with qmake:
+
+ \badcode
+ <RCC>
+ <qresource prefix="/">
+ ...
+ <file>data/refinery.obj</file>
+ <file>data/oilrig.obj</file>
+ <file>data/pipe.obj</file>
+ ...
+ </qresource>
+ </RCC>
+ \endcode
+
+ \section2 Adding Custom Item to a Graph
+
+ With the \uicontrol {Multiseries Height Map} data set, custom items are inserted into the
+ graph and can be toggled on or off using checkboxes. Other visual qualities can also be
+ controlled with another set of checkboxes, including see-through for the two top layers, and
+ a highlight for the bottom layer.
+
+ Begin by creating a small QImage. Fill it with a single color to use as the color for the
+ custom object:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 9
+
+ Then, specify the position of the item in a variable. The position can then be used for
+ removing the correct item from the graph:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 10
+
+ Then, create a new QCustom3DItem with all the parameters:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 11
+
+ Finally, add the item to the graph:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 12
+
+ \section2 Adding Custom Label to a Graph
+
+ Adding a custom label is very similar to adding a custom item. For the label, a custom mesh is
+ not needed, but just a QCustom3DLabel instance:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 13
+
+ \section2 Removing Custom Item from a Graph
+
+ To remove a specific item from the graph, call \c removeCustomItemAt() with the position of
+ the item:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 14
+
+ \note Removing a custom item from the graph also deletes the object. If you want to preserve
+ the item, use the \c releaseCustomItem() method instead.
+
+ \section2 Texture to a Surface Series
+
+ With the \uicontrol {Textured Topography} data set, create a map texture to be used with the
+ topographic height map.
+
+ Set an image to be used as the texture on a surface with QSurface3DSeries::setTextureFile().
+ Add a check box to control if the texture is set or not, and a handler to react to the checkbox
+ state:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 15
+
+ The image in this example is read from a JPG file. Setting an empty file with the method clears
+ the texture, and the surface uses the gradients or colors from the theme.
+
+ \section2 Use Custom Input Handler to Enable Zooming and Panning
+
+ With the \uicontrol {Textured Topography} data set, create a custom input handler to
+ highlight the selection on the graph and allow panning the graph.
+
+ The panning implementation is similar to the one shown in \l{Implementing Axis Dragging}.
+ The difference is that, in this example, you follow only the X and Z axes and don't allow
+ dragging the surface outside the graph. To limit the dragging, follow the limits of the axes
+ and do nothing if going outside the graph:
+
+ \snippet graphgallery/custominputhandler.cpp 0
+
+ For zooming, catch the \c wheelEvent and adjust the X and Y axis ranges according to the delta
+ value on QWheelEvent. Adjust the Y axis so that the aspect ratio between the Y axis and the XZ
+ plane stays the same. This prevents getting a graph in which the height is exaggerated:
+
+ \snippet graphgallery/custominputhandler.cpp 1
+
+ Next, add some limits to the zoom level, so that it won't get too near to or far from the
+ surface. For instance, if the value for the X axis gets below the allowed limit, i.e. zooming
+ gets too far, the value is set to the minimum allowed value. If the range is going to below
+ the range minimum, both ends of the axis are adjusted so that the range stays at the limit:
+
+ \snippet graphgallery/custominputhandler.cpp 2
+
+ \section2 Highlight an Area of the Surface
+
+ To implement a highlight to be displayed on the surface, create a copy of the series and add
+ some offset to the y value. In this example, the class \c HighlightSeries implements the
+ creation of the copy in its \c handlePositionChange method.
+
+ First, give \c HighlightSeries the pointer to the original series, and then start listening to
+ the QSurface3DSeries::selectedPointChanged signal:
+
+ \snippet graphgallery/highlightseries.cpp 0
+
+ When the signal triggers, check that the position is valid. Then, calculate the ranges
+ for the copied area, and check that they stay within the bounds. Finally, fill the data array
+ of the highlight series with the range from the data array of the topography series:
+
+ \snippet graphgallery/highlightseries.cpp 1
+
+ \section2 A Gradient to the Highlight Series
+
+ Since the \c HighlightSeries is QSurface3DSeries, all the decoration methods a series can
+ have are available. In this example, add a gradient to emphasize the elevation. Because the
+ suitable gradient style depends on the range of the Y axis and we change the range when
+ zooming, the gradient color positions need to be adjusted as the range changes. Do this by
+ defining proportional values for the gradient color positions:
+
+ \snippet graphgallery/highlightseries.cpp 2
+
+ The gradient modification is done in the \c handleGradientChange method, so connect it to
+ react to changes on the Y axis:
+
+ \snippet graphgallery/surfacegraphmodifier.cpp 16
+
+ When a change in the Y axis max value happens, calculate the new gradient color positions:
+
+ \snippet graphgallery/highlightseries.cpp 3
+
+ \section1 Example Contents
+*/
diff --git a/examples/datavisualization/graphgallery/graphgallery.pro b/examples/datavisualization/graphgallery/graphgallery.pro
new file mode 100644
index 00000000..c9bd96f6
--- /dev/null
+++ b/examples/datavisualization/graphgallery/graphgallery.pro
@@ -0,0 +1,49 @@
+android|ios|winrt {
+ error( "This example is not supported for android, ios, or winrt." )
+}
+
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+QT += widgets
+requires(qtConfig(fontcombobox))
+requires(qtConfig(combobox))
+
+SOURCES += main.cpp \
+ bargraph.cpp \
+ graphmodifier.cpp \
+ rainfalldata.cpp \
+ variantdataset.cpp \
+ variantbardataproxy.cpp \
+ variantbardatamapping.cpp \
+ scattergraph.cpp \
+ scatterdatamodifier.cpp \
+ axesinputhandler.cpp \
+ surfacegraph.cpp \
+ surfacegraphmodifier.cpp \
+ custominputhandler.cpp \
+ highlightseries.cpp \
+ topographicseries.cpp
+
+HEADERS += \
+ bargraph.h \
+ graphmodifier.h \
+ rainfalldata.h \
+ variantdataset.h \
+ variantbardataproxy.h \
+ variantbardatamapping.h \
+ scattergraph.h \
+ scatterdatamodifier.h \
+ axesinputhandler.h \
+ surfacegraph.h \
+ surfacegraphmodifier.h \
+ custominputhandler.h \
+ highlightseries.h \
+ topographicseries.h
+
+RESOURCES += graphgallery.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ data/*
diff --git a/examples/datavisualization/graphgallery/graphgallery.qrc b/examples/datavisualization/graphgallery/graphgallery.qrc
new file mode 100644
index 00000000..6df5703d
--- /dev/null
+++ b/examples/datavisualization/graphgallery/graphgallery.qrc
@@ -0,0 +1,13 @@
+<RCC>
+ <qresource prefix="/">
+ <file>data/raindata.txt</file>
+ <file>data/layer_1.png</file>
+ <file>data/layer_2.png</file>
+ <file>data/layer_3.png</file>
+ <file>data/refinery.obj</file>
+ <file>data/oilrig.obj</file>
+ <file>data/pipe.obj</file>
+ <file>data/maptexture.jpg</file>
+ <file>data/topography.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/bars/graphmodifier.cpp b/examples/datavisualization/graphgallery/graphmodifier.cpp
index a130b0ff..b0cb6f48 100644
--- a/examples/datavisualization/bars/graphmodifier.cpp
+++ b/examples/datavisualization/graphgallery/graphmodifier.cpp
@@ -1,33 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "graphmodifier.h"
+#include "rainfalldata.h"
+
#include <QtDataVisualization/qcategory3daxis.h>
#include <QtDataVisualization/qvalue3daxis.h>
#include <QtDataVisualization/qbardataproxy.h>
@@ -35,33 +11,26 @@
#include <QtDataVisualization/q3dcamera.h>
#include <QtDataVisualization/qbar3dseries.h>
#include <QtDataVisualization/q3dtheme.h>
-#include <QtCore/QTime>
-#include <QtWidgets/QComboBox>
#include <QtCore/qmath.h>
+#include <QtWidgets/qcombobox.h>
-using namespace QtDataVisualization;
+using namespace Qt::StringLiterals;
-const QString celsiusString = QString(QChar(0xB0)) + "C";
+// TODO: Many of the values do not affect custom proxy series now - should be fixed
//! [0]
-GraphModifier::GraphModifier(Q3DBars *bargraph)
- : m_graph(bargraph),
- m_xRotation(0.0f),
- m_yRotation(0.0f),
- m_fontSize(30),
- m_segments(4),
- m_subSegments(3),
- m_minval(-20.0f),
- m_maxval(20.0f),
+GraphModifier::GraphModifier(Q3DBars *bargraph, QObject *parent) :
+ QObject(parent),
+ m_graph(bargraph),
+ //! [0]
//! [1]
m_temperatureAxis(new QValue3DAxis),
m_yearAxis(new QCategory3DAxis),
m_monthAxis(new QCategory3DAxis),
m_primarySeries(new QBar3DSeries),
m_secondarySeries(new QBar3DSeries),
- //! [1]
- m_barMesh(QAbstract3DSeries::MeshBevelBar),
- m_smooth(false)
+ m_celsiusString(u"°C"_s)
+ //! [1]
{
//! [2]
m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftMedium);
@@ -71,15 +40,16 @@ GraphModifier::GraphModifier(Q3DBars *bargraph)
m_graph->setMultiSeriesUniform(true);
//! [2]
- m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
- m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012" << "2013";
+ m_months = {"January", "February", "March", "April", "May", "June" , "July",
+ "August", "September", "October" , "November", "December"};
+ m_years = {"2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022"};
//! [3]
m_temperatureAxis->setTitle("Average temperature");
m_temperatureAxis->setSegmentCount(m_segments);
m_temperatureAxis->setSubSegmentCount(m_subSegments);
m_temperatureAxis->setRange(m_minval, m_maxval);
- m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%.1f ") + celsiusString));
+ m_temperatureAxis->setLabelFormat(u"%.1f "_s + m_celsiusString);
m_temperatureAxis->setLabelAutoRotation(30.0f);
m_temperatureAxis->setTitleVisible(true);
@@ -95,32 +65,32 @@ GraphModifier::GraphModifier(Q3DBars *bargraph)
m_graph->setColumnAxis(m_monthAxis);
//! [3]
- //! [8]
- m_primarySeries->setItemLabelFormat(QStringLiteral("Oulu - @colLabel @rowLabel: @valueLabel"));
+ //! [4]
+ m_primarySeries->setItemLabelFormat(u"Oulu - @colLabel @rowLabel: @valueLabel"_s);
m_primarySeries->setMesh(QAbstract3DSeries::MeshBevelBar);
m_primarySeries->setMeshSmooth(false);
- m_secondarySeries->setItemLabelFormat(QStringLiteral("Helsinki - @colLabel @rowLabel: @valueLabel"));
+ m_secondarySeries->setItemLabelFormat(u"Helsinki - @colLabel @rowLabel: @valueLabel"_s);
m_secondarySeries->setMesh(QAbstract3DSeries::MeshBevelBar);
m_secondarySeries->setMeshSmooth(false);
m_secondarySeries->setVisible(false);
- //! [8]
-
//! [4]
+
+ //! [5]
m_graph->addSeries(m_primarySeries);
m_graph->addSeries(m_secondarySeries);
- //! [4]
+ //! [5]
//! [6]
changePresetCamera();
//! [6]
- //! [9]
+ //! [8]
resetTemperatureData();
- //! [9]
+ //! [8]
// Set up property animations for zooming to the selected bar
- //! [12]
+ //! [11]
Q3DCamera *camera = m_graph->scene()->activeCamera();
m_defaultAngleX = camera->xRotation();
m_defaultAngleY = camera->yRotation();
@@ -150,53 +120,54 @@ GraphModifier::GraphModifier(Q3DBars *bargraph)
m_animationCameraZoom.setKeyValueAt(zoomOutFraction, QVariant::fromValue(50.0f));
m_animationCameraTarget.setKeyValueAt(zoomOutFraction,
QVariant::fromValue(QVector3D(0.0f, 0.0f, 0.0f)));
- //! [12]
+ //! [11]
+
+ m_customData = new RainfallData();
}
-//! [0]
GraphModifier::~GraphModifier()
{
- delete m_graph;
+ delete m_customData;
}
void GraphModifier::resetTemperatureData()
{
- //! [5]
+ //! [9a]
// Set up data
static const float tempOulu[8][12] = {
- {-6.7f, -11.7f, -9.7f, 3.3f, 9.2f, 14.0f, 16.3f, 17.8f, 10.2f, 2.1f, -2.6f, -0.3f}, // 2006
- {-6.8f, -13.3f, 0.2f, 1.5f, 7.9f, 13.4f, 16.1f, 15.5f, 8.2f, 5.4f, -2.6f, -0.8f}, // 2007
- {-4.2f, -4.0f, -4.6f, 1.9f, 7.3f, 12.5f, 15.0f, 12.8f, 7.6f, 5.1f, -0.9f, -1.3f}, // 2008
- {-7.8f, -8.8f, -4.2f, 0.7f, 9.3f, 13.2f, 15.8f, 15.5f, 11.2f, 0.6f, 0.7f, -8.4f}, // 2009
- {-14.4f, -12.1f, -7.0f, 2.3f, 11.0f, 12.6f, 18.8f, 13.8f, 9.4f, 3.9f, -5.6f, -13.0f}, // 2010
- {-9.0f, -15.2f, -3.8f, 2.6f, 8.3f, 15.9f, 18.6f, 14.9f, 11.1f, 5.3f, 1.8f, -0.2f}, // 2011
- {-8.7f, -11.3f, -2.3f, 0.4f, 7.5f, 12.2f, 16.4f, 14.1f, 9.2f, 3.1f, 0.3f, -12.1f}, // 2012
- {-7.9f, -5.3f, -9.1f, 0.8f, 11.6f, 16.6f, 15.9f, 15.5f, 11.2f, 4.0f, 0.1f, -1.9f} // 2013
+ {-7.4f, -2.4f, 0.0f, 3.0f, 8.2f, 11.6f, 14.7f, 15.4f, 11.4f, 4.2f, 2.1f, -2.3f}, // 2015
+ {-13.4f, -3.9f, -1.8f, 3.1f, 10.6f, 13.7f, 17.8f, 13.6f, 10.7f, 3.5f, -3.1f, -4.2f}, // 2016
+ //! [9a]
+ {-5.7f, -6.7f, -3.0f, -0.1f, 4.7f, 12.4f, 16.1f, 14.1f, 9.4f, 3.0f, -0.3f, -3.2f}, // 2017
+ {-6.4f, -11.9f, -7.4f, 1.9f, 11.4f, 12.4f, 21.5f, 16.1f, 11.0f, 4.4f, 2.1f, -4.1f}, // 2018
+ {-11.7f, -6.1f, -2.4f, 3.9f, 7.2f, 14.5f, 15.6f, 14.4f, 8.5f, 2.0f, -3.0f, -1.5f}, // 2019
+ {-2.1f, -3.4f, -1.8f, 0.6f, 7.0f, 17.1f, 15.6f, 15.4f, 11.1f, 5.6f, 1.9f, -1.7f}, // 2020
+ {-9.6f, -11.6f, -3.2f, 2.4f, 7.8f, 17.3f, 19.4f, 14.2f, 8.0f, 5.2f, -2.2f, -8.6f}, // 2021
+ {-7.3f, -6.4f, -1.8f, 1.3f, 8.1f, 15.5f, 17.6f, 17.6f, 9.1f, 5.4f, -1.5f, -4.4f} // 2022
};
static const float tempHelsinki[8][12] = {
- {-3.7f, -7.8f, -5.4f, 3.4f, 10.7f, 15.4f, 18.6f, 18.7f, 14.3f, 8.5f, 2.9f, 4.1f}, // 2006
- {-1.2f, -7.5f, 3.1f, 5.5f, 10.3f, 15.9f, 17.4f, 17.9f, 11.2f, 7.3f, 1.1f, 0.5f}, // 2007
- {-0.6f, 1.2f, 0.2f, 6.3f, 10.2f, 13.8f, 18.1f, 15.1f, 10.1f, 9.4f, 2.5f, 0.4f}, // 2008
- {-2.9f, -3.5f, -0.9f, 4.7f, 10.9f, 14.0f, 17.4f, 16.8f, 13.2f, 4.1f, 2.6f, -2.3f}, // 2009
- {-10.2f, -8.0f, -1.9f, 6.6f, 11.3f, 14.5f, 21.0f, 18.8f, 12.6f, 6.1f, -0.5f, -7.3f}, // 2010
- {-4.4f, -9.1f, -2.0f, 5.5f, 9.9f, 15.6f, 20.8f, 17.8f, 13.4f, 8.9f, 3.6f, 1.5f}, // 2011
- {-3.5f, -3.2f, -0.7f, 4.0f, 11.1f, 13.4f, 17.3f, 15.8f, 13.1f, 6.4f, 4.1f, -5.1f}, // 2012
- {-4.8f, -1.8f, -5.0f, 2.9f, 12.8f, 17.2f, 18.0f, 17.1f, 12.5f, 7.5f, 4.5f, 2.3f} // 2013
+ {-2.0f, -0.1f, 1.8f, 5.1f, 9.7f, 13.7f, 16.3f, 17.3f, 12.7f, 5.4f, 4.6f, 2.1f}, // 2015
+ {-10.3f, -0.6f, 0.0f, 4.9f, 14.3f, 15.7f, 17.7f, 16.0f, 12.7f, 4.6f, -1.0f, -0.9f}, // 2016
+ {-2.9f, -3.3f, 0.7f, 2.3f, 9.9f, 13.8f, 16.1f, 15.9f, 11.4f, 5.0f, 2.7f, 0.7f}, // 2017
+ {-2.2f, -8.4f, -4.7f, 5.0f, 15.3f, 15.8f, 21.2f, 18.2f, 13.3f, 6.7f, 2.8f, -2.0f}, // 2018
+ {-6.2f, -0.5f, -0.3f, 6.8f, 10.6f, 17.9f, 17.5f, 16.8f, 11.3f, 5.2f, 1.8f, 1.4f}, // 2019
+ {1.9f, 0.5f, 1.7f, 4.5f, 9.5f, 18.4f, 16.5f, 16.8f, 13.0f, 8.2f, 4.4f, 0.9f}, // 2020
+ {-4.7f, -8.1f, -0.9f, 4.5f, 10.4f, 19.2f, 20.9f, 15.4f, 9.5f, 8.0f, 1.5f, -6.7f}, // 2021
+ {-3.3f, -2.2f, -0.2f, 3.3f, 9.6f, 16.9f, 18.1f, 18.9f, 9.2f, 7.6f, 2.3f, -3.4f} // 2022
};
// Create data arrays
- QBarDataArray *dataSet = new QBarDataArray;
- QBarDataArray *dataSet2 = new QBarDataArray;
- QBarDataRow *dataRow;
- QBarDataRow *dataRow2;
+ //! [9b]
+ auto *dataSet = new QBarDataArray;
+ auto *dataSet2 = new QBarDataArray;
dataSet->reserve(m_years.size());
- for (int year = 0; year < m_years.size(); year++) {
+ for (qsizetype year = 0; year < m_years.size(); ++year) {
// Create a data row
- dataRow = new QBarDataRow(m_months.size());
- dataRow2 = new QBarDataRow(m_months.size());
- for (int month = 0; month < m_months.size(); month++) {
+ auto *dataRow = new QBarDataRow(m_months.size());
+ auto *dataRow2 = new QBarDataRow(m_months.size());
+ for (qsizetype month = 0; month < m_months.size(); ++month) {
// Add data to the row
(*dataRow)[month].setValue(tempOulu[year][month]);
(*dataRow2)[month].setValue(tempHelsinki[year][month]);
@@ -209,7 +180,7 @@ void GraphModifier::resetTemperatureData()
// Add data to the data proxy (the data proxy assumes ownership of it)
m_primarySeries->dataProxy()->resetArray(dataSet, m_years, m_months);
m_secondarySeries->dataProxy()->resetArray(dataSet2, m_years, m_months);
- //! [5]
+ //! [9b]
}
void GraphModifier::changeRange(int range)
@@ -222,11 +193,12 @@ void GraphModifier::changeRange(int range)
void GraphModifier::changeStyle(int style)
{
- QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
+ auto *comboBox = qobject_cast<QComboBox *>(sender());
if (comboBox) {
- m_barMesh = QAbstract3DSeries::Mesh(comboBox->itemData(style).toInt());
+ m_barMesh = comboBox->itemData(style).value<QAbstract3DSeries::Mesh>();
m_primarySeries->setMesh(m_barMesh);
m_secondarySeries->setMesh(m_barMesh);
+ m_customData->customSeries()->setMesh(m_barMesh);
}
}
@@ -240,14 +212,14 @@ void GraphModifier::changePresetCamera()
// Restore camera target in case animation has changed it
m_graph->scene()->activeCamera()->setTarget(QVector3D(0.0f, 0.0f, 0.0f));
- //! [10]
+ //! [7]
static int preset = Q3DCamera::CameraPresetFront;
m_graph->scene()->activeCamera()->setCameraPreset((Q3DCamera::CameraPreset)preset);
if (++preset > Q3DCamera::CameraPresetDirectlyBelow)
preset = Q3DCamera::CameraPresetFrontLow;
- //! [10]
+ //! [7]
}
void GraphModifier::changeTheme(int theme)
@@ -267,7 +239,7 @@ void GraphModifier::changeLabelBackground()
void GraphModifier::changeSelectionMode(int selectionMode)
{
- QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
+ auto *comboBox = qobject_cast<QComboBox *>(sender());
if (comboBox) {
int flags = comboBox->itemData(selectionMode).toInt();
m_graph->setSelectionMode(QAbstract3DGraph::SelectionFlags(flags));
@@ -316,7 +288,6 @@ void GraphModifier::setAxisTitleFixed(bool enabled)
m_yearAxis->setTitleFixed(enabled);
}
-//! [11]
void GraphModifier::zoomToSelectedBar()
{
m_animationCameraX.stop();
@@ -341,7 +312,7 @@ void GraphModifier::zoomToSelectedBar()
if (selectedBar != QBar3DSeries::invalidSelectionPosition()) {
// Normalize selected bar position within axis range to determine target coordinates
- //! [13]
+ //! [12]
QVector3D endTarget;
float xMin = m_graph->columnAxis()->min();
float xRange = m_graph->columnAxis()->max() - xMin;
@@ -349,10 +320,10 @@ void GraphModifier::zoomToSelectedBar()
float zRange = m_graph->rowAxis()->max() - zMin;
endTarget.setX((selectedBar.y() - xMin) / xRange * 2.0f - 1.0f);
endTarget.setZ((selectedBar.x() - zMin) / zRange * 2.0f - 1.0f);
- //! [13]
+ //! [12]
// Rotate the camera so that it always points approximately to the graph center
- //! [15]
+ //! [14]
qreal endAngleX = 90.0 - qRadiansToDegrees(qAtan(qreal(endTarget.z() / endTarget.x())));
if (endTarget.x() > 0.0f)
endAngleX -= 180.0f;
@@ -361,14 +332,14 @@ void GraphModifier::zoomToSelectedBar()
float endAngleY = barValue >= 0.0f ? 30.0f : -30.0f;
if (m_graph->valueAxis()->reversed())
endAngleY *= -1.0f;
- //! [15]
+ //! [14]
m_animationCameraX.setEndValue(QVariant::fromValue(float(endAngleX)));
m_animationCameraY.setEndValue(QVariant::fromValue(endAngleY));
m_animationCameraZoom.setEndValue(QVariant::fromValue(250));
- //! [14]
+ //! [13]
m_animationCameraTarget.setEndValue(QVariant::fromValue(endTarget));
- //! [14]
+ //! [13]
} else {
// No selected bar, so return to the default view
m_animationCameraX.setEndValue(QVariant::fromValue(m_defaultAngleX));
@@ -382,7 +353,18 @@ void GraphModifier::zoomToSelectedBar()
m_animationCameraZoom.start();
m_animationCameraTarget.start();
}
-//! [11]
+
+void GraphModifier::setDataModeToWeather(bool enabled)
+{
+ if (enabled)
+ changeDataMode(false);
+}
+
+void GraphModifier::setDataModeToCustom(bool enabled)
+{
+ if (enabled)
+ changeDataMode(true);
+}
void GraphModifier::changeShadowQuality(int quality)
{
@@ -391,19 +373,19 @@ void GraphModifier::changeShadowQuality(int quality)
emit shadowQualityChanged(quality);
}
-//! [7]
+//! [10]
void GraphModifier::rotateX(int rotation)
{
m_xRotation = rotation;
m_graph->scene()->activeCamera()->setCameraPosition(m_xRotation, m_yRotation);
}
+//! [10]
void GraphModifier::rotateY(int rotation)
{
m_yRotation = rotation;
m_graph->scene()->activeCamera()->setCameraPosition(m_xRotation, m_yRotation);
}
-//! [7]
void GraphModifier::setBackgroundEnabled(int enabled)
{
@@ -420,6 +402,7 @@ void GraphModifier::setSmoothBars(int smooth)
m_smooth = bool(smooth);
m_primarySeries->setMeshSmooth(m_smooth);
m_secondarySeries->setMeshSmooth(m_smooth);
+ m_customData->customSeries()->setMeshSmooth(m_smooth);
}
void GraphModifier::setSeriesVisibility(int enabled)
@@ -436,3 +419,23 @@ void GraphModifier::setReflection(bool enabled)
{
m_graph->setReflection(enabled);
}
+
+void GraphModifier::changeDataMode(bool customData)
+{
+ // Change between weather data and data from custom proxy
+ if (customData) {
+ m_graph->removeSeries(m_primarySeries);
+ m_graph->removeSeries(m_secondarySeries);
+ m_graph->addSeries(m_customData->customSeries());
+ m_graph->setValueAxis(m_customData->valueAxis());
+ m_graph->setRowAxis(m_customData->rowAxis());
+ m_graph->setColumnAxis(m_customData->colAxis());
+ } else {
+ m_graph->removeSeries(m_customData->customSeries());
+ m_graph->addSeries(m_primarySeries);
+ m_graph->addSeries(m_secondarySeries);
+ m_graph->setValueAxis(m_temperatureAxis);
+ m_graph->setRowAxis(m_yearAxis);
+ m_graph->setColumnAxis(m_monthAxis);
+ }
+}
diff --git a/examples/datavisualization/graphgallery/graphmodifier.h b/examples/datavisualization/graphgallery/graphmodifier.h
new file mode 100644
index 00000000..0d112c0d
--- /dev/null
+++ b/examples/datavisualization/graphgallery/graphmodifier.h
@@ -0,0 +1,87 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef GRAPHMODIFIER_H
+#define GRAPHMODIFIER_H
+
+#include <QtDataVisualization/q3dbars.h>
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtDataVisualization/qabstract3dseries.h>
+#include <QtCore/qpropertyanimation.h>
+
+class RainfallData;
+
+class GraphModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit GraphModifier(Q3DBars *bargraph, QObject *parent);
+ ~GraphModifier();
+
+ void resetTemperatureData();
+ void changePresetCamera();
+ void changeLabelBackground();
+ void changeFont(const QFont &font);
+ void changeFontSize(int fontsize);
+ void rotateX(int rotation);
+ void rotateY(int rotation);
+ void setBackgroundEnabled(int enabled);
+ void setGridEnabled(int enabled);
+ void setSmoothBars(int smooth);
+ void setSeriesVisibility(int enabled);
+ void setReverseValueAxis(int enabled);
+ void setReflection(bool enabled);
+ void changeDataMode(bool customData);
+
+public Q_SLOTS:
+ void changeRange(int range);
+ void changeStyle(int style);
+ void changeSelectionMode(int selectionMode);
+ void changeTheme(int theme);
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
+ void changeLabelRotation(int rotation);
+ void setAxisTitleVisibility(bool enabled);
+ void setAxisTitleFixed(bool enabled);
+ void zoomToSelectedBar();
+ void setDataModeToWeather(bool enabled);
+ void setDataModeToCustom(bool enabled);
+
+Q_SIGNALS:
+ void shadowQualityChanged(int quality);
+ void backgroundEnabledChanged(bool enabled);
+ void gridEnabledChanged(bool enabled);
+ void fontChanged(const QFont &font);
+ void fontSizeChanged(int size);
+
+private:
+ Q3DBars *m_graph = nullptr;
+ float m_xRotation = 0.f;
+ float m_yRotation = 0.f;
+ int m_fontSize = 30;
+ int m_segments = 4;
+ int m_subSegments = 3;
+ float m_minval = -20.f;
+ float m_maxval = 20.f;
+ QStringList m_months = {};
+ QStringList m_years = {};
+ QValue3DAxis *m_temperatureAxis = nullptr;
+ QCategory3DAxis *m_yearAxis = nullptr;
+ QCategory3DAxis *m_monthAxis = nullptr;
+ QBar3DSeries *m_primarySeries = nullptr;
+ QBar3DSeries *m_secondarySeries = nullptr;
+ QAbstract3DSeries::Mesh m_barMesh = QAbstract3DSeries::MeshBevelBar;
+ bool m_smooth = false;
+ QPropertyAnimation m_animationCameraX = {};
+ QPropertyAnimation m_animationCameraY = {};
+ QPropertyAnimation m_animationCameraZoom = {};
+ QPropertyAnimation m_animationCameraTarget = {};
+ float m_defaultAngleX = 0.f;
+ float m_defaultAngleY = 0.f;
+ float m_defaultZoom = 0.f;
+ QVector3D m_defaultTarget = {};
+ const QString m_celsiusString;
+ RainfallData *m_customData = nullptr;
+};
+
+#endif
diff --git a/examples/datavisualization/texturesurface/highlightseries.cpp b/examples/datavisualization/graphgallery/highlightseries.cpp
index 7807c7ea..3f10b421 100644
--- a/examples/datavisualization/texturesurface/highlightseries.cpp
+++ b/examples/datavisualization/graphgallery/highlightseries.cpp
@@ -1,38 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "highlightseries.h"
-using namespace QtDataVisualization;
-
//! [2]
-const float darkRedPos = 1.0f;
+const float darkRedPos = 1.f;
const float redPos = 0.8f;
const float yellowPos = 0.6f;
const float greenPos = 0.4f;
@@ -40,8 +12,6 @@ const float darkGreenPos = 0.2f;
//! [2]
HighlightSeries::HighlightSeries()
- : m_width(100),
- m_height(100)
{
setDrawMode(QSurface3DSeries::DrawSurface);
setFlatShadingEnabled(true);
@@ -71,7 +41,6 @@ void HighlightSeries::handlePositionChange(const QPoint &position)
if (position == invalidSelectionPosition()) {
setVisible(false);
-
return;
}
@@ -94,16 +63,18 @@ void HighlightSeries::handlePositionChange(const QPoint &position)
QSurfaceDataProxy *srcProxy = m_topographicSeries->dataProxy();
const QSurfaceDataArray &srcArray = *srcProxy->array();
- QSurfaceDataArray *dataArray = new QSurfaceDataArray;
+ auto *dataArray = new QSurfaceDataArray;
dataArray->reserve(endZ - startZ);
- for (int i = startZ; i < endZ; i++) {
- QSurfaceDataRow *newRow = new QSurfaceDataRow(endX - startX);
+ for (int i = startZ; i < endZ; ++i) {
+ auto *newRow = new QSurfaceDataRow;
+ newRow->reserve(endX - startX);
QSurfaceDataRow *srcRow = srcArray.at(i);
- for (int j = startX, p = 0; j < endX; j++, p++) {
+ for (int j = startX; j < endX; ++j) {
QVector3D pos = srcRow->at(j).position();
- (*newRow)[p].setPosition(QVector3D(pos.x(), pos.y() + 0.1f, pos.z()));
+ pos.setY(pos.y() + 0.1f);
+ newRow->append(QSurfaceDataItem(pos));
}
- *dataArray << newRow;
+ dataArray->append(newRow);
}
dataProxy()->resetArray(dataArray);
@@ -117,7 +88,7 @@ void HighlightSeries::handleGradientChange(float value)
float ratio = m_minHeight / value;
QLinearGradient gr;
- gr.setColorAt(0.0f, Qt::black);
+ gr.setColorAt(0.f, Qt::black);
gr.setColorAt(darkGreenPos * ratio, Qt::darkGreen);
gr.setColorAt(greenPos * ratio, Qt::green);
gr.setColorAt(yellowPos * ratio, Qt::yellow);
diff --git a/examples/datavisualization/graphgallery/highlightseries.h b/examples/datavisualization/graphgallery/highlightseries.h
new file mode 100644
index 00000000..c74a6b84
--- /dev/null
+++ b/examples/datavisualization/graphgallery/highlightseries.h
@@ -0,0 +1,35 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef HIGHLIGHTSERIES_H
+#define HIGHLIGHTSERIES_H
+
+#include <QtDataVisualization/qsurface3dseries.h>
+
+#include "topographicseries.h"
+
+class HighlightSeries : public QSurface3DSeries
+{
+ Q_OBJECT
+public:
+ explicit HighlightSeries();
+ ~HighlightSeries();
+
+ void setTopographicSeries(TopographicSeries *series);
+ inline void setMinHeight(float height) { m_minHeight = height; }
+
+public Q_SLOTS:
+ void handlePositionChange(const QPoint &position);
+ void handleGradientChange(float value);
+
+private:
+ int m_width = 100;
+ int m_height = 100;
+ int m_srcWidth = 0;
+ int m_srcHeight = 0;
+ QPoint m_position = {};
+ TopographicSeries *m_topographicSeries = nullptr;
+ float m_minHeight = 0.f;
+};
+
+#endif // HIGHLIGHTSERIES_H
diff --git a/examples/datavisualization/graphgallery/main.cpp b/examples/datavisualization/graphgallery/main.cpp
new file mode 100644
index 00000000..4bffa1c1
--- /dev/null
+++ b/examples/datavisualization/graphgallery/main.cpp
@@ -0,0 +1,52 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "bargraph.h"
+#include "scattergraph.h"
+#include "surfacegraph.h"
+
+#include <QtWidgets/qapplication.h>
+#include <QtWidgets/qmessagebox.h>
+#include <QtWidgets/qwidget.h>
+#include <QtWidgets/qtabwidget.h>
+#include <QtGui/qscreen.h>
+
+using namespace Qt::StringLiterals;
+
+int main(int argc, char **argv)
+{
+ qputenv("QSG_RHI_BACKEND", "opengl");
+
+ QApplication app(argc, argv);
+
+ // Create a tab widget for creating own tabs for Q3DBars, Q3DScatter, and Q3DSurface
+ QTabWidget tabWidget;
+ tabWidget.setWindowTitle(u"Graph Gallery"_s);
+
+ const QSize screenSize = tabWidget.screen()->size();
+ const QSize minimumGraphSize{screenSize.width() / 2, qRound(screenSize.height() / 1.75)};
+
+ // Create bar graph
+ BarGraph bars;
+ // Create scatter graph
+ ScatterGraph scatter;
+ // Create surface graph
+ SurfaceGraph surface;
+
+ if (!bars.initialize(minimumGraphSize, screenSize)
+ || !scatter.initialize(minimumGraphSize, screenSize)
+ || !surface.initialize(minimumGraphSize, screenSize)) {
+ QMessageBox::warning(nullptr, u"Graph Gallery"_s, u"Couldn't initialize the OpenGL context."_s);
+ return -1;
+ }
+
+ // Add bars widget
+ tabWidget.addTab(bars.barsWidget(), u"Bar Graph"_s);
+ // Add scatter widget
+ tabWidget.addTab(scatter.scatterWidget(), u"Scatter Graph"_s);
+ // Add surface widget
+ tabWidget.addTab(surface.surfaceWidget(), u"Surface Graph"_s);
+
+ tabWidget.show();
+ return app.exec();
+}
diff --git a/examples/datavisualization/graphgallery/rainfalldata.cpp b/examples/datavisualization/graphgallery/rainfalldata.cpp
new file mode 100644
index 00000000..66a2553a
--- /dev/null
+++ b/examples/datavisualization/graphgallery/rainfalldata.cpp
@@ -0,0 +1,117 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "rainfalldata.h"
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QtCore/qtextstream.h>
+#include <QtCore/qfile.h>
+
+using namespace Qt::StringLiterals;
+
+RainfallData::RainfallData()
+{
+ // In data file the months are in numeric format, so create custom list
+ for (int i = 1; i <= 12; ++i)
+ m_numericMonths << QString::number(i);
+
+ m_columnCount = m_numericMonths.size();
+
+ updateYearsList(2010, 2022);
+
+ // Create proxy and series
+ //! [0]
+ m_proxy = new VariantBarDataProxy;
+ m_series = new QBar3DSeries(m_proxy);
+ //! [0]
+
+ m_series->setItemLabelFormat(u"%.1f mm"_s);
+
+ // Create the axes
+ m_rowAxis = new QCategory3DAxis(this);
+ m_colAxis = new QCategory3DAxis(this);
+ m_valueAxis = new QValue3DAxis(this);
+ m_rowAxis->setAutoAdjustRange(true);
+ m_colAxis->setAutoAdjustRange(true);
+ m_valueAxis->setAutoAdjustRange(true);
+
+ // Set axis labels and titles
+ QStringList months{"January", "February", "March", "April",
+ "May", "June", "July", "August", "September", "October",
+ "November","December"};
+ m_rowAxis->setTitle("Year");
+ m_colAxis->setTitle("Month");
+ m_valueAxis->setTitle("rainfall (mm)");
+ m_valueAxis->setSegmentCount(5);
+ m_rowAxis->setLabels(m_years);
+ m_colAxis->setLabels(months);
+ m_rowAxis->setTitleVisible(true);
+ m_colAxis->setTitleVisible(true);
+ m_valueAxis->setTitleVisible(true);
+
+ addDataSet();
+}
+
+RainfallData::~RainfallData()
+{
+ delete m_mapping;
+ delete m_dataSet;
+ delete m_proxy;
+}
+
+void RainfallData::updateYearsList(int start, int end)
+{
+ m_years.clear();
+
+ for (int i = start; i <= end; ++i)
+ m_years << QString::number(i);
+
+ m_rowCount = m_years.size();
+}
+
+//! [1]
+void RainfallData::addDataSet()
+{
+ // Create a new variant data set and data item list
+ m_dataSet = new VariantDataSet;
+ auto *itemList = new VariantDataItemList;
+
+ // Read data from a data file into the data item list
+ QFile dataFile(":/data/raindata.txt");
+ if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream stream(&dataFile);
+ while (!stream.atEnd()) {
+ QString line = stream.readLine();
+ if (line.startsWith('#')) // Ignore comments
+ continue;
+ const auto strList = QStringView{line}.split(',', Qt::SkipEmptyParts);
+ // Each line has three data items: Year, month, and rainfall value
+ if (strList.size() < 3) {
+ qWarning() << "Invalid row read from data:" << line;
+ continue;
+ }
+ // Store year and month as strings, and rainfall value as double
+ // into a variant data item and add the item to the item list.
+ auto *newItem = new VariantDataItem;
+ for (int i = 0; i < 2; ++i)
+ newItem->append(strList.at(i).trimmed().toString());
+ newItem->append(strList.at(2).trimmed().toDouble());
+ itemList->append(newItem);
+ }
+ } else {
+ qWarning() << "Unable to open data file:" << dataFile.fileName();
+ }
+ //! [1]
+
+ //! [2]
+ // Add items to the data set and set it to the proxy
+ m_dataSet->addItems(itemList);
+ m_proxy->setDataSet(m_dataSet);
+
+ // Create new mapping for the data and set it to the proxy
+ m_mapping = new VariantBarDataMapping(0, 1, 2, m_years, m_numericMonths);
+ m_proxy->setMapping(m_mapping);
+ //! [2]
+}
diff --git a/examples/datavisualization/graphgallery/rainfalldata.h b/examples/datavisualization/graphgallery/rainfalldata.h
new file mode 100644
index 00000000..c71f072b
--- /dev/null
+++ b/examples/datavisualization/graphgallery/rainfalldata.h
@@ -0,0 +1,43 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef RAINFALLDATA_H
+#define RAINFALLDATA_H
+
+#include "variantbardataproxy.h"
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+
+class RainfallData : public QObject
+{
+ Q_OBJECT
+public:
+ explicit RainfallData();
+ ~RainfallData();
+
+ void addDataSet();
+
+ //! [0]
+ QBar3DSeries *customSeries() { return m_series; }
+ //! [0]
+
+ QValue3DAxis *valueAxis() { return m_valueAxis; }
+ QCategory3DAxis *rowAxis() { return m_rowAxis; }
+ QCategory3DAxis *colAxis() { return m_colAxis; }
+
+private:
+ void updateYearsList(int start, int end);
+ int m_columnCount;
+ int m_rowCount;
+ QStringList m_years;
+ QStringList m_numericMonths;
+ VariantBarDataProxy *m_proxy;
+ VariantBarDataMapping *m_mapping;
+ VariantDataSet *m_dataSet;
+ QBar3DSeries *m_series;
+ QValue3DAxis *m_valueAxis;
+ QCategory3DAxis *m_rowAxis;
+ QCategory3DAxis *m_colAxis;
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/scatterdatamodifier.cpp b/examples/datavisualization/graphgallery/scatterdatamodifier.cpp
new file mode 100644
index 00000000..1f3ec7ed
--- /dev/null
+++ b/examples/datavisualization/graphgallery/scatterdatamodifier.cpp
@@ -0,0 +1,191 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "scatterdatamodifier.h"
+#include <QtDataVisualization/qscatterdataproxy.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qscatter3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qrandom.h>
+#include <QtWidgets/qcombobox.h>
+
+using namespace Qt::StringLiterals;
+
+//#define RANDOM_SCATTER // Uncomment this to switch to random scatter
+
+const int numberOfItems = 10000;
+const float curveDivider = 7.5f;
+const int lowerNumberOfItems = 900;
+const float lowerCurveDivider = 0.75f;
+
+ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter, QObject *parent) :
+ QObject(parent),
+ m_graph(scatter),
+ m_itemCount(lowerNumberOfItems),
+ m_curveDivider(lowerCurveDivider),
+ //! [7]
+ m_inputHandler(new AxesInputHandler(scatter))
+ //! [7]
+{
+ //! [0]
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeStoneMoss);
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftHigh);
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
+ m_graph->scene()->activeCamera()->setZoomLevel(80.f);
+ //! [0]
+
+ //! [1]
+ auto *proxy = new QScatterDataProxy;
+ auto *series = new QScatter3DSeries(proxy);
+ series->setItemLabelFormat(u"@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"_s);
+ series->setMeshSmooth(m_smooth);
+ m_graph->addSeries(series);
+ //! [1]
+
+ //! [8]
+ // Give ownership of the handler to the graph and make it the active handler
+ m_graph->setActiveInputHandler(m_inputHandler);
+ //! [8]
+
+ //! [9]
+ // Give our axes to the input handler
+ m_inputHandler->setAxes(m_graph->axisX(), m_graph->axisZ(), m_graph->axisY());
+ //! [9]
+
+ //! [2]
+ addData();
+ //! [2]
+}
+
+void ScatterDataModifier::addData()
+{
+ // Configure the axes according to the data
+ //! [3]
+ m_graph->axisX()->setTitle("X");
+ m_graph->axisY()->setTitle("Y");
+ m_graph->axisZ()->setTitle("Z");
+ //! [3]
+
+ //! [4]
+ auto *dataArray = new QScatterDataArray;
+ dataArray->reserve(m_itemCount);
+ //! [4]
+
+#ifdef RANDOM_SCATTER
+ for (int i = 0; i < m_itemCount; ++i)
+ dataArray->append(QScatterDataItem(randVector()));
+#else
+ //! [5]
+ const float limit = qSqrt(m_itemCount) / 2.0f;
+ for (int i = -limit; i < limit; ++i) {
+ for (int j = -limit; j < limit; ++j) {
+ const float x = float(i) + 0.5f;
+ const float y = qCos(qDegreesToRadians(float(i * j) / m_curveDivider));
+ const float z = float(j) + 0.5f;
+ dataArray->append(QScatterDataItem({x, y, z}));
+ }
+ }
+ //! [5]
+#endif
+
+ //! [6]
+ m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);
+ //! [6]
+}
+
+void ScatterDataModifier::changeStyle(int style)
+{
+ QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
+ if (comboBox) {
+ m_style = comboBox->itemData(style).value<QAbstract3DSeries::Mesh>();
+ if (!m_graph->seriesList().isEmpty())
+ m_graph->seriesList().at(0)->setMesh(m_style);
+ }
+}
+
+void ScatterDataModifier::setSmoothDots(int smooth)
+{
+ m_smooth = bool(smooth);
+ QScatter3DSeries *series = m_graph->seriesList().at(0);
+ series->setMeshSmooth(m_smooth);
+}
+
+void ScatterDataModifier::changeTheme(int theme)
+{
+ Q3DTheme *currentTheme = m_graph->activeTheme();
+ currentTheme->setType(Q3DTheme::Theme(theme));
+ emit backgroundEnabledChanged(currentTheme->isBackgroundEnabled());
+ emit gridEnabledChanged(currentTheme->isGridEnabled());
+}
+
+void ScatterDataModifier::changePresetCamera()
+{
+ static int preset = Q3DCamera::CameraPresetFrontLow;
+
+ m_graph->scene()->activeCamera()->setCameraPreset((Q3DCamera::CameraPreset)preset);
+
+ if (++preset > Q3DCamera::CameraPresetDirectlyBelow)
+ preset = Q3DCamera::CameraPresetFrontLow;
+}
+
+void ScatterDataModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality sq)
+{
+ int quality = int(sq);
+ emit shadowQualityChanged(quality); // connected to a checkbox in scattergraph.cpp
+}
+
+void ScatterDataModifier::changeShadowQuality(int quality)
+{
+ QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality);
+ m_graph->setShadowQuality(sq);
+}
+
+void ScatterDataModifier::setBackgroundEnabled(int enabled)
+{
+ m_graph->activeTheme()->setBackgroundEnabled(enabled == Qt::Checked);
+}
+
+void ScatterDataModifier::setGridEnabled(int enabled)
+{
+ m_graph->activeTheme()->setGridEnabled(enabled == Qt::Checked);
+}
+
+void ScatterDataModifier::toggleItemCount()
+{
+ if (m_itemCount == numberOfItems) {
+ m_itemCount = lowerNumberOfItems;
+ m_curveDivider = lowerCurveDivider;
+ } else {
+ m_itemCount = numberOfItems;
+ m_curveDivider = curveDivider;
+ }
+ m_graph->seriesList().at(0)->dataProxy()->resetArray(0);
+ addData();
+}
+
+void ScatterDataModifier::toggleRanges()
+{
+ if (!m_autoAdjust) {
+ m_graph->axisX()->setAutoAdjustRange(true);
+ m_graph->axisZ()->setAutoAdjustRange(true);
+ m_inputHandler->setDragSpeedModifier(1.5f);
+ m_autoAdjust = true;
+ } else {
+ m_graph->axisX()->setRange(-10.0f, 10.0f);
+ m_graph->axisZ()->setRange(-10.0f, 10.0f);
+ m_inputHandler->setDragSpeedModifier(15.0f);
+ m_autoAdjust = false;
+ }
+}
+
+QVector3D ScatterDataModifier::randVector()
+{
+ auto *generator = QRandomGenerator::global();
+ const auto x = float(generator->bounded(100)) / 2.0f - float(generator->bounded(100)) / 2.0f;
+ const auto y = float(generator->bounded(100)) / 100.0f - float(generator->bounded(100)) / 100.0f;
+ const auto z = float(generator->bounded(100)) / 2.0f - float(generator->bounded(100)) / 2.0f;
+ return {x, y, z};
+}
diff --git a/examples/datavisualization/graphgallery/scatterdatamodifier.h b/examples/datavisualization/graphgallery/scatterdatamodifier.h
new file mode 100644
index 00000000..53f557e6
--- /dev/null
+++ b/examples/datavisualization/graphgallery/scatterdatamodifier.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef SCATTERDATAMODIFIER_H
+#define SCATTERDATAMODIFIER_H
+
+#include "axesinputhandler.h"
+
+#include <QtDataVisualization/q3dscatter.h>
+#include <QtDataVisualization/qabstract3dseries.h>
+
+class ScatterDataModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit ScatterDataModifier(Q3DScatter *scatter, QObject *parent);
+
+ void addData();
+
+public Q_SLOTS:
+ void setBackgroundEnabled(int enabled);
+ void setGridEnabled(int enabled);
+ void setSmoothDots(int smooth);
+ void changePresetCamera();
+ void toggleItemCount();
+ void toggleRanges();
+ void changeStyle(int style);
+ void changeTheme(int theme);
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
+
+Q_SIGNALS:
+ void backgroundEnabledChanged(bool enabled);
+ void gridEnabledChanged(bool enabled);
+ void shadowQualityChanged(int quality);
+
+private:
+ QVector3D randVector();
+ Q3DScatter *m_graph = nullptr;
+ QAbstract3DSeries::Mesh m_style = QAbstract3DSeries::MeshSphere;
+ bool m_smooth = true;
+ int m_itemCount;
+ float m_curveDivider;
+
+ AxesInputHandler *m_inputHandler;
+ bool m_autoAdjust = true;
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/scattergraph.cpp b/examples/datavisualization/graphgallery/scattergraph.cpp
new file mode 100644
index 00000000..a426c10a
--- /dev/null
+++ b/examples/datavisualization/graphgallery/scattergraph.cpp
@@ -0,0 +1,142 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "scattergraph.h"
+#include "scatterdatamodifier.h"
+
+#include <QtWidgets/qboxlayout.h>
+#include <QtWidgets/qcheckbox.h>
+#include <QtWidgets/qcombobox.h>
+#include <QtWidgets/qlabel.h>
+#include <QtWidgets/qcommandlinkbutton.h>
+
+using namespace Qt::StringLiterals;
+
+ScatterGraph::ScatterGraph()
+{
+ m_scatterGraph = new Q3DScatter();
+}
+
+ScatterGraph::~ScatterGraph() = default;
+
+bool ScatterGraph::initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize)
+{
+ if (!m_scatterGraph->hasContext())
+ return false;
+
+ m_scatterWidget = new QWidget;
+ auto *hLayout = new QHBoxLayout(m_scatterWidget);
+ m_container = QWidget::createWindowContainer(m_scatterGraph, m_scatterWidget);
+ m_container->setMinimumSize(minimumGraphSize);
+ m_container->setMaximumSize(maximumGraphSize);
+ m_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_container->setFocusPolicy(Qt::StrongFocus);
+ hLayout->addWidget(m_container, 1);
+
+ auto *vLayout = new QVBoxLayout();
+ hLayout->addLayout(vLayout);
+
+ auto *cameraButton = new QCommandLinkButton(m_scatterWidget);
+ cameraButton->setText(u"Change camera preset"_s);
+ cameraButton->setDescription(u"Switch between a number of preset camera positions"_s);
+ cameraButton->setIconSize(QSize(0, 0));
+
+ auto *itemCountButton = new QCommandLinkButton(m_scatterWidget);
+ itemCountButton->setText(u"Toggle item count"_s);
+ itemCountButton->setDescription(u"Switch between 900 and 10000 data points"_s);
+ itemCountButton->setIconSize(QSize(0, 0));
+
+ auto *rangeButton = new QCommandLinkButton(m_scatterWidget);
+ rangeButton->setText(u"Toggle axis ranges"_s);
+ rangeButton->setDescription(u"Switch between automatic axis ranges and preset ranges"_s);
+ rangeButton->setIconSize(QSize(0, 0));
+
+ auto *backgroundCheckBox = new QCheckBox(m_scatterWidget);
+ backgroundCheckBox->setText(u"Show background"_s);
+ backgroundCheckBox->setChecked(true);
+
+ auto *gridCheckBox = new QCheckBox(m_scatterWidget);
+ gridCheckBox->setText(u"Show grid"_s);
+ gridCheckBox->setChecked(true);
+
+ auto *smoothCheckBox = new QCheckBox(m_scatterWidget);
+ smoothCheckBox->setText(u"Smooth dots"_s);
+ smoothCheckBox->setChecked(true);
+
+ auto *itemStyleList = new QComboBox(m_scatterWidget);
+ itemStyleList->addItem(u"Sphere"_s, QAbstract3DSeries::MeshSphere);
+ itemStyleList->addItem(u"Cube"_s, QAbstract3DSeries::MeshCube);
+ itemStyleList->addItem(u"Minimal"_s, QAbstract3DSeries::MeshMinimal);
+ itemStyleList->addItem(u"Point"_s, QAbstract3DSeries::MeshPoint);
+ itemStyleList->setCurrentIndex(0);
+
+ auto *themeList = new QComboBox(m_scatterWidget);
+ themeList->addItem(u"Qt"_s);
+ themeList->addItem(u"Primary Colors"_s);
+ themeList->addItem(u"Digia"_s);
+ themeList->addItem(u"Stone Moss"_s);
+ themeList->addItem(u"Army Blue"_s);
+ themeList->addItem(u"Retro"_s);
+ themeList->addItem(u"Ebony"_s);
+ themeList->addItem(u"Isabelle"_s);
+ themeList->setCurrentIndex(3);
+
+ auto *shadowQuality = new QComboBox(m_scatterWidget);
+ shadowQuality->addItem(u"None"_s);
+ shadowQuality->addItem(u"Low"_s);
+ shadowQuality->addItem(u"Medium"_s);
+ shadowQuality->addItem(u"High"_s);
+ shadowQuality->addItem(u"Low Soft"_s);
+ shadowQuality->addItem(u"Medium Soft"_s);
+ shadowQuality->addItem(u"High Soft"_s);
+ shadowQuality->setCurrentIndex(6);
+
+ vLayout->addWidget(cameraButton);
+ vLayout->addWidget(itemCountButton);
+ vLayout->addWidget(rangeButton);
+ vLayout->addWidget(backgroundCheckBox);
+ vLayout->addWidget(gridCheckBox);
+ vLayout->addWidget(smoothCheckBox);
+ vLayout->addWidget(new QLabel(u"Change dot style"_s));
+ vLayout->addWidget(itemStyleList);
+ vLayout->addWidget(new QLabel(u"Change theme"_s));
+ vLayout->addWidget(themeList);
+ vLayout->addWidget(new QLabel(u"Adjust shadow quality"_s));
+ vLayout->addWidget(shadowQuality, 1, Qt::AlignTop);
+
+ auto *modifier = new ScatterDataModifier(m_scatterGraph, this);
+
+ QObject::connect(cameraButton, &QCommandLinkButton::clicked, modifier,
+ &ScatterDataModifier::changePresetCamera);
+ QObject::connect(itemCountButton, &QCommandLinkButton::clicked, modifier,
+ &ScatterDataModifier::toggleItemCount);
+ QObject::connect(rangeButton, &QCommandLinkButton::clicked, modifier,
+ &ScatterDataModifier::toggleRanges);
+
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &ScatterDataModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &ScatterDataModifier::setGridEnabled);
+ QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
+ &ScatterDataModifier::setSmoothDots);
+
+ QObject::connect(modifier, &ScatterDataModifier::backgroundEnabledChanged,
+ backgroundCheckBox, &QCheckBox::setChecked);
+ QObject::connect(modifier, &ScatterDataModifier::gridEnabledChanged,
+ gridCheckBox, &QCheckBox::setChecked);
+ QObject::connect(itemStyleList, &QComboBox::currentIndexChanged, modifier,
+ &ScatterDataModifier::changeStyle);
+
+ QObject::connect(themeList, &QComboBox::currentIndexChanged, modifier,
+ &ScatterDataModifier::changeTheme);
+
+ QObject::connect(shadowQuality, &QComboBox::currentIndexChanged, modifier,
+ &ScatterDataModifier::changeShadowQuality);
+
+ QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+ QObject::connect(m_scatterGraph, &Q3DScatter::shadowQualityChanged, modifier,
+ &ScatterDataModifier::shadowQualityUpdatedByVisual);
+
+ return true;
+}
diff --git a/examples/datavisualization/graphgallery/scattergraph.h b/examples/datavisualization/graphgallery/scattergraph.h
new file mode 100644
index 00000000..eb8c7c52
--- /dev/null
+++ b/examples/datavisualization/graphgallery/scattergraph.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef SCATTERGRAPH_H
+#define SCATTERGRAPH_H
+
+#include <QtCore/qobject.h>
+#include <QtDataVisualization/q3dscatter.h>
+
+class ScatterGraph : public QObject
+{
+ Q_OBJECT
+public:
+ ScatterGraph();
+ ~ScatterGraph();
+
+ bool initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize);
+ QWidget *scatterWidget() { return m_scatterWidget; }
+
+private:
+ Q3DScatter *m_scatterGraph = nullptr;
+ QWidget *m_container = nullptr;
+ QWidget *m_scatterWidget = nullptr;
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/surfacegraph.cpp b/examples/datavisualization/graphgallery/surfacegraph.cpp
new file mode 100644
index 00000000..88cbc72f
--- /dev/null
+++ b/examples/datavisualization/graphgallery/surfacegraph.cpp
@@ -0,0 +1,346 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "surfacegraph.h"
+#include "surfacegraphmodifier.h"
+
+#include <QtWidgets/qboxlayout.h>
+#include <QtWidgets/qcheckbox.h>
+#include <QtWidgets/qcombobox.h>
+#include <QtWidgets/qradiobutton.h>
+#include <QtWidgets/qgroupbox.h>
+#include <QtWidgets/qlabel.h>
+#include <QtWidgets/qcommandlinkbutton.h>
+#include <QtGui/qpainter.h>
+
+using namespace Qt::StringLiterals;
+
+static QPixmap gradientBtoYPB_Pixmap()
+{
+ QLinearGradient grBtoY(0, 0, 1, 100);
+ grBtoY.setColorAt(1.f, Qt::black);
+ grBtoY.setColorAt(0.67f, Qt::blue);
+ grBtoY.setColorAt(0.33f, Qt::red);
+ grBtoY.setColorAt(0.f, Qt::yellow);
+ QPixmap pm(24, 100);
+ QPainter pmp(&pm);
+ pmp.setBrush(QBrush(grBtoY));
+ pmp.setPen(Qt::NoPen);
+ pmp.drawRect(0, 0, 24, 100);
+ return pm;
+}
+
+static QPixmap gradientGtoRPB_Pixmap()
+{
+ QLinearGradient grGtoR(0, 0, 1, 100);
+ grGtoR.setColorAt(1.f, Qt::darkGreen);
+ grGtoR.setColorAt(0.5f, Qt::yellow);
+ grGtoR.setColorAt(0.2f, Qt::red);
+ grGtoR.setColorAt(0.f, Qt::darkRed);
+ QPixmap pm(24, 100);
+ QPainter pmp(&pm);
+ pmp.setBrush(QBrush(grGtoR));
+ pmp.drawRect(0, 0, 24, 100);
+ return pm;
+}
+
+static QPixmap highlightPixmap()
+{
+ constexpr int height = 400;
+ constexpr int width = 110;
+ constexpr int border = 10;
+ QLinearGradient gr(0, 0, 1, height - 2 * border);
+ gr.setColorAt(1.f, Qt::black);
+ gr.setColorAt(0.8f, Qt::darkGreen);
+ gr.setColorAt(0.6f, Qt::green);
+ gr.setColorAt(0.4f, Qt::yellow);
+ gr.setColorAt(0.2f, Qt::red);
+ gr.setColorAt(0.f, Qt::darkRed);
+
+ QPixmap pmHighlight(width, height);
+ pmHighlight.fill(Qt::transparent);
+ QPainter pmpHighlight(&pmHighlight);
+ pmpHighlight.setBrush(QBrush(gr));
+ pmpHighlight.setPen(Qt::NoPen);
+ pmpHighlight.drawRect(border, border, 35, height - 2 * border);
+ pmpHighlight.setPen(Qt::black);
+ int step = (height - 2 * border) / 5;
+ for (int i = 0; i < 6; ++i) {
+ int yPos = i * step + border;
+ pmpHighlight.drawLine(border, yPos, 55, yPos);
+ const int height = 550 - (i * 110);
+ pmpHighlight.drawText(60, yPos + 2, QString::number(height) + u" m"_s);
+ }
+ return pmHighlight;
+}
+
+SurfaceGraph::SurfaceGraph()
+{
+ m_surfaceGraph = new Q3DSurface();
+}
+
+SurfaceGraph::~SurfaceGraph() = default;
+
+bool SurfaceGraph::initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize)
+{
+ if (!m_surfaceGraph->hasContext())
+ return false;
+
+ m_surfaceWidget = new QWidget;
+ auto *hLayout = new QHBoxLayout(m_surfaceWidget);
+ m_container = QWidget::createWindowContainer(m_surfaceGraph, m_surfaceWidget);
+ m_container->setMinimumSize(minimumGraphSize);
+ m_container->setMaximumSize(maximumGraphSize);
+ m_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_container->setFocusPolicy(Qt::StrongFocus);
+ hLayout->addWidget(m_container, 1);
+
+ auto *vLayout = new QVBoxLayout();
+ hLayout->addLayout(vLayout);
+ vLayout->setAlignment(Qt::AlignTop);
+
+ // Create control widgets
+ auto *modelGroupBox = new QGroupBox(u"Model"_s);
+
+ auto *sqrtSinModelRB = new QRadioButton(m_surfaceWidget);
+ sqrtSinModelRB->setText(u"Sqrt && Sin"_s);
+ sqrtSinModelRB->setChecked(false);
+
+ auto *heightMapModelRB = new QRadioButton(m_surfaceWidget);
+ heightMapModelRB->setText(u"Multiseries\nHeight Map"_s);
+ heightMapModelRB->setChecked(false);
+
+ auto *texturedModelRB = new QRadioButton(m_surfaceWidget);
+ texturedModelRB->setText(u"Textured\nTopography"_s);
+ texturedModelRB->setChecked(false);
+
+ auto *modelVBox = new QVBoxLayout;
+ modelVBox->addWidget(sqrtSinModelRB);
+ modelVBox->addWidget(heightMapModelRB);
+ modelVBox->addWidget(texturedModelRB);
+ modelGroupBox->setLayout(modelVBox);
+
+ auto *selectionGroupBox = new QGroupBox(u"Graph Selection Mode"_s);
+
+ auto *modeNoneRB = new QRadioButton(m_surfaceWidget);
+ modeNoneRB->setText(u"No selection"_s);
+ modeNoneRB->setChecked(false);
+
+ auto *modeItemRB = new QRadioButton(m_surfaceWidget);
+ modeItemRB->setText(u"Item"_s);
+ modeItemRB->setChecked(false);
+
+ auto *modeSliceRowRB = new QRadioButton(m_surfaceWidget);
+ modeSliceRowRB->setText(u"Row Slice"_s);
+ modeSliceRowRB->setChecked(false);
+
+ auto *modeSliceColumnRB = new QRadioButton(m_surfaceWidget);
+ modeSliceColumnRB->setText(u"Column Slice"_s);
+ modeSliceColumnRB->setChecked(false);
+
+ auto *selectionVBox = new QVBoxLayout;
+ selectionVBox->addWidget(modeNoneRB);
+ selectionVBox->addWidget(modeItemRB);
+ selectionVBox->addWidget(modeSliceRowRB);
+ selectionVBox->addWidget(modeSliceColumnRB);
+ selectionGroupBox->setLayout(selectionVBox);
+
+ auto *axisGroupBox = new QGroupBox(u"Axis ranges"_s);
+
+ auto *axisMinSliderX = new QSlider(Qt::Horizontal);
+ axisMinSliderX->setMinimum(0);
+ axisMinSliderX->setTickInterval(1);
+ axisMinSliderX->setEnabled(true);
+ auto *axisMaxSliderX = new QSlider(Qt::Horizontal);
+ axisMaxSliderX->setMinimum(1);
+ axisMaxSliderX->setTickInterval(1);
+ axisMaxSliderX->setEnabled(true);
+ auto *axisMinSliderZ = new QSlider(Qt::Horizontal);
+ axisMinSliderZ->setMinimum(0);
+ axisMinSliderZ->setTickInterval(1);
+ axisMinSliderZ->setEnabled(true);
+ auto *axisMaxSliderZ = new QSlider(Qt::Horizontal);
+ axisMaxSliderZ->setMinimum(1);
+ axisMaxSliderZ->setTickInterval(1);
+ axisMaxSliderZ->setEnabled(true);
+
+ auto *axisVBox = new QVBoxLayout;
+ axisVBox->addWidget(new QLabel(u"Column range"_s));
+ axisVBox->addWidget(axisMinSliderX);
+ axisVBox->addWidget(axisMaxSliderX);
+ axisVBox->addWidget(new QLabel(u"Row range"_s));
+ axisVBox->addWidget(axisMinSliderZ);
+ axisVBox->addWidget(axisMaxSliderZ);
+ axisGroupBox->setLayout(axisVBox);
+
+ // Mode-dependent controls
+ // sqrt-sin
+ auto *colorGroupBox = new QGroupBox(u"Custom gradient"_s);
+
+ QPixmap pixmap = gradientBtoYPB_Pixmap();
+ auto *gradientBtoYPB = new QPushButton(m_surfaceWidget);
+ gradientBtoYPB->setIcon(QIcon(pixmap));
+ gradientBtoYPB->setIconSize(pixmap.size());
+
+ pixmap = gradientGtoRPB_Pixmap();
+ auto *gradientGtoRPB = new QPushButton(m_surfaceWidget);
+ gradientGtoRPB->setIcon(QIcon(pixmap));
+ gradientGtoRPB->setIconSize(pixmap.size());
+ auto *colorHBox = new QHBoxLayout;
+ colorHBox->addWidget(gradientBtoYPB);
+ colorHBox->addWidget(gradientGtoRPB);
+ colorGroupBox->setLayout(colorHBox);
+
+ // Multiseries heightmap
+ auto *showGroupBox = new QGroupBox(u"_show Object"_s);
+ showGroupBox->setVisible(false);
+
+ auto *checkboxShowOilRigOne = new QCheckBox(u"Oil Rig 1"_s);
+ checkboxShowOilRigOne->setChecked(true);
+
+ auto *checkboxShowOilRigTwo = new QCheckBox(u"Oil Rig 2"_s);
+ checkboxShowOilRigTwo->setChecked(true);
+
+ auto *checkboxShowRefinery = new QCheckBox(u"Refinery"_s);
+
+ auto *showVBox = new QVBoxLayout;
+ showVBox->addWidget(checkboxShowOilRigOne);
+ showVBox->addWidget(checkboxShowOilRigTwo);
+ showVBox->addWidget(checkboxShowRefinery);
+ showGroupBox->setLayout(showVBox);
+
+ auto *visualsGroupBox = new QGroupBox(u"Visuals"_s);
+ visualsGroupBox->setVisible(false);
+
+ auto *checkboxVisualsSeeThrough = new QCheckBox(u"See-Through"_s);
+
+ auto *checkboxHighlightOil = new QCheckBox(u"Highlight Oil"_s);
+
+ auto *checkboxShowShadows = new QCheckBox(u"Shadows"_s);
+ checkboxShowShadows->setChecked(true);
+
+ auto *visualVBox = new QVBoxLayout;
+ visualVBox->addWidget(checkboxVisualsSeeThrough);
+ visualVBox->addWidget(checkboxHighlightOil);
+ visualVBox->addWidget(checkboxShowShadows);
+ visualsGroupBox->setLayout(visualVBox);
+
+ auto *labelSelection = new QLabel(u"Selection:"_s);
+ labelSelection->setVisible(false);
+
+ auto *labelSelectedItem = new QLabel(u"Nothing"_s);
+ labelSelectedItem->setVisible(false);
+
+ // Textured topography heightmap
+ auto *enableTexture = new QCheckBox(u"Surface texture"_s);
+ enableTexture->setVisible(false);
+
+ auto *label = new QLabel(m_surfaceWidget);
+ label->setPixmap(highlightPixmap());
+
+ auto *heightMapGroupBox = new QGroupBox(u"Highlight color map"_s);
+ auto *colorMapVBox = new QVBoxLayout;
+ colorMapVBox->addWidget(label);
+ heightMapGroupBox->setLayout(colorMapVBox);
+ heightMapGroupBox->setVisible(false);
+
+ // Populate vertical layout
+ // Common
+ vLayout->addWidget(modelGroupBox);
+ vLayout->addWidget(selectionGroupBox);
+ vLayout->addWidget(axisGroupBox);
+
+ // Sqrt Sin
+ vLayout->addWidget(colorGroupBox);
+
+ // Multiseries heightmap
+ vLayout->addWidget(showGroupBox);
+ vLayout->addWidget(visualsGroupBox);
+ vLayout->addWidget(labelSelection);
+ vLayout->addWidget(labelSelectedItem);
+
+ // Textured topography
+ vLayout->addWidget(heightMapGroupBox);
+ vLayout->addWidget(enableTexture);
+
+ // Create the controller
+ auto *modifier = new SurfaceGraphModifier(m_surfaceGraph, labelSelectedItem, this);
+
+ // Connect widget controls to controller
+ QObject::connect(heightMapModelRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::enableHeightMapModel);
+ QObject::connect(sqrtSinModelRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::enableSqrtSinModel);
+ QObject::connect(texturedModelRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::enableTopographyModel);
+
+ QObject::connect(modeNoneRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::toggleModeNone);
+ QObject::connect(modeItemRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::toggleModeItem);
+ QObject::connect(modeSliceRowRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::toggleModeSliceRow);
+ QObject::connect(modeSliceColumnRB, &QRadioButton::toggled,
+ modifier, &SurfaceGraphModifier::toggleModeSliceColumn);
+
+ QObject::connect(axisMinSliderX, &QSlider::valueChanged,
+ modifier, &SurfaceGraphModifier::adjustXMin);
+ QObject::connect(axisMaxSliderX, &QSlider::valueChanged,
+ modifier, &SurfaceGraphModifier::adjustXMax);
+ QObject::connect(axisMinSliderZ, &QSlider::valueChanged,
+ modifier, &SurfaceGraphModifier::adjustZMin);
+ QObject::connect(axisMaxSliderZ, &QSlider::valueChanged,
+ modifier, &SurfaceGraphModifier::adjustZMax);
+
+ // Mode dependent connections
+ QObject::connect(gradientBtoYPB, &QPushButton::pressed,
+ modifier, &SurfaceGraphModifier::setBlackToYellowGradient);
+ QObject::connect(gradientGtoRPB, &QPushButton::pressed,
+ modifier, &SurfaceGraphModifier::setGreenToRedGradient);
+
+ QObject::connect(checkboxShowOilRigOne, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleItemOne);
+ QObject::connect(checkboxShowOilRigTwo, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleItemTwo);
+ QObject::connect(checkboxShowRefinery, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleItemThree);
+
+ QObject::connect(checkboxVisualsSeeThrough, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleSeeThrough);
+ QObject::connect(checkboxHighlightOil, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleOilHighlight);
+ QObject::connect(checkboxShowShadows, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleShadows);
+
+ QObject::connect(enableTexture, &QCheckBox::stateChanged,
+ modifier, &SurfaceGraphModifier::toggleSurfaceTexture);
+
+ // Connections to disable features depending on mode
+ QObject::connect(sqrtSinModelRB, &QRadioButton::toggled,
+ colorGroupBox, &QGroupBox::setVisible);
+
+ QObject::connect(heightMapModelRB, &QRadioButton::toggled,
+ showGroupBox, &QGroupBox::setVisible);
+ QObject::connect(heightMapModelRB, &QRadioButton::toggled,
+ visualsGroupBox, &QGroupBox::setVisible);
+ QObject::connect(heightMapModelRB, &QRadioButton::toggled,
+ labelSelection, &QLabel::setVisible);
+ QObject::connect(heightMapModelRB, &QRadioButton::toggled,
+ labelSelectedItem, &QLabel::setVisible);
+
+ QObject::connect(texturedModelRB, &QRadioButton::toggled,
+ enableTexture, &QLabel::setVisible);
+ QObject::connect(texturedModelRB, &QRadioButton::toggled,
+ heightMapGroupBox, &QGroupBox::setVisible);
+
+ modifier->setAxisMinSliderX(axisMinSliderX);
+ modifier->setAxisMaxSliderX(axisMaxSliderX);
+ modifier->setAxisMinSliderZ(axisMinSliderZ);
+ modifier->setAxisMaxSliderZ(axisMaxSliderZ);
+
+ sqrtSinModelRB->setChecked(true);
+ modeItemRB->setChecked(true);
+ enableTexture->setChecked(true);
+
+ return true;
+}
diff --git a/examples/datavisualization/graphgallery/surfacegraph.h b/examples/datavisualization/graphgallery/surfacegraph.h
new file mode 100644
index 00000000..5ec29930
--- /dev/null
+++ b/examples/datavisualization/graphgallery/surfacegraph.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef SURFACEGRAPH_H
+#define SURFACEGRAPH_H
+
+#include <QtCore/qobject.h>
+#include <QtDataVisualization/q3dsurface.h>
+
+class SurfaceGraph : public QObject
+{
+ Q_OBJECT
+public:
+ SurfaceGraph();
+ ~SurfaceGraph();
+
+ bool initialize(const QSize &minimumGraphSize, const QSize &maximumGraphSize);
+ QWidget *surfaceWidget() { return m_surfaceWidget; }
+
+private:
+ Q3DSurface *m_surfaceGraph = nullptr;
+ QWidget *m_container = nullptr;
+ QWidget *m_surfaceWidget = nullptr;
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/surfacegraphmodifier.cpp b/examples/datavisualization/graphgallery/surfacegraphmodifier.cpp
new file mode 100644
index 00000000..190a96b9
--- /dev/null
+++ b/examples/datavisualization/graphgallery/surfacegraphmodifier.cpp
@@ -0,0 +1,647 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "surfacegraphmodifier.h"
+#include "highlightseries.h"
+#include "topographicseries.h"
+#include "custominputhandler.h"
+
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QtGui/qimage.h>
+#include <QtCore/qmath.h>
+
+using namespace Qt::StringLiterals;
+
+const int sampleCountX = 150;
+const int sampleCountZ = 150;
+const int heightMapGridStepX = 6;
+const int heightMapGridStepZ = 6;
+const float sampleMin = -8.f;
+const float sampleMax = 8.f;
+
+const float areaWidth = 8000.f;
+const float areaHeight = 8000.f;
+const float aspectRatio = 0.1389f;
+const float minRange = areaWidth * 0.49f;
+
+SurfaceGraphModifier::SurfaceGraphModifier(Q3DSurface *surface, QLabel *label, QObject *parent) :
+ QObject(parent),
+ m_graph(surface),
+ m_textField(label)
+{
+ m_graph->scene()->activeCamera()->setZoomLevel(85.f);
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricRight);
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeRetro);
+
+ m_graph->setAxisX(new QValue3DAxis);
+ m_graph->setAxisY(new QValue3DAxis);
+ m_graph->setAxisZ(new QValue3DAxis);
+
+ //
+ // Sqrt Sin
+ //
+ //! [0]
+ m_sqrtSinProxy = new QSurfaceDataProxy();
+ m_sqrtSinSeries = new QSurface3DSeries(m_sqrtSinProxy);
+ //! [0]
+ fillSqrtSinProxy();
+
+ //
+ // Multisurface heightmap
+ //
+ //! [2]
+ // Create the first surface layer
+ QImage heightMapImageOne(":/data/layer_1.png");
+ m_heightMapProxyOne = new QHeightMapSurfaceDataProxy(heightMapImageOne);
+ m_heightMapSeriesOne = new QSurface3DSeries(m_heightMapProxyOne);
+ m_heightMapSeriesOne->setItemLabelFormat(u"(@xLabel, @zLabel): @yLabel"_s);
+ m_heightMapProxyOne->setValueRanges(34.f, 40.f, 18.f, 24.f);
+ //! [2]
+
+ // Create the other 2 surface layers
+ QImage heightMapImageTwo(":/data/layer_2.png");
+ m_heightMapProxyTwo = new QHeightMapSurfaceDataProxy(heightMapImageTwo);
+ m_heightMapSeriesTwo = new QSurface3DSeries(m_heightMapProxyTwo);
+ m_heightMapSeriesTwo->setItemLabelFormat(u"(@xLabel, @zLabel): @yLabel"_s);
+ m_heightMapProxyTwo->setValueRanges(34.f, 40.f, 18.f, 24.f);
+
+ QImage heightMapImageThree(":/data/layer_3.png");
+ m_heightMapProxyThree = new QHeightMapSurfaceDataProxy(heightMapImageThree);
+ m_heightMapSeriesThree = new QSurface3DSeries(m_heightMapProxyThree);
+ m_heightMapSeriesThree->setItemLabelFormat(u"(@xLabel, @zLabel): @yLabel"_s);
+ m_heightMapProxyThree->setValueRanges(34.f, 40.f, 18.f, 24.f);
+
+ // The images are the same size, so it's enough to get the dimensions from one
+ m_heightMapWidth = heightMapImageOne.width();
+ m_heightMapHeight = heightMapImageOne.height();
+
+ // Set the gradients for multi-surface layers
+ QLinearGradient grOne;
+ grOne.setColorAt(0.f, Qt::black);
+ grOne.setColorAt(0.38f, Qt::darkYellow);
+ grOne.setColorAt(0.39f, Qt::darkGreen);
+ grOne.setColorAt(0.5f, Qt::darkGray);
+ grOne.setColorAt(1.f, Qt::gray);
+ m_heightMapSeriesOne->setBaseGradient(grOne);
+ m_heightMapSeriesOne->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ QLinearGradient grTwo;
+ grTwo.setColorAt(0.39f, Qt::blue);
+ grTwo.setColorAt(0.4f, Qt::white);
+ m_heightMapSeriesTwo->setBaseGradient(grTwo);
+ m_heightMapSeriesTwo->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ QLinearGradient grThree;
+ grThree.setColorAt(0.f, Qt::white);
+ grThree.setColorAt(0.05f, Qt::black);
+ m_heightMapSeriesThree->setBaseGradient(grThree);
+ m_heightMapSeriesThree->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ // Custom items and label
+ connect(m_graph, &QAbstract3DGraph::selectedElementChanged,
+ this, &SurfaceGraphModifier::handleElementSelected);
+
+ m_selectionAnimation = new QPropertyAnimation(this);
+ m_selectionAnimation->setPropertyName("scaling");
+ m_selectionAnimation->setDuration(500);
+ m_selectionAnimation->setLoopCount(-1);
+
+ QFont titleFont = QFont("Century Gothic", 30);
+ titleFont.setBold(true);
+ m_titleLabel = new QCustom3DLabel("Oil Rigs on Imaginary Sea", titleFont,
+ QVector3D(0.f, 1.2f, 0.f),
+ QVector3D(1.f, 1.f, 0.f),
+ QQuaternion());
+ m_titleLabel->setPositionAbsolute(true);
+ m_titleLabel->setFacingCamera(true);
+ m_titleLabel->setBackgroundColor(QColor(0x66cdaa));
+ m_graph->addCustomItem(m_titleLabel);
+ m_titleLabel->setVisible(false);
+
+ // Make two of the custom object visible
+ toggleItemOne(true);
+ toggleItemTwo(true);
+
+ //
+ // Topographic map
+ //
+ m_topography = new TopographicSeries();
+ m_topography->setTopographyFile(":/data/topography.png", areaWidth, areaHeight);
+ m_topography->setItemLabelFormat(u"@yLabel m"_s);
+
+ m_highlight = new HighlightSeries();
+ m_highlight->setTopographicSeries(m_topography);
+ m_highlight->setMinHeight(minRange * aspectRatio);
+ m_highlight->handleGradientChange(areaWidth * aspectRatio);
+ //! [16]
+ QObject::connect(m_graph->axisY(), &QValue3DAxis::maxChanged,
+ m_highlight, &HighlightSeries::handleGradientChange);
+ //! [16]
+
+ m_customInputHandler = new CustomInputHandler(m_graph);
+ m_customInputHandler->setHighlightSeries(m_highlight);
+ m_customInputHandler->setAxes(m_graph->axisX(), m_graph->axisY(), m_graph->axisZ());
+ m_customInputHandler->setLimits(0.f, areaWidth, minRange);
+ m_customInputHandler->setAspectRatio(aspectRatio);
+}
+
+void SurfaceGraphModifier::fillSqrtSinProxy()
+{
+ float stepX = (sampleMax - sampleMin) / float(sampleCountX - 1);
+ float stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1);
+
+ //! [1]
+ auto *dataArray = new QSurfaceDataArray;
+ dataArray->reserve(sampleCountZ);
+ for (int i = 0 ; i < sampleCountZ ; ++i) {
+ auto *newRow = new QSurfaceDataRow;
+ newRow->reserve(sampleCountX);
+ // Keep values within range bounds, since just adding step can cause minor drift due
+ // to the rounding errors.
+ float z = qMin(sampleMax, (i * stepZ + sampleMin));
+ for (int j = 0; j < sampleCountX; ++j) {
+ float x = qMin(sampleMax, (j * stepX + sampleMin));
+ float R = qSqrt(z * z + x * x) + 0.01f;
+ float y = (qSin(R) / R + 0.24f) * 1.61f;
+ newRow->append(QSurfaceDataItem({x, y, z}));
+ }
+ dataArray->append(newRow);
+ }
+
+ m_sqrtSinProxy->resetArray(dataArray);
+ //! [1]
+}
+
+void SurfaceGraphModifier::enableSqrtSinModel(bool enable)
+{
+ if (enable) {
+ //! [3]
+ m_sqrtSinSeries->setDrawMode(QSurface3DSeries::DrawSurfaceAndWireframe);
+ m_sqrtSinSeries->setFlatShadingEnabled(true);
+
+ m_graph->axisX()->setLabelFormat("%.2f");
+ m_graph->axisZ()->setLabelFormat("%.2f");
+ m_graph->axisX()->setRange(sampleMin, sampleMax);
+ m_graph->axisY()->setRange(0.f, 2.f);
+ m_graph->axisZ()->setRange(sampleMin, sampleMax);
+ m_graph->axisX()->setLabelAutoRotation(30.f);
+ m_graph->axisY()->setLabelAutoRotation(90.f);
+ m_graph->axisZ()->setLabelAutoRotation(30.f);
+
+ m_graph->removeSeries(m_heightMapSeriesOne);
+ m_graph->removeSeries(m_heightMapSeriesTwo);
+ m_graph->removeSeries(m_heightMapSeriesThree);
+ m_graph->removeSeries(m_topography);
+ m_graph->removeSeries(m_highlight);
+
+ m_graph->addSeries(m_sqrtSinSeries);
+ //! [3]
+
+ m_titleLabel->setVisible(false);
+ m_graph->axisX()->setTitleVisible(false);
+ m_graph->axisY()->setTitleVisible(false);
+ m_graph->axisZ()->setTitleVisible(false);
+
+ m_graph->axisX()->setTitle({});
+ m_graph->axisY()->setTitle({});
+ m_graph->axisZ()->setTitle({});
+
+ m_graph->setActiveInputHandler(m_defaultInputHandler);
+
+ //! [6]
+ // Reset range sliders for Sqrt & Sin
+ m_rangeMinX = sampleMin;
+ m_rangeMinZ = sampleMin;
+ m_stepX = (sampleMax - sampleMin) / float(sampleCountX - 1);
+ m_stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1);
+ m_axisMinSliderX->setMinimum(0);
+ m_axisMinSliderX->setMaximum(sampleCountX - 2);
+ m_axisMinSliderX->setValue(0);
+ m_axisMaxSliderX->setMinimum(1);
+ m_axisMaxSliderX->setMaximum(sampleCountX - 1);
+ m_axisMaxSliderX->setValue(sampleCountX - 1);
+ m_axisMinSliderZ->setMinimum(0);
+ m_axisMinSliderZ->setMaximum(sampleCountZ - 2);
+ m_axisMinSliderZ->setValue(0);
+ m_axisMaxSliderZ->setMinimum(1);
+ m_axisMaxSliderZ->setMaximum(sampleCountZ - 1);
+ m_axisMaxSliderZ->setValue(sampleCountZ - 1);
+ //! [6]
+ }
+}
+
+void SurfaceGraphModifier::enableHeightMapModel(bool enable)
+{
+ if (enable) {
+ m_heightMapSeriesOne->setDrawMode(QSurface3DSeries::DrawSurface);
+ m_heightMapSeriesOne->setFlatShadingEnabled(false);
+ m_heightMapSeriesTwo->setDrawMode(QSurface3DSeries::DrawSurface);
+ m_heightMapSeriesTwo->setFlatShadingEnabled(false);
+ m_heightMapSeriesThree->setDrawMode(QSurface3DSeries::DrawSurface);
+ m_heightMapSeriesThree->setFlatShadingEnabled(false);
+
+ m_graph->axisX()->setLabelFormat("%.1f N");
+ m_graph->axisZ()->setLabelFormat("%.1f E");
+ m_graph->axisX()->setRange(34.f, 40.f);
+ //! [4]
+ m_graph->axisY()->setAutoAdjustRange(true);
+ //! [4]
+ m_graph->axisZ()->setRange(18.f, 24.f);
+
+ m_graph->axisX()->setTitle(u"Latitude"_s);
+ m_graph->axisY()->setTitle(u"Height"_s);
+ m_graph->axisZ()->setTitle(u"Longitude"_s);
+
+ m_graph->removeSeries(m_sqrtSinSeries);
+ m_graph->removeSeries(m_topography);
+ m_graph->removeSeries(m_highlight);
+ m_graph->addSeries(m_heightMapSeriesOne);
+ m_graph->addSeries(m_heightMapSeriesTwo);
+ m_graph->addSeries(m_heightMapSeriesThree);
+
+ m_graph->setActiveInputHandler(m_defaultInputHandler);
+
+ m_titleLabel->setVisible(true);
+ m_graph->axisX()->setTitleVisible(true);
+ m_graph->axisY()->setTitleVisible(true);
+ m_graph->axisZ()->setTitleVisible(true);
+
+ // Reset range sliders for height map
+ int mapGridCountX = m_heightMapWidth / heightMapGridStepX;
+ int mapGridCountZ = m_heightMapHeight / heightMapGridStepZ;
+ m_rangeMinX = 34.f;
+ m_rangeMinZ = 18.f;
+ m_stepX = 6.f / float(mapGridCountX - 1);
+ m_stepZ = 6.f / float(mapGridCountZ - 1);
+ m_axisMinSliderX->setMinimum(0);
+ m_axisMinSliderX->setMaximum(mapGridCountX - 2);
+ m_axisMinSliderX->setValue(0);
+ m_axisMaxSliderX->setMinimum(1);
+ m_axisMaxSliderX->setMaximum(mapGridCountX - 1);
+ m_axisMaxSliderX->setValue(mapGridCountX - 1);
+ m_axisMinSliderZ->setMinimum(0);
+ m_axisMinSliderZ->setMaximum(mapGridCountZ - 2);
+ m_axisMinSliderZ->setValue(0);
+ m_axisMaxSliderZ->setMinimum(1);
+ m_axisMaxSliderZ->setMaximum(mapGridCountZ - 1);
+ m_axisMaxSliderZ->setValue(mapGridCountZ - 1);
+ }
+}
+
+void SurfaceGraphModifier::enableTopographyModel(bool enable)
+{
+ if (enable) {
+ m_graph->axisX()->setLabelFormat("%i");
+ m_graph->axisZ()->setLabelFormat("%i");
+ m_graph->axisX()->setRange(0.f, areaWidth);
+ m_graph->axisY()->setRange(100.f, areaWidth * aspectRatio);
+ m_graph->axisZ()->setRange(0.f, areaHeight);
+ m_graph->axisX()->setLabelAutoRotation(30.f);
+ m_graph->axisY()->setLabelAutoRotation(90.f);
+ m_graph->axisZ()->setLabelAutoRotation(30.f);
+
+ m_graph->removeSeries(m_heightMapSeriesOne);
+ m_graph->removeSeries(m_heightMapSeriesTwo);
+ m_graph->removeSeries(m_heightMapSeriesThree);
+ m_graph->addSeries(m_topography);
+ m_graph->addSeries(m_highlight);
+
+ m_titleLabel->setVisible(false);
+ m_graph->axisX()->setTitleVisible(false);
+ m_graph->axisY()->setTitleVisible(false);
+ m_graph->axisZ()->setTitleVisible(false);
+
+ m_graph->axisX()->setTitle({});
+ m_graph->axisY()->setTitle({});
+ m_graph->axisZ()->setTitle({});
+
+ //! [5]
+ m_graph->setActiveInputHandler(m_customInputHandler);
+ //! [5]
+
+ // Reset range sliders for topography map
+ m_rangeMinX = 0.f;
+ m_rangeMinZ = 0.f;
+ m_stepX = 1.f;
+ m_stepZ = 1.f;
+ m_axisMinSliderX->setMinimum(0);
+ m_axisMinSliderX->setMaximum(areaWidth - 200);
+ m_axisMinSliderX->setValue(0);
+ m_axisMaxSliderX->setMinimum(200);
+ m_axisMaxSliderX->setMaximum(areaWidth);
+ m_axisMaxSliderX->setValue(areaWidth);
+ m_axisMinSliderZ->setMinimum(0);
+ m_axisMinSliderZ->setMaximum(areaHeight - 200);
+ m_axisMinSliderZ->setValue(0);
+ m_axisMaxSliderZ->setMinimum(200);
+ m_axisMaxSliderZ->setMaximum(areaHeight);
+ m_axisMaxSliderZ->setValue(areaHeight);
+ }
+}
+
+void SurfaceGraphModifier::adjustXMin(int min)
+{
+ float minX = m_stepX * float(min) + m_rangeMinX;
+
+ int max = m_axisMaxSliderX->value();
+ if (min >= max) {
+ max = min + 1;
+ m_axisMaxSliderX->setValue(max);
+ }
+ float maxX = m_stepX * max + m_rangeMinX;
+
+ setAxisXRange(minX, maxX);
+}
+
+void SurfaceGraphModifier::adjustXMax(int max)
+{
+ float maxX = m_stepX * float(max) + m_rangeMinX;
+
+ int min = m_axisMinSliderX->value();
+ if (max <= min) {
+ min = max - 1;
+ m_axisMinSliderX->setValue(min);
+ }
+ float minX = m_stepX * min + m_rangeMinX;
+
+ setAxisXRange(minX, maxX);
+}
+
+void SurfaceGraphModifier::adjustZMin(int min)
+{
+ float minZ = m_stepZ * float(min) + m_rangeMinZ;
+
+ int max = m_axisMaxSliderZ->value();
+ if (min >= max) {
+ max = min + 1;
+ m_axisMaxSliderZ->setValue(max);
+ }
+ float maxZ = m_stepZ * max + m_rangeMinZ;
+
+ setAxisZRange(minZ, maxZ);
+}
+
+void SurfaceGraphModifier::adjustZMax(int max)
+{
+ float maxX = m_stepZ * float(max) + m_rangeMinZ;
+
+ int min = m_axisMinSliderZ->value();
+ if (max <= min) {
+ min = max - 1;
+ m_axisMinSliderZ->setValue(min);
+ }
+ float minX = m_stepZ * min + m_rangeMinZ;
+
+ setAxisZRange(minX, maxX);
+}
+
+//! [7]
+void SurfaceGraphModifier::setAxisXRange(float min, float max)
+{
+ m_graph->axisX()->setRange(min, max);
+}
+//! [7]
+
+void SurfaceGraphModifier::setAxisZRange(float min, float max)
+{
+ m_graph->axisZ()->setRange(min, max);
+}
+
+void SurfaceGraphModifier::setBlackToYellowGradient()
+{
+ //! [8]
+ QLinearGradient gr;
+ gr.setColorAt(0.f, Qt::black);
+ gr.setColorAt(0.33f, Qt::blue);
+ gr.setColorAt(0.67f, Qt::red);
+ gr.setColorAt(1.f, Qt::yellow);
+
+ m_sqrtSinSeries->setBaseGradient(gr);
+ m_sqrtSinSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+ //! [8]
+}
+
+void SurfaceGraphModifier::setGreenToRedGradient()
+{
+ QLinearGradient gr;
+ gr.setColorAt(0.f, Qt::darkGreen);
+ gr.setColorAt(0.5f, Qt::yellow);
+ gr.setColorAt(0.8f, Qt::red);
+ gr.setColorAt(1.f, Qt::darkRed);
+
+ m_sqrtSinSeries->setBaseGradient(gr);
+ m_sqrtSinSeries->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+}
+
+void SurfaceGraphModifier::toggleItemOne(bool show)
+{
+ //! [10]
+ QVector3D positionOne = QVector3D(39.f, 77.f, 19.2f);
+ //! [10]
+ QVector3D positionOnePipe = QVector3D(39.f, 45.f, 19.2f);
+ QVector3D positionOneLabel = QVector3D(39.f, 107.f, 19.2f);
+ if (show) {
+ //! [9]
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::red);
+ //! [9]
+ //! [11]
+ auto *item = new QCustom3DItem(":/data/oilrig.obj", positionOne,
+ QVector3D(0.025f, 0.025f, 0.025f),
+ QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 45.f),
+ color);
+ //! [11]
+ //! [12]
+ m_graph->addCustomItem(item);
+ //! [12]
+ item = new QCustom3DItem(":/data/pipe.obj", positionOnePipe,
+ QVector3D(0.005f, 0.5f, 0.005f),
+ QQuaternion(),
+ color);
+ item->setShadowCasting(false);
+ m_graph->addCustomItem(item);
+
+ //! [13]
+ auto *label = new QCustom3DLabel();
+ label->setText("Oil Rig One");
+ label->setPosition(positionOneLabel);
+ label->setScaling(QVector3D(1.f, 1.f, 1.f));
+ m_graph->addCustomItem(label);
+ //! [13]
+ } else {
+ resetSelection();
+ //! [14]
+ m_graph->removeCustomItemAt(positionOne);
+ //! [14]
+ m_graph->removeCustomItemAt(positionOnePipe);
+ m_graph->removeCustomItemAt(positionOneLabel);
+ }
+}
+
+void SurfaceGraphModifier::toggleItemTwo(bool show)
+{
+ QVector3D positionTwo = QVector3D(34.5f, 77.f, 23.4f);
+ QVector3D positionTwoPipe = QVector3D(34.5f, 45.f, 23.4f);
+ QVector3D positionTwoLabel = QVector3D(34.5f, 107.f, 23.4f);
+ if (show) {
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::red);
+ auto *item = new QCustom3DItem();
+ item->setMeshFile(":/data/oilrig.obj");
+ item->setPosition(positionTwo);
+ item->setScaling(QVector3D(0.025f, 0.025f, 0.025f));
+ item->setRotation(QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 25.f));
+ item->setTextureImage(color);
+ m_graph->addCustomItem(item);
+ item = new QCustom3DItem(":/data/pipe.obj", positionTwoPipe,
+ QVector3D(0.005f, 0.5f, 0.005f),
+ QQuaternion(),
+ color);
+ item->setShadowCasting(false);
+ m_graph->addCustomItem(item);
+
+ auto *label = new QCustom3DLabel();
+ label->setText("Oil Rig Two");
+ label->setPosition(positionTwoLabel);
+ label->setScaling(QVector3D(1.f, 1.f, 1.f));
+ m_graph->addCustomItem(label);
+ } else {
+ resetSelection();
+ m_graph->removeCustomItemAt(positionTwo);
+ m_graph->removeCustomItemAt(positionTwoPipe);
+ m_graph->removeCustomItemAt(positionTwoLabel);
+ }
+}
+
+void SurfaceGraphModifier::toggleItemThree(bool show)
+{
+ QVector3D positionThree = QVector3D(34.5f, 86.f, 19.1f);
+ QVector3D positionThreeLabel = QVector3D(34.5f, 116.f, 19.1f);
+ if (show) {
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::darkMagenta);
+ auto *item = new QCustom3DItem();
+ item->setMeshFile(":/data/refinery.obj");
+ item->setPosition(positionThree);
+ item->setScaling(QVector3D(0.04f, 0.04f, 0.04f));
+ item->setRotation(QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 75.f));
+ item->setTextureImage(color);
+ m_graph->addCustomItem(item);
+
+ auto *label = new QCustom3DLabel();
+ label->setText("Refinery");
+ label->setPosition(positionThreeLabel);
+ label->setScaling(QVector3D(1.f, 1.f, 1.f));
+ m_graph->addCustomItem(label);
+ } else {
+ resetSelection();
+ m_graph->removeCustomItemAt(positionThree);
+ m_graph->removeCustomItemAt(positionThreeLabel);
+ }
+}
+
+void SurfaceGraphModifier::toggleSeeThrough(bool seethrough)
+{
+ if (seethrough) {
+ m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawWireframe);
+ m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawWireframe);
+ } else {
+ m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawSurface);
+ m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawSurface);
+ }
+}
+
+void SurfaceGraphModifier::toggleOilHighlight(bool highlight)
+{
+ if (highlight) {
+ QLinearGradient grThree;
+ grThree.setColorAt(0.0, Qt::black);
+ grThree.setColorAt(0.05, Qt::red);
+ m_graph->seriesList().at(2)->setBaseGradient(grThree);
+ } else {
+ QLinearGradient grThree;
+ grThree.setColorAt(0.0, Qt::white);
+ grThree.setColorAt(0.05, Qt::black);
+ m_graph->seriesList().at(2)->setBaseGradient(grThree);
+ }
+}
+
+void SurfaceGraphModifier::toggleShadows(bool shadows)
+{
+ if (shadows)
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
+ else
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+}
+
+//! [15]
+void SurfaceGraphModifier::toggleSurfaceTexture(bool enable)
+{
+ if (enable)
+ m_topography->setTextureFile(":/data/maptexture.jpg");
+ else
+ m_topography->setTextureFile("");
+}
+//! [15]
+
+void SurfaceGraphModifier::handleElementSelected(QAbstract3DGraph::ElementType type)
+{
+ resetSelection();
+ if (type == QAbstract3DGraph::ElementCustomItem) {
+ QCustom3DItem *item = m_graph->selectedCustomItem();
+ QString text;
+ if (qobject_cast<QCustom3DLabel *>(item) != 0) {
+ text.append("Custom label: ");
+ } else {
+ QStringList split = item->meshFile().split("/");
+ text.append(split.last());
+ text.append(": ");
+ }
+ int index = m_graph->selectedCustomItemIndex();
+ text.append(QString::number(index));
+ m_textField->setText(text);
+ m_previouslyAnimatedItem = item;
+ m_previousScaling = item->scaling();
+ m_selectionAnimation->setTargetObject(item);
+ m_selectionAnimation->setStartValue(item->scaling());
+ m_selectionAnimation->setEndValue(item->scaling() * 1.5f);
+ m_selectionAnimation->start();
+ } else if (type == QAbstract3DGraph::ElementSeries) {
+ QString text = "Surface (";
+ QSurface3DSeries *series = m_graph->selectedSeries();
+ if (series) {
+ QPoint point = series->selectedPoint();
+ QString posStr;
+ posStr.setNum(point.x());
+ text.append(posStr);
+ text.append(", ");
+ posStr.setNum(point.y());
+ text.append(posStr);
+ }
+ text.append(")");
+ m_textField->setText(text);
+ } else if (type > QAbstract3DGraph::ElementSeries
+ && type < QAbstract3DGraph::ElementCustomItem) {
+ int index = m_graph->selectedLabelIndex();
+ QString text;
+ if (type == QAbstract3DGraph::ElementAxisXLabel)
+ text.append("Axis X label: ");
+ else if (type == QAbstract3DGraph::ElementAxisYLabel)
+ text.append("Axis Y label: ");
+ else
+ text.append("Axis Z label: ");
+ text.append(QString::number(index));
+ m_textField->setText(text);
+ } else {
+ m_textField->setText("Nothing");
+ }
+}
+
+void SurfaceGraphModifier::resetSelection()
+{
+ m_selectionAnimation->stop();
+ if (m_previouslyAnimatedItem)
+ m_previouslyAnimatedItem->setScaling(m_previousScaling);
+ m_previouslyAnimatedItem = nullptr;
+}
diff --git a/examples/datavisualization/graphgallery/surfacegraphmodifier.h b/examples/datavisualization/graphgallery/surfacegraphmodifier.h
new file mode 100644
index 00000000..1a54958e
--- /dev/null
+++ b/examples/datavisualization/graphgallery/surfacegraphmodifier.h
@@ -0,0 +1,109 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef SURFACEGRAPHMODIFIER_H
+#define SURFACEGRAPHMODIFIER_H
+
+#include <QtDataVisualization/q3dsurface.h>
+#include <QtDataVisualization/qsurfacedataproxy.h>
+#include <QtDataVisualization/qheightmapsurfacedataproxy.h>
+#include <QtDataVisualization/qsurface3dseries.h>
+#include <QtDataVisualization/qcustom3ditem.h>
+#include <QtDataVisualization/qcustom3dlabel.h>
+#include <QtDataVisualization/q3dinputhandler.h>
+#include <QtWidgets/qslider.h>
+#include <QtWidgets/qlabel.h>
+#include <QtCore/qpropertyanimation.h>
+
+class TopographicSeries;
+class HighlightSeries;
+class CustomInputHandler;
+
+class SurfaceGraphModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit SurfaceGraphModifier(Q3DSurface *surface, QLabel *label, QObject *parent);
+
+ //! [0]
+ void toggleModeNone() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionNone); }
+ void toggleModeItem() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItem); }
+ void toggleModeSliceRow() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndRow
+ | QAbstract3DGraph::SelectionSlice
+ | QAbstract3DGraph::SelectionMultiSeries); }
+ void toggleModeSliceColumn() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndColumn
+ | QAbstract3DGraph::SelectionSlice
+ | QAbstract3DGraph::SelectionMultiSeries); }
+ //! [0]
+
+ void setBlackToYellowGradient();
+ void setGreenToRedGradient();
+
+ void setAxisMinSliderX(QSlider *slider) { m_axisMinSliderX = slider; }
+ void setAxisMaxSliderX(QSlider *slider) { m_axisMaxSliderX = slider; }
+ void setAxisMinSliderZ(QSlider *slider) { m_axisMinSliderZ = slider; }
+ void setAxisMaxSliderZ(QSlider *slider) { m_axisMaxSliderZ = slider; }
+
+ void adjustXMin(int min);
+ void adjustXMax(int max);
+ void adjustZMin(int min);
+ void adjustZMax(int max);
+
+public Q_SLOTS:
+ void enableSqrtSinModel(bool enable);
+ void enableHeightMapModel(bool enable);
+ void enableTopographyModel(bool enable);
+
+ void toggleItemOne(bool show);
+ void toggleItemTwo(bool show);
+ void toggleItemThree(bool show);
+ void toggleSeeThrough(bool seethrough);
+ void toggleOilHighlight(bool highlight);
+ void toggleShadows(bool shadows);
+ void toggleSurfaceTexture(bool enable);
+
+private:
+ void setAxisXRange(float min, float max);
+ void setAxisZRange(float min, float max);
+ void fillSqrtSinProxy();
+ void handleElementSelected(QAbstract3DGraph::ElementType type);
+ void resetSelection();
+
+private:
+ Q3DSurface *m_graph = nullptr;
+ QSurfaceDataProxy *m_sqrtSinProxy = nullptr;
+ QSurface3DSeries *m_sqrtSinSeries = nullptr;
+ QHeightMapSurfaceDataProxy *m_heightMapProxyOne = nullptr;
+ QHeightMapSurfaceDataProxy *m_heightMapProxyTwo = nullptr;
+ QHeightMapSurfaceDataProxy *m_heightMapProxyThree = nullptr;
+ QSurface3DSeries *m_heightMapSeriesOne = nullptr;
+ QSurface3DSeries *m_heightMapSeriesTwo = nullptr;
+ QSurface3DSeries *m_heightMapSeriesThree = nullptr;
+
+ QSlider *m_axisMinSliderX = nullptr;
+ QSlider *m_axisMaxSliderX = nullptr;
+ QSlider *m_axisMinSliderZ = nullptr;
+ QSlider *m_axisMaxSliderZ = nullptr;
+ float m_rangeMinX = 0.f;
+ float m_rangeMinZ = 0.f;
+ float m_stepX = 0.f;
+ float m_stepZ = 0.f;
+ int m_heightMapWidth = 0;
+ int m_heightMapHeight = 0;
+
+ QLabel *m_textField = nullptr;
+ QPropertyAnimation *m_selectionAnimation = nullptr;
+ QCustom3DLabel *m_titleLabel = nullptr;
+ QCustom3DItem *m_previouslyAnimatedItem = nullptr;
+ QVector3D m_previousScaling = {};
+
+ TopographicSeries *m_topography = nullptr;
+ HighlightSeries *m_highlight = nullptr;
+ int m_highlightWidth = 0;
+ int m_highlightHeight = 0;
+
+ CustomInputHandler *m_customInputHandler = nullptr;
+ Q3DInputHandler *m_defaultInputHandler = new Q3DInputHandler();
+};
+
+#endif // SURFACEGRAPHMODIFIER_H
diff --git a/examples/datavisualization/graphgallery/topographicseries.cpp b/examples/datavisualization/graphgallery/topographicseries.cpp
new file mode 100644
index 00000000..201a275e
--- /dev/null
+++ b/examples/datavisualization/graphgallery/topographicseries.cpp
@@ -0,0 +1,55 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "topographicseries.h"
+
+//! [0]
+// Value used to encode height data as RGB value on PNG file
+const float packingFactor = 11983.f;
+//! [0]
+
+TopographicSeries::TopographicSeries()
+{
+ setDrawMode(QSurface3DSeries::DrawSurface);
+ setFlatShadingEnabled(true);
+ setBaseColor(Qt::white);
+}
+
+TopographicSeries::~TopographicSeries() = default;
+
+void TopographicSeries::setTopographyFile(const QString file, float width, float height)
+{
+ //! [1]
+ QImage heightMapImage(file);
+ uchar *bits = heightMapImage.bits();
+ int imageHeight = heightMapImage.height();
+ int imageWidth = heightMapImage.width();
+ int widthBits = imageWidth * 4;
+ float stepX = width / float(imageWidth);
+ float stepZ = height / float(imageHeight);
+
+ auto *dataArray = new QSurfaceDataArray;
+ dataArray->reserve(imageHeight);
+ for (int i = 0; i < imageHeight; ++i) {
+ int p = i * widthBits;
+ float z = height - float(i) * stepZ;
+ auto *newRow = new QSurfaceDataRow;
+ newRow->reserve(imageWidth);
+ for (int j = 0; j < imageWidth; ++j) {
+ uchar aa = bits[p + 0];
+ uchar rr = bits[p + 1];
+ uchar gg = bits[p + 2];
+ uint color = uint((gg << 16) + (rr << 8) + aa);
+ float y = float(color) / packingFactor;
+ newRow->append(QSurfaceDataItem({float(j) * stepX, y, z}));
+ p += 4;
+ }
+ dataArray->append(newRow);
+ }
+
+ dataProxy()->resetArray(dataArray);
+ //! [1]
+
+ m_sampleCountX = float(imageWidth);
+ m_sampleCountZ = float(imageHeight);
+}
diff --git a/examples/datavisualization/graphgallery/topographicseries.h b/examples/datavisualization/graphgallery/topographicseries.h
new file mode 100644
index 00000000..41e03b1e
--- /dev/null
+++ b/examples/datavisualization/graphgallery/topographicseries.h
@@ -0,0 +1,26 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef TOPOGRAPHICSERIES_H
+#define TOPOGRAPHICSERIES_H
+
+#include <QtDataVisualization/qsurface3dseries.h>
+
+class TopographicSeries : public QSurface3DSeries
+{
+ Q_OBJECT
+public:
+ TopographicSeries();
+ ~TopographicSeries();
+
+ void setTopographyFile(const QString file, float width, float height);
+
+ float sampleCountX() { return m_sampleCountX; }
+ float sampleCountZ() { return m_sampleCountZ; }
+
+private:
+ float m_sampleCountX = 0.f;
+ float m_sampleCountZ = 0.f;
+};
+
+#endif // TOPOGRAPHICSERIES_H
diff --git a/examples/datavisualization/graphgallery/variantbardatamapping.cpp b/examples/datavisualization/graphgallery/variantbardatamapping.cpp
new file mode 100644
index 00000000..7a2a6cc7
--- /dev/null
+++ b/examples/datavisualization/graphgallery/variantbardatamapping.cpp
@@ -0,0 +1,85 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "variantbardatamapping.h"
+
+VariantBarDataMapping::VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories)
+ : QObject(nullptr)
+{
+ m_rowIndex = rowIndex;
+ m_columnIndex = columnIndex;
+ m_valueIndex = valueIndex;
+ m_rowCategories = rowCategories;
+ m_columnCategories = columnCategories;
+}
+
+VariantBarDataMapping::~VariantBarDataMapping() = default;
+
+void VariantBarDataMapping::setRowIndex(int index)
+{
+ m_rowIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::rowIndex() const
+{
+ return m_rowIndex;
+}
+
+void VariantBarDataMapping::setColumnIndex(int index)
+{
+ m_columnIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::columnIndex() const
+{
+ return m_columnIndex;
+}
+
+void VariantBarDataMapping::setValueIndex(int index)
+{
+ m_valueIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::valueIndex() const
+{
+ return m_valueIndex;
+}
+
+void VariantBarDataMapping::setRowCategories(const QStringList &categories)
+{
+ m_rowCategories = categories;
+ emit mappingChanged();
+}
+
+const QStringList &VariantBarDataMapping::rowCategories() const
+{
+ return m_rowCategories;
+}
+
+void VariantBarDataMapping::setColumnCategories(const QStringList &categories)
+{
+ m_columnCategories = categories;
+ emit mappingChanged();
+}
+
+const QStringList &VariantBarDataMapping::columnCategories() const
+{
+ return m_columnCategories;
+}
+
+void VariantBarDataMapping::remap(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories)
+{
+ m_rowIndex = rowIndex;
+ m_columnIndex = columnIndex;
+ m_valueIndex = valueIndex;
+ m_rowCategories = rowCategories;
+ m_columnCategories = columnCategories;
+ emit mappingChanged();
+}
diff --git a/examples/datavisualization/graphgallery/variantbardatamapping.h b/examples/datavisualization/graphgallery/variantbardatamapping.h
new file mode 100644
index 00000000..25bacebd
--- /dev/null
+++ b/examples/datavisualization/graphgallery/variantbardatamapping.h
@@ -0,0 +1,66 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef VARIANTBARDATAMAPPING_H
+#define VARIANTBARDATAMAPPING_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qstringlist.h>
+
+class VariantBarDataMapping : public QObject
+{
+ Q_OBJECT
+ //! [0]
+ Q_PROPERTY(int rowIndex READ rowIndex WRITE setRowIndex NOTIFY rowIndexChanged)
+ Q_PROPERTY(int columnIndex READ columnIndex WRITE setColumnIndex NOTIFY columnIndexChanged)
+ Q_PROPERTY(int valueIndex READ valueIndex WRITE setValueIndex NOTIFY valueIndexChanged)
+ Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY rowCategoriesChanged)
+ Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY columnCategoriesChanged)
+ //! [0]
+public:
+ //! [1]
+ explicit VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories);
+ //! [1]
+ virtual ~VariantBarDataMapping();
+
+ void setRowIndex(int index);
+ int rowIndex() const;
+ void setColumnIndex(int index);
+ int columnIndex() const;
+ void setValueIndex(int index);
+ int valueIndex() const;
+
+ void setRowCategories(const QStringList &categories);
+ const QStringList &rowCategories() const;
+ void setColumnCategories(const QStringList &categories);
+ const QStringList &columnCategories() const;
+
+ //! [2]
+ void remap(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories);
+ //! [2]
+Q_SIGNALS:
+ void rowIndexChanged();
+ void columnIndexChanged();
+ void valueIndexChanged();
+ void rowCategoriesChanged();
+ void columnCategoriesChanged();
+ //! [3]
+ void mappingChanged();
+ //! [3]
+
+private:
+ // Indexes of the mapped items in the VariantDataItem
+ int m_rowIndex = 0;
+ int m_columnIndex = 1;
+ int m_valueIndex = 2;
+
+ // For row/column items, sort items into these categories. Other categories are ignored.
+ QStringList m_rowCategories = {};
+ QStringList m_columnCategories = {};
+};
+
+#endif
diff --git a/examples/datavisualization/customproxy/variantbardataproxy.cpp b/examples/datavisualization/graphgallery/variantbardataproxy.cpp
index 587ef0c9..8fe73abc 100644
--- a/examples/datavisualization/customproxy/variantbardataproxy.cpp
+++ b/examples/datavisualization/graphgallery/variantbardataproxy.cpp
@@ -1,48 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "variantbardataproxy.h"
-using namespace QtDataVisualization;
-
-VariantBarDataProxy::VariantBarDataProxy() :
- QBarDataProxy()
-{
-}
-
-VariantBarDataProxy::VariantBarDataProxy(VariantDataSet *newSet,
- VariantBarDataMapping *mapping) :
- QBarDataProxy()
-{
- setDataSet(newSet);
- setMapping(mapping);
-}
+VariantBarDataProxy::VariantBarDataProxy() = default;
VariantBarDataProxy::~VariantBarDataProxy()
{
@@ -52,7 +13,7 @@ VariantBarDataProxy::~VariantBarDataProxy()
void VariantBarDataProxy::setDataSet(VariantDataSet *newSet)
{
if (!m_dataSet.isNull())
- QObject::disconnect(m_dataSet.data(), 0, this, 0);
+ QObject::disconnect(m_dataSet.data(), nullptr, this, nullptr);
m_dataSet = newSet;
@@ -72,15 +33,17 @@ VariantDataSet *VariantBarDataProxy::dataSet()
void VariantBarDataProxy::setMapping(VariantBarDataMapping *mapping)
{
- if (!m_mapping.isNull())
+ if (!m_mapping.isNull()) {
QObject::disconnect(m_mapping.data(), &VariantBarDataMapping::mappingChanged, this,
&VariantBarDataProxy::handleMappingChanged);
+ }
m_mapping = mapping;
- if (!m_mapping.isNull())
+ if (!m_mapping.isNull()) {
QObject::connect(m_mapping.data(), &VariantBarDataMapping::mappingChanged, this,
&VariantBarDataProxy::handleMappingChanged);
+ }
resolveDataSet();
}
@@ -102,7 +65,7 @@ void VariantBarDataProxy::handleItemsAdded(int index, int count)
void VariantBarDataProxy::handleDataCleared()
{
// Data cleared, reset array
- resetArray(0);
+ resetArray(nullptr);
}
void VariantBarDataProxy::handleMappingChanged()
@@ -117,7 +80,7 @@ void VariantBarDataProxy::resolveDataSet()
// If we have no data or mapping, or the categories are not defined, simply clear the array
if (m_dataSet.isNull() || m_mapping.isNull() || !m_mapping->rowCategories().size()
|| !m_mapping->columnCategories().size()) {
- resetArray(0);
+ resetArray(nullptr);
return;
}
const VariantDataItemList &itemList = m_dataSet->itemList();
@@ -129,18 +92,18 @@ void VariantBarDataProxy::resolveDataSet()
const QStringList &columnList = m_mapping->columnCategories();
// Sort values into rows and columns
- typedef QHash<QString, float> ColumnValueMap;
+ using ColumnValueMap = QHash<QString, float>;
QHash <QString, ColumnValueMap> itemValueMap;
- foreach (const VariantDataItem *item, itemList) {
+ for (const VariantDataItem *item : itemList) {
itemValueMap[item->at(rowIndex).toString()][item->at(columnIndex).toString()]
= item->at(valueIndex).toReal();
}
// Create a new data array in format the parent class understands
- QBarDataArray *newProxyArray = new QBarDataArray;
- foreach (QString rowKey, rowList) {
- QBarDataRow *newProxyRow = new QBarDataRow(columnList.size());
- for (int i = 0; i < columnList.size(); i++)
+ auto *newProxyArray = new QBarDataArray;
+ for (const QString &rowKey : rowList) {
+ auto *newProxyRow = new QBarDataRow(columnList.size());
+ for (qsizetype i = 0; i < columnList.size(); ++i)
(*newProxyRow)[i].setValue(itemValueMap[rowKey][columnList.at(i)]);
newProxyArray->append(newProxyRow);
}
diff --git a/examples/datavisualization/graphgallery/variantbardataproxy.h b/examples/datavisualization/graphgallery/variantbardataproxy.h
new file mode 100644
index 00000000..6a4d2f31
--- /dev/null
+++ b/examples/datavisualization/graphgallery/variantbardataproxy.h
@@ -0,0 +1,48 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef VARIANTBARDATAPROXY_H
+#define VARIANTBARDATAPROXY_H
+
+#include "variantdataset.h"
+#include "variantbardatamapping.h"
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtCore/qpointer.h>
+
+//! [0]
+class VariantBarDataProxy : public QBarDataProxy
+//! [0]
+{
+ Q_OBJECT
+
+public:
+ VariantBarDataProxy();
+ virtual ~VariantBarDataProxy();
+
+ //! [1]
+ // Doesn't gain ownership of the dataset, but does connect to it to listen for data changes.
+ void setDataSet(VariantDataSet *newSet);
+ VariantDataSet *dataSet();
+
+ // Map key (row, column, value) to value index in data item (VariantItem).
+ // Doesn't gain ownership of mapping, but does connect to it to listen for mapping changes.
+ // Modifying mapping that is set to proxy will trigger dataset re-resolving.
+ void setMapping(VariantBarDataMapping *mapping);
+ VariantBarDataMapping *mapping();
+ //! [1]
+
+public Q_SLOTS:
+ void handleItemsAdded(int index, int count);
+ void handleDataCleared();
+ void handleMappingChanged();
+
+private:
+ void resolveDataSet();
+
+ QPointer<VariantDataSet> m_dataSet;
+ QPointer<VariantBarDataMapping> m_mapping;
+
+ Q_DISABLE_COPY(VariantBarDataProxy)
+};
+
+#endif
diff --git a/examples/datavisualization/graphgallery/variantdataset.cpp b/examples/datavisualization/graphgallery/variantdataset.cpp
new file mode 100644
index 00000000..3892f02b
--- /dev/null
+++ b/examples/datavisualization/graphgallery/variantdataset.cpp
@@ -0,0 +1,45 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "variantdataset.h"
+
+VariantDataSet::VariantDataSet() = default;
+
+VariantDataSet::~VariantDataSet()
+{
+ clear();
+}
+
+void VariantDataSet::clear()
+{
+ for (VariantDataItem *item : m_variantData) {
+ item->clear();
+ delete item;
+ }
+ m_variantData.clear();
+ emit dataCleared();
+}
+
+int VariantDataSet::addItem(VariantDataItem *item)
+{
+ m_variantData.append(item);
+ int addIndex = m_variantData.size();
+
+ emit itemsAdded(addIndex, 1);
+ return addIndex;
+}
+
+int VariantDataSet::addItems(VariantDataItemList *itemList)
+{
+ int newCount = itemList->size();
+ int addIndex = m_variantData.size();
+ m_variantData.append(*itemList);
+ delete itemList;
+ emit itemsAdded(addIndex, newCount);
+ return addIndex;
+}
+
+const VariantDataItemList &VariantDataSet::itemList() const
+{
+ return m_variantData;
+}
diff --git a/examples/datavisualization/graphgallery/variantdataset.h b/examples/datavisualization/graphgallery/variantdataset.h
new file mode 100644
index 00000000..ca0d7ffd
--- /dev/null
+++ b/examples/datavisualization/graphgallery/variantdataset.h
@@ -0,0 +1,41 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef VARIANTDATASET_H
+#define VARIANTDATASET_H
+
+#include <QtCore/qvariantlist.h>
+
+//! [0]
+using VariantDataItem = QVariantList;
+using VariantDataItemList = QList<VariantDataItem *>;
+//! [0]
+
+class VariantDataSet : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit VariantDataSet();
+ ~VariantDataSet();
+
+ //! [1]
+ void clear();
+
+ int addItem(VariantDataItem *item);
+ int addItems(VariantDataItemList *itemList);
+
+ const VariantDataItemList &itemList() const;
+
+Q_SIGNALS:
+ void itemsAdded(int index, int count);
+ void dataCleared();
+ //! [1]
+
+private:
+ VariantDataItemList m_variantData;
+
+ Q_DISABLE_COPY(VariantDataSet)
+};
+
+#endif
diff --git a/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
deleted file mode 100644
index 677b7eec..00000000
--- a/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
deleted file mode 100644
index c042f84d..00000000
--- a/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc b/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
deleted file mode 100644
index 9a66c26a..00000000
--- a/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
+++ /dev/null
@@ -1,196 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example itemmodel
- \title Item Model Example
- \ingroup qtdatavisualization_examples
- \brief Using an item model as data source for Q3DBars.
-
- The item model example shows how to make a simple 3D bar graph using Q3DBars and how to modify
- the data being drawn at run-time. The example shows how to:
-
- \list
- \li Create an application with Q3DBars and widgets
- \li Use QItemModelBarDataProxy to set data to the graph
- \li Use a table widget to modify the data in the graph
- \endlist
-
- For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
-
- \image itemmodel-example-2.png
-
- \include examples-run.qdocinc
-
- \section1 Creating the Application
-
- First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container for it:
-
- \snippet itemmodel/main.cpp 0
-
- The call to QWidget::createWindowContainer is required, as all data visualization graph classes
- (Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
- as a widget any other way.
-
- Then we'll create a layout and add the graph and the table widget into it:
-
- \snippet itemmodel/main.cpp 1
-
- The table widget is going to be used to display the numerical data being inserted into the
- graph, and to modify it (See \l {Adding data to the graph} and \l {Interacting with the data}).
-
- We need to instantiate QItemModelBarDataProxy and a QBar3DSeries for it, and give the series
- to the graph:
-
- \snippet itemmodel/main.cpp 2
-
- Here we tell the proxy to directly map the model's rows and columns into the proxy's rows and
- columns instead of defining row and column roles to map for them. Then we give the model from
- the table widget to the proxy. We also create a series instance and set the proxy to it.
- We customize the series visuals a bit by changing the object mesh to pyramids, and finally
- add the series to the graph.
-
- Next, let's create another class to handle the data addition and other interaction with the
- graph. Let's call it \c GraphDataGenerator (See \l {Setting up the graph} and
- \l {Adding data to the graph} for details) and connect some signals between QBar3DSeries,
- \c GraphDataGenerator, and QTableWidget (See \l {Interacting with the data} for a closer look):
-
- \snippet itemmodel/main.cpp 3
-
- The application main is done and we can show the graph and start the event loop:
-
- \snippet itemmodel/main.cpp 4
-
- \section1 Setting up the Graph
-
- Let's set up the visual attributes for the graph in the constructor of \c GraphDataGenerator:
-
- \snippet itemmodel/main.cpp 5
- \snippet itemmodel/main.cpp 6
- \snippet itemmodel/main.cpp 7
-
- First we set bar thickness ratio to 1.0, which means bars will be as wide as they are deep. 1.0
- is also the default value, so the line is basically unnecessary. It's left there so you could
- easily try how changing it affects the graph. The second line sets bar spacings to 0.2, which
- means there will be a gap of 20% of the bar's thickness between the bars in both directions.
-
- We want to be able to select rows of data for a closer inspection, so we set the selection mode
- to slice item and row. This means that whenever we select a bar in the graph, the whole row will be
- displayed separately and the selected bar will be highlighted.
-
- We don't want to use the default colors, so we set one of the predefined themes as the active theme.
-
- Next line sets the font to \c Impact. If your system doesn't have it, it will be replaced by
- the system default.
-
- And finally, we set the camera position to one of the predefined camera positions.
- Now the initial graph settings are done.
-
- \note You do not need to set any of these in case you're happy with the defaults. You can
- easily try them by commenting out the contents of the constructor.
-
- \section1 Adding Data to the Graph
-
- We created the data generator in the application main and gave it the graph and the table
- widget as parameters:
-
- \code
- GraphDataGenerator generator(graph, tableWidget);
- \endcode
-
- We added a separate start method to the generator, so that it wouldn't start doing anything
- until everything else is set up. We then called the method when starting the application:
-
- \code
- generator.start();
- \endcode
-
- Let's have a look at the contents of the \c start() method:
-
- \snippet itemmodel/main.cpp 8
-
- The main thing \c start() does is set up the data model. It also activates a timer for getting
- the accurate dimensions of the table widget after it's been filled with data. The reason we
- do this is that the widget doesn't know its final visual domensions until all the data has been
- inserted to it and it has been shown. The data timer usage is not vital for the
- application, so we won't take a closer look at it. It's just there to make QTableWidget look better.
-
- In \c setupModel() we first introduce the row and column labels, and the actual data:
-
- \snippet itemmodel/main.cpp 9
-
- Then we set up the axes:
-
- \snippet itemmodel/main.cpp 10
-
- Next we will set up the table widget:
-
- \snippet itemmodel/main.cpp 11
-
- After that all that's left is adding the data to the table widget:
-
- \snippet itemmodel/main.cpp 12
-
- Now we have a bar graph and a table widget, both displaying the same data.
-
- You're probably wondering how the data can be displayed in the graph, as the only thing we did
- was add it to the table widget? That's because of what we did earlier, in the application main:
-
- \snippet itemmodel/main.cpp 2
-
- We created QItemModelBarDataProxy instance, and gave the proxy the model of the table widget
- we just created. The proxy maps the rows and the columns in the model of the table widget into
- rows and columns for itself directly, as we set the QItemModelBarDataProxy::useModelCategories
- property to true, and the graph gets the data to be displayed via the series that owns the proxy.
-
- \section1 Interacting with the Data
-
- We made a couple of signal connections in the application main earlier:
-
- \snippet itemmodel/main.cpp 3
-
- Now we'll find out what these were for.
-
- The first one connects a signal from Q3DBars to the \c GraphDataGenerator. Signal
- QBar3DSeries::selectedBarChanged() is emitted when a bar is selected from the series. We connect
- that to a method in the data generator that selects the same data item in the table widget:
-
- \snippet itemmodel/main.cpp 13
-
- The second connection does the opposite; it connects a signal from the table widget to a
- method in the data generator. The method then selects the corresponding bar in the series:
-
- \snippet itemmodel/main.cpp 14
-
- You can even select an item in the widget and change the value of it, and the new value is
- updated to the graph. This is handled again by the proxy with mapping between the data
- in the table widget and itself.
-
- \image itemmodel-example.png
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/itemmodel/itemmodel.pro b/examples/datavisualization/itemmodel/itemmodel.pro
deleted file mode 100644
index 60b36b98..00000000
--- a/examples/datavisualization/itemmodel/itemmodel.pro
+++ /dev/null
@@ -1,15 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp
-
-QT += widgets
-requires(qtConfig(tablewidget))
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/itemmodel/main.cpp b/examples/datavisualization/itemmodel/main.cpp
deleted file mode 100644
index 35bf7e0d..00000000
--- a/examples/datavisualization/itemmodel/main.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtDataVisualization/q3dbars.h>
-#include <QtDataVisualization/qcategory3daxis.h>
-#include <QtDataVisualization/qitemmodelbardataproxy.h>
-#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/qbar3dseries.h>
-#include <QtDataVisualization/q3dtheme.h>
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QTableWidget>
-#include <QtGui/QScreen>
-#include <QtCore/QRandomGenerator>
-#include <QtCore/QTimer>
-#include <QtGui/QFont>
-#include <QtCore/QDebug>
-#include <QtWidgets/QHeaderView>
-#include <QtWidgets/QMessageBox>
-
-#define USE_STATIC_DATA
-
-using namespace QtDataVisualization;
-
-class GraphDataGenerator : public QObject
-{
-public:
- explicit GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWidget);
- ~GraphDataGenerator();
-
- void setupModel();
- void addRow();
- void changeStyle();
- void changePresetCamera();
- void changeTheme();
- void start();
- void selectFromTable(const QPoint &selection);
- void selectedFromTable(int currentRow, int currentColumn, int previousRow, int previousColumn);
- void fixTableSize();
-
-private:
- Q3DBars *m_graph;
- QTimer *m_dataTimer;
- int m_columnCount;
- int m_rowCount;
- QTableWidget *m_tableWidget; // not owned
-};
-
-GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWidget)
- : m_graph(bargraph),
- m_dataTimer(0),
- m_columnCount(100),
- m_rowCount(50),
- m_tableWidget(tableWidget)
-{
- //! [5]
- // Set up bar specifications; make the bars as wide as they are deep,
- // and add a small space between them
- m_graph->setBarThickness(1.0f);
- m_graph->setBarSpacing(QSizeF(0.2, 0.2));
-
- //! [5]
-#ifndef USE_STATIC_DATA
- // Set up sample space; make it as deep as it's wide
- m_graph->rowAxis()->setRange(0, m_rowCount);
- m_graph->columnAxis()->setRange(0, m_columnCount);
- m_tableWidget->setColumnCount(m_columnCount);
-
- // Set selection mode to full
- m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemRowAndColumn);
-
- // Hide axis labels by explicitly setting one empty string as label list
- m_graph->rowAxis()->setLabels(QStringList(QString()));
- m_graph->columnAxis()->setLabels(QStringList(QString()));
-
- m_graph->seriesList().at(0)->setItemLabelFormat(QStringLiteral("@valueLabel"));
-#else
- //! [6]
- // Set selection mode to slice row
- m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndRow | QAbstract3DGraph::SelectionSlice);
-
- //! [6]
-#endif
-
- //! [7]
- // Set theme
- m_graph->activeTheme()->setType(Q3DTheme::ThemeDigia);
-
- // Set font
- m_graph->activeTheme()->setFont(QFont("Impact", 20));
-
- // Set preset camera position
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
- //! [7]
-}
-
-GraphDataGenerator::~GraphDataGenerator()
-{
- if (m_dataTimer) {
- m_dataTimer->stop();
- delete m_dataTimer;
- }
- delete m_graph;
-}
-
-void GraphDataGenerator::start()
-{
-#ifndef USE_STATIC_DATA
- m_dataTimer = new QTimer();
- m_dataTimer->setTimerType(Qt::CoarseTimer);
- QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::addRow);
- m_dataTimer->start(0);
- m_tableWidget->setFixedWidth(m_graph->width());
-#else
- //! [8]
- setupModel();
-
- // Table needs to be shown before the size of its headers can be accurately obtained,
- // so we postpone it a bit
- m_dataTimer = new QTimer();
- m_dataTimer->setSingleShot(true);
- QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::fixTableSize);
- m_dataTimer->start(0);
- //! [8]
-#endif
-}
-
-void GraphDataGenerator::setupModel()
-{
- //! [9]
- // Set up row and column names
- QStringList days;
- days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday";
- QStringList weeks;
- weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5";
-
- // Set up data Mon Tue Wed Thu Fri Sat Sun
- float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 10.0f}, // week 1
- {0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2
- {1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3
- {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4
- {3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5
- //! [9]
-
- // Add labels
- //! [10]
- m_graph->rowAxis()->setTitle("Week of year");
- m_graph->rowAxis()->setTitleVisible(true);
- m_graph->columnAxis()->setTitle("Day of week");
- m_graph->columnAxis()->setTitleVisible(true);
- m_graph->valueAxis()->setTitle("Hours spent on the Internet");
- m_graph->valueAxis()->setTitleVisible(true);
- m_graph->valueAxis()->setLabelFormat("%.1f h");
- //! [10]
-
- //! [11]
- m_tableWidget->setRowCount(5);
- m_tableWidget->setColumnCount(7);
- m_tableWidget->setHorizontalHeaderLabels(days);
- m_tableWidget->setVerticalHeaderLabels(weeks);
- m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- m_tableWidget->setCurrentCell(-1, -1);
- m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
- //! [11]
-
- //! [12]
- for (int week = 0; week < weeks.size(); week++) {
- for (int day = 0; day < days.size(); day++) {
- QModelIndex index = m_tableWidget->model()->index(week, day);
- m_tableWidget->model()->setData(index, hours[week][day]);
- }
- }
- //! [12]
-}
-
-void GraphDataGenerator::addRow()
-{
- m_tableWidget->model()->insertRow(0);
- if (m_tableWidget->model()->rowCount() > m_rowCount)
- m_tableWidget->model()->removeRow(m_rowCount);
- for (int i = 0; i < m_columnCount; i++) {
- QModelIndex index = m_tableWidget->model()->index(0, i);
- m_tableWidget->model()->setData(index,
- ((float)i / (float)m_columnCount) / 2.0f +
- (float)(QRandomGenerator::global()->bounded(30)) / 100.0f);
- }
- m_tableWidget->resizeColumnsToContents();
-}
-
-//! [13]
-void GraphDataGenerator::selectFromTable(const QPoint &selection)
-{
- m_tableWidget->setFocus();
- m_tableWidget->setCurrentCell(selection.x(), selection.y());
-}
-//! [13]
-
-//! [14]
-void GraphDataGenerator::selectedFromTable(int currentRow, int currentColumn,
- int previousRow, int previousColumn)
-{
- Q_UNUSED(previousRow);
- Q_UNUSED(previousColumn);
- m_graph->seriesList().at(0)->setSelectedBar(QPoint(currentRow, currentColumn));
-}
-//! [14]
-
-void GraphDataGenerator::fixTableSize()
-{
- int width = m_tableWidget->horizontalHeader()->length();
- width += m_tableWidget->verticalHeader()->width();
- m_tableWidget->setFixedWidth(width + 2);
- int height = m_tableWidget->verticalHeader()->length();
- height += m_tableWidget->horizontalHeader()->height();
- m_tableWidget->setFixedHeight(height + 2);
-}
-
-int main(int argc, char **argv)
-{
- //! [0]
- QApplication app(argc, argv);
- Q3DBars *graph = new Q3DBars();
- QWidget *container = QWidget::createWindowContainer(graph);
- //! [0]
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- //! [1]
- QWidget widget;
- QVBoxLayout *layout = new QVBoxLayout(&widget);
- QTableWidget *tableWidget = new QTableWidget(&widget);
- layout->addWidget(container, 1);
- layout->addWidget(tableWidget, 1, Qt::AlignHCenter);
- //! [1]
-
- tableWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- tableWidget->setAlternatingRowColors(true);
- widget.setWindowTitle(QStringLiteral("Hours spent on the Internet"));
-
- //! [2]
- // Since we are dealing with QTableWidget, the model will already have data sorted properly
- // into rows and columns, so we simply set useModelCategories property to true to utilize this.
- QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model());
- proxy->setUseModelCategories(true);
- QBar3DSeries *series = new QBar3DSeries(proxy);
- series->setMesh(QAbstract3DSeries::MeshPyramid);
- graph->addSeries(series);
- //! [2]
-
- //! [3]
- GraphDataGenerator generator(graph, tableWidget);
- QObject::connect(series, &QBar3DSeries::selectedBarChanged, &generator,
- &GraphDataGenerator::selectFromTable);
- QObject::connect(tableWidget, &QTableWidget::currentCellChanged, &generator,
- &GraphDataGenerator::selectedFromTable);
- //! [3]
-
- //! [4]
- widget.show();
- generator.start();
- return app.exec();
- //! [4]
-}
diff --git a/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png b/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png
deleted file mode 100644
index de33ba66..00000000
--- a/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc
deleted file mode 100644
index f0dea871..00000000
--- a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlaxisdrag
- \title Qt Quick 2 Axis Dragging Example
- \ingroup qtdatavisualization_examples
- \brief Implementing axis dragging in QML.
- \since QtDataVisualization 1.1
-
- The Qt Quick 2 axis dragging example concentrates on showing how to implement axis range
- changing by dragging axis labels in QML. It also gives a quick peek to two other new features
- in Qt Data Visualization 1.1: orthographic projection and dynamic custom item handling.
-
- \image qmlaxisdrag-example.png
-
- \include examples-run.qdocinc
-
- \section1 Overriding Default Input Handling
-
- First we deactivate the default input handling mechanism by setting the active input handler
- of Scatter3D graph to \c{null}:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 0
- \dots
-
- Then we add a MouseArea and set it to fill the parent, which is the same \c Item our
- \c scatterGraph is contained in. We also set it to accept only left mouse button presses,
- as in this example we are not interested in other buttons:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 1
- \dots
-
- Then we need to listen to mouse presses, and when caught, send a selection query to the graph:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 2
-
- Current mouse position, that will be needed for move distance calculation, is caught in
- \c{onPositionChanged}:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 3
- \dots
-
- At the end of \c{onPositionChanged}, we'll save the previous mouse position for move distance
- calculation that will be introduced later:
-
- \dots 0
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 4
-
- \section1 Translating Mouse Movement to Axis Range Change
-
- in \c scatterGraph we will need to listen to \c onSelectedElementChanged signal. The signal
- is emitted after the selection query has been made in the \c{onPressed} of \c{inputArea}. We
- set the element type into a property we defined (\c{property int selectedAxisLabel: -1}) in our
- main component, since it is of a type we are interested in:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 5
-
- Then, back in the \c onPositionChanged of \c{inputArea}, we check if a mouse button is pressed
- and if we have a current axis label selection. If the conditions are met, we'll call the
- function that does the conversion from mouse movement to axis range update:
-
- \dots 0
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 6
- \dots 0
-
- The conversion is easy in this case, as we have a fixed camera rotation. We can use some
- precalculated values, calculate mouse move distance, and apply the values to the
- selected axis range:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 7
-
- For a more sophisticated conversion from mouse movement to axis range update, see
- \l{Axis Range Dragging With Labels Example}{this example}.
-
- \section1 Other Features
-
- The example also demonstrates how to use orthographic projection and how to update properties
- of a custom item on the fly.
-
- Orthographic projection is very simple. You'll just need to change \c orthoProjection property
- of \c{scatterGraph}. In this example we have a button for toggling it on and off:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 8
-
- For custom items, first we'll add one in the \c customItemList of \c{scatterGraph}:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 9
-
- We have implemented a timer to add, remove, and rotate all the items in the graph,
- and we'll use the same timer for rotating the custom item:
-
- \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 10
- \dots
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/qmlaxisdrag/main.cpp b/examples/datavisualization/qmlaxisdrag/main.cpp
deleted file mode 100644
index 4e2fa483..00000000
--- a/examples/datavisualization/qmlaxisdrag/main.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("QML Draggable Axes"));
-
- viewer.setSource(QUrl("qrc:/qml/qmlaxisdrag/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml
deleted file mode 100644
index 3529f56f..00000000
--- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- height: 80
-
- Button {
- opacity: 0.5
- width: parent.width
- height: parent.height
- Text {
- id: buttonText
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png
deleted file mode 100644
index 3cea6863..00000000
--- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml
deleted file mode 100644
index 764987b0..00000000
--- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml
+++ /dev/null
@@ -1,328 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtDataVisualization 1.1
-import "."
-
-Item {
- id: mainView
- width: 800
- height: 600
- visible: true
-
- property int selectedAxisLabel: -1
- property real dragSpeedModifier: 100.0
- property int currentMouseX: -1
- property int currentMouseY: -1
- property int previousMouseX: -1
- property int previousMouseY: -1
-
- ListModel {
- id: graphModel
- ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "@0,0,0,0" }
- ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1,1,1" }
- }
-
- Timer {
- id: dataTimer
- interval: 1
- running: true
- repeat: true
- property bool isIncreasing: true
- property real rotationAngle: 0
-
- function generateQuaternion() {
- return "@" + Math.random() * 360 + "," + Math.random() + ","
- + Math.random() + "," + Math.random()
- }
-
- function appendRow() {
- graphModel.append({"xPos": Math.random(),
- "yPos": Math.random(),
- "zPos": Math.random(),
- "rotation": generateQuaternion()
- });
- }
-
- //! [10]
- onTriggered: {
- rotationAngle = rotationAngle + 1
- qtCube.setRotationAxisAndAngle(Qt.vector3d(1,0,1), rotationAngle)
- //! [10]
- scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle)
- if (isIncreasing) {
- for (var i = 0; i < 10; i++)
- appendRow()
- if (graphModel.count > 2002) {
- scatterGraph.theme = isabelleTheme
- isIncreasing = false
- }
- } else {
- graphModel.remove(2, 10);
- if (graphModel.count == 2) {
- scatterGraph.theme = dynamicColorTheme
- isIncreasing = true
- }
- }
- }
- }
-
- ThemeColor {
- id: dynamicColor
- ColorAnimation on color {
- from: "red"
- to: "yellow"
- duration: 2000
- loops: Animation.Infinite
- }
- }
-
- Theme3D {
- id: dynamicColorTheme
- type: Theme3D.ThemeEbony
- baseColors: [dynamicColor]
- font.pointSize: 50
- labelBorderEnabled: true
- labelBackgroundColor: "gold"
- labelTextColor: "black"
- }
-
- Theme3D {
- id: isabelleTheme
- type: Theme3D.ThemeIsabelle
- font.pointSize: 50
- labelBorderEnabled: true
- labelBackgroundColor: "gold"
- labelTextColor: "black"
- }
-
- Item {
- id: dataView
- anchors.bottom: parent.bottom
- width: parent.width
- height: parent.height
-
- //! [0]
- Scatter3D {
- id: scatterGraph
- inputHandler: null
- //! [0]
- width: dataView.width
- height: dataView.height
- theme: dynamicColorTheme
- shadowQuality: AbstractGraph3D.ShadowQualityLow
- scene.activeCamera.yRotation: 45.0
- scene.activeCamera.xRotation: 45.0
- scene.activeCamera.zoomLevel: 75.0
-
- Scatter3DSeries {
- id: scatterSeries
- itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
- mesh: Abstract3DSeries.MeshCube
-
- ItemModelScatterDataProxy {
- itemModel: graphModel
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- rotationRole: "rotation"
- }
- }
- //! [9]
- customItemList: [
- Custom3DItem {
- id: qtCube
- meshFile: ":/mesh/cube"
- textureFile: ":/texture/texture"
- position: Qt.vector3d(0.65,0.35,0.65)
- scaling: Qt.vector3d(0.3,0.3,0.3)
- }
- ]
- //! [9]
- //! [5]
- onSelectedElementChanged: {
- if (selectedElement >= AbstractGraph3D.ElementAxisXLabel
- && selectedElement <= AbstractGraph3D.ElementAxisZLabel)
- selectedAxisLabel = selectedElement
- else
- selectedAxisLabel = -1
- }
- //! [5]
- }
-
- //! [1]
- MouseArea {
- anchors.fill: parent
- hoverEnabled: true
- acceptedButtons: Qt.LeftButton
- //! [1]
-
- //! [3]
- onPositionChanged: {
- currentMouseX = mouse.x;
- currentMouseY = mouse.y;
- //! [3]
- //! [6]
- if (pressed && selectedAxisLabel != -1)
- dragAxis();
- //! [6]
- //! [4]
- previousMouseX = currentMouseX;
- previousMouseY = currentMouseY;
- }
- //! [4]
-
- //! [2]
- onPressed: {
- scatterGraph.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y);
- }
- //! [2]
-
- onReleased: {
- // We need to clear mouse positions and selected axis, because touch devices cannot
- // track position all the time
- selectedAxisLabel = -1
- currentMouseX = -1
- currentMouseY = -1
- previousMouseX = -1
- previousMouseY = -1
- }
- }
- }
-
- //! [7]
- function dragAxis() {
- // Do nothing if previous mouse position is uninitialized
- if (previousMouseX === -1)
- return
-
- // Directional drag multipliers based on rotation. Camera is locked to 45 degrees, so we
- // can use one precalculated value instead of calculating xx, xy, zx and zy individually
- var cameraMultiplier = 0.70710678
-
- // Calculate the mouse move amount
- var moveX = currentMouseX - previousMouseX
- var moveY = currentMouseY - previousMouseY
-
- // Adjust axes
- switch (selectedAxisLabel) {
- case AbstractGraph3D.ElementAxisXLabel:
- var distance = ((moveX - moveY) * cameraMultiplier) / dragSpeedModifier
- // Check if we need to change min or max first to avoid invalid ranges
- if (distance > 0) {
- scatterGraph.axisX.min -= distance
- scatterGraph.axisX.max -= distance
- } else {
- scatterGraph.axisX.max -= distance
- scatterGraph.axisX.min -= distance
- }
- break
- case AbstractGraph3D.ElementAxisYLabel:
- distance = moveY / dragSpeedModifier
- // Check if we need to change min or max first to avoid invalid ranges
- if (distance > 0) {
- scatterGraph.axisY.max += distance
- scatterGraph.axisY.min += distance
- } else {
- scatterGraph.axisY.min += distance
- scatterGraph.axisY.max += distance
- }
- break
- case AbstractGraph3D.ElementAxisZLabel:
- distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier
- // Check if we need to change min or max first to avoid invalid ranges
- if (distance > 0) {
- scatterGraph.axisZ.max += distance
- scatterGraph.axisZ.min += distance
- } else {
- scatterGraph.axisZ.min += distance
- scatterGraph.axisZ.max += distance
- }
- break
- }
- }
- //! [7]
-
- NewButton {
- id: rangeToggle
- width: parent.width / 3 // We're adding 3 buttons and want to divide them equally
- text: "Use Preset Range"
- anchors.left: parent.left
- property bool autoRange: true
- onClicked: {
- if (autoRange) {
- text = "Use Automatic Range"
- scatterGraph.axisX.min = 0.3
- scatterGraph.axisX.max = 0.7
- scatterGraph.axisY.min = 0.3
- scatterGraph.axisY.max = 0.7
- scatterGraph.axisZ.min = 0.3
- scatterGraph.axisZ.max = 0.7
- autoRange = false
- dragSpeedModifier = 200.0
- } else {
- text = "Use Preset Range"
- autoRange = true
- dragSpeedModifier = 100.0
- }
- scatterGraph.axisX.autoAdjustRange = autoRange
- scatterGraph.axisY.autoAdjustRange = autoRange
- scatterGraph.axisZ.autoAdjustRange = autoRange
- }
- }
-
- //! [8]
- NewButton {
- id: orthoToggle
- width: parent.width / 3
- text: "Display Orthographic"
- anchors.left: rangeToggle.right
- onClicked: {
- if (scatterGraph.orthoProjection) {
- text = "Display Orthographic";
- scatterGraph.orthoProjection = false
- // Orthographic projection disables shadows, so we need to switch them back on
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityLow
- } else {
- text = "Display Perspective";
- scatterGraph.orthoProjection = true
- }
- }
- }
- //! [8]
-
- NewButton {
- id: exitButton
- width: parent.width / 3
- text: "Quit"
- anchors.left: orthoToggle.right
- onClicked: Qt.quit(0);
- }
-}
diff --git a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro
deleted file mode 100644
index d45525ad..00000000
--- a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp
-
-RESOURCES += qmlaxisdrag.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlaxisdrag/*
diff --git a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc
deleted file mode 100644
index c6c45e26..00000000
--- a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc
+++ /dev/null
@@ -1,12 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmlaxisdrag/main.qml</file>
- <file>qml/qmlaxisdrag/NewButton.qml</file>
- </qresource>
- <qresource prefix="/mesh">
- <file alias="cube">qml/qmlaxisdrag/cube.obj</file>
- </qresource>
- <qresource prefix="/texture">
- <file alias="texture">qml/qmlaxisdrag/cubetexture.png</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.h b/examples/datavisualization/qmlaxisformatter/customformatter.h
deleted file mode 100644
index aa9db422..00000000
--- a/examples/datavisualization/qmlaxisformatter/customformatter.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CUSTOMFORMATTER_H
-#define CUSTOMFORMATTER_H
-
-#include <QtDataVisualization/QValue3DAxisFormatter>
-#include <QtCore/QDateTime>
-
-using namespace QtDataVisualization;
-
-//! [2]
-class CustomFormatter : public QValue3DAxisFormatter
-{
- //! [2]
- Q_OBJECT
-
- //! [1]
- Q_PROPERTY(QDate originDate READ originDate WRITE setOriginDate NOTIFY originDateChanged)
- //! [1]
- //! [3]
- Q_PROPERTY(QString selectionFormat READ selectionFormat WRITE setSelectionFormat NOTIFY selectionFormatChanged)
- //! [3]
-public:
- explicit CustomFormatter(QObject *parent = 0);
- virtual ~CustomFormatter();
-
- //! [0]
- virtual QValue3DAxisFormatter *createNewInstance() const;
- virtual void populateCopy(QValue3DAxisFormatter &copy) const;
- virtual void recalculate();
- virtual QString stringForValue(qreal value, const QString &format) const;
- //! [0]
-
- QDate originDate() const;
- QString selectionFormat() const;
-
-public Q_SLOTS:
- void setOriginDate(const QDate &date);
- void setSelectionFormat(const QString &format);
-
-Q_SIGNALS:
- void originDateChanged(const QDate &date);
- void selectionFormatChanged(const QString &format);
-
-private:
- Q_DISABLE_COPY(CustomFormatter)
-
- QDateTime valueToDateTime(qreal value) const;
-
- QDate m_originDate;
- QString m_selectionFormat;
-};
-
-#endif
diff --git a/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png b/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png
deleted file mode 100644
index fbfbd833..00000000
--- a/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc
deleted file mode 100644
index 3c9574d4..00000000
--- a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlaxisformatter
- \title Qt Quick 2 Axis Formatter Example
- \ingroup qtdatavisualization_examples
- \brief Example of a hybrid C++ and QML application demonstrating different axis formatters.
- \since QtDataVisualization 1.1
-
- The Qt Quick axis formatter example shows how to use predefined axis formatters and how to
- create a custom one.
-
- \image qmlaxisformatter-example.png
-
- The interesting thing about this example is axis formatters, so we'll concentrate on
- that and skip explaining the basic functionality - for
- more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Custom Axis Formatter
-
- Customizing axis formatters requires subclassing the QValue3DAxisFormatter, which cannot be
- done in QML code alone. In this example we want an axis that interprets the float values as
- a timestamp and shows the date in the axis labels. To achieve this, we introduce a new class
- called \c CustomFormatter, which subclasses the QValue3DAxisFormatter:
-
- \snippet qmlaxisformatter/customformatter.h 2
- \dots 0
-
- Since float values of a QScatter3DSeries cannot be directly cast into QDateTime values due to
- difference in data width, we need some sort of mapping between the two. We chose to do the
- mapping by specifying an origin date for the formatter and interpreting the float values
- from the QScatter3DSeries as date offsets to that origin value. The origin date is given as
- a property:
-
- \snippet qmlaxisformatter/customformatter.h 1
-
- The mapping from value to QDateTime is done using \c valueToDateTime() method:
-
- \snippet qmlaxisformatter/customformatter.cpp 0
-
- To function as an axis formatter, our \c CustomFormatter needs to reimplement some virtual
- methods:
-
- \snippet qmlaxisformatter/customformatter.h 0
-
- The first two are simple, we just create a new instance of \c CustomFormatter and copy the
- necessary data over to it. These two methods are used to create and update a cache of formatter for
- rendering purposes. It is important to remember to call the superclass implementation
- of \c populateCopy():
-
- \snippet qmlaxisformatter/customformatter.cpp 1
-
- Bulk of the work done by \c CustomFormatter is done in the \c recalculate() method, where
- our formatter calculates the grid, subgrid, and label positions, as well as formats the label
- strings.
- In our custom formatter we ignore the segment count of the axis and draw a grid line always at
- midnight. Subsegment count and label positioning is handled normally:
-
- \snippet qmlaxisformatter/customformatter.cpp 2
-
- The axis labels are formatted to show only the date, but for selection label we want little more
- resolution for the timestamp, so we specify another property for our custom formatter to allow
- user to customize it:
-
- \snippet qmlaxisformatter/customformatter.h 3
-
- This selection format property is used in the reimplemented \c stringToValue method, where we
- ignore the submitted format and substitute the custom selection format for it:
-
- \snippet qmlaxisformatter/customformatter.cpp 3
-
- To expose our new custom formatter to the QML, we must declare and register it:
-
- \snippet qmlaxisformatter/main.cpp 0
- \dots 0
- \snippet qmlaxisformatter/main.cpp 1
-
- \section1 QML
-
- In the QML codes, we define a different axis for each dimension:
-
- \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 3
-
- Z-axis is just a regular ValueAxis3D:
-
- \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 0
-
- For the Y-axis we define a logarithmic axis. ValueAxis3D can be made to show logarithmic scale
- by specifying LogValueAxis3DFormatter for \c formatter property of the axis:
-
- \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 2
-
- And finally, for the X-axis we use our new \c CustomFormatter:
-
- \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 1
-
- Rest of the application consists of fairly self-explanatory logic for modifying the axes and
- showing the graph.
-*/
diff --git a/examples/datavisualization/qmlaxisformatter/main.cpp b/examples/datavisualization/qmlaxisformatter/main.cpp
deleted file mode 100644
index 71d0470a..00000000
--- a/examples/datavisualization/qmlaxisformatter/main.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "customformatter.h"
-
-#include <QtGui/QGuiApplication>
-#include <QtQuick/QQuickView>
-#include <QtQml>
-
-//! [0]
-Q_DECLARE_METATYPE(CustomFormatter *)
-//! [0]
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- //! [1]
- qmlRegisterType<CustomFormatter>("CustomFormatter", 1, 0, "CustomFormatter");
- //! [1]
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("Axis formatter example"));
-
- viewer.setSource(QUrl("qrc:/qml/qmlaxisformatter/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml
deleted file mode 100644
index 203c6103..00000000
--- a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml
+++ /dev/null
@@ -1,194 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.1
-import CustomFormatter 1.0
-import "."
-
-Rectangle {
- id: mainView
- width: 1280
- height: 1024
-
- Data {
- id: seriesData
- }
-
- Theme3D {
- id: themeIsabelle
- type: Theme3D.ThemePrimaryColors
- font.family: "Lucida Handwriting"
- font.pointSize: 40
- }
-
- //! [1]
- ValueAxis3D {
- id: dateAxis
- formatter: CustomFormatter {
- originDate: "2014-01-01"
- selectionFormat: "yyyy-MM-dd HH:mm:ss"
- }
- subSegmentCount: 2
- labelFormat: "yyyy-MM-dd"
- min: 0
- max: 14
- }
- //! [1]
-
- //! [2]
- ValueAxis3D {
- id: logAxis
- formatter: LogValueAxis3DFormatter {
- id: logAxisFormatter
- base: 10
- autoSubGrid: true
- showEdgeLabels: true
- }
- labelFormat: "%.2f"
- }
- //! [2]
-
- ValueAxis3D {
- id: linearAxis
- labelFormat: "%.2f"
- min: 0
- max: 500
- }
-
- //! [0]
- ValueAxis3D {
- id: valueAxis
- segmentCount: 5
- subSegmentCount: 2
- labelFormat: "%.2f"
- min: 0
- max: 10
- }
- //! [0]
-
- Item {
- id: dataView
- anchors.bottom: parent.bottom
- width: parent.width
- height: parent.height - buttonLayout.height
-
- Scatter3D {
- id: scatterGraph
- width: dataView.width
- height: dataView.height
- theme: themeIsabelle
- shadowQuality: AbstractGraph3D.ShadowQualitySoftLow
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricRight
- //! [3]
- axisZ: valueAxis
- axisY: logAxis
- axisX: dateAxis
- //! [3]
-
- Scatter3DSeries {
- id: scatterSeries
- itemLabelFormat: "@xLabel - (@yLabel, @zLabel)"
- meshSmooth: true
- ItemModelScatterDataProxy {
- itemModel: seriesData.model
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- }
- }
- }
- }
-
- RowLayout {
- id: buttonLayout
- Layout.minimumHeight: exitButton.height
- width: parent.width
- anchors.left: parent.left
- spacing: 0
-
- NewButton {
- id: yAxisBaseChange
- Layout.fillHeight: true
- Layout.fillWidth: true
- state: "enabled"
- onClicked: {
- if (logAxisFormatter.base === 10)
- logAxisFormatter.base = 0
- else if (logAxisFormatter.base === 2)
- logAxisFormatter.base = 10
- else
- logAxisFormatter.base = 2
- }
- states: [
- State {
- name: "enabled"
- PropertyChanges {
- target: yAxisBaseChange
- text: "Y-axis log base: " + logAxisFormatter.base
- enabled: true
- }
- },
- State {
- name: "disabled"
- PropertyChanges {
- target: yAxisBaseChange
- text: "Y-axis linear"
- enabled: false
- }
- }
- ]
- }
-
- NewButton {
- id: yAxisToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Toggle Y-axis"
- onClicked: {
- if (scatterGraph.axisY === linearAxis) {
- scatterGraph.axisY = logAxis
- yAxisBaseChange.state = "enabled"
- } else {
- scatterGraph.axisY = linearAxis
- yAxisBaseChange.state = "disabled"
- }
- }
- }
-
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Quit"
- onClicked: Qt.quit(0);
- }
- }
-}
diff --git a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro
deleted file mode 100644
index 0f3b2f80..00000000
--- a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-QT += datavisualization
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp \
- customformatter.cpp
-HEADERS += customformatter.h
-
-RESOURCES += qmlaxisformatter.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlaxisformatter/*
diff --git a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc
deleted file mode 100644
index 0cd9e927..00000000
--- a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmlaxisformatter/main.qml</file>
- <file>qml/qmlaxisformatter/NewButton.qml</file>
- <file>qml/qmlaxisformatter/Data.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlaxishandling/CMakeLists.txt b/examples/datavisualization/qmlaxishandling/CMakeLists.txt
new file mode 100644
index 00000000..41ce410c
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/CMakeLists.txt
@@ -0,0 +1,60 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(qmlaxishandling LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Qml)
+find_package(Qt6 COMPONENTS Quick)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(qmlaxishandling
+ main.cpp
+)
+set_target_properties(qmlaxishandling PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_link_libraries(qmlaxishandling PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Qml
+ Qt::Quick
+ Qt::DataVisualization
+)
+
+qt6_add_qml_module(qmlaxishandling
+ URI AxisHandling
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ SOURCES
+ customformatter.cpp customformatter.h
+ QML_FILES
+ qml/qmlaxishandling/main.qml
+ qml/qmlaxishandling/Data.qml
+ qml/qmlaxishandling/AxisDragging.qml
+ qml/qmlaxishandling/AxisFormatting.qml
+ RESOURCES
+ qml/qmlaxishandling/cube.obj
+ qml/qmlaxishandling/cubetexture.png
+)
+
+install(TARGETS qmlaxishandling
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.cpp b/examples/datavisualization/qmlaxishandling/customformatter.cpp
index fb469065..b0473159 100644
--- a/examples/datavisualization/qmlaxisformatter/customformatter.cpp
+++ b/examples/datavisualization/qmlaxishandling/customformatter.cpp
@@ -1,40 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "customformatter.h"
-#include <QtDataVisualization/QValue3DAxis>
-#include <QtQml/QQmlExtensionPlugin>
-#include <QtCore/QDebug>
-
-using namespace QtDataVisualization;
-
-Q_DECLARE_METATYPE(QValue3DAxisFormatter *)
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtQml/qqmlextensionplugin.h>
static const qreal oneDayMs = 60.0 * 60.0 * 24.0 * 1000.0;
@@ -143,7 +112,7 @@ QString CustomFormatter::selectionFormat() const
return m_selectionFormat;
}
-void CustomFormatter::setOriginDate(const QDate &date)
+void CustomFormatter::setOriginDate(QDate date)
{
if (m_originDate != date) {
m_originDate = date;
diff --git a/examples/datavisualization/qmlaxishandling/customformatter.h b/examples/datavisualization/qmlaxishandling/customformatter.h
new file mode 100644
index 00000000..2c821b49
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/customformatter.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef CUSTOMFORMATTER_H
+#define CUSTOMFORMATTER_H
+
+#include <QtDataVisualization/qvalue3daxisformatter.h>
+#include <QtCore/qdatetime.h>
+#include <QtQml/qqmlregistration.h>
+
+//! [2]
+class CustomFormatter : public QValue3DAxisFormatter
+{
+ //! [2]
+ Q_OBJECT
+ QML_ELEMENT
+
+ //! [1]
+ Q_PROPERTY(QDate originDate READ originDate WRITE setOriginDate NOTIFY originDateChanged)
+ //! [1]
+ //! [3]
+ Q_PROPERTY(QString selectionFormat READ selectionFormat WRITE setSelectionFormat NOTIFY selectionFormatChanged)
+ //! [3]
+public:
+ explicit CustomFormatter(QObject *parent = 0);
+ virtual ~CustomFormatter();
+
+ //! [0]
+ virtual QValue3DAxisFormatter *createNewInstance() const;
+ virtual void populateCopy(QValue3DAxisFormatter &copy) const;
+ virtual void recalculate();
+ virtual QString stringForValue(qreal value, const QString &format) const;
+ //! [0]
+
+ QDate originDate() const;
+ QString selectionFormat() const;
+
+public Q_SLOTS:
+ void setOriginDate(QDate date);
+ void setSelectionFormat(const QString &format);
+
+Q_SIGNALS:
+ void originDateChanged(QDate date);
+ void selectionFormatChanged(const QString &format);
+
+private:
+ Q_DISABLE_COPY(CustomFormatter)
+
+ QDateTime valueToDateTime(qreal value) const;
+
+ QDate m_originDate;
+ QString m_selectionFormat;
+};
+
+#endif
diff --git a/examples/datavisualization/qmlaxishandling/doc/images/qmlaxishandling-example.png b/examples/datavisualization/qmlaxishandling/doc/images/qmlaxishandling-example.png
new file mode 100644
index 00000000..21e9551b
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/doc/images/qmlaxishandling-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlaxishandling/doc/src/qmlaxishandling.qdoc b/examples/datavisualization/qmlaxishandling/doc/src/qmlaxishandling.qdoc
new file mode 100644
index 00000000..087630c6
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/doc/src/qmlaxishandling.qdoc
@@ -0,0 +1,188 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \example qmlaxishandling
+ \meta tags {DataVisualization, Scatter3D, Custom Input Handler, Dynamic Data, Custom Axis Formatter, Scatter Graph}
+ \title Axis Handling
+ \ingroup qtdatavisualization_qmlexamples
+ \brief Implementing axis dragging with a custom input handler in QML, and creating a custom axis formatter.
+ \since QtDataVisualization 6.5
+
+ \e {Axis Handling} demonstrates two different custom features with axes. The features have their
+ own tabs in the application.
+
+ The following sections concentrate on those features only and skip explaining the basic
+ functionality - for more detailed QML example documentation, see \l{Simple Scatter Graph}.
+
+ \image qmlaxishandling-example.png
+
+ \include examples-run.qdocinc
+
+ \section1 Axis Dragging
+
+ In the \uicontrol {Axis Dragging} tab, implement a custom input handler in QML that enables you
+ to drag axis labels to change axis ranges. Further, use orthographic projection and dynamically
+ update the properties of a custom item.
+
+ \section2 Overriding Default Input Handling
+
+ To deactivate the default input handling mechanism, set the active input handler of Scatter3D
+ graph to \c{null}:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 0
+ \dots
+
+ Then, add a MouseArea and set it to fill the parent, which is the same \c Item our
+ \c scatterGraph is contained in. Also, set it to accept only left mouse button presses,
+ as in this example the other buttons are not needed:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 1
+ \dots
+
+ Then, listen to mouse presses, and when caught, send a selection query to the graph:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 2
+
+ The \c{onPositionChanged} signal handler catches the current mouse position that will be
+ needed for move distance calculation:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 3
+ \dots
+
+ At the end of \c{onPositionChanged}, save the previous mouse position for move distance
+ calculation that will be introduced later:
+
+ \dots 0
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 4
+
+ \section2 Translating Mouse Movement to Axis Range Change
+
+ In \c {scatterGraph}, listen to \c {onSelectedElementChanged}. The signal
+ is emitted after the selection query has been made in the \c{onPressed} of the \c{inputArea}.
+ Set the element type into a property you defined (\c{property int selectedAxisLabel: -1}) in the
+ main component, since it is of a type you are interested in:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 5
+
+ Then, back in the \c onPositionChanged of \c{inputArea}, check if a mouse button is pressed
+ and if you have a current axis label selection. If the conditions are met, call the
+ function that does the conversion from mouse movement to axis range update:
+
+ \dots 0
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 6
+ \dots 0
+
+ The conversion is easy in this case, as the camera rotation is fixed. You can use some
+ precalculated values, calculate mouse move distance, and apply the values to the
+ selected axis range:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 7
+
+ For a more sophisticated conversion from mouse movement to axis range update, see
+ \l{Graph Gallery}.
+
+ \section2 Other Features
+
+ The example also demonstrates how to use orthographic projection and how to update properties
+ of a custom item on the fly.
+
+ Orthographic projection is very simple. You'll just need to change the \c orthoProjection
+ property of \c{scatterGraph}. The example has a button for toggling it on and off:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 8
+
+ For custom items, add one to the \c customItemList of \c{scatterGraph}:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 9
+
+ You implement a timer to add, remove, and rotate all the items in the graph, and use the same
+ timer for rotating the custom item:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml 10
+ \dots
+
+ \section1 Axis Formatters
+
+ In the \uicontrol {Axis Formatter} tab, create a custom axis formatter. It also illustrates how
+ to use predefined axis formatters.
+
+ \section2 Custom Axis Formatter
+
+ Customizing axis formatters requires subclassing the QValue3DAxisFormatter, which cannot be
+ done in QML code alone. In this example, the axis interprets the float values as
+ a timestamp and shows the date in the axis labels. To achieve this, introduce a new class
+ called \c CustomFormatter, which subclasses the QValue3DAxisFormatter:
+
+ \snippet qmlaxishandling/customformatter.h 2
+ \dots 0
+
+ Since float values of a QScatter3DSeries cannot be directly cast into QDateTime values due to
+ difference in data width, some sort of mapping between the two is needed. To do the mapping,
+ specify an origin date for the formatter and interpret the float values from the
+ QScatter3DSeries as date offsets to that origin value. The origin date is given as
+ a property:
+
+ \snippet qmlaxishandling/customformatter.h 1
+
+ For the mapping from value to QDateTime, use the \c valueToDateTime() method:
+
+ \snippet qmlaxishandling/customformatter.cpp 0
+
+ To function as an axis formatter, \c CustomFormatter needs to reimplement some virtual
+ methods:
+
+ \snippet qmlaxishandling/customformatter.h 0
+
+ The first two are simple, just create a new instance of \c CustomFormatter and copy the
+ necessary data over to it. Use these two methods to create and update a cache of formatter for
+ rendering purposes. Remember to call the superclass implementation of \c populateCopy():
+
+ \snippet qmlaxishandling/customformatter.cpp 1
+
+ \c CustomFormatter does the bulk of its work in the \c recalculate() method, where
+ our formatter calculates the grid, subgrid, and label positions, as well as formats the label
+ strings.
+ In the custom formatter, ignore the segment count of the axis and draw a grid line always at
+ midnight. Subsegment count and label positioning is handled normally:
+
+ \snippet qmlaxishandling/customformatter.cpp 2
+
+ The axis labels are formatted to show only the date. However, to increase the resolution of the
+ timestamp of the selection label, specify another property for the custom formatter to allow
+ the user to customize it:
+
+ \snippet qmlaxishandling/customformatter.h 3
+
+ This selection format property is used in the reimplemented \c stringToValue method, where
+ the submitted format is ignored and the custom selection format substituted for it:
+
+ \snippet qmlaxishandling/customformatter.cpp 3
+
+ To expose our new custom formatter to the QML, declare it and make it a QML module.
+ For information about how to do this, see \l{Surface Graph Gallery}.
+
+ \section2 QML
+
+ In the QML code, define a different axis for each dimension:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml 3
+
+ The Z-axis is just a regular ValueAxis3D:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml 0
+
+ For the Y-axis, define a logarithmic axis. To make ValueAxis3D show a logarithmic scale,
+ specify LogValueAxis3DFormatter for \c formatter property of the axis:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml 2
+
+ And finally, for the X-axis use the new \c CustomFormatter:
+
+ \snippet qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml 1
+
+ The rest of the application consists of fairly self-explanatory logic for modifying the axes and
+ showing the graph.
+
+ \section1 Example Contents
+*/
diff --git a/examples/datavisualization/qmlaxishandling/main.cpp b/examples/datavisualization/qmlaxishandling/main.cpp
new file mode 100644
index 00000000..2a145633
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/main.cpp
@@ -0,0 +1,43 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QtGui/qguiapplication.h>
+#include <QtQuick/qquickview.h>
+#include <QtQml/qqmlengine.h>
+#include <QtQml>
+
+#ifdef QMAKE_BUILD
+#include "customformatter.h"
+Q_DECLARE_METATYPE(CustomFormatter *)
+#endif
+
+int main(int argc, char *argv[])
+{
+ qputenv("QSG_RHI_BACKEND", "opengl");
+ QGuiApplication app(argc, argv);
+
+#ifdef QMAKE_BUILD
+ qmlRegisterType<CustomFormatter>("AxisHandling", 1, 0, "CustomFormatter");
+#endif
+
+ QQuickView viewer;
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
+ viewer.setTitle(QStringLiteral("Axis Handling"));
+
+ viewer.setSource(QUrl("qrc:/qml/qmlaxishandling/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml
new file mode 100644
index 00000000..81d2e0a1
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisDragging.qml
@@ -0,0 +1,298 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
+
+Item {
+ id: axisDragView
+
+ property int selectedAxisLabel: -1
+ property real dragSpeedModifier: 100.0
+ property int currentMouseX: -1
+ property int currentMouseY: -1
+ property int previousMouseX: -1
+ property int previousMouseY: -1
+
+ required property bool portraitMode
+
+ ListModel {
+ id: graphModel
+ ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "@0,0,0,0" }
+ ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1,1,1" }
+ }
+
+ Timer {
+ id: dataTimer
+ interval: 1
+ running: true
+ repeat: true
+ property bool isIncreasing: true
+ property real rotationAngle: 0
+
+ function generateQuaternion() {
+ return "@" + Math.random() * 360 + "," + Math.random() + ","
+ + Math.random() + "," + Math.random();
+ }
+
+ function appendRow() {
+ graphModel.append({"xPos": Math.random(),
+ "yPos": Math.random(),
+ "zPos": Math.random(),
+ "rotation": generateQuaternion()
+ });
+ }
+
+ //! [10]
+ onTriggered: {
+ rotationAngle = rotationAngle + 1;
+ qtCube.setRotationAxisAndAngle(Qt.vector3d(1, 0, 1), rotationAngle);
+ //! [10]
+ scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1, 1, 1), rotationAngle);
+ if (isIncreasing) {
+ for (var i = 0; i < 10; i++)
+ appendRow();
+ if (graphModel.count > 2002) {
+ scatterGraph.theme = isabelleTheme;
+ isIncreasing = false;
+ }
+ } else {
+ graphModel.remove(2, 10);
+ if (graphModel.count === 2) {
+ scatterGraph.theme = dynamicColorTheme;
+ isIncreasing = true;
+ }
+ }
+ }
+ }
+
+ ThemeColor {
+ id: dynamicColor
+ ColorAnimation on color {
+ from: "red"
+ to: "yellow"
+ duration: 2000
+ loops: Animation.Infinite
+ }
+ }
+
+ Theme3D {
+ id: dynamicColorTheme
+ type: Theme3D.ThemeEbony
+ baseColors: [dynamicColor]
+ font.pointSize: 50
+ labelBorderEnabled: true
+ labelBackgroundColor: "gold"
+ labelTextColor: "black"
+ }
+
+ Theme3D {
+ id: isabelleTheme
+ type: Theme3D.ThemeIsabelle
+ font.pointSize: 50
+ labelBorderEnabled: true
+ labelBackgroundColor: "gold"
+ labelTextColor: "black"
+ }
+
+ //! [0]
+ Scatter3D {
+ id: scatterGraph
+ inputHandler: null
+ //! [0]
+ anchors.fill: parent
+ theme: dynamicColorTheme
+ shadowQuality: AbstractGraph3D.ShadowQualityMedium
+ scene.activeCamera.yRotation: 45.0
+ scene.activeCamera.xRotation: 45.0
+ scene.activeCamera.zoomLevel: 75.0
+
+ Scatter3DSeries {
+ id: scatterSeries
+ itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: graphModel
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ rotationRole: "rotation"
+ }
+ }
+ //! [9]
+ customItemList: [
+ Custom3DItem {
+ id: qtCube
+ meshFile: ":/qml/qmlaxishandling/cube.obj"
+ textureFile: ":/qml/qmlaxishandling/cubetexture.png"
+ position: Qt.vector3d(0.65, 0.35, 0.65)
+ scaling: Qt.vector3d(0.3, 0.3, 0.3)
+ }
+ ]
+ //! [9]
+ //! [5]
+ onSelectedElementChanged: {
+ if (selectedElement >= AbstractGraph3D.ElementAxisXLabel
+ && selectedElement <= AbstractGraph3D.ElementAxisZLabel) {
+ selectedAxisLabel = selectedElement;
+ } else {
+ selectedAxisLabel = -1;
+ }
+ }
+ //! [5]
+ }
+
+ //! [1]
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ acceptedButtons: Qt.LeftButton
+ //! [1]
+
+ //! [3]
+ onPositionChanged: (mouse)=> {
+ currentMouseX = mouse.x;
+ currentMouseY = mouse.y;
+ //! [3]
+ //! [6]
+ if (pressed && selectedAxisLabel != -1)
+ axisDragView.dragAxis();
+ //! [6]
+ //! [4]
+ previousMouseX = currentMouseX;
+ previousMouseY = currentMouseY;
+ }
+ //! [4]
+
+ //! [2]
+ onPressed: (mouse)=> {
+ scatterGraph.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y);
+ }
+ //! [2]
+
+ onReleased: {
+ // We need to clear mouse positions and selected axis, because touch devices cannot
+ // track position all the time
+ selectedAxisLabel = -1;
+ currentMouseX = -1;
+ currentMouseY = -1;
+ previousMouseX = -1;
+ previousMouseY = -1;
+ }
+ }
+
+ //! [7]
+ function dragAxis() {
+ // Do nothing if previous mouse position is uninitialized
+ if (previousMouseX === -1)
+ return;
+
+ // Directional drag multipliers based on rotation. Camera is locked to 45 degrees, so we
+ // can use one precalculated value instead of calculating xx, xy, zx and zy individually
+ var cameraMultiplier = 0.70710678;
+
+ // Calculate the mouse move amount
+ var moveX = currentMouseX - previousMouseX;
+ var moveY = currentMouseY - previousMouseY;
+
+ // Adjust axes
+ switch (selectedAxisLabel) {
+ case AbstractGraph3D.ElementAxisXLabel:
+ var distance = ((moveX - moveY) * cameraMultiplier) / dragSpeedModifier;
+ // Check if we need to change min or max first to avoid invalid ranges
+ if (distance > 0) {
+ scatterGraph.axisX.min -= distance;
+ scatterGraph.axisX.max -= distance;
+ } else {
+ scatterGraph.axisX.max -= distance;
+ scatterGraph.axisX.min -= distance;
+ }
+ break;
+ case AbstractGraph3D.ElementAxisYLabel:
+ distance = moveY / dragSpeedModifier;
+ // Check if we need to change min or max first to avoid invalid ranges
+ if (distance > 0) {
+ scatterGraph.axisY.max += distance;
+ scatterGraph.axisY.min += distance;
+ } else {
+ scatterGraph.axisY.min += distance;
+ scatterGraph.axisY.max += distance;
+ }
+ break;
+ case AbstractGraph3D.ElementAxisZLabel:
+ distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier;
+ // Check if we need to change min or max first to avoid invalid ranges
+ if (distance > 0) {
+ scatterGraph.axisZ.max += distance;
+ scatterGraph.axisZ.min += distance;
+ } else {
+ scatterGraph.axisZ.min += distance;
+ scatterGraph.axisZ.max += distance;
+ }
+ break;
+ }
+ }
+ //! [7]
+
+ Button {
+ id: rangeToggle
+ // We're adding 3 buttons and want to divide them equally, if not in portrait mode
+ width: axisDragView.portraitMode ? parent.width : parent.width / 3
+ text: "Use Preset Range"
+ anchors.left: parent.left
+ anchors.top: parent.top
+ property bool autoRange: true
+ onClicked: {
+ if (autoRange) {
+ text = "Use Automatic Range";
+ scatterGraph.axisX.min = 0.3;
+ scatterGraph.axisX.max = 0.7;
+ scatterGraph.axisY.min = 0.3;
+ scatterGraph.axisY.max = 0.7;
+ scatterGraph.axisZ.min = 0.3;
+ scatterGraph.axisZ.max = 0.7;
+ autoRange = false;
+ dragSpeedModifier = 200.0;
+ } else {
+ text = "Use Preset Range";
+ autoRange = true;
+ dragSpeedModifier = 100.0;
+ }
+ scatterGraph.axisX.autoAdjustRange = autoRange;
+ scatterGraph.axisY.autoAdjustRange = autoRange;
+ scatterGraph.axisZ.autoAdjustRange = autoRange;
+ }
+ }
+
+ //! [8]
+ Button {
+ id: orthoToggle
+ width: axisDragView.portraitMode ? parent.width : parent.width / 3
+ text: "Display Orthographic"
+ anchors.left: axisDragView.portraitMode ? parent.left : rangeToggle.right
+ anchors.top: axisDragView.portraitMode ? rangeToggle.bottom : parent.top
+ onClicked: {
+ if (scatterGraph.orthoProjection) {
+ text = "Display Orthographic";
+ scatterGraph.orthoProjection = false;
+ // Orthographic projection disables shadows, so we need to switch them back on
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium
+ } else {
+ text = "Display Perspective";
+ scatterGraph.orthoProjection = true;
+ }
+ }
+ }
+ //! [8]
+
+ Button {
+ id: exitButton
+ width: axisDragView.portraitMode ? parent.width : parent.width / 3
+ text: "Quit"
+ anchors.left: axisDragView.portraitMode ? parent.left : orthoToggle.right
+ anchors.top: axisDragView.portraitMode ? orthoToggle.bottom : parent.top
+ onClicked: Qt.quit();
+ }
+}
diff --git a/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml
new file mode 100644
index 00000000..5ceae315
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/AxisFormatting.qml
@@ -0,0 +1,156 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
+import AxisHandling
+
+Item {
+ id: axisFormattingView
+
+ required property bool portraitMode
+
+ Data {
+ id: seriesData
+ }
+
+ Theme3D {
+ id: themePrimaryColors
+ type: Theme3D.ThemePrimaryColors
+ font.family: "Lucida Handwriting"
+ font.pointSize: 40
+ }
+
+ //! [1]
+ ValueAxis3D {
+ id: dateAxis
+ formatter: CustomFormatter {
+ originDate: "2023-01-01"
+ selectionFormat: "yyyy-MM-dd HH:mm:ss"
+ }
+ subSegmentCount: 2
+ labelFormat: "yyyy-MM-dd"
+ min: 0
+ max: 14
+ }
+ //! [1]
+
+ //! [2]
+ ValueAxis3D {
+ id: logAxis
+ formatter: LogValueAxis3DFormatter {
+ id: logAxisFormatter
+ base: 10
+ autoSubGrid: true
+ showEdgeLabels: true
+ }
+ labelFormat: "%.2f"
+ }
+ //! [2]
+
+ ValueAxis3D {
+ id: linearAxis
+ labelFormat: "%.2f"
+ min: 0
+ max: 500
+ }
+
+ //! [0]
+ ValueAxis3D {
+ id: valueAxis
+ segmentCount: 5
+ subSegmentCount: 2
+ labelFormat: "%.2f"
+ min: 0
+ max: 10
+ }
+ //! [0]
+
+ Scatter3D {
+ id: scatterGraph
+ anchors.top: exitButton.bottom
+ anchors.bottom: parent.bottom
+ width: parent.width
+ theme: themePrimaryColors
+ shadowQuality: AbstractGraph3D.ShadowQualitySoftMedium
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricRight
+ //! [3]
+ axisZ: valueAxis
+ axisY: logAxis
+ axisX: dateAxis
+ //! [3]
+
+ Scatter3DSeries {
+ id: scatterSeries
+ itemLabelFormat: "@xLabel - (@yLabel, @zLabel)"
+ meshSmooth: true
+ ItemModelScatterDataProxy {
+ itemModel: seriesData.model
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ }
+
+ Button {
+ id: yAxisBaseChange
+ width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
+ anchors.left: parent.left
+ anchors.top: parent.top
+ state: "enabled"
+ onClicked: {
+ if (logAxisFormatter.base === 10)
+ logAxisFormatter.base = 0;
+ else if (logAxisFormatter.base === 2)
+ logAxisFormatter.base = 10;
+ else
+ logAxisFormatter.base = 2;
+ }
+ states: [
+ State {
+ name: "enabled"
+ PropertyChanges {
+ target: yAxisBaseChange
+ text: "Y-axis log base: " + logAxisFormatter.base
+ enabled: true
+ }
+ },
+ State {
+ name: "disabled"
+ PropertyChanges {
+ target: yAxisBaseChange
+ text: "Y-axis linear"
+ enabled: false
+ }
+ }
+ ]
+ }
+
+ Button {
+ id: yAxisToggle
+ width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
+ anchors.left: axisFormattingView.portraitMode ? parent.left : yAxisBaseChange.right
+ anchors.top: axisFormattingView.portraitMode ? yAxisBaseChange.bottom : parent.top
+ text: "Toggle Y-axis"
+ onClicked: {
+ if (scatterGraph.axisY == linearAxis) {
+ scatterGraph.axisY = logAxis;
+ yAxisBaseChange.state = "enabled";
+ } else {
+ scatterGraph.axisY = linearAxis;
+ yAxisBaseChange.state = "disabled";
+ }
+ }
+ }
+
+ Button {
+ id: exitButton
+ width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
+ anchors.left: axisFormattingView.portraitMode ? parent.left : yAxisToggle.right
+ anchors.top: axisFormattingView.portraitMode ? yAxisToggle.bottom : parent.top
+ text: "Quit"
+ onClicked: Qt.quit();
+ }
+}
diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/Data.qml
index 7d907a57..b74337fd 100644
--- a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/Data.qml
@@ -1,33 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-import QtQuick 2.1
+import QtQuick
Item {
property alias model: dataModel
diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cube.obj
index 0197618f..0197618f 100644
--- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cube.obj
diff --git a/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cubetexture.png b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cubetexture.png
new file mode 100644
index 00000000..6369363f
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/cubetexture.png
Binary files differ
diff --git a/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/main.qml b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/main.qml
new file mode 100644
index 00000000..d4d830a4
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qml/qmlaxishandling/main.qml
@@ -0,0 +1,47 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+
+Item {
+ id: mainView
+ width: 1280
+ height: 1024
+ visible: true
+
+ property bool portraitMode: width < height
+
+ TabBar {
+ id: tabBar
+ width: parent.width
+
+ TabButton {
+ text: "Axis Dragging"
+ }
+
+ TabButton {
+ text: "Axis Formatting"
+ }
+ }
+
+ StackLayout {
+ anchors.top: tabBar.bottom
+ anchors.bottom: parent.bottom
+ width: parent.width
+ currentIndex: tabBar.currentIndex
+
+ AxisDragging {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ portraitMode: mainView.portraitMode
+ }
+
+ AxisFormatting {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ portraitMode: mainView.portraitMode
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlaxishandling/qmlaxishandling.pro b/examples/datavisualization/qmlaxishandling/qmlaxishandling.pro
new file mode 100644
index 00000000..36b0deee
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qmlaxishandling.pro
@@ -0,0 +1,16 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+DEFINES += QMAKE_BUILD
+
+SOURCES += main.cpp \
+ customformatter.cpp
+
+HEADERS += customformatter.h
+
+RESOURCES += qmlaxishandling.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/* \
+ qml/qmlaxishandling/*
diff --git a/examples/datavisualization/qmlaxishandling/qmlaxishandling.qrc b/examples/datavisualization/qmlaxishandling/qmlaxishandling.qrc
new file mode 100644
index 00000000..136734f5
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qmlaxishandling.qrc
@@ -0,0 +1,12 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlaxishandling/AxisDragging.qml</file>
+ <file>qml/qmlaxishandling/AxisFormatting.qml</file>
+ <file>qml/qmlaxishandling/cube.obj</file>
+ <file>qml/qmlaxishandling/cubetexture.png</file>
+ <file>qml/qmlaxishandling/Data.qml</file>
+ <file>qml/qmlaxishandling/main.qml</file>
+ </qresource>
+ <qresource prefix="/mesh"/>
+ <qresource prefix="/texture"/>
+</RCC>
diff --git a/examples/datavisualization/qmlaxishandling/qmldir b/examples/datavisualization/qmlaxishandling/qmldir
new file mode 100644
index 00000000..f6da01e7
--- /dev/null
+++ b/examples/datavisualization/qmlaxishandling/qmldir
@@ -0,0 +1,2 @@
+module AxisHandling
+plugin customformatterplugin
diff --git a/examples/datavisualization/qmlbars/CMakeLists.txt b/examples/datavisualization/qmlbars/CMakeLists.txt
new file mode 100644
index 00000000..2f627b49
--- /dev/null
+++ b/examples/datavisualization/qmlbars/CMakeLists.txt
@@ -0,0 +1,58 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(qmlbars LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Qml)
+find_package(Qt6 COMPONENTS Quick)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(qmlbars
+ main.cpp
+)
+set_target_properties(qmlbars PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_compile_definitions(qmlbars PUBLIC
+ QT_DISABLE_DEPRECATED_UP_TO=0x050F00
+)
+
+target_link_libraries(qmlbars PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Qml
+ Qt::Quick
+ Qt::DataVisualization
+)
+
+qt6_add_qml_module(qmlbars
+ URI Bars
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ QML_FILES
+ qml/qmlbars/Axes.qml
+ qml/qmlbars/Data.qml
+ qml/qmlbars/main.qml
+)
+
+install(TARGETS qmlbars
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
index c2ab2459..803ff62e 100644
--- a/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
+++ b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
index 60815d48..2b0a1c4b 100644
--- a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
+++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
@@ -1,136 +1,110 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\example qmlbars
- \title Qt Quick 2 Bars Example
- \ingroup qtdatavisualization_examples
+ \meta tags {DataVisualization, Barsr3D, Multiple Series}
+ \title Simple Bar Graph
+ \ingroup qtdatavisualization_qmlexamples
\brief Using Bars3D in a QML application.
- The Qt Quick 2 bars example shows how to make a simple 3D bar graph using Bars3D and Qt
- Quick 2.
+ \e {Simple Bar Graph} shows how to make a simple 3D bar graph using Bars3D and QML.
\image qmlbars-example.png
- The interesting thing about this example is switching series and displaying more than one series
- at once. We'll concentrate on those and skip explaining the basic Bars3D functionality - for
- more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+ The following sections describe how to switch series and display more than one series
+ at a time. For more information about basic QML application functionality, see
+ \l{Simple Scatter Graph}.
\include examples-run.qdocinc
\section1 Data
- The example data is monthly income and expenses of a fictional company over several years.
+ The example data set is the monthly income and expenses of a fictional company over several years.
The data is defined in a list model in \c Data.qml like this:
\snippet qmlbars/qml/qmlbars/Data.qml 0
\dots
Each data item has three roles: timestamp, income, and expenses. The timestamp value is in
- format: \c{<four digit year>-<two digit month>}. Years and months are natural to map to rows and
- columns of a bar chart, but we can only show either income or expenses as the value.
+ format: \c{<four digit year>-<two digit month>}. Usually, you would map years and months to rows
+ and columns of a bar chart, but you can only show either income or expenses as the value.
- Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it,
- starting with a series for the income:
+ Now, add the data to the Bars3D graph. Create two Bar3DSeries inside it, starting with a series
+ for the income:
\snippet qmlbars/qml/qmlbars/main.qml 3
\dots
The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the
- series. For \c valueRole we simply specify the \c income field, as it contains the value we
- want, but getting the years and months is a bit more complicated, since they are both found
- in the same field. To extract those values, we specify the \c timestamp field for both
+ series. For \c{valueRole}, specify the \c income field, as it contains the value you
+ want. Getting the years and months is a bit more complicated, since they are both found
+ in the same field. To extract those values, specify the \c timestamp field for both
\c rowRole and \c columnRole, and additionally specify a search pattern and a replace rule
for those roles to extract the correct portion of the field contents for each role.
The search pattern is a normal JavaScript regular expression and the replace rule specifies
what the field content that matches the regular expression is replaced with.
- In this case we want to replace the entire field content with just the year or the month,
+ In this case, replace the entire field content with just the year or the month,
which is the first captured substring for both rows and columns.
- For more information how the replace using regular expressions works, see
+ For more information about the replace functionality with regular expression, see
QString::replace(const QRegExp &rx, const QString &after) function documentation.
The \c multiMatchBehavior property specifies what to do in case multiple item model items match
- the same row/column combination. In this case we want to add their values together.
- This property has no effect when we are showing values for each month, as there are no
- duplicate months in our item model, but it becomes relevant later when we want to show
+ the same row/column combination. In this case, add their values together.
+ This property has no effect when showing values for each month, as there are no
+ duplicate months in our item model, but it becomes relevant later when you want to show
the yearly totals.
- Then we add another series for the expenses:
+ Then, add another series for the expenses:
\snippet qmlbars/qml/qmlbars/main.qml 4
\dots
- The model contains expenses as negative values, but we want to show them as positive bars, so
- that we can easily compare them to income bars. We use \c valueRolePattern to remove the minus
+ The model contains expenses as negative values, but you want to show them as positive bars, so
+ that they can be easily compared to income bars. Use the \c valueRolePattern to remove the minus
sign to achieve this. No replacement string needs to be specified as the default replacement
is an empty string.
- We use the \c visible property of the series to hide the second series for now.
+ Use the \c visible property of the series to hide the second series for now.
\section1 Custom Axis Labels
- One interesting tidbit about axes is that we redefine the category labels for column axis in
- \c Axes.qml. This is done because the data contains numbers for months, which we don't want
- to use for our column labels:
+ \c Axes.qml redefines the category labels for the column axis because the data contains numbers
+ for months, which would clutter the labels:
\snippet qmlbars/qml/qmlbars/Axes.qml 0
- We also set automatic axis label rotation to make axis labels more readable at low camera
- angles.
+ To make axis labels more readable at low camera angles, set automatic axis label rotation.
\section1 Switching Series
- In the \c main.qml, we set up the graph and various UI elements. There are three interesting
- code blocks we want to highlight here. The first one shows how to change the
- visualized data between income, expenses, and both, by simply changing visibility of the two
- series:
+ In \c main.qml, set up the graph and various UI elements. There are three interesting
+ code blocks to highlight here. The first one shows how to change the visualized data between
+ income, expenses, and both, by simply changing the visibility of the two series:
\snippet qmlbars/qml/qmlbars/main.qml 0
The axis label format and item selection label formats are tweaked to get the negative sign
showing properly for expenses, which were actually resolved as positive values.
- The second interesting block is where we change the visualized data by adjusting the proxy
- propertes:
+ The second interesting block is where the visualized data is changed by adjusting the proxy
+ properties:
\snippet qmlbars/qml/qmlbars/main.qml 1
- To show yearly totals, we need to combine the twelve months of each year into a single bar.
- We achieve this by specifying a \c columnRolePattern that matches all model items. That way
- the data proxy will only have a single column. The cumulative \c multiMatchBehavior we
+ To show the yearly totals, combine the twelve months of each year into a single bar.
+ This is achieved by specifying a \c columnRolePattern that matches all model items. That way,
+ the data proxy will only have a single column. The cumulative \c multiMatchBehavior
specified earlier for the proxy becomes relevant now, causing the values of all twelve months
of each year to be added up into a single bar.
- To show just a subset of years, we set \c autoRowCategories to false on the
- ItemModelBarDataProxy item and define the row categories explicitly. This way, only the items
- in specified row categories are visualized.
+ To show just a subset of years, set \c autoRowCategories to false on the ItemModelBarDataProxy
+ item and define the row categories explicitly. This way, only the items in the specified row
+ categories are visualized.
- The third interesting block shows how to get the row and column index of an item if you know the
- row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex() and \c columnCategoryIndex():
+ The third interesting block shows how to get the row and column index of an item if you know
+ the row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex()
+ and \c columnCategoryIndex():
\snippet qmlbars/qml/qmlbars/main.qml 2
*/
diff --git a/examples/datavisualization/qmlbars/main.cpp b/examples/datavisualization/qmlbars/main.cpp
index 5cf2eef9..1c479ba2 100644
--- a/examples/datavisualization/qmlbars/main.cpp
+++ b/examples/datavisualization/qmlbars/main.cpp
@@ -1,39 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
+#include <QtGui/qguiapplication.h>
+#include <QtQuick/qquickview.h>
+#include <QtQml/qqmlengine.h>
int main(int argc, char *argv[])
{
+ qputenv("QSG_RHI_BACKEND", "opengl");
QGuiApplication app(argc, argv);
QQuickView viewer;
@@ -46,12 +20,13 @@ int main(int argc, char *argv[])
QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
+ QString::fromLatin1("qml")));
- viewer.setTitle(QStringLiteral("Monthly income/expenses"));
+ viewer.setTitle(QStringLiteral("Monthly income / expenses"));
viewer.setSource(QUrl("qrc:/qml/qmlbars/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.setColor("black");
viewer.show();
return app.exec();
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
index 15726c2a..042294ad 100644
--- a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
@@ -1,34 +1,8 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-import QtQuick 2.1
-import QtDataVisualization 1.1
+import QtQuick
+import QtDataVisualization
Item {
property alias column: columnAxis
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
index efd575a2..4121f26b 100644
--- a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
@@ -1,130 +1,118 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-import QtQuick 2.1
+import QtQuick
+import QtQml.Models
Item {
property alias model: dataModel
+ property var modelAsJsArray: {
+ var arr = [];
+ for (var i = 0; i < dataModel.count; i++) {
+ var row = dataModel.get(i);
+ arr.push({
+ timestamp: row.timestamp,
+ expenses: row.expenses,
+ income: row.income
+ });
+ }
+ return arr;
+ }
+
//! [0]
ListModel {
id: dataModel
- ListElement{ timestamp: "2006-01"; expenses: "-4"; income: "5" }
- ListElement{ timestamp: "2006-02"; expenses: "-5"; income: "6" }
- ListElement{ timestamp: "2006-03"; expenses: "-7"; income: "4" }
+ ListElement{ timestamp: "2016-01"; expenses: "-4"; income: "5" }
+ ListElement{ timestamp: "2016-02"; expenses: "-5"; income: "6" }
+ ListElement{ timestamp: "2016-03"; expenses: "-7"; income: "4" }
//! [0]
- ListElement{ timestamp: "2006-04"; expenses: "-3"; income: "2" }
- ListElement{ timestamp: "2006-05"; expenses: "-4"; income: "1" }
- ListElement{ timestamp: "2006-06"; expenses: "-2"; income: "2" }
- ListElement{ timestamp: "2006-07"; expenses: "-1"; income: "3" }
- ListElement{ timestamp: "2006-08"; expenses: "-5"; income: "1" }
- ListElement{ timestamp: "2006-09"; expenses: "-2"; income: "3" }
- ListElement{ timestamp: "2006-10"; expenses: "-5"; income: "2" }
- ListElement{ timestamp: "2006-11"; expenses: "-8"; income: "5" }
- ListElement{ timestamp: "2006-12"; expenses: "-3"; income: "3" }
+ ListElement{ timestamp: "2016-04"; expenses: "-3"; income: "2" }
+ ListElement{ timestamp: "2016-05"; expenses: "-4"; income: "1" }
+ ListElement{ timestamp: "2016-06"; expenses: "-2"; income: "2" }
+ ListElement{ timestamp: "2016-07"; expenses: "-1"; income: "3" }
+ ListElement{ timestamp: "2016-08"; expenses: "-5"; income: "1" }
+ ListElement{ timestamp: "2016-09"; expenses: "-2"; income: "3" }
+ ListElement{ timestamp: "2016-10"; expenses: "-5"; income: "2" }
+ ListElement{ timestamp: "2016-11"; expenses: "-8"; income: "5" }
+ ListElement{ timestamp: "2016-12"; expenses: "-3"; income: "3" }
- ListElement{ timestamp: "2007-01"; expenses: "-3"; income: "1" }
- ListElement{ timestamp: "2007-02"; expenses: "-4"; income: "2" }
- ListElement{ timestamp: "2007-03"; expenses: "-12"; income: "4" }
- ListElement{ timestamp: "2007-04"; expenses: "-13"; income: "6" }
- ListElement{ timestamp: "2007-05"; expenses: "-14"; income: "11" }
- ListElement{ timestamp: "2007-06"; expenses: "-7"; income: "7" }
- ListElement{ timestamp: "2007-07"; expenses: "-6"; income: "4" }
- ListElement{ timestamp: "2007-08"; expenses: "-4"; income: "15" }
- ListElement{ timestamp: "2007-09"; expenses: "-2"; income: "18" }
- ListElement{ timestamp: "2007-10"; expenses: "-29"; income: "25" }
- ListElement{ timestamp: "2007-11"; expenses: "-23"; income: "29" }
- ListElement{ timestamp: "2007-12"; expenses: "-5"; income: "9" }
+ ListElement{ timestamp: "2017-01"; expenses: "-3"; income: "1" }
+ ListElement{ timestamp: "2017-02"; expenses: "-4"; income: "2" }
+ ListElement{ timestamp: "2017-03"; expenses: "-12"; income: "4" }
+ ListElement{ timestamp: "2017-04"; expenses: "-13"; income: "6" }
+ ListElement{ timestamp: "2017-05"; expenses: "-14"; income: "11" }
+ ListElement{ timestamp: "2017-06"; expenses: "-7"; income: "7" }
+ ListElement{ timestamp: "2017-07"; expenses: "-6"; income: "4" }
+ ListElement{ timestamp: "2017-08"; expenses: "-4"; income: "15" }
+ ListElement{ timestamp: "2017-09"; expenses: "-2"; income: "18" }
+ ListElement{ timestamp: "2017-10"; expenses: "-29"; income: "25" }
+ ListElement{ timestamp: "2017-11"; expenses: "-23"; income: "29" }
+ ListElement{ timestamp: "2017-12"; expenses: "-5"; income: "9" }
- ListElement{ timestamp: "2008-01"; expenses: "-3"; income: "8" }
- ListElement{ timestamp: "2008-02"; expenses: "-8"; income: "14" }
- ListElement{ timestamp: "2008-03"; expenses: "-10"; income: "20" }
- ListElement{ timestamp: "2008-04"; expenses: "-12"; income: "24" }
- ListElement{ timestamp: "2008-05"; expenses: "-10"; income: "19" }
- ListElement{ timestamp: "2008-06"; expenses: "-5"; income: "8" }
- ListElement{ timestamp: "2008-07"; expenses: "-1"; income: "4" }
- ListElement{ timestamp: "2008-08"; expenses: "-7"; income: "12" }
- ListElement{ timestamp: "2008-09"; expenses: "-4"; income: "16" }
- ListElement{ timestamp: "2008-10"; expenses: "-22"; income: "33" }
- ListElement{ timestamp: "2008-11"; expenses: "-16"; income: "25" }
- ListElement{ timestamp: "2008-12"; expenses: "-2"; income: "7" }
+ ListElement{ timestamp: "2018-01"; expenses: "-3"; income: "8" }
+ ListElement{ timestamp: "2018-02"; expenses: "-8"; income: "14" }
+ ListElement{ timestamp: "2018-03"; expenses: "-10"; income: "20" }
+ ListElement{ timestamp: "2018-04"; expenses: "-12"; income: "24" }
+ ListElement{ timestamp: "2018-05"; expenses: "-10"; income: "19" }
+ ListElement{ timestamp: "2018-06"; expenses: "-5"; income: "8" }
+ ListElement{ timestamp: "2018-07"; expenses: "-1"; income: "4" }
+ ListElement{ timestamp: "2018-08"; expenses: "-7"; income: "12" }
+ ListElement{ timestamp: "2018-09"; expenses: "-4"; income: "16" }
+ ListElement{ timestamp: "2018-10"; expenses: "-22"; income: "33" }
+ ListElement{ timestamp: "2018-11"; expenses: "-16"; income: "25" }
+ ListElement{ timestamp: "2018-12"; expenses: "-2"; income: "7" }
- ListElement{ timestamp: "2009-01"; expenses: "-4"; income: "5" }
- ListElement{ timestamp: "2009-02"; expenses: "-4"; income: "7" }
- ListElement{ timestamp: "2009-03"; expenses: "-11"; income: "14" }
- ListElement{ timestamp: "2009-04"; expenses: "-16"; income: "22" }
- ListElement{ timestamp: "2009-05"; expenses: "-3"; income: "5" }
- ListElement{ timestamp: "2009-06"; expenses: "-4"; income: "8" }
- ListElement{ timestamp: "2009-07"; expenses: "-7"; income: "9" }
- ListElement{ timestamp: "2009-08"; expenses: "-9"; income: "13" }
- ListElement{ timestamp: "2009-09"; expenses: "-1"; income: "6" }
- ListElement{ timestamp: "2009-10"; expenses: "-14"; income: "25" }
- ListElement{ timestamp: "2009-11"; expenses: "-19"; income: "29" }
- ListElement{ timestamp: "2009-12"; expenses: "-5"; income: "7" }
+ ListElement{ timestamp: "2019-01"; expenses: "-4"; income: "5" }
+ ListElement{ timestamp: "2019-02"; expenses: "-4"; income: "7" }
+ ListElement{ timestamp: "2019-03"; expenses: "-11"; income: "14" }
+ ListElement{ timestamp: "2019-04"; expenses: "-16"; income: "22" }
+ ListElement{ timestamp: "2019-05"; expenses: "-3"; income: "5" }
+ ListElement{ timestamp: "2019-06"; expenses: "-4"; income: "8" }
+ ListElement{ timestamp: "2019-07"; expenses: "-7"; income: "9" }
+ ListElement{ timestamp: "2019-08"; expenses: "-9"; income: "13" }
+ ListElement{ timestamp: "2019-09"; expenses: "-1"; income: "6" }
+ ListElement{ timestamp: "2019-10"; expenses: "-14"; income: "25" }
+ ListElement{ timestamp: "2019-11"; expenses: "-19"; income: "29" }
+ ListElement{ timestamp: "2019-12"; expenses: "-5"; income: "7" }
- ListElement{ timestamp: "2010-01"; expenses: "-14"; income: "22" }
- ListElement{ timestamp: "2010-02"; expenses: "-5"; income: "7" }
- ListElement{ timestamp: "2010-03"; expenses: "-1"; income: "9" }
- ListElement{ timestamp: "2010-04"; expenses: "-1"; income: "12" }
- ListElement{ timestamp: "2010-05"; expenses: "-5"; income: "9" }
- ListElement{ timestamp: "2010-06"; expenses: "-5"; income: "8" }
- ListElement{ timestamp: "2010-07"; expenses: "-3"; income: "7" }
- ListElement{ timestamp: "2010-08"; expenses: "-1"; income: "5" }
- ListElement{ timestamp: "2010-09"; expenses: "-2"; income: "4" }
- ListElement{ timestamp: "2010-10"; expenses: "-10"; income: "13" }
- ListElement{ timestamp: "2010-11"; expenses: "-12"; income: "17" }
- ListElement{ timestamp: "2010-12"; expenses: "-6"; income: "9" }
+ ListElement{ timestamp: "2020-01"; expenses: "-14"; income: "22" }
+ ListElement{ timestamp: "2020-02"; expenses: "-5"; income: "7" }
+ ListElement{ timestamp: "2020-03"; expenses: "-1"; income: "9" }
+ ListElement{ timestamp: "2020-04"; expenses: "-1"; income: "12" }
+ ListElement{ timestamp: "2020-05"; expenses: "-5"; income: "9" }
+ ListElement{ timestamp: "2020-06"; expenses: "-5"; income: "8" }
+ ListElement{ timestamp: "2020-07"; expenses: "-3"; income: "7" }
+ ListElement{ timestamp: "2020-08"; expenses: "-1"; income: "5" }
+ ListElement{ timestamp: "2020-09"; expenses: "-2"; income: "4" }
+ ListElement{ timestamp: "2020-10"; expenses: "-10"; income: "13" }
+ ListElement{ timestamp: "2020-11"; expenses: "-12"; income: "17" }
+ ListElement{ timestamp: "2020-12"; expenses: "-6"; income: "9" }
- ListElement{ timestamp: "2011-01"; expenses: "-2"; income: "6" }
- ListElement{ timestamp: "2011-02"; expenses: "-4"; income: "8" }
- ListElement{ timestamp: "2011-03"; expenses: "-7"; income: "12" }
- ListElement{ timestamp: "2011-04"; expenses: "-9"; income: "15" }
- ListElement{ timestamp: "2011-05"; expenses: "-7"; income: "19" }
- ListElement{ timestamp: "2011-06"; expenses: "-9"; income: "18" }
- ListElement{ timestamp: "2011-07"; expenses: "-13"; income: "17" }
- ListElement{ timestamp: "2011-08"; expenses: "-5"; income: "9" }
- ListElement{ timestamp: "2011-09"; expenses: "-3"; income: "8" }
- ListElement{ timestamp: "2011-10"; expenses: "-13"; income: "15" }
- ListElement{ timestamp: "2011-11"; expenses: "-8"; income: "17" }
- ListElement{ timestamp: "2011-12"; expenses: "-7"; income: "10" }
+ ListElement{ timestamp: "2021-01"; expenses: "-2"; income: "6" }
+ ListElement{ timestamp: "2021-02"; expenses: "-4"; income: "8" }
+ ListElement{ timestamp: "2021-03"; expenses: "-7"; income: "12" }
+ ListElement{ timestamp: "2021-04"; expenses: "-9"; income: "15" }
+ ListElement{ timestamp: "2021-05"; expenses: "-7"; income: "19" }
+ ListElement{ timestamp: "2021-06"; expenses: "-9"; income: "18" }
+ ListElement{ timestamp: "2021-07"; expenses: "-13"; income: "17" }
+ ListElement{ timestamp: "2021-08"; expenses: "-5"; income: "9" }
+ ListElement{ timestamp: "2021-09"; expenses: "-3"; income: "8" }
+ ListElement{ timestamp: "2021-10"; expenses: "-13"; income: "15" }
+ ListElement{ timestamp: "2021-11"; expenses: "-8"; income: "17" }
+ ListElement{ timestamp: "2021-12"; expenses: "-7"; income: "10" }
- ListElement{ timestamp: "2012-01"; expenses: "-12"; income: "16" }
- ListElement{ timestamp: "2012-02"; expenses: "-24"; income: "28" }
- ListElement{ timestamp: "2012-03"; expenses: "-27"; income: "22" }
- ListElement{ timestamp: "2012-04"; expenses: "-29"; income: "25" }
- ListElement{ timestamp: "2012-05"; expenses: "-27"; income: "29" }
- ListElement{ timestamp: "2012-06"; expenses: "-19"; income: "18" }
- ListElement{ timestamp: "2012-07"; expenses: "-13"; income: "17" }
- ListElement{ timestamp: "2012-08"; expenses: "-15"; income: "19" }
- ListElement{ timestamp: "2012-09"; expenses: "-3"; income: "8" }
- ListElement{ timestamp: "2012-10"; expenses: "-3"; income: "6" }
- ListElement{ timestamp: "2012-11"; expenses: "-4"; income: "8" }
- ListElement{ timestamp: "2012-12"; expenses: "-5"; income: "9" }
+ ListElement{ timestamp: "2022-01"; expenses: "-12"; income: "16" }
+ ListElement{ timestamp: "2022-02"; expenses: "-24"; income: "28" }
+ ListElement{ timestamp: "2022-03"; expenses: "-27"; income: "22" }
+ ListElement{ timestamp: "2022-04"; expenses: "-29"; income: "25" }
+ ListElement{ timestamp: "2022-05"; expenses: "-27"; income: "29" }
+ ListElement{ timestamp: "2022-06"; expenses: "-19"; income: "18" }
+ ListElement{ timestamp: "2022-07"; expenses: "-13"; income: "17" }
+ ListElement{ timestamp: "2022-08"; expenses: "-15"; income: "19" }
+ ListElement{ timestamp: "2022-09"; expenses: "-3"; income: "8" }
+ ListElement{ timestamp: "2022-10"; expenses: "-3"; income: "6" }
+ ListElement{ timestamp: "2022-11"; expenses: "-4"; income: "8" }
+ ListElement{ timestamp: "2022-12"; expenses: "-5"; income: "9" }
}
}
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
index 203de239..0b40e957 100644
--- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
@@ -1,45 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.1
-import QtQuick.Window 2.0
-import "."
-
-Rectangle {
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtDataVisualization
+import Qt.labs.qmlmodels
+
+pragma ComponentBehavior: Bound
+
+Item {
id: mainview
width: 1280
height: 1024
- property int buttonLayoutHeight: 180;
+ property int buttonLayoutHeight: 180
+ property int currentRow
state: Screen.width < Screen.height ? "portrait" : "landscape"
Data {
@@ -54,31 +30,25 @@ Rectangle {
selectedSeries: barSeries
function handleSelectionChange(series, position) {
- if (position != series.invalidSelectionPosition) {
- selectedSeries = series
- }
+ if (position !== series.invalidSelectionPosition)
+ selectedSeries = series;
// Set tableView current row to selected bar
var rowRole = series.dataProxy.rowLabels[position.x];
- var colRole
- if (barGraph.columnAxis === graphAxes.total)
+ var colRole;
+ if (barGraph.columnAxis == graphAxes.total)
colRole = "01";
else
colRole = series.dataProxy.columnLabels[position.y];
- var checkTimestamp = rowRole + "-" + colRole
- var currentRow = tableView.currentRow
+ var checkTimestamp = rowRole + "-" + colRole;
+
if (currentRow === -1 || checkTimestamp !== graphData.model.get(currentRow).timestamp) {
- var totalRows = tableView.rowCount;
+ var totalRows = tableView.rows;
for (var i = 0; i < totalRows; i++) {
- var modelTimestamp = graphData.model.get(i).timestamp
+ var modelTimestamp = graphData.model.get(i).timestamp;
if (modelTimestamp === checkTimestamp) {
- tableView.currentRow = i
- // Workaround to 5.2 row selection issue
- if (typeof tableView.selection != "undefined") {
- tableView.selection.clear()
- tableView.selection.select(i)
- }
- break
+ currentRow = i;
+ break;
}
}
}
@@ -86,17 +56,16 @@ Rectangle {
Item {
id: dataView
- anchors.right: mainview.right;
+ anchors.right: mainview.right
anchors.bottom: mainview.bottom
Bars3D {
id: barGraph
- width: dataView.width
- height: dataView.height
- shadowQuality: AbstractGraph3D.ShadowQualityMedium
+ anchors.fill: parent
+ shadowQuality: AbstractGraph3D.ShadowQualitySoftHigh
selectionMode: AbstractGraph3D.SelectionItem
theme: Theme3D {
- type: Theme3D.ThemeRetro
+ type: Theme3D.ThemeEbony
labelBorderEnabled: true
font.pointSize: 35
labelBackgroundEnabled: true
@@ -145,7 +114,8 @@ Rectangle {
ColorGradientStop { position: 0.0; color: "#600000" }
}
- onSelectedBarChanged: handleSelectionChange(secondarySeries, position)
+ onSelectedBarChanged: (position) => mainview.handleSelectionChange(secondarySeries,
+ position);
}
//! [3]
@@ -174,71 +144,117 @@ Rectangle {
ColorGradientStop { position: 0.0; color: "#006000" }
}
- onSelectedBarChanged: handleSelectionChange(barSeries, position)
+ onSelectedBarChanged: (position) => mainview.handleSelectionChange(barSeries,
+ position);
}
}
}
- TableView {
- id: tableView
+ ColumnLayout {
+ id: tableViewLayout
+
anchors.top: parent.top
anchors.left: parent.left
- TableViewColumn{ role: "timestamp" ; title: "Month" ; width: tableView.width / 2 }
- TableViewColumn{ role: "expenses" ; title: "Expenses" ; width: tableView.width / 4 }
- TableViewColumn{ role: "income" ; title: "Income" ; width: tableView.width / 4 }
- itemDelegate: Item {
- Text {
- id: delegateText
- anchors.verticalCenter: parent.verticalCenter
- width: parent.width
- anchors.leftMargin: 4
- anchors.left: parent.left
- anchors.right: parent.right
- color: styleData.textColor
- elide: styleData.elideMode
- text: customText
- horizontalAlignment: styleData.textAlignment
-
- property string originalText: styleData.value
- property string customText
-
- onOriginalTextChanged: {
- if (styleData.column === 0) {
- if (delegateText.originalText !== "") {
- var pattern = /(\d\d\d\d)-(\d\d)/
- var matches = pattern.exec(delegateText.originalText)
- var colIndex = parseInt(matches[2], 10) - 1
- delegateText.customText = matches[1] + " - " + graphAxes.column.labels[colIndex]
+
+ HorizontalHeaderView {
+ id: headerView
+ readonly property var columnNames: ["Month", "Expenses", "Income"]
+
+ syncView: tableView
+ Layout.fillWidth: true
+ delegate: Text {
+ required property int index
+ padding: 3
+ text: headerView.columnNames[index]
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+ }
+
+ TableView {
+ id: tableView
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+
+ reuseItems: false
+ clip: true
+
+ model: TableModel {
+ id: tableModel
+ TableModelColumn { display: "timestamp" }
+ TableModelColumn { display: "expenses" }
+ TableModelColumn { display: "income" }
+
+ rows: graphData.modelAsJsArray
+ }
+
+ delegate: Rectangle {
+ id: delegateRoot
+ required property int row
+ required property int column
+ required property string display
+ implicitHeight: 30
+ implicitWidth: column === 0 ? tableView.width / 2 : tableView.width / 4
+ color: row === mainview.currentRow ? barGraph.theme.gridLineColor
+ : barGraph.theme.windowColor
+ border.color: row === mainview.currentRow ? barGraph.theme.labelTextColor
+ : barGraph.theme.gridLineColor
+ border.width: 1
+ MouseArea {
+ anchors.fill: parent
+ onClicked: mainview.currentRow = delegateRoot.row;
+ }
+
+ Text {
+ id: delegateText
+ anchors.verticalCenter: parent.verticalCenter
+ width: parent.width
+ anchors.leftMargin: 4
+ anchors.left: parent.left
+ anchors.right: parent.right
+ text: formattedText
+ property string formattedText: {
+ if (delegateRoot.column === 0) {
+ if (delegateRoot.display !== "") {
+ var pattern = /(\d\d\d\d)-(\d\d)/;
+ var matches = pattern.exec(delegateRoot.display);
+ var colIndex = parseInt(matches[2], 10) - 1;
+ return matches[1] + " - " + graphAxes.column.labels[colIndex];
+ }
+ } else {
+ return delegateRoot.display;
}
- } else {
- delegateText.customText = originalText
}
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: delegateRoot.column === 0 ? Text.AlignLeft
+ : Text.AlignHCenter
+ elide: Text.ElideRight
}
}
}
+ }
- model: graphData.model
-
- //! [2]
- onCurrentRowChanged: {
- var timestamp = graphData.model.get(currentRow).timestamp
- var pattern = /(\d\d\d\d)-(\d\d)/
- var matches = pattern.exec(timestamp)
- var rowIndex = modelProxy.rowCategoryIndex(matches[1])
- var colIndex
- if (barGraph.columnAxis === graphAxes.total)
- colIndex = 0 // Just one column when showing yearly totals
- else
- colIndex = modelProxy.columnCategoryIndex(matches[2])
- if (selectedSeries.visible)
- mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex)
- else if (barSeries.visible)
- barSeries.selectedBar = Qt.point(rowIndex, colIndex)
- else
- secondarySeries.selectedBar = Qt.point(rowIndex, colIndex)
- }
- //! [2]
+ //! [2]
+ onCurrentRowChanged: {
+ var timestamp = graphData.model.get(mainview.currentRow).timestamp;
+ var pattern = /(\d\d\d\d)-(\d\d)/;
+ var matches = pattern.exec(timestamp);
+ var rowIndex = modelProxy.rowCategoryIndex(matches[1]);
+ var colIndex;
+ if (barGraph.columnAxis == graphAxes.total)
+ colIndex = 0 ;// Just one column when showing yearly totals
+ else
+ colIndex = modelProxy.columnCategoryIndex(matches[2]);
+ if (selectedSeries.visible)
+ mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex);
+ else if (barSeries.visible)
+ barSeries.selectedBar = Qt.point(rowIndex, colIndex);
+ else
+ secondarySeries.selectedBar = Qt.point(rowIndex, colIndex);
}
+ //! [2]
ColumnLayout {
id: controlLayout
@@ -248,38 +264,55 @@ Rectangle {
id: changeDataButton
Layout.fillWidth: true
Layout.fillHeight: true
- text: "Show 2010 - 2012"
+ text: "Show 2020 - 2022"
clip: true
//! [1]
onClicked: {
if (text === "Show yearly totals") {
- modelProxy.autoRowCategories = true
- secondaryProxy.autoRowCategories = true
- modelProxy.columnRolePattern = /^.*$/
- secondaryProxy.columnRolePattern = /^.*$/
- graphAxes.value.autoAdjustRange = true
- barGraph.columnAxis = graphAxes.total
- text = "Show all years"
+ modelProxy.autoRowCategories = true;
+ secondaryProxy.autoRowCategories = true;
+ modelProxy.columnRolePattern = /^.*$/;
+ secondaryProxy.columnRolePattern = /^.*$/;
+ graphAxes.value.autoAdjustRange = true;
+ barGraph.columnAxis = graphAxes.total;
+ text = "Show all years";
} else if (text === "Show all years") {
- modelProxy.autoRowCategories = true
- secondaryProxy.autoRowCategories = true
- modelProxy.columnRolePattern = /^.*-(\d\d)$/
- secondaryProxy.columnRolePattern = /^.*-(\d\d)$/
- graphAxes.value.min = 0
- graphAxes.value.max = 35
- barGraph.columnAxis = graphAxes.column
- text = "Show 2010 - 2012"
- } else { // text === "Show 2010 - 2012"
+ modelProxy.autoRowCategories = true;
+ secondaryProxy.autoRowCategories = true;
+ modelProxy.columnRolePattern = /^.*-(\d\d)$/;
+ secondaryProxy.columnRolePattern = /^.*-(\d\d)$/;
+ graphAxes.value.min = 0;
+ graphAxes.value.max = 35;
+ barGraph.columnAxis = graphAxes.column;
+ text = "Show 2020 - 2022";
+ } else { // text === "Show 2020 - 2022"
// Explicitly defining row categories, since we do not want to show data for
// all years in the model, just for the selected ones.
- modelProxy.autoRowCategories = false
- secondaryProxy.autoRowCategories = false
- modelProxy.rowCategories = ["2010", "2011", "2012"]
- secondaryProxy.rowCategories = ["2010", "2011", "2012"]
- text = "Show yearly totals"
+ modelProxy.autoRowCategories = false;
+ secondaryProxy.autoRowCategories = false;
+ modelProxy.rowCategories = ["2020", "2021", "2022"];
+ secondaryProxy.rowCategories = ["2020", "2021", "2022"];
+ text = "Show yearly totals";
}
}
//! [1]
+
+ contentItem: Text {
+ text: changeDataButton.text
+ opacity: changeDataButton.enabled ? 1.0 : 0.3
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ opacity: changeDataButton.enabled ? 1 : 0.3
+ color: changeDataButton.down ? barGraph.theme.gridLineColor : barGraph.theme.windowColor
+ border.color: changeDataButton.down ? barGraph.theme.labelTextColor : barGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
}
Button {
@@ -291,13 +324,29 @@ Rectangle {
enabled: barGraph.shadowsSupported
onClicked: {
if (barGraph.shadowQuality == AbstractGraph3D.ShadowQualityNone) {
- barGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
- text = "Hide Shadows"
+ barGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftHigh;
+ text = "Hide Shadows";
} else {
barGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
- text = "Show Shadows"
+ text = "Show Shadows";
}
}
+ contentItem: Text {
+ text: shadowToggle.text
+ opacity: shadowToggle.enabled ? 1.0 : 0.3
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ opacity: shadowToggle.enabled ? 1 : 0.3
+ color: shadowToggle.down ? barGraph.theme.gridLineColor : barGraph.theme.windowColor
+ border.color: shadowToggle.down ? barGraph.theme.labelTextColor : barGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
}
Button {
@@ -309,22 +358,74 @@ Rectangle {
//! [0]
onClicked: {
if (text === "Show Expenses") {
- barSeries.visible = false
- secondarySeries.visible = true
- barGraph.valueAxis.labelFormat = "-%.2f M\u20AC"
- secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: @valueLabel"
- text = "Show Both"
+ barSeries.visible = false;
+ secondarySeries.visible = true;
+ barGraph.valueAxis.labelFormat = "-%.2f M\u20AC";
+ secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: @valueLabel";
+ text = "Show Both";
} else if (text === "Show Both") {
- barSeries.visible = true
- barGraph.valueAxis.labelFormat = "%.2f M\u20AC"
- secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: -@valueLabel"
- text = "Show Income"
+ barSeries.visible = true;
+ barGraph.valueAxis.labelFormat = "%.2f M\u20AC";
+ secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: -@valueLabel";
+ text = "Show Income";
} else { // text === "Show Income"
- secondarySeries.visible = false
- text = "Show Expenses"
+ secondarySeries.visible = false;
+ text = "Show Expenses";
}
}
//! [0]
+ contentItem: Text {
+ text: seriesToggle.text
+ opacity: seriesToggle.enabled ? 1.0 : 0.3
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ opacity: seriesToggle.enabled ? 1 : 0.3
+ color: seriesToggle.down ? barGraph.theme.gridLineColor : barGraph.theme.windowColor
+ border.color: seriesToggle.down ? barGraph.theme.labelTextColor : barGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
+ }
+
+ Button {
+ id: marginToggle
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ text: "Use Margin"
+ clip: true
+
+ onClicked: {
+ if (text === "Use Margin") {
+ barGraph.barSeriesMargin = Qt.size(0.2, 0.2);
+ barGraph.barSpacing = Qt.size(0.0, 0.0);
+ text = "Use Spacing"
+ } else if (text === "Use Spacing") {
+ barGraph.barSeriesMargin = Qt.size(0.0, 0.0);
+ barGraph.barSpacing = Qt.size(0.5, 0.5);
+ text = "Use Margin";
+ }
+ }
+ contentItem: Text {
+ text: marginToggle.text
+ opacity: marginToggle.enabled ? 1.0 : 0.3
+ color: barGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ opacity: marginToggle.enabled ? 1 : 0.3
+ color: marginToggle.down ? barGraph.theme.gridLineColor : barGraph.theme.windowColor
+ border.color: marginToggle.down ? barGraph.theme.labelTextColor : barGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
}
}
@@ -337,7 +438,7 @@ Rectangle {
height: mainview.height
}
PropertyChanges {
- target: tableView
+ target: tableViewLayout
height: mainview.height - buttonLayoutHeight
anchors.right: dataView.left
anchors.left: mainview.left
@@ -347,7 +448,7 @@ Rectangle {
target: controlLayout
width: mainview.width / 4
height: buttonLayoutHeight
- anchors.top: tableView.bottom
+ anchors.top: tableViewLayout.bottom
anchors.bottom: mainview.bottom
anchors.left: mainview.left
anchors.right: dataView.left
@@ -357,11 +458,11 @@ Rectangle {
name: "portrait"
PropertyChanges {
target: dataView
- width: mainview.height / 4 * 3
+ width: mainview.width
height: mainview.width
}
PropertyChanges {
- target: tableView
+ target: tableViewLayout
height: mainview.width
anchors.right: controlLayout.left
anchors.left: mainview.left
diff --git a/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png b/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
deleted file mode 100644
index 33d00708..00000000
--- a/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc b/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
deleted file mode 100644
index ed405ca2..00000000
--- a/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlcustominput
- \title Qt Quick 2 Custom Input Example
- \ingroup qtdatavisualization_examples
- \brief Customizing input in a QML application.
-
- The Qt Quick 2 Custom Input example shows how to customize the 3D graph controls from Qt Quick 2 using the MouseArea to capture and process mouse events in QML.
- Custom input handling code in this example shows how the camera is now controlled by using NumberAnimation to animate the camera and item selection
- is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default
- input handler implements.
-
- \image qmlcustominput-example.png
-
- \include examples-run.qdocinc
-
- \section1 Removing Default Input Handling
-
- The default input handling mechanism is disabled by setting the inputHandler property to null.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 0
- \dots 0
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 1
- \dots 0
-
- \section1 Implementing Custom Selection Handling
-
- The on mouseover selection handling is implemented using standard MouseArea to capture the mouse events.
- The mouse area is configured to capture hover events and has two custom properties for \c mouseX and \c mouseY
- to store the last known mouse coordinates.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 2
-
- Whenever a pointer movement related signal is received the code updates the \c mouseX and \c mouseY properties.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 3
-
- As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
- currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 4
-
- \section1 Implementing Custom Zoom Handling
-
- The camera has a zoom factor that represents amount of zoom in percentages. In this example the zoom range is limited
- between 10% and 500%. This range is then divided to four subranges where angleDelta is scaled to different amount of zoom change
- based on the current subrange.
-
- \dots
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 5
- \dots
-
- \section1 Implementing Custom Camera Handling
-
- The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
- a simple NumberAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 6
-
- The camera movement up and down is implemented with a SequentialAnimation that varies the \l Q3DCamera::yRotation property of the camera
- from 5 degrees to 45 degrees and back with in and out easing.
-
- \snippet qmlcustominput/qml/qmlcustominput/main.qml 7
-*/
diff --git a/examples/datavisualization/qmlcustominput/main.cpp b/examples/datavisualization/qmlcustominput/main.cpp
deleted file mode 100644
index 92ab7c5b..00000000
--- a/examples/datavisualization/qmlcustominput/main.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("QML Custom Input"));
-
- viewer.setSource(QUrl("qrc:/qml/qmlcustominput/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
deleted file mode 100644
index b86f96c5..00000000
--- a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
+++ /dev/null
@@ -1,1106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-
-Item {
- property alias modelOne: dataModelOne
- property alias modelTwo: dataModelTwo
- property alias modelThree: dataModelThree
-
- ListModel {
- id: dataModelOne
- ListElement{ xPos: -10.0000; yPos: 5.00000; zPos: -5.00000 }
- ListElement{ xPos: -9.06229; yPos: 3.07132; zPos: -4.54268 }
- ListElement{ xPos: -8.55132; yPos: 4.19424; zPos: -4.03318 }
- ListElement{ xPos: -8.03806; yPos: 4.75162; zPos: -3.99583 }
- ListElement{ xPos: -9.50337; yPos: 4.90684; zPos: -4.21947 }
- ListElement{ xPos: -9.93819; yPos: 3.42724; zPos: -3.58955 }
- ListElement{ xPos: -7.84971; yPos: 3.15272; zPos: -4.90367 }
- ListElement{ xPos: -7.30477; yPos: 2.91062; zPos: -4.11078 }
- ListElement{ xPos: -7.11201; yPos: 3.68863; zPos: -4.52683 }
- ListElement{ xPos: -8.83267; yPos: 2.96504; zPos: -3.61108 }
- ListElement{ xPos: -6.94874; yPos: 2.49808; zPos: -2.92883 }
- ListElement{ xPos: -9.02606; yPos: 4.7496; zPos: -4.18193 }
- ListElement{ xPos: -9.5434; yPos: 3.15534; zPos: -3.83789 }
- ListElement{ xPos: -6.8679; yPos: 3.66922; zPos: -3.58288 }
- ListElement{ xPos: -8.16487; yPos: 1.82227; zPos: -4.64523 }
- ListElement{ xPos: -7.42165; yPos: 3.18192; zPos: -4.22791 }
- ListElement{ xPos: -7.99257; yPos: 3.06559; zPos: -4.33262 }
- ListElement{ xPos: -8.98851; yPos: 2.64924; zPos: -4.44595 }
- ListElement{ xPos: -6.36774; yPos: 3.96697; zPos: -4.38998 }
- ListElement{ xPos: -7.18413; yPos: 3.32417; zPos: -4.04636 }
- ListElement{ xPos: -7.91649; yPos: 3.46826; zPos: -2.78126 }
- ListElement{ xPos: -7.49495; yPos: 3.12306; zPos: -3.14539 }
- ListElement{ xPos: -7.5445; yPos: 2.85744; zPos: -3.68421 }
- }
-
- ListModel {
- id: dataModelTwo
- ListElement{ xPos: 2.25354; yPos: 1.36828; zPos: -1.32025 }
- ListElement{ xPos: -2.35524; yPos: -0.081203; zPos: 1.23267 }
- ListElement{ xPos: 2.6517; yPos: -1.20549; zPos: 2.73606 }
- ListElement{ xPos: -2.55382; yPos: 3.48814; zPos: -0.454971 }
- ListElement{ xPos: -3.85468; yPos: 0.263955; zPos: 0.578276 }
- ListElement{ xPos: 2.85275; yPos: 1.32315; zPos: 1.0565 }
- ListElement{ xPos: -0.404099; yPos: -2.36811; zPos: -1.60324 }
- ListElement{ xPos: 1.58908; yPos: 0.363782; zPos: -0.554303 }
- ListElement{ xPos: 0.251507; yPos: 0.124637; zPos: -0.752568 }
- ListElement{ xPos: -2.45626; yPos: -0.722719; zPos: -1.11764 }
- ListElement{ xPos: 4.15342; yPos: 1.92247; zPos: -0.954975 }
- ListElement{ xPos: 2.05845; yPos: 0.643191; zPos: -0.121564 }
- ListElement{ xPos: 0.253468; yPos: 0.814651; zPos: 3.05732 }
- ListElement{ xPos: 1.51724; yPos: 0.244303; zPos: 2.25864 }
- ListElement{ xPos: 1.15; yPos: -0.487518; zPos: 0.815931 }
- ListElement{ xPos: -0.0538979; yPos: 0.124927; zPos: 0.251571 }
- ListElement{ xPos: 0.941523; yPos: -0.483498; zPos: -3.2731 }
- ListElement{ xPos: 3.55074; yPos: -1.04714; zPos: -0.954301 }
- ListElement{ xPos: -2.43125; yPos: -0.964099; zPos: -0.658537 }
- ListElement{ xPos: 4.25459; yPos: 0.163296; zPos: 2.05563 }
- ListElement{ xPos: -0.612031; yPos: 1.03234; zPos: -0.227175 }
- ListElement{ xPos: 0.78338; yPos: -0.847922; zPos: -0.959189 }
- ListElement{ xPos: -4.20076; yPos: 1.44907; zPos: 0.853836 }
- ListElement{ xPos: -1.59466; yPos: -1.27511; zPos: -1.5686 }
- ListElement{ xPos: -3.3567; yPos: -1.96864; zPos: 1.83224 }
- ListElement{ xPos: -2.75169; yPos: -0.964221; zPos: -1.26465 }
- ListElement{ xPos: -2.45624; yPos: 0.287046; zPos: -4.55032 }
- ListElement{ xPos: 2.73649; yPos: -1.48789; zPos: -0.653082 }
- ListElement{ xPos: 2.73284; yPos: 2.2912; zPos: -2.4933 }
- ListElement{ xPos: -0.854321; yPos: -2.04288; zPos: 3.7516 }
- ListElement{ xPos: -1.35708; yPos: -1.84915; zPos: 2.35985 }
- ListElement{ xPos: -3.25001; yPos: -1.64456; zPos: -4.45419 }
- ListElement{ xPos: -0.356834; yPos: -0.569139; zPos: -1.75308 }
- ListElement{ xPos: -0.813569; yPos: -0.287899; zPos: -0.0535036 }
- ListElement{ xPos: 4.75975; yPos: -1.48817; zPos: -2.45957 }
- ListElement{ xPos: 4.35294; yPos: 1.46154; zPos: 0.814214 }
- ListElement{ xPos: -3.22467; yPos: 2.76903; zPos: 0.510435 }
- ListElement{ xPos: 2.49494; yPos: 1.9286; zPos: 0.552287 }
- ListElement{ xPos: -0.456521; yPos: 0.688277; zPos: -0.82788 }
- ListElement{ xPos: -2.72568; yPos: 2.80278; zPos: -2.45782 }
- ListElement{ xPos: -1.65023; yPos: 1.32005; zPos: -2.05754 }
- ListElement{ xPos: -1.63551; yPos: 1.88519; zPos: -3.65544 }
- ListElement{ xPos: -1.20008; yPos: -0.723785; zPos: 0.853563 }
- ListElement{ xPos: 1.45448; yPos: 1.08701; zPos: 2.17385 }
- ListElement{ xPos: -3.9042; yPos: -1.16916; zPos: -0.85395 }
- ListElement{ xPos: 3.15645; yPos: 0.123932; zPos: -0.950988 }
- ListElement{ xPos: -1.35924; yPos: -2.64015; zPos: -0.54254 }
- ListElement{ xPos: -4.15753; yPos: 1.28294; zPos: -4.47502 }
- ListElement{ xPos: -2.7885; yPos: 2.48535; zPos: -0.159651 }
- ListElement{ xPos: -3.44364; yPos: 0.627232; zPos: 0.611881 }
- ListElement{ xPos: -1.55639; yPos: -0.967484; zPos: 2.35497 }
- ListElement{ xPos: -0.752853; yPos: 1.16736; zPos: -0.757871 }
- ListElement{ xPos: -0.859974; yPos: 0.640213; zPos: -1.75453 }
- ListElement{ xPos: 0.85744; yPos: 0.480175; zPos: 2.97204 }
- ListElement{ xPos: 4.0571; yPos: 3.24083; zPos: -0.183622 }
- ListElement{ xPos: 0.658087; yPos: 0.841418; zPos: 0.357839 }
- ListElement{ xPos: -2.13027; yPos: 0.920836; zPos: -2.758 }
- ListElement{ xPos: -0.65825; yPos: 0.164257; zPos: 1.69478 }
- ListElement{ xPos: -1.88335; yPos: -1.4811; zPos: -2.15408 }
- ListElement{ xPos: -1.67331; yPos: 2.96982; zPos: 1.85521 }
- ListElement{ xPos: -0.750937; yPos: 0.282914; zPos: -0.758707 }
- ListElement{ xPos: 2.29891; yPos: 1.16949; zPos: 2.65927 }
- ListElement{ xPos: 2.69132; yPos: 2.92632; zPos: -0.206126 }
- ListElement{ xPos: -1.65771; yPos: 3.28846; zPos: 2.50201 }
- ListElement{ xPos: -0.568799; yPos: 2.5289; zPos: -1.15875 }
- ListElement{ xPos: -1.85383; yPos: 0.528953; zPos: -2.32418 }
- ListElement{ xPos: 0.159422; yPos: -2.36165; zPos: -0.569393 }
- ListElement{ xPos: -3.96506; yPos: 0.282374; zPos: -0.254519 }
- ListElement{ xPos: 0.150933; yPos: -3.88058; zPos: -0.759422 }
- ListElement{ xPos: -1.17917; yPos: -1.96176; zPos: 0.95589 }
- ListElement{ xPos: -0.340817; yPos: -3.52333; zPos: -1.45715 }
- ListElement{ xPos: 3.21784; yPos: -2.56593; zPos: 2.55468 }
- ListElement{ xPos: 0.060965; yPos: -2.44153; zPos: 1.35813 }
- ListElement{ xPos: 1.4594; yPos: -1.96511; zPos: 0.170228 }
- ListElement{ xPos: 3.55017; yPos: -2.16882; zPos: 1.75539 }
- ListElement{ xPos: 2.89487; yPos: -0.727481; zPos: -0.39588 }
- ListElement{ xPos: -1.65151; yPos: -0.603877; zPos: 0.250508 }
- ListElement{ xPos: -4.35232; yPos: -1.32155; zPos: -2.31877 }
- ListElement{ xPos: 2.75852; yPos: -1.88931; zPos: 1.77874 }
- ListElement{ xPos: 2.75452; yPos: -0.64123; zPos: 2.45546 }
- ListElement{ xPos: 0.151914; yPos: -0.888395; zPos: -0.260935 }
- ListElement{ xPos: 0.150593; yPos: 0.0461652; zPos: -0.158206 }
- ListElement{ xPos: -1.22087; yPos: -2.92034; zPos: -3.78604 }
- ListElement{ xPos: -0.761622; yPos: 0.161856; zPos: 3.5586 }
- ListElement{ xPos: -1.88456; yPos: -2.48094; zPos: 0.287091 }
- ListElement{ xPos: 1.25293; yPos: 2.64374; zPos: 1.6532 }
- ListElement{ xPos: -0.657609; yPos: 1.32547; zPos: -0.557301 }
- ListElement{ xPos: 3.85995; yPos: 2.32568; zPos: -1.38265 }
- ListElement{ xPos: 1.65572; yPos: -2.28977; zPos: 0.957488 }
- ListElement{ xPos: -2.45312; yPos: -2.96071; zPos: 3.45147 }
- ListElement{ xPos: -1.75259; yPos: 0.365259; zPos: 1.60113 }
- ListElement{ xPos: 1.14045; yPos: -0.844805; zPos: 0.359343 }
- ListElement{ xPos: -1.55951; yPos: 1.65687; zPos: -3.10398 }
- ListElement{ xPos: 0.441652; yPos: -1.36623; zPos: -1.55494 }
- ListElement{ xPos: -3.95762; yPos: 0.288753; zPos: 3.7791 }
- ListElement{ xPos: -1.80101; yPos: -0.241499; zPos: 2.29693 }
- ListElement{ xPos: -0.456931; yPos: 1.64399; zPos: 1.35559 }
- ListElement{ xPos: -0.691421; yPos: -0.723378; zPos: 2.51839 }
- ListElement{ xPos: -1.20658; yPos: -3.04063; zPos: -1.552 }
- ListElement{ xPos: -0.958574; yPos: 1.48688; zPos: 0.950152 }
- ListElement{ xPos: 1.76319; yPos: -1.36072; zPos: 2.15866 }
- ListElement{ xPos: -3.91301; yPos: -0.328932; zPos: -2.45524 }
- ListElement{ xPos: 2.9553; yPos: 3.12703; zPos: -2.43321 }
- ListElement{ xPos: 3.55939; yPos: -1.48028; zPos: 0.152252 }
- ListElement{ xPos: -1.41545; yPos: 3.247; zPos: 0.779314 }
- ListElement{ xPos: -3.34482; yPos: -0.894538; zPos: 0.209302 }
- ListElement{ xPos: 1.15338; yPos: 0.362332; zPos: -2.7924 }
- ListElement{ xPos: 0.468852; yPos: 0.120872; zPos: 1.35593 }
- ListElement{ xPos: 1.98778; yPos: -3.32292; zPos: -0.758591 }
- ListElement{ xPos: 0.420718; yPos: -0.225014; zPos: -2.44806 }
- ListElement{ xPos: 0.550207; yPos: 1.56432; zPos: 2.25317 }
- ListElement{ xPos: 4.35156; yPos: -0.966178; zPos: -0.791032 }
- ListElement{ xPos: 3.35179; yPos: -1.04981; zPos: -0.854089 }
- ListElement{ xPos: 1.70857; yPos: -0.281369; zPos: -0.254686 }
- ListElement{ xPos: -3.05855; yPos: -0.443693; zPos: 1.30251 }
- ListElement{ xPos: -3.9509; yPos: -2.72179; zPos: -3.83489 }
- ListElement{ xPos: 2.19632; yPos: 1.32915; zPos: 1.15345 }
- ListElement{ xPos: 1.42782; yPos: -0.449435; zPos: -2.85005 }
- ListElement{ xPos: -2.19053; yPos: 0.049866; zPos: 2.87493 }
- ListElement{ xPos: 2.45196; yPos: -2.44705; zPos: -2.85302 }
- ListElement{ xPos: 4.35263; yPos: 0.245956; zPos: 1.12886 }
- ListElement{ xPos: 1.8167; yPos: 1.85407; zPos: -0.714159 }
- ListElement{ xPos: 1.88577; yPos: 2.04227; zPos: -0.959396 }
- ListElement{ xPos: 1.6522; yPos: -2.48289; zPos: 0.355373 }
- ListElement{ xPos: -3.39965; yPos: 0.286834; zPos: -1.68171 }
- ListElement{ xPos: 1.85639; yPos: 1.47419; zPos: 2.25749 }
- ListElement{ xPos: -2.5216; yPos: -0.88573; zPos: -2.69594 }
- ListElement{ xPos: -0.143043; yPos: 0.28453; zPos: -1.75898 }
- ListElement{ xPos: -2.52745; yPos: -2.76741; zPos: -0.257011 }
- ListElement{ xPos: 0.381448; yPos: -1.64793; zPos: -0.756889 }
- ListElement{ xPos: 2.30469; yPos: -1.28844; zPos: -2.79271 }
- ListElement{ xPos: -1.72491; yPos: -1.48634; zPos: -2.61686 }
- ListElement{ xPos: 0.503342; yPos: 0.248352; zPos: -2.27162 }
- ListElement{ xPos: 0.457491; yPos: -1.88183; zPos: -0.951124 }
- ListElement{ xPos: -1.23123; yPos: 0.963519; zPos: 2.3569 }
- ListElement{ xPos: -0.55709; yPos: -0.364372; zPos: -1.82528 }
- ListElement{ xPos: 2.73963; yPos: -0.567024; zPos: -0.496936 }
- ListElement{ xPos: 1.17979; yPos: 2.76252; zPos: -2.35641 }
- ListElement{ xPos: -1.20723; yPos: -2.1692; zPos: 3.14368 }
- ListElement{ xPos: -0.0504301; yPos: 1.76714; zPos: 1.64265 }
- ListElement{ xPos: 1.45714; yPos: -0.725448; zPos: 0.739217 }
- ListElement{ xPos: 0.246123; yPos: -3.27811; zPos: -0.251218 }
- ListElement{ xPos: -0.894632; yPos: 1.08758; zPos: -0.17184 }
- ListElement{ xPos: -2.45217; yPos: 0.565077; zPos: -0.557015 }
- ListElement{ xPos: 2.51301; yPos: 1.1271; zPos: 2.25057 }
- ListElement{ xPos: -1.05099; yPos: -2.1688; zPos: -1.88996 }
- ListElement{ xPos: 1.26945; yPos: -2.1225; zPos: -1.55031 }
- ListElement{ xPos: -4.30129; yPos: -0.760298; zPos: 0.259868 }
- ListElement{ xPos: -0.157336; yPos: -0.237532; zPos: -2.69483 }
- ListElement{ xPos: -2.95778; yPos: 1.36212; zPos: -3.65524 }
- ListElement{ xPos: 2.74003; yPos: 1.16234; zPos: 2.05928 }
- ListElement{ xPos: 0.955294; yPos: -1.52182; zPos: -1.05684 }
- ListElement{ xPos: -1.87004; yPos: 2.72729; zPos: -0.550608 }
- ListElement{ xPos: 0.459439; yPos: 2.88101; zPos: -4.4135 }
- ListElement{ xPos: 1.35069; yPos: 1.08445; zPos: -0.808625 }
- ListElement{ xPos: -2.70034; yPos: -1.36291; zPos: -2.65126 }
- ListElement{ xPos: 0.353099; yPos: 2.32354; zPos: -1.61885 }
- ListElement{ xPos: -0.453359; yPos: 1.67524; zPos: 0.122888 }
- ListElement{ xPos: 3.7506; yPos: 1.12855; zPos: -3.86338 }
- ListElement{ xPos: 0.548626; yPos: 2.63101; zPos: 0.552261 }
- ListElement{ xPos: -0.753935; yPos: -3.52241; zPos: -3.21122 }
- ListElement{ xPos: 0.258935; yPos: -1.32453; zPos: 2.25745 }
- ListElement{ xPos: -2.8797; yPos: -1.60832; zPos: -2.45626 }
- ListElement{ xPos: 0.151838; yPos: -0.565264; zPos: 3.98539 }
- ListElement{ xPos: 2.1508; yPos: -1.68734; zPos: -1.75076 }
- ListElement{ xPos: -4.23947; yPos: -1.92531; zPos: 2.35438 }
- ListElement{ xPos: 1.95273; yPos: -1.32736; zPos: 0.313398 }
- ListElement{ xPos: 0.533647; yPos: 0.646686; zPos: 0.75712 }
- ListElement{ xPos: 0.856619; yPos: -0.843249; zPos: -0.577773 }
- ListElement{ xPos: -2.15649; yPos: -1.64285; zPos: -2.31055 }
- ListElement{ xPos: -0.851309; yPos: -2.84717; zPos: -0.324933 }
- ListElement{ xPos: -3.17772; yPos: -0.324817; zPos: -0.858394 }
- ListElement{ xPos: 3.45303; yPos: 0.529449; zPos: 0.818094 }
- ListElement{ xPos: 1.42912; yPos: 0.238088; zPos: 0.385617 }
- ListElement{ xPos: 0.459586; yPos: 1.7661; zPos: -0.153761 }
- ListElement{ xPos: 0.855577; yPos: 3.16845; zPos: -2.19548 }
- ListElement{ xPos: 2.15181; yPos: 0.729021; zPos: -0.955922 }
- ListElement{ xPos: -2.40113; yPos: 0.665756; zPos: -0.521366 }
- ListElement{ xPos: 1.45469; yPos: -0.462177; zPos: -1.95869 }
- ListElement{ xPos: 0.629115; yPos: -1.84769; zPos: 1.86755 }
- ListElement{ xPos: 3.47576; yPos: -0.209875; zPos: -0.555502 }
- ListElement{ xPos: 0.295075; yPos: -0.840772; zPos: 4.68895 }
- ListElement{ xPos: -0.253301; yPos: -2.49078; zPos: 2.11749 }
- ListElement{ xPos: -1.15923; yPos: -3.163; zPos: -3.05671 }
- ListElement{ xPos: 1.45484; yPos: 0.963654; zPos: -0.734942 }
- ListElement{ xPos: 0.354307; yPos: 0.520772; zPos: -1.32278 }
- ListElement{ xPos: 2.65725; yPos: 0.284589; zPos: -0.856856 }
- ListElement{ xPos: -1.2596; yPos: 0.765493; zPos: -1.66469 }
- ListElement{ xPos: -0.656057; yPos: -2.16906; zPos: 3.72144 }
- ListElement{ xPos: -0.251559; yPos: -2.36406; zPos: -1.89709 }
- ListElement{ xPos: 0.35608; yPos: -0.80463; zPos: 1.85674 }
- ListElement{ xPos: 0.0508692; yPos: 0.615674; zPos: 0.856785 }
- ListElement{ xPos: -2.50726; yPos: 2.28743; zPos: -2.05697 }
- ListElement{ xPos: 1.65272; yPos: 1.29604; zPos: 2.11481 }
- ListElement{ xPos: -3.2878; yPos: -0.244516; zPos: 0.799732 }
- ListElement{ xPos: -2.18989; yPos: -0.847222; zPos: -0.264559 }
- ListElement{ xPos: 0.452832; yPos: 0.960993; zPos: 2.53691 }
- ListElement{ xPos: -2.43913; yPos: 1.28957; zPos: 2.75427 }
- ListElement{ xPos: -1.72889; yPos: -3.29414; zPos: -2.31426 }
- ListElement{ xPos: 0.952615; yPos: -0.0844651; zPos: 0.346607 }
- ListElement{ xPos: 1.41175; yPos: 0.889643; zPos: 0.450356 }
- ListElement{ xPos: 2.13145; yPos: 1.08697; zPos: 0.223055 }
- ListElement{ xPos: -2.16002; yPos: -0.225505; zPos: -0.602641 }
- ListElement{ xPos: 0.54028; yPos: 1.24765; zPos: -0.456129 }
- ListElement{ xPos: 2.55086; yPos: -0.56734; zPos: -2.65051 }
- ListElement{ xPos: -4.53921; yPos: -0.483588; zPos: -1.25013 }
- ListElement{ xPos: 3.45413; yPos: -0.44258; zPos: 2.29687 }
- ListElement{ xPos: -0.257456; yPos: 0.64624; zPos: 1.65041 }
- ListElement{ xPos: 1.25559; yPos: -0.65493; zPos: -0.358872 }
- ListElement{ xPos: 1.9599; yPos: -1.56965; zPos: -4.17044 }
- ListElement{ xPos: 2.75996; yPos: -1.98665; zPos: 3.31794 }
- ListElement{ xPos: 3.05837; yPos: 1.04847; zPos: -0.975536 }
- ListElement{ xPos: -2.95407; yPos: 1.40294; zPos: -2.25825 }
- ListElement{ xPos: 1.38718; yPos: 0.360709; zPos: -2.98211 }
- ListElement{ xPos: 0.481728; yPos: -2.48564; zPos: 3.25864 }
- ListElement{ xPos: -1.15089; yPos: 0.363522; zPos: 0.458662 }
- ListElement{ xPos: -2.25551; yPos: 0.0421839; zPos: 0.650008 }
- ListElement{ xPos: -1.85862; yPos: -0.969237; zPos: 4.25313 }
- ListElement{ xPos: 1.55797; yPos: 0.0465051; zPos: -3.85709 }
- ListElement{ xPos: 0.0555338; yPos: 0.682957; zPos: -2.45556 }
- ListElement{ xPos: -0.186868; yPos: -0.482811; zPos: 1.96957 }
- ListElement{ xPos: 2.197; yPos: -1.5248; zPos: -4.20912 }
- ListElement{ xPos: 3.40636; yPos: 0.626269; zPos: -2.05757 }
- ListElement{ xPos: 0.780426; yPos: 2.68048; zPos: -0.852693 }
- ListElement{ xPos: 1.65184; yPos: 1.68951; zPos: -0.892089 }
- ListElement{ xPos: 2.11929; yPos: -2.44406; zPos: 1.21168 }
- ListElement{ xPos: -0.153348; yPos: -1.88112; zPos: -0.357374 }
- ListElement{ xPos: -0.359393; yPos: 1.76654; zPos: 1.63063 }
- ListElement{ xPos: -2.15954; yPos: 0.0819277; zPos: 0.757621 }
- ListElement{ xPos: -0.159898; yPos: -3.36316; zPos: 0.359582 }
- ListElement{ xPos: 2.74125; yPos: -2.84148; zPos: 0.355785 }
- ListElement{ xPos: -1.3558; yPos: 0.0027827; zPos: -0.588162 }
- ListElement{ xPos: -0.354346; yPos: -2.56747; zPos: -0.984403 }
- ListElement{ xPos: -2.75082; yPos: -3.56807; zPos: 1.5599 }
- ListElement{ xPos: -2.54708; yPos: -0.686147; zPos: 2.75649 }
- ListElement{ xPos: 1.35138; yPos: 0.692978; zPos: -2.24969 }
- ListElement{ xPos: -1.39826; yPos: -0.246682; zPos: -1.65876 }
- ListElement{ xPos: -1.46629; yPos: -1.44446; zPos: 4.45293 }
- ListElement{ xPos: -1.89442; yPos: 3.64549; zPos: 2.05732 }
- ListElement{ xPos: -0.658093; yPos: 0.0815129; zPos: 3.95269 }
- ListElement{ xPos: 2.25603; yPos: 2.96329; zPos: -2.35993 }
- ListElement{ xPos: 1.36323; yPos: 1.64488; zPos: -0.0538547 }
- ListElement{ xPos: 1.75659; yPos: 2.24227; zPos: -2.8522 }
- ListElement{ xPos: -0.0566584; yPos: -1.56465; zPos: -0.0503143 }
- ListElement{ xPos: -3.8532; yPos: -0.822258; zPos: -0.345406 }
- ListElement{ xPos: 0.951328; yPos: 0.329296; zPos: -2.52211 }
- ListElement{ xPos: -2.48659; yPos: 0.410856; zPos: -3.55401 }
- ListElement{ xPos: 3.72676; yPos: 2.36324; zPos: 3.65589 }
- ListElement{ xPos: 0.559972; yPos: 0.884984; zPos: 3.15283 }
- ListElement{ xPos: -1.37624; yPos: -1.36007; zPos: -2.16578 }
- ListElement{ xPos: 2.05543; yPos: 0.4472; zPos: -0.82911 }
- ListElement{ xPos: -4.75258; yPos: 1.8779; zPos: -1.75376 }
- ListElement{ xPos: 0.15648; yPos: 2.64039; zPos: -2.21467 }
- ListElement{ xPos: -2.0593; yPos: -2.56775; zPos: 1.15037 }
- ListElement{ xPos: -3.70217; yPos: 2.12375; zPos: 1.3652 }
- ListElement{ xPos: 1.05566; yPos: 0.98299; zPos: 4.02985 }
- ListElement{ xPos: -0.766882; yPos: -0.88359; zPos: 1.35525 }
- ListElement{ xPos: 0.951335; yPos: -1.84689; zPos: 0.178337 }
- ListElement{ xPos: 0.751608; yPos: 1.1691; zPos: 4.25273 }
- ListElement{ xPos: -1.36367; yPos: 0.728904; zPos: 0.655858 }
- ListElement{ xPos: 3.17581; yPos: -0.0844758; zPos: -1.75811 }
- ListElement{ xPos: 2.85546; yPos: -0.683618; zPos: 0.653701 }
- ListElement{ xPos: -0.471118; yPos: 3.04176; zPos: -2.35393 }
- ListElement{ xPos: 3.0574; yPos: -0.601996; zPos: -0.611932 }
- ListElement{ xPos: -0.854024; yPos: -0.44532; zPos: 0.355575 }
- ListElement{ xPos: 0.05047; yPos: -1.92888; zPos: 0.64818 }
- ListElement{ xPos: -1.25515; yPos: -1.44466; zPos: 1.90429 }
- ListElement{ xPos: -1.67201; yPos: 0.0461708; zPos: -0.796655 }
- ListElement{ xPos: 1.45345; yPos: -1.66159; zPos: -3.48143 }
- ListElement{ xPos: -2.84514; yPos: -1.24586; zPos: -3.47945 }
- ListElement{ xPos: 0.287402; yPos: -0.688276; zPos: -3.75664 }
- ListElement{ xPos: 3.35908; yPos: 0.687828; zPos: -1.94406 }
- ListElement{ xPos: -2.39167; yPos: 1.08322; zPos: -1.73508 }
- ListElement{ xPos: 1.52152; yPos: 1.86032; zPos: -1.25351 }
- ListElement{ xPos: 1.55931; yPos: 3.64414; zPos: 1.35944 }
- ListElement{ xPos: 1.15954; yPos: -1.36058; zPos: 0.758814 }
- ListElement{ xPos: -1.95325; yPos: 0.0851092; zPos: -0.854106 }
- ListElement{ xPos: -2.25254; yPos: -0.523024; zPos: 1.05486 }
- ListElement{ xPos: -2.68036; yPos: -1.32901; zPos: 1.05877 }
- ListElement{ xPos: -0.485956; yPos: -1.52164; zPos: 2.45303 }
- ListElement{ xPos: -0.0546215; yPos: 0.640683; zPos: -2.85953 }
- ListElement{ xPos: 4.45295; yPos: -0.246051; zPos: -0.159626 }
- ListElement{ xPos: 3.4523; yPos: 1.7215; zPos: -1.10587 }
- ListElement{ xPos: 3.35142; yPos: -1.72053; zPos: -0.252105 }
- ListElement{ xPos: 1.74251; yPos: 2.76108; zPos: 2.51524 }
- ListElement{ xPos: 2.15054; yPos: -2.88101; zPos: -1.7527 }
- ListElement{ xPos: -3.70517; yPos: -0.0470951; zPos: 0.258921 }
- ListElement{ xPos: -0.45593; yPos: -3.47184; zPos: -2.95345 }
- ListElement{ xPos: 3.15988; yPos: -2.32107; zPos: 0.105299 }
- ListElement{ xPos: 0.751449; yPos: -2.88762; zPos: -3.45245 }
- ListElement{ xPos: 2.9794; yPos: 0.493172; zPos: -0.654683 }
- ListElement{ xPos: -1.87713; yPos: -2.48632; zPos: -3.534 }
- ListElement{ xPos: 1.65266; yPos: 3.16008; zPos: 2.1579 }
- ListElement{ xPos: -1.25239; yPos: -0.763119; zPos: 2.15776 }
- ListElement{ xPos: 3.5572; yPos: 0.282681; zPos: 2.44174 }
- ListElement{ xPos: 0.251145; yPos: 0.520256; zPos: 2.3184 }
- ListElement{ xPos: -1.78596; yPos: -1.36913; zPos: -2.50818 }
- ListElement{ xPos: 3.82122; yPos: 1.04473; zPos: 0.456159 }
- ListElement{ xPos: 2.45979; yPos: -0.722759; zPos: -4.05123 }
- ListElement{ xPos: -0.855594; yPos: 0.163792; zPos: -0.553702 }
- ListElement{ xPos: 0.656895; yPos: 0.529982; zPos: 3.35129 }
- ListElement{ xPos: 0.857952; yPos: -0.0885677; zPos: 0.695128 }
- ListElement{ xPos: -0.143269; yPos: 1.12972; zPos: -3.155 }
- ListElement{ xPos: -2.95923; yPos: 0.241767; zPos: 0.832165 }
- ListElement{ xPos: 0.253329; yPos: -0.622952; zPos: -0.459799 }
- ListElement{ xPos: 0.151499; yPos: 2.5297; zPos: 1.53059 }
- ListElement{ xPos: 0.655464; yPos: -1.49902; zPos: -1.51071 }
- ListElement{ xPos: 4.7585; yPos: 1.76425; zPos: 1.15164 }
- ListElement{ xPos: -1.75063; yPos: -1.44645; zPos: -3.65525 }
- ListElement{ xPos: 0.850392; yPos: 0.0417223; zPos: -0.340588 }
- ListElement{ xPos: -0.557015; yPos: -0.282305; zPos: -1.85291 }
- ListElement{ xPos: -4.05639; yPos: 0.522959; zPos: -2.3507 }
- ListElement{ xPos: -0.358137; yPos: -0.967852; zPos: 0.807832 }
- ListElement{ xPos: -1.82056; yPos: -0.0483894; zPos: 0.0541359 }
- ListElement{ xPos: -2.16623; yPos: 0.129809; zPos: -2.52513 }
- ListElement{ xPos: -1.85591; yPos: -1.04417; zPos: -1.28501 }
- ListElement{ xPos: -1.79647; yPos: -3.44045; zPos: -1.73399 }
- ListElement{ xPos: 2.25342; yPos: 0.161308; zPos: -0.0517495 }
- ListElement{ xPos: -1.37877; yPos: 0.243596; zPos: -1.52931 }
- ListElement{ xPos: -0.059299; yPos: -0.480825; zPos: 1.7137 }
- ListElement{ xPos: -2.54357; yPos: 0.286685; zPos: -2.11495 }
- ListElement{ xPos: 3.92334; yPos: -0.442936; zPos: -0.852895 }
- ListElement{ xPos: -0.390023; yPos: -1.96437; zPos: 1.38718 }
- ListElement{ xPos: 1.35263; yPos: 2.92968; zPos: -1.1545 }
- ListElement{ xPos: -2.25892; yPos: -2.27429; zPos: -0.451533 }
- ListElement{ xPos: -0.2215; yPos: -0.126727; zPos: 0.155541 }
- ListElement{ xPos: 0.715932; yPos: 1.47509; zPos: -3.52895 }
- ListElement{ xPos: -0.382939; yPos: 3.16461; zPos: 2.65165 }
- ListElement{ xPos: -1.14437; yPos: -1.44682; zPos: 0.456601 }
- ListElement{ xPos: 0.251892; yPos: -1.0431; zPos: 4.31548 }
- ListElement{ xPos: -2.23281; yPos: -2.48698; zPos: 0.46995 }
- ListElement{ xPos: 0.954231; yPos: -3.4323; zPos: -1.20233 }
- ListElement{ xPos: 2.75569; yPos: -1.66383; zPos: -1.95486 }
- ListElement{ xPos: 0.750644; yPos: -1.84163; zPos: -0.159206 }
- ListElement{ xPos: -0.757387; yPos: -1.84192; zPos: 0.354209 }
- ListElement{ xPos: -2.85509; yPos: -2.12151; zPos: -0.954754 }
- ListElement{ xPos: -0.888427; yPos: -2.8403; zPos: -0.157387 }
- ListElement{ xPos: -1.95265; yPos: -0.445753; zPos: 2.17956 }
- ListElement{ xPos: -1.05845; yPos: -2.48694; zPos: -1.25315 }
- ListElement{ xPos: -2.66497; yPos: -1.48251; zPos: 0.873192 }
- ListElement{ xPos: 2.50491; yPos: -1.0833; zPos: 1.99667 }
- ListElement{ xPos: 0.453931; yPos: 2.52158; zPos: 0.456875 }
- ListElement{ xPos: 1.55859; yPos: -0.161924; zPos: 0.256619 }
- ListElement{ xPos: -2.92585; yPos: 0.368018; zPos: 0.35908 }
- ListElement{ xPos: 2.95509; yPos: -1.56248; zPos: -2.74469 }
- ListElement{ xPos: 3.46082; yPos: -1.76026; zPos: 3.05835 }
- ListElement{ xPos: 1.75644; yPos: -2.84241; zPos: 0.507631 }
- ListElement{ xPos: -0.959006; yPos: 0.649579; zPos: 1.10824 }
- ListElement{ xPos: 2.63856; yPos: 2.0417; zPos: 0.187281 }
- ListElement{ xPos: -0.150004; yPos: -0.0838836; zPos: -0.949314 }
- ListElement{ xPos: 2.26402; yPos: -1.28916; zPos: 2.85284 }
- ListElement{ xPos: -0.821239; yPos: 2.68795; zPos: -0.317185 }
- ListElement{ xPos: 3.47124; yPos: 0.840813; zPos: -2.65322 }
- ListElement{ xPos: -0.253209; yPos: -0.244177; zPos: 0.457348 }
- ListElement{ xPos: 2.76181; yPos: 1.64033; zPos: -1.95329 }
- ListElement{ xPos: 1.35105; yPos: -2.96027; zPos: 0.659952 }
- ListElement{ xPos: -1.45423; yPos: -0.24358; zPos: 0.832696 }
- ListElement{ xPos: 1.45109; yPos: 1.64958; zPos: -3.45448 }
- ListElement{ xPos: -1.15659; yPos: 3.08225; zPos: 1.11445 }
- ListElement{ xPos: 0.806359; yPos: 1.88298; zPos: -2.13001 }
- ListElement{ xPos: 1.15538; yPos: 3.04545; zPos: -0.759437 }
- ListElement{ xPos: -0.450074; yPos: 1.36121; zPos: -0.155042 }
- ListElement{ xPos: -2.80924; yPos: -1.24207; zPos: 2.55513 }
- ListElement{ xPos: 4.48859; yPos: 2.04394; zPos: 1.25324 }
- ListElement{ xPos: -0.958741; yPos: 1.24575; zPos: 3.65169 }
- ListElement{ xPos: 3.45143; yPos: 1.3276; zPos: 2.5144 }
- ListElement{ xPos: -3.25232; yPos: 1.12514; zPos: -1.21425 }
- ListElement{ xPos: -2.45327; yPos: 0.681109; zPos: 4.35764 }
- ListElement{ xPos: 0.55395; yPos: -0.128353; zPos: -3.95705 }
- ListElement{ xPos: -0.352458; yPos: 3.08882; zPos: -0.340631 }
- ListElement{ xPos: 1.35213; yPos: -2.92251; zPos: -3.31166 }
- ListElement{ xPos: 0.52621; yPos: -0.279201; zPos: 0.959619 }
- ListElement{ xPos: 1.2243; yPos: -0.240093; zPos: -0.75247 }
- ListElement{ xPos: -1.29854; yPos: 2.16477; zPos: 3.3507 }
- ListElement{ xPos: -3.35677; yPos: 2.36713; zPos: 3.4585 }
- ListElement{ xPos: 0.957717; yPos: -0.885793; zPos: 1.25827 }
- ListElement{ xPos: 0.150983; yPos: 1.24269; zPos: 0.539106 }
- ListElement{ xPos: 1.84986; yPos: 1.56932; zPos: -1.05811 }
- ListElement{ xPos: -1.35563; yPos: 3.82103; zPos: -1.45287 }
- ListElement{ xPos: 1.4544; yPos: -2.6453; zPos: 0.58082 }
- ListElement{ xPos: 2.05908; yPos: 1.16496; zPos: 1.44075 }
- ListElement{ xPos: 2.9507; yPos: -2.4957; zPos: 0.153512 }
- ListElement{ xPos: -1.10289; yPos: 0.763085; zPos: -1.65351 }
- ListElement{ xPos: -2.50708; yPos: -2.467; zPos: 1.05892 }
- ListElement{ xPos: 3.55284; yPos: -1.8509; zPos: -2.55732 }
- ListElement{ xPos: -0.848034; yPos: 1.24305; zPos: -3.7516 }
- ListElement{ xPos: -1.35051; yPos: -2.48178; zPos: 2.85326 }
- ListElement{ xPos: -2.18554; yPos: 1.48771; zPos: -0.155205 }
- ListElement{ xPos: -0.459278; yPos: 2.68404; zPos: 2.85727 }
- ListElement{ xPos: 0.854722; yPos: 1.47322; zPos: -3.35951 }
- ListElement{ xPos: -2.23505; yPos: -2.24254; zPos: 0.353203 }
- ListElement{ xPos: 1.42395; yPos: -2.32169; zPos: 0.558188 }
- ListElement{ xPos: 3.65106; yPos: 1.12201; zPos: -4.58409 }
- ListElement{ xPos: 0.11; yPos: -0.68782; zPos: 1.85804 }
- ListElement{ xPos: -1.9551; yPos: -0.560204; zPos: -2.0577 }
- ListElement{ xPos: 1.85964; yPos: 1.32737; zPos: -4.40673 }
- ListElement{ xPos: -0.616311; yPos: 0.649737; zPos: -0.30189 }
- ListElement{ xPos: -1.55375; yPos: 1.52043; zPos: -3.75629 }
- ListElement{ xPos: 1.85417; yPos: 0.486964; zPos: 0.654806 }
- ListElement{ xPos: 3.35638; yPos: 2.52599; zPos: 1.94343 }
- ListElement{ xPos: 0.491389; yPos: 1.40427; zPos: -1.31935 }
- ListElement{ xPos: -2.72939; yPos: 0.844341; zPos: 1.62621 }
- ListElement{ xPos: -0.525985; yPos: 1.31415; zPos: 0.484015 }
- ListElement{ xPos: 2.25998; yPos: -1.719; zPos: 1.25143 }
- ListElement{ xPos: 1.79268; yPos: 2.46378; zPos: -0.951188 }
- ListElement{ xPos: -3.55105; yPos: 1.04122; zPos: 3.9501 }
- ListElement{ xPos: 0.954251; yPos: 1.28296; zPos: 2.05486 }
- ListElement{ xPos: -3.15267; yPos: 1.96498; zPos: -0.361707 }
- ListElement{ xPos: 1.35358; yPos: -0.921098; zPos: -1.71743 }
- ListElement{ xPos: -3.16896; yPos: -3.08548; zPos: 0.903411 }
- ListElement{ xPos: 1.25127; yPos: -2.44903; zPos: 2.25616 }
- ListElement{ xPos: -3.88899; yPos: 0.761334; zPos: -1.05751 }
- ListElement{ xPos: -1.05163; yPos: -3.89783; zPos: -0.883668 }
- ListElement{ xPos: -4.189; yPos: 1.24176; zPos: -2.63816 }
- ListElement{ xPos: 2.45671; yPos: -1.84859; zPos: 0.352808 }
- ListElement{ xPos: -1.59618; yPos: 2.16255; zPos: 4.33699 }
- ListElement{ xPos: 2.10913; yPos: -1.88673; zPos: -0.952497 }
- ListElement{ xPos: -1.85571; yPos: -0.287392; zPos: 0.277176 }
- ListElement{ xPos: 0.751967; yPos: 1.04568; zPos: -1.35427 }
- ListElement{ xPos: 2.85792; yPos: 1.60982; zPos: -2.05454 }
- ListElement{ xPos: -2.13152; yPos: -0.260207; zPos: -2.15124 }
- ListElement{ xPos: 1.75432; yPos: 2.28936; zPos: 0.756254 }
- ListElement{ xPos: 1.95711; yPos: -0.681098; zPos: -2.38037 }
- ListElement{ xPos: -0.826273; yPos: 1.08361; zPos: 1.6515 }
- ListElement{ xPos: -1.85118; yPos: 1.89481; zPos: -0.756754 }
- ListElement{ xPos: -3.0571; yPos: 2.44795; zPos: 0.355341 }
- ListElement{ xPos: -0.455122; yPos: -3.58071; zPos: -2.85209 }
- ListElement{ xPos: -0.95805; yPos: 0.641282; zPos: 2.15189 }
- ListElement{ xPos: -1.35515; yPos: -0.234803; zPos: -0.825819 }
- ListElement{ xPos: 2.12472; yPos: -0.0444431; zPos: 0.651227 }
- ListElement{ xPos: 2.67573; yPos: 0.223987; zPos: 2.75712 }
- ListElement{ xPos: 1.65871; yPos: -0.163059; zPos: 1.6513 }
- ListElement{ xPos: -1.85429; yPos: 0.68862; zPos: 1.9576 }
- ListElement{ xPos: -3.05186; yPos: -2.2804; zPos: 0.100919 }
- ListElement{ xPos: 3.41813; yPos: -1.88775; zPos: 3.67075 }
- ListElement{ xPos: -0.753778; yPos: 0.36467; zPos: 1.55333 }
- ListElement{ xPos: 2.97628; yPos: -1.36503; zPos: -1.85135 }
- ListElement{ xPos: 0.477128; yPos: 1.08862; zPos: 0.858931 }
- ListElement{ xPos: -1.0531; yPos: 1.0488; zPos: 2.15218 }
- ListElement{ xPos: 2.66911; yPos: -2.08876; zPos: -0.182397 }
- ListElement{ xPos: 0.5117; yPos: -2.84097; zPos: -0.953684 }
- ListElement{ xPos: 0.468302; yPos: 1.88616; zPos: 2.05369 }
- ListElement{ xPos: -3.16099; yPos: -2.76085; zPos: -2.75679 }
- ListElement{ xPos: -2.6593; yPos: 3.52373; zPos: -1.24072 }
- ListElement{ xPos: -4.37957; yPos: -0.286903; zPos: 3.63863 }
- ListElement{ xPos: -2.85958; yPos: -2.56921; zPos: -2.85723 }
- ListElement{ xPos: -0.159735; yPos: 2.72758; zPos: -2.80575 }
- ListElement{ xPos: -0.951849; yPos: -0.607465; zPos: 1.05633 }
- ListElement{ xPos: 1.93077; yPos: 2.56422; zPos: 1.25446 }
- ListElement{ xPos: -0.859754; yPos: 0.248106; zPos: 0.0584456 }
- ListElement{ xPos: 2.4023; yPos: 2.56659; zPos: -1.2588 }
- ListElement{ xPos: 2.35295; yPos: -1.08729; zPos: 2.7851 }
- ListElement{ xPos: -2.1537; yPos: -0.765032; zPos: 2.83652 }
- ListElement{ xPos: 1.40185; yPos: 1.29804; zPos: 2.3588 }
- ListElement{ xPos: -0.991566; yPos: 1.72049; zPos: 4.17146 }
- ListElement{ xPos: 3.76736; yPos: -1.48837; zPos: 2.05329 }
- ListElement{ xPos: -0.251896; yPos: 0.765367; zPos: -1.4087 }
- ListElement{ xPos: -1.6228; yPos: 0.328693; zPos: 0.0528287 }
- ListElement{ xPos: 2.56735; yPos: -3.08103; zPos: 0.853144 }
- ListElement{ xPos: 0.0531812; yPos: -1.96216; zPos: 1.55734 }
- ListElement{ xPos: -3.77052; yPos: 0.8421; zPos: -0.258953 }
- ListElement{ xPos: 2.35523; yPos: 0.676643; zPos: -1.55789 }
- ListElement{ xPos: 1.16702; yPos: 2.64474; zPos: -1.45533 }
- ListElement{ xPos: 2.55709; yPos: -1.56013; zPos: 2.05351 }
- ListElement{ xPos: -2.15518; yPos: 3.56253; zPos: 3.257 }
- ListElement{ xPos: -0.553936; yPos: -1.24935; zPos: 2.65224 }
- ListElement{ xPos: -0.355931; yPos: 1.32374; zPos: 0.859863 }
- ListElement{ xPos: -1.92974; yPos: 1.2482; zPos: 1.15936 }
- ListElement{ xPos: 0.350652; yPos: -2.44371; zPos: -1.35611 }
- ListElement{ xPos: 2.98996; yPos: -1.08527; zPos: -4.30641 }
- ListElement{ xPos: 1.82765; yPos: -0.440236; zPos: 1.25528 }
- ListElement{ xPos: -0.689231; yPos: -1.08813; zPos: -0.668663 }
- ListElement{ xPos: -0.326426; yPos: -0.881857; zPos: -1.45371 }
- ListElement{ xPos: -1.0655; yPos: 2.12466; zPos: 2.34146 }
- ListElement{ xPos: 3.1563; yPos: 0.523166; zPos: -2.8572 }
- ListElement{ xPos: 0.455505; yPos: 2.48775; zPos: -1.33482 }
- ListElement{ xPos: 0.53939; yPos: -0.847333; zPos: 0.732877 }
- ListElement{ xPos: -0.683025; yPos: -0.448889; zPos: -1.35747 }
- ListElement{ xPos: -1.7711; yPos: -0.125587; zPos: -2.55083 }
- ListElement{ xPos: -0.512871; yPos: 0.520964; zPos: 1.40731 }
- ListElement{ xPos: 4.93857; yPos: -1.6805; zPos: -0.127298 }
- ListElement{ xPos: 1.46098; yPos: -1.64073; zPos: 1.35833 }
- ListElement{ xPos: 0.0518058; yPos: 0.285151; zPos: -2.2437 }
- ListElement{ xPos: 1.5587; yPos: -1.23067; zPos: 0.458753 }
- ListElement{ xPos: 3.13089; yPos: 3.64132; zPos: 1.45181 }
- ListElement{ xPos: -1.55648; yPos: 2.167; zPos: 0.153491 }
- ListElement{ xPos: 3.94451; yPos: -2.56372; zPos: -1.25276 }
- ListElement{ xPos: 4.15866; yPos: 0.646921; zPos: 2.65542 }
- ListElement{ xPos: -2.88189; yPos: 0.562407; zPos: -1.35379 }
- ListElement{ xPos: 1.31686; yPos: 1.2808; zPos: 0.804375 }
- ListElement{ xPos: -2.36912; yPos: -3.08775; zPos: 1.28335 }
- ListElement{ xPos: 0.575203; yPos: -0.36483; zPos: -2.43958 }
- ListElement{ xPos: 0.613108; yPos: 0.526892; zPos: 2.75368 }
- ListElement{ xPos: 3.96027; yPos: -0.525425; zPos: -4.25746 }
- ListElement{ xPos: -0.510821; yPos: 1.28578; zPos: -0.058488 }
- ListElement{ xPos: -0.254704; yPos: -3.847; zPos: 3.15258 }
- ListElement{ xPos: -0.925874; yPos: -1.72014; zPos: -3.15341 }
- ListElement{ xPos: 0.85704; yPos: 0.84788; zPos: -1.75947 }
- ListElement{ xPos: -3.35712; yPos: 0.722104; zPos: 2.15645 }
- ListElement{ xPos: -1.67305; yPos: 0.681216; zPos: 1.65726 }
- ListElement{ xPos: -3.64682; yPos: 0.867926; zPos: 2.63525 }
- ListElement{ xPos: -0.715921; yPos: 1.96081; zPos: -0.939934 }
- ListElement{ xPos: -2.45646; yPos: 1.3249; zPos: -2.75733 }
- ListElement{ xPos: -1.75798; yPos: 0.725382; zPos: -0.851921 }
- ListElement{ xPos: -2.78528; yPos: 0.679275; zPos: -2.59212 }
- ListElement{ xPos: -2.24551; yPos: -3.4597; zPos: -1.85735 }
- ListElement{ xPos: 0.85142; yPos: 2.28058; zPos: -3.75328 }
- ListElement{ xPos: -3.85054; yPos: 2.44519; zPos: 4.35081 }
- ListElement{ xPos: -3.6553; yPos: 0.521917; zPos: 0.293354 }
- ListElement{ xPos: -4.35959; yPos: -0.528198; zPos: 1.55557 }
- ListElement{ xPos: 1.45186; yPos: -0.0891161; zPos: -0.468118 }
- ListElement{ xPos: 1.85594; yPos: -0.761461; zPos: -4.68083 }
- ListElement{ xPos: 0.950642; yPos: 0.526239; zPos: -1.30614 }
- ListElement{ xPos: -2.50526; yPos: -0.885606; zPos: -0.362569 }
- ListElement{ xPos: -2.96569; yPos: 1.68519; zPos: -1.15965 }
- ListElement{ xPos: -3.212; yPos: 0.260715; zPos: 1.18472 }
- ListElement{ xPos: 0.950556; yPos: -0.282806; zPos: 0.776252 }
- ListElement{ xPos: 3.66678; yPos: 1.08585; zPos: -2.15646 }
- ListElement{ xPos: -0.806289; yPos: 1.72784; zPos: 2.85906 }
- ListElement{ xPos: 0.363827; yPos: 1.76644; zPos: 0.931866 }
- ListElement{ xPos: -1.34204; yPos: -0.563686; zPos: -2.34091 }
- ListElement{ xPos: -2.81333; yPos: 0.415358; zPos: 4.28363 }
- ListElement{ xPos: 1.52053; yPos: -0.327359; zPos: 0.35052 }
- ListElement{ xPos: -0.633441; yPos: -0.240518; zPos: 4.05745 }
- ListElement{ xPos: -2.38947; yPos: -1.84662; zPos: -2.29572 }
- ListElement{ xPos: -1.95744; yPos: -0.863705; zPos: 1.85889 }
- ListElement{ xPos: -0.0509082; yPos: -0.164164; zPos: 3.8571 }
- ListElement{ xPos: 0.156438; yPos: -2.64188; zPos: 1.75836 }
- ListElement{ xPos: -3.85642; yPos: 1.48025; zPos: 0.171659 }
- ListElement{ xPos: 0.253545; yPos: 1.0852; zPos: -2.45243 }
- ListElement{ xPos: -4.11318; yPos: 0.41655; zPos: -0.120976 }
- ListElement{ xPos: -1.44928; yPos: -0.328222; zPos: -0.871279 }
- ListElement{ xPos: -1.90972; yPos: -1.8495; zPos: -3.16966 }
- ListElement{ xPos: 0.359433; yPos: 1.3236; zPos: -3.95045 }
- ListElement{ xPos: -2.60974; yPos: -1.04138; zPos: 4.25836 }
- ListElement{ xPos: -3.16336; yPos: -0.961581; zPos: -1.65161 }
- ListElement{ xPos: -0.552909; yPos: -1.16942; zPos: 4.05164 }
- ListElement{ xPos: -3.10918; yPos: -1.2402; zPos: -0.555073 }
- ListElement{ xPos: 2.25494; yPos: 1.24432; zPos: 3.44063 }
- ListElement{ xPos: -1.24998; yPos: -1.24928; zPos: -4.05493 }
- ListElement{ xPos: 3.05441; yPos: 1.92762; zPos: 1.43329 }
- ListElement{ xPos: 0.557032; yPos: -2.7688; zPos: -3.25463 }
- ListElement{ xPos: -2.05665; yPos: 1.6357; zPos: 0.656665 }
- ListElement{ xPos: -0.459042; yPos: 0.122664; zPos: -0.152961 }
- ListElement{ xPos: 2.17715; yPos: 2.96833; zPos: 1.1332 }
- ListElement{ xPos: 0.0536573; yPos: -2.08635; zPos: -0.736471 }
- ListElement{ xPos: -3.15658; yPos: 1.0818; zPos: -0.172166 }
- ListElement{ xPos: -1.95784; yPos: 0.44402; zPos: 0.612685 }
- ListElement{ xPos: 0.15168; yPos: -0.323951; zPos: 2.85563 }
- ListElement{ xPos: 0.559356; yPos: 1.63101; zPos: 0.558005 }
- ListElement{ xPos: -2.05643; yPos: 1.84615; zPos: -1.87964 }
- ListElement{ xPos: -0.254098; yPos: 0.368208; zPos: 1.23061 }
- ListElement{ xPos: 4.6438; yPos: -0.209283; zPos: 0.695869 }
- ListElement{ xPos: -1.95087; yPos: -0.859788; zPos: 0.0539467 }
- ListElement{ xPos: -0.351737; yPos: -1.04291; zPos: 0.869198 }
- ListElement{ xPos: 0.776319; yPos: 3.04922; zPos: -3.55278 }
- ListElement{ xPos: -0.158751; yPos: 1.12538; zPos: -2.59681 }
- ListElement{ xPos: -0.560997; yPos: -1.68381; zPos: 1.56935 }
- ListElement{ xPos: 1.71385; yPos: -0.446223; zPos: -1.56843 }
- ListElement{ xPos: 4.05142; yPos: -1.3243; zPos: 2.85052 }
- ListElement{ xPos: 1.68685; yPos: -1.56305; zPos: 2.159 }
- ListElement{ xPos: 0.359977; yPos: -1.16029; zPos: 1.25037 }
- ListElement{ xPos: -2.65045; yPos: -1.28532; zPos: 0.459338 }
- ListElement{ xPos: 0.542068; yPos: 1.52601; zPos: -1.35562 }
- ListElement{ xPos: 1.34386; yPos: 1.68231; zPos: -2.75114 }
- ListElement{ xPos: 1.25123; yPos: 0.43108; zPos: 0.383897 }
- ListElement{ xPos: -0.952936; yPos: 3.6889; zPos: 1.75759 }
- ListElement{ xPos: -3.55855; yPos: 0.484241; zPos: 1.15503 }
- ListElement{ xPos: -1.71394; yPos: -2.64568; zPos: -3.30684 }
- ListElement{ xPos: -2.23513; yPos: -2.46812; zPos: 1.05321 }
- ListElement{ xPos: 0.160986; yPos: 0.442362; zPos: -1.05077 }
- ListElement{ xPos: 2.05433; yPos: 0.473204; zPos: 0.823968 }
- ListElement{ xPos: 0.482077; yPos: 0.0477338; zPos: 4.21712 }
- ListElement{ xPos: -1.25348; yPos: 0.767612; zPos: 0.455813 }
- ListElement{ xPos: 1.61308; yPos: 2.04125; zPos: -2.95433 }
- ListElement{ xPos: -2.05862; yPos: -0.444052; zPos: 1.35177 }
- ListElement{ xPos: -3.2582; yPos: 0.44354; zPos: 2.15898 }
- ListElement{ xPos: -1.75935; yPos: 0.0459283; zPos: 2.35061 }
- ListElement{ xPos: -4.15501; yPos: 0.68674; zPos: 0.802439 }
- ListElement{ xPos: -1.66005; yPos: 1.12067; zPos: 0.552901 }
- ListElement{ xPos: -0.150828; yPos: 3.4151; zPos: 3.05446 }
- ListElement{ xPos: -0.274381; yPos: 0.0405946; zPos: -1.45463 }
- ListElement{ xPos: 2.94543; yPos: -0.360918; zPos: 1.45895 }
- ListElement{ xPos: -1.42494; yPos: 1.56503; zPos: 1.31012 }
- ListElement{ xPos: 3.45402; yPos: -1.27808; zPos: -4.29049 }
- ListElement{ xPos: -1.14819; yPos: 0.674339; zPos: 1.55807 }
- ListElement{ xPos: -0.356159; yPos: 1.52295; zPos: -0.351445 }
- ListElement{ xPos: 0.387809; yPos: 0.965119; zPos: 1.84271 }
- ListElement{ xPos: 2.56165; yPos: -1.84639; zPos: 1.65056 }
- ListElement{ xPos: -0.619108; yPos: 2.24004; zPos: -2.92134 }
- ListElement{ xPos: -0.254288; yPos: -2.32744; zPos: -0.720931 }
- ListElement{ xPos: 3.3508; yPos: -2.24501; zPos: 1.58268 }
- ListElement{ xPos: 1.69434; yPos: 1.96814; zPos: 3.97439 }
- ListElement{ xPos: 1.80785; yPos: 0.685502; zPos: -1.55595 }
- ListElement{ xPos: 2.71587; yPos: 1.76415; zPos: -2.98124 }
- ListElement{ xPos: -2.35151; yPos: -0.697338; zPos: -3.96269 }
- ListElement{ xPos: -1.85759; yPos: 1.96899; zPos: -1.25212 }
- ListElement{ xPos: -4.05922; yPos: 1.12838; zPos: -2.7597 }
- ListElement{ xPos: -2.85434; yPos: -1.36487; zPos: 0.659987 }
- ListElement{ xPos: -1.75616; yPos: 2.12969; zPos: -1.35032 }
- ListElement{ xPos: -2.95985; yPos: -0.0854955; zPos: 3.65545 }
- ListElement{ xPos: -2.46049; yPos: 2.45378; zPos: 4.51969 }
- ListElement{ xPos: -0.0577358; yPos: 0.0427911; zPos: 0.359068 }
- ListElement{ xPos: -3.25346; yPos: 0.161829; zPos: 1.12956 }
- ListElement{ xPos: 3.55498; yPos: 2.32482; zPos: 1.33302 }
- ListElement{ xPos: 4.99905; yPos: -1.88748; zPos: 0.450165 }
- ListElement{ xPos: -2.35406; yPos: -1.44715; zPos: -0.745307 }
- ListElement{ xPos: 2.44217; yPos: -0.642981; zPos: 0.126924 }
- ListElement{ xPos: 1.73283; yPos: 1.67362; zPos: 1.91136 }
- ListElement{ xPos: 1.34239; yPos: -0.434386; zPos: -0.449795 }
- ListElement{ xPos: -0.9813; yPos: -2.72962; zPos: -3.6889 }
- ListElement{ xPos: 1.29807; yPos: -0.448566; zPos: 2.13911 }
- ListElement{ xPos: 0.654017; yPos: 3.54591; zPos: -1.55982 }
- ListElement{ xPos: -1.55508; yPos: -2.64564; zPos: 0.555 }
- ListElement{ xPos: 1.92722; yPos: -0.322513; zPos: -2.13691 }
- ListElement{ xPos: 1.35913; yPos: -2.84853; zPos: -0.470788 }
- ListElement{ xPos: 0.257868; yPos: -2.68874; zPos: -0.268328 }
- ListElement{ xPos: -2.05043; yPos: -1.68405; zPos: -3.05075 }
- ListElement{ xPos: 1.65173; yPos: -0.446801; zPos: -0.75339 }
- ListElement{ xPos: -1.25655; yPos: 0.965275; zPos: -4.15374 }
- ListElement{ xPos: -4.27942; yPos: -0.564403; zPos: 1.45826 }
- ListElement{ xPos: 0.950669; yPos: -2.4416; zPos: -1.68235 }
- ListElement{ xPos: -0.0541107; yPos: 0.882274; zPos: 3.15308 }
- ListElement{ xPos: -1.65016; yPos: -0.886156; zPos: -3.85588 }
- ListElement{ xPos: 0.355613; yPos: 0.217671; zPos: 4.25412 }
- ListElement{ xPos: 0.800472; yPos: 0.847259; zPos: 3.11114 }
- ListElement{ xPos: 1.8599; yPos: -2.16981; zPos: -2.22314 }
- ListElement{ xPos: -2.05061; yPos: 0.164561; zPos: -0.452181 }
- ListElement{ xPos: 0.854144; yPos: 1.84334; zPos: -1.45981 }
- ListElement{ xPos: 1.68547; yPos: 1.56536; zPos: -1.45874 }
- ListElement{ xPos: 1.25244; yPos: -0.844991; zPos: -2.95475 }
- ListElement{ xPos: -1.92348; yPos: 2.32119; zPos: -1.80444 }
- ListElement{ xPos: -0.645646; yPos: 2.45193; zPos: -3.65332 }
- ListElement{ xPos: 4.45803; yPos: 0.527732; zPos: 3.02031 }
- ListElement{ xPos: 2.74572; yPos: 0.287964; zPos: -1.80485 }
- ListElement{ xPos: 0.35961; yPos: -2.56437; zPos: 3.97194 }
- ListElement{ xPos: -0.956828; yPos: -1.28915; zPos: 1.64424 }
- ListElement{ xPos: 0.414971; yPos: -0.235061; zPos: -2.15757 }
- ListElement{ xPos: -0.0530542; yPos: -1.08464; zPos: -4.11853 }
- ListElement{ xPos: 3.17203; yPos: -1.21013; zPos: -3.85806 }
- ListElement{ xPos: 0.758948; yPos: 0.124698; zPos: -3.10188 }
- ListElement{ xPos: -1.65404; yPos: -1.16204; zPos: -1.65357 }
- ListElement{ xPos: -1.65985; yPos: 3.84433; zPos: 4.65101 }
- ListElement{ xPos: 2.83444; yPos: -2.69529; zPos: -1.65021 }
- ListElement{ xPos: 1.29814; yPos: -2.76926; zPos: -2.27139 }
- ListElement{ xPos: 0.462382; yPos: 3.04217; zPos: 3.45153 }
- ListElement{ xPos: -3.61944; yPos: 1.04723; zPos: -0.638308 }
- ListElement{ xPos: 2.25235; yPos: 1.64048; zPos: 2.95175 }
- ListElement{ xPos: -3.05826; yPos: -0.76526; zPos: -2.38243 }
- ListElement{ xPos: -2.8506; yPos: 2.12102; zPos: -0.659444 }
- ListElement{ xPos: -0.10046; yPos: 0.0887098; zPos: -1.63621 }
- ListElement{ xPos: -1.55585; yPos: -1.36073; zPos: 2.2076 }
- ListElement{ xPos: -0.474968; yPos: 1.56568; zPos: -0.302349 }
- ListElement{ xPos: 0.36584; yPos: -2.36102; zPos: 1.35289 }
- ListElement{ xPos: 0.224784; yPos: -0.637694; zPos: 1.62444 }
- ListElement{ xPos: -0.658172; yPos: 1.9689; zPos: -3.13712 }
- ListElement{ xPos: 0.646334; yPos: -1.04672; zPos: 2.59285 }
- ListElement{ xPos: -2.63054; yPos: -1.08263; zPos: -0.851087 }
- ListElement{ xPos: 1.45804; yPos: -2.56159; zPos: -2.66388 }
- ListElement{ xPos: -2.45748; yPos: 0.0409116; zPos: -2.85428 }
- ListElement{ xPos: -0.0561462; yPos: -1.24229; zPos: -1.25145 }
- ListElement{ xPos: -2.95391; yPos: -1.80896; zPos: -2.05036 }
- ListElement{ xPos: 4.36778; yPos: -0.969951; zPos: 3.53686 }
- ListElement{ xPos: 2.15582; yPos: -1.67173; zPos: -0.831609 }
- ListElement{ xPos: -1.27059; yPos: -1.14919; zPos: 1.7569 }
- ListElement{ xPos: -1.57398; yPos: -1.28091; zPos: -0.251735 }
- ListElement{ xPos: 2.59506; yPos: -2.6408; zPos: -0.345589 }
- ListElement{ xPos: -1.64147; yPos: -0.360324; zPos: 3.1562 }
- ListElement{ xPos: -0.125427; yPos: -0.641484; zPos: -3.66095 }
- ListElement{ xPos: -1.9148; yPos: 1.8885; zPos: 2.12972 }
- ListElement{ xPos: -2.85768; yPos: -2.28782; zPos: -1.55719 }
- ListElement{ xPos: -1.37239; yPos: -0.485964; zPos: -2.22291 }
- ListElement{ xPos: 0.516294; yPos: 0.281078; zPos: 0.652612 }
- ListElement{ xPos: -1.13028; yPos: 0.246659; zPos: -2.25636 }
- ListElement{ xPos: 1.7555; yPos: -1.41602; zPos: 0.348449 }
- ListElement{ xPos: 1.5355; yPos: -1.32646; zPos: -2.82417 }
- ListElement{ xPos: -0.95426; yPos: 2.0824; zPos: -0.383507 }
- ListElement{ xPos: 2.75739; yPos: 0.241779; zPos: 0.755701 }
- ListElement{ xPos: 0.752655; yPos: 0.56204; zPos: -1.55738 }
- ListElement{ xPos: 1.1271; yPos: -3.76145; zPos: 0.43701 }
- ListElement{ xPos: 0.326656; yPos: -1.24467; zPos: 2.62222 }
- ListElement{ xPos: -0.259702; yPos: 2.68152; zPos: -3.18542 }
- ListElement{ xPos: 1.88504; yPos: -0.760623; zPos: 4.42592 }
- ListElement{ xPos: 0.251673; yPos: 0.472252; zPos: -1.99239 }
- ListElement{ xPos: -1.66934; yPos: -0.129677; zPos: -2.49048 }
- ListElement{ xPos: -1.25499; yPos: 2.36151; zPos: -2.98447 }
- ListElement{ xPos: 2.65331; yPos: 0.0443886; zPos: 0.108819 }
- ListElement{ xPos: -3.35439; yPos: 0.0872109; zPos: -1.33429 }
- ListElement{ xPos: 3.35597; yPos: 0.0403626; zPos: 2.8203 }
- ListElement{ xPos: 4.45191; yPos: 1.24824; zPos: -0.95821 }
- ListElement{ xPos: -0.171441; yPos: -1.52622; zPos: -4.68253 }
- ListElement{ xPos: 1.19986; yPos: 1.72992; zPos: -3.29566 }
- ListElement{ xPos: -0.451339; yPos: 1.92976; zPos: 1.21534 }
- ListElement{ xPos: -0.743119; yPos: -0.160688; zPos: 0.805688 }
- ListElement{ xPos: 2.38678; yPos: 0.272829; zPos: 2.75457 }
- ListElement{ xPos: 1.72464; yPos: 2.08232; zPos: -0.950389 }
- ListElement{ xPos: 2.11167; yPos: 1.56576; zPos: 1.21969 }
- ListElement{ xPos: 3.05157; yPos: -1.56838; zPos: -0.450535 }
- ListElement{ xPos: 0.132417; yPos: -3.08279; zPos: -1.34127 }
- ListElement{ xPos: 1.65441; yPos: -0.325204; zPos: -0.825145 }
- ListElement{ xPos: 2.05515; yPos: -1.8417; zPos: 1.8561 }
- ListElement{ xPos: -0.555858; yPos: 1.52007; zPos: -0.80122 }
- ListElement{ xPos: -2.05026; yPos: 1.52773; zPos: 2.33529 }
- ListElement{ xPos: -2.35231; yPos: -3.28716; zPos: 3.53598 }
- ListElement{ xPos: -2.25771; yPos: 2.5667; zPos: -1.92243 }
- ListElement{ xPos: 0.386884; yPos: -3.28674; zPos: 3.49336 }
- ListElement{ xPos: 0.957272; yPos: -1.68124; zPos: -1.89095 }
- ListElement{ xPos: 2.99881; yPos: 2.24992; zPos: -0.0535837 }
- ListElement{ xPos: 3.19604; yPos: 2.92893; zPos: -2.16276 }
- ListElement{ xPos: 2.55903; yPos: 3.12413; zPos: 2.95022 }
- ListElement{ xPos: -0.570758; yPos: -2.85326; zPos: -0.339255 }
- ListElement{ xPos: 0.356627; yPos: 0.641074; zPos: 0.355538 }
- ListElement{ xPos: -1.15777; yPos: -0.162227; zPos: -0.455885 }
- ListElement{ xPos: -2.4871; yPos: -0.885492; zPos: -0.374875 }
- ListElement{ xPos: 1.55464; yPos: -1.48929; zPos: -0.593706 }
- ListElement{ xPos: -0.852655; yPos: -2.08736; zPos: -1.18281 }
- ListElement{ xPos: 0.504087; yPos: -0.879247; zPos: 1.35148 }
- ListElement{ xPos: -2.15261; yPos: 1.04511; zPos: -3.25543 }
- ListElement{ xPos: -0.653745; yPos: -1.32873; zPos: -3.18964 }
- ListElement{ xPos: 0.35973; yPos: -0.844255; zPos: -1.72034 }
- ListElement{ xPos: -2.11112; yPos: 0.962572; zPos: 2.59386 }
- ListElement{ xPos: 1.47531; yPos: -0.693626; zPos: -3.15249 }
- ListElement{ xPos: -1.35814; yPos: 0.767202; zPos: 3.45094 }
- ListElement{ xPos: -3.05812; yPos: -1.26298; zPos: 1.45287 }
- ListElement{ xPos: -1.63927; yPos: 0.893568; zPos: -1.94978 }
- ListElement{ xPos: 0.751992; yPos: 1.68559; zPos: 2.3618 }
- ListElement{ xPos: 0.58205; yPos: -0.769076; zPos: -0.958994 }
- ListElement{ xPos: -2.38512; yPos: -0.166005; zPos: -1.25855 }
- ListElement{ xPos: -0.556071; yPos: -2.28164; zPos: 1.57032 }
- ListElement{ xPos: 0.589172; yPos: -0.244834; zPos: 0.553728 }
- ListElement{ xPos: -0.468648; yPos: -0.927756; zPos: -0.737048 }
- ListElement{ xPos: -2.66659; yPos: -1.64374; zPos: -0.995568 }
- ListElement{ xPos: 0.251499; yPos: -1.24569; zPos: 0.95028 }
- ListElement{ xPos: 0.737721; yPos: 2.88575; zPos: 0.448918 }
- ListElement{ xPos: -0.634421; yPos: -1.84377; zPos: -2.47094 }
- ListElement{ xPos: 0.556349; yPos: 2.86774; zPos: 1.62621 }
- ListElement{ xPos: -3.29644; yPos: 3.28642; zPos: -3.45459 }
- ListElement{ xPos: -1.45045; yPos: 2.52138; zPos: 2.75329 }
- ListElement{ xPos: 1.87449; yPos: -2.68651; zPos: 3.60371 }
- ListElement{ xPos: -0.656424; yPos: -2.56828; zPos: 1.35509 }
- ListElement{ xPos: 1.95771; yPos: -1.48325; zPos: -3.85265 }
- ListElement{ xPos: 3.85074; yPos: 0.0825779; zPos: -1.65283 }
- ListElement{ xPos: -1.17278; yPos: -1.69258; zPos: -1.05875 }
- ListElement{ xPos: 1.25754; yPos: -0.0439433; zPos: 1.3571 }
- ListElement{ xPos: 2.91459; yPos: 2.08715; zPos: 0.259842 }
- ListElement{ xPos: 0.748196; yPos: 2.52132; zPos: 0.659051 }
- ListElement{ xPos: -1.85745; yPos: -1.88355; zPos: 1.05259 }
- ListElement{ xPos: 1.69311; yPos: 1.12299; zPos: -3.05453 }
- ListElement{ xPos: -2.86301; yPos: 0.123274; zPos: 0.559289 }
- ListElement{ xPos: -1.43146; yPos: 1.64425; zPos: -1.95053 }
- ListElement{ xPos: 2.35287; yPos: 0.414621; zPos: -0.950807 }
- ListElement{ xPos: 0.952585; yPos: -0.280452; zPos: -0.844588 }
- ListElement{ xPos: -1.53836; yPos: -1.76396; zPos: 2.51742 }
- ListElement{ xPos: -3.05431; yPos: 2.45; zPos: -0.26571 }
- ListElement{ xPos: -0.637412; yPos: 1.12028; zPos: -0.587387 }
- ListElement{ xPos: -1.71017; yPos: -0.728497; zPos: -1.05087 }
- ListElement{ xPos: 0.454027; yPos: 0.849208; zPos: -0.151716 }
- ListElement{ xPos: -3.54846; yPos: 0.367137; zPos: 1.1484 }
- ListElement{ xPos: 0.200816; yPos: -2.08832; zPos: 0.255433 }
- ListElement{ xPos: -2.15817; yPos: 0.725338; zPos: 0.852676 }
- ListElement{ xPos: -2.45708; yPos: -0.725538; zPos: -0.859435 }
- ListElement{ xPos: 4.25339; yPos: 1.84177; zPos: -0.555145 }
- ListElement{ xPos: 0.119319; yPos: -1.32041; zPos: -1.45864 }
- ListElement{ xPos: -3.65177; yPos: 0.361323; zPos: 0.351554 }
- ListElement{ xPos: 0.928598; yPos: 0.321024; zPos: -3.64759 }
- ListElement{ xPos: -0.250062; yPos: 1.84912; zPos: 0.949887 }
- ListElement{ xPos: 3.59593; yPos: 0.929451; zPos: -2.15224 }
- ListElement{ xPos: 0.658599; yPos: 2.36796; zPos: 4.11632 }
- ListElement{ xPos: 0.55841; yPos: -1.08657; zPos: 0.258326 }
- ListElement{ xPos: 1.9419; yPos: 0.0488641; zPos: -3.75375 }
- ListElement{ xPos: 0.0589998; yPos: 0.521351; zPos: -3.85723 }
- ListElement{ xPos: 3.45108; yPos: 0.562199; zPos: 4.20946 }
- ListElement{ xPos: -0.255073; yPos: 2.36504; zPos: -3.556 }
- ListElement{ xPos: 1.95848; yPos: 1.28698; zPos: 4.25014 }
- ListElement{ xPos: 1.85411; yPos: 3.12131; zPos: 0.652769 }
- ListElement{ xPos: -3.3589; yPos: 0.801817; zPos: -1.5591 }
- ListElement{ xPos: 2.48128; yPos: -0.163406; zPos: 1.25243 }
- ListElement{ xPos: 2.52135; yPos: 0.960467; zPos: 1.45432 }
- ListElement{ xPos: 0.827496; yPos: -0.163021; zPos: -0.558886 }
- ListElement{ xPos: -3.45032; yPos: -0.0831453; zPos: 0.851212 }
- ListElement{ xPos: -3.45334; yPos: 0.855944; zPos: 1.35596 }
- ListElement{ xPos: -0.834644; yPos: 0.245598; zPos: -1.23878 }
- ListElement{ xPos: 3.64558; yPos: 1.16831; zPos: -0.18559 }
- ListElement{ xPos: -1.45919; yPos: -3.08196; zPos: -0.329805 }
- ListElement{ xPos: -3.65715; yPos: -1.04485; zPos: 0.159208 }
- ListElement{ xPos: 1.35463; yPos: -0.766382; zPos: 0.558632 }
- ListElement{ xPos: -2.75899; yPos: -1.67431; zPos: -1.55069 }
- ListElement{ xPos: 1.67539; yPos: 2.04337; zPos: 0.912884 }
- ListElement{ xPos: 3.51677; yPos: -3.24285; zPos: 0.170272 }
- ListElement{ xPos: -4.25189; yPos: 0.56589; zPos: -4.35936 }
- ListElement{ xPos: -2.68545; yPos: -0.448243; zPos: 0.540342 }
- ListElement{ xPos: 0.279844; yPos: -0.641466; zPos: -0.353986 }
- ListElement{ xPos: -3.27626; yPos: -3.52006; zPos: 1.77644 }
- ListElement{ xPos: -0.724096; yPos: -1.84647; zPos: -2.45271 }
- ListElement{ xPos: -4.18603; yPos: 0.123376; zPos: 3.85066 }
- ListElement{ xPos: -4.05156; yPos: 0.0499386; zPos: -0.332945 }
- ListElement{ xPos: 2.69508; yPos: 2.32777; zPos: 1.26256 }
- ListElement{ xPos: -0.353726; yPos: 1.07252; zPos: -0.738837 }
- ListElement{ xPos: -0.947178; yPos: 0.36459; zPos: 1.55593 }
- ListElement{ xPos: -0.058346; yPos: 2.44781; zPos: -4.35023 }
- ListElement{ xPos: 1.51586; yPos: -0.961109; zPos: -3.43483 }
- ListElement{ xPos: -2.8852; yPos: 2.08863; zPos: -1.75468 }
- ListElement{ xPos: -0.297867; yPos: 0.722757; zPos: 0.91355 }
- ListElement{ xPos: -1.12917; yPos: -1.68328; zPos: 0.175315 }
- ListElement{ xPos: -1.24248; yPos: -0.323519; zPos: -0.854841 }
- ListElement{ xPos: 0.751943; yPos: 0.564075; zPos: 3.95073 }
- ListElement{ xPos: 1.15436; yPos: 2.81813; zPos: 0.653114 }
- ListElement{ xPos: -2.55058; yPos: -2.56486; zPos: 0.756618 }
- ListElement{ xPos: 0.959794; yPos: 0.845224; zPos: -0.854001 }
- ListElement{ xPos: -2.15033; yPos: 0.248556; zPos: -3.16151 }
- ListElement{ xPos: 0.353224; yPos: -1.68637; zPos: 0.457949 }
- ListElement{ xPos: -0.753237; yPos: -2.48313; zPos: -0.355373 }
- ListElement{ xPos: 0.296585; yPos: 2.04822; zPos: 0.198473 }
- ListElement{ xPos: -2.4737; yPos: 0.682952; zPos: 1.85349 }
- ListElement{ xPos: 1.9027; yPos: 0.882796; zPos: 1.45908 }
- ListElement{ xPos: 0.254799; yPos: 1.92572; zPos: -1.70848 }
- ListElement{ xPos: -0.951602; yPos: -0.698987; zPos: -2.22682 }
- ListElement{ xPos: 0.262582; yPos: -2.44093; zPos: 1.05636 }
- ListElement{ xPos: 0.385415; yPos: -0.685667; zPos: -3.35928 }
- ListElement{ xPos: 0.055981; yPos: 0.523585; zPos: -3.36093 }
- ListElement{ xPos: -0.0518635; yPos: -0.889068; zPos: -0.840648 }
- ListElement{ xPos: 0.455171; yPos: 2.84624; zPos: -1.98276 }
- ListElement{ xPos: 2.85475; yPos: -0.685697; zPos: -2.45695 }
- ListElement{ xPos: -1.05047; yPos: -1.92121; zPos: 0.931666 }
- ListElement{ xPos: -2.75962; yPos: -0.164458; zPos: -1.55261 }
- ListElement{ xPos: 1.91811; yPos: 1.65767; zPos: 3.15004 }
- ListElement{ xPos: -2.25653; yPos: 0.856735; zPos: -4.351 }
- ListElement{ xPos: 1.89178; yPos: -0.728669; zPos: -3.8803 }
- ListElement{ xPos: -3.25958; yPos: -1.16223; zPos: -1.85148 }
- ListElement{ xPos: -1.6291; yPos: -2.32967; zPos: -0.874786 }
- ListElement{ xPos: 3.17524; yPos: 0.327351; zPos: 2.15337 }
- ListElement{ xPos: -1.05094; yPos: -0.560694; zPos: -3.4581 }
- ListElement{ xPos: 0.759785; yPos: -1.0801; zPos: -0.257876 }
- ListElement{ xPos: -0.4597; yPos: -2.2404; zPos: 2.54341 }
- ListElement{ xPos: 0.242266; yPos: 0.121832; zPos: 0.780878 }
- ListElement{ xPos: -1.6573; yPos: 1.56049; zPos: -1.61749 }
- ListElement{ xPos: 1.39912; yPos: -2.84395; zPos: -0.25965 }
- ListElement{ xPos: 0.552342; yPos: 1.36924; zPos: 2.95278 }
- ListElement{ xPos: -1.92932; yPos: -0.883981; zPos: 0.0589583 }
- ListElement{ xPos: -1.9026; yPos: 0.56297; zPos: -0.723523 }
- ListElement{ xPos: -1.25867; yPos: -0.529617; zPos: 2.3503 }
- ListElement{ xPos: 2.16527; yPos: -0.723364; zPos: -1.45609 }
- ListElement{ xPos: -0.984608; yPos: -0.720375; zPos: -2.05144 }
- ListElement{ xPos: 0.946803; yPos: -0.969188; zPos: -3.14625 }
- ListElement{ xPos: 2.7986; yPos: -2.36069; zPos: 1.25827 }
- ListElement{ xPos: 3.37979; yPos: -1.11699; zPos: -3.55116 }
- ListElement{ xPos: -0.753992; yPos: -1.9649; zPos: 2.98548 }
- ListElement{ xPos: -0.456321; yPos: 0.525303; zPos: -0.109174 }
- ListElement{ xPos: 0.8642; yPos: 0.153147; zPos: -3.34749 }
- ListElement{ xPos: -0.450507; yPos: -0.443265; zPos: -2.8325 }
- ListElement{ xPos: -3.24876; yPos: 3.12791; zPos: 0.576143 }
- ListElement{ xPos: -3.14755; yPos: 2.84502; zPos: -0.45749 }
- ListElement{ xPos: 0.226819; yPos: -1.28172; zPos: 0.939501 }
- ListElement{ xPos: -0.650725; yPos: -1.40317; zPos: -1.35211 }
- ListElement{ xPos: -0.451625; yPos: 1.84271; zPos: -0.950536 }
- ListElement{ xPos: -1.36693; yPos: 0.850218; zPos: -1.09799 }
- ListElement{ xPos: 2.35374; yPos: -0.28759; zPos: 1.55815 }
- ListElement{ xPos: 2.60577; yPos: -2.46765; zPos: 1.2633 }
- ListElement{ xPos: 1.21562; yPos: -1.72153; zPos: -0.4034 }
- ListElement{ xPos: -2.43216; yPos: 3.04268; zPos: 1.90109 }
- ListElement{ xPos: -1.85365; yPos: -0.16523; zPos: -2.98947 }
- ListElement{ xPos: -0.953475; yPos: -2.76164; zPos: 2.53396 }
- ListElement{ xPos: 2.55264; yPos: -0.645611; zPos: 3.25479 }
- ListElement{ xPos: -0.675476; yPos: -0.724382; zPos: -1.4566 }
- ListElement{ xPos: 0.801062; yPos: 0.16778; zPos: 2.21815 }
- ListElement{ xPos: 0.680443; yPos: 0.0407888; zPos: 3.27279 }
- ListElement{ xPos: -3.75426; yPos: -0.247624; zPos: 0.26307 }
- ListElement{ xPos: 0.427609; yPos: -0.322312; zPos: 0.652005 }
- ListElement{ xPos: -2.17428; yPos: -3.68643; zPos: 0.256619 }
- ListElement{ xPos: 0.456732; yPos: -2.44858; zPos: 3.13051 }
- ListElement{ xPos: 0.524175; yPos: -1.88231; zPos: -1.93171 }
- ListElement{ xPos: 0.92311; yPos: 1.8354; zPos: -1.2502 }
- ListElement{ xPos: 2.69502; yPos: 2.25543; zPos: -4.25127 }
- ListElement{ xPos: 0.259357; yPos: 2.28099; zPos: -0.476734 }
- ListElement{ xPos: -0.327316; yPos: -1.24908; zPos: 0.78628 }
- ListElement{ xPos: 0.190362; yPos: -3.26019; zPos: 0.0545844 }
- ListElement{ xPos: -1.25409; yPos: -0.761609; zPos: 2.65361 }
- ListElement{ xPos: 2.86816; yPos: 0.443709; zPos: 0.556137 }
- ListElement{ xPos: 2.60289; yPos: -0.680561; zPos: 0.248414 }
- ListElement{ xPos: 1.75631; yPos: -0.162859; zPos: -3.62488 }
- ListElement{ xPos: -0.559754; yPos: -0.16222; zPos: 2.35858 }
- ListElement{ xPos: 0.157552; yPos: -1.72639; zPos: -0.48056 }
- ListElement{ xPos: 3.69492; yPos: -0.848265; zPos: -0.256413 }
- ListElement{ xPos: -1.4264; yPos: -1.48589; zPos: -2.724 }
- ListElement{ xPos: 1.15372; yPos: -0.27228; zPos: -2.75499 }
- ListElement{ xPos: -1.85159; yPos: 1.76577; zPos: -0.858854 }
- ListElement{ xPos: 0.0580466; yPos: -0.41133; zPos: 1.05649 }
- ListElement{ xPos: -1.25289; yPos: 0.528142; zPos: -0.386138 }
- ListElement{ xPos: -0.858101; yPos: -0.245127; zPos: 1.95078 }
- ListElement{ xPos: -1.95302; yPos: -0.0862415; zPos: -1.95806 }
- ListElement{ xPos: -2.79133; yPos: -0.527094; zPos: -0.356931 }
- ListElement{ xPos: 0.110597; yPos: 0.167534; zPos: 4.12784 }
- ListElement{ xPos: -0.637771; yPos: -0.526587; zPos: -1.25734 }
- ListElement{ xPos: -2.311; yPos: -0.489068; zPos: -2.8594 }
- ListElement{ xPos: -0.352617; yPos: -1.23939; zPos: -1.85435 }
- ListElement{ xPos: 1.78814; yPos: -0.265883; zPos: 3.35913 }
- ListElement{ xPos: 2.75557; yPos: -2.32271; zPos: 3.15559 }
- ListElement{ xPos: 2.85426; yPos: 0.443661; zPos: 0.921828 }
- ListElement{ xPos: -2.14262; yPos: 0.400863; zPos: 1.11614 }
- ListElement{ xPos: 4.45496; yPos: -0.488668; zPos: -3.7533 }
- ListElement{ xPos: 0.754719; yPos: -1.44165; zPos: 0.853323 }
- ListElement{ xPos: -0.856506; yPos: 1.76559; zPos: 1.05702 }
- ListElement{ xPos: -0.418565; yPos: -0.921031; zPos: -2.43699 }
- ListElement{ xPos: -1.29292; yPos: -0.282271; zPos: -1.62927 }
- ListElement{ xPos: -0.759531; yPos: 0.566692; zPos: -0.750991 }
- ListElement{ xPos: 0.559787; yPos: 1.72479; zPos: -0.26667 }
- ListElement{ xPos: 2.75533; yPos: -0.245187; zPos: -0.543844 }
- ListElement{ xPos: -2.27924; yPos: -1.04154; zPos: -4.05156 }
- ListElement{ xPos: 3.35852; yPos: -0.561129; zPos: -2.98986 }
- ListElement{ xPos: 2.41843; yPos: -0.321119; zPos: -1.55651 }
- ListElement{ xPos: 0.85431; yPos: -0.883719; zPos: -2.17826 }
- ListElement{ xPos: 0.417867; yPos: 0.242995; zPos: -0.456326 }
- ListElement{ xPos: -4.17449; yPos: -0.720086; zPos: 0.355145 }
- ListElement{ xPos: -0.577386; yPos: 0.0440364; zPos: -0.950268 }
- ListElement{ xPos: -2.8156; yPos: 2.92346; zPos: 0.958713 }
- ListElement{ xPos: -1.65138; yPos: 0.963561; zPos: 1.25265 }
- ListElement{ xPos: 1.45117; yPos: 0.845424; zPos: 0.252789 }
- ListElement{ xPos: 2.27848; yPos: -1.76777; zPos: 0.0117707 }
- ListElement{ xPos: -0.754248; yPos: 1.08381; zPos: -2.15345 }
- ListElement{ xPos: -3.15415; yPos: -0.162292; zPos: -1.15347 }
- ListElement{ xPos: 2.55396; yPos: -1.68912; zPos: 1.15698 }
- ListElement{ xPos: 0.159561; yPos: 1.84202; zPos: 0.428428 }
- ListElement{ xPos: -1.58079; yPos: 2.04207; zPos: 3.29578 }
- ListElement{ xPos: -1.05711; yPos: -0.843112; zPos: -1.98122 }
- ListElement{ xPos: 0.138866; yPos: -2.96642; zPos: -0.212247 }
- ListElement{ xPos: 2.6778; yPos: 0.686972; zPos: -2.6553 }
- ListElement{ xPos: -0.498291; yPos: -0.362846; zPos: -1.0538 }
- ListElement{ xPos: 1.19872; yPos: 0.0476518; zPos: -2.42077 }
- ListElement{ xPos: -2.3972; yPos: 1.40393; zPos: -0.1943 }
- ListElement{ xPos: 0.85034; yPos: -1.24222; zPos: 1.5646 }
- ListElement{ xPos: 0.142174; yPos: 0.249903; zPos: -2.75252 }
- ListElement{ xPos: 1.15197; yPos: 1.32746; zPos: -1.70104 }
- ListElement{ xPos: 0.359387; yPos: -1.65115; zPos: -2.75243 }
- ListElement{ xPos: 0.357917; yPos: -1.36406; zPos: 2.55102 }
- ListElement{ xPos: -1.65268; yPos: -0.28339; zPos: 2.75665 }
- ListElement{ xPos: -3.82681; yPos: -3.28984; zPos: 2.55128 }
- ListElement{ xPos: -2.61371; yPos: 1.08247; zPos: -0.457068 }
- ListElement{ xPos: 1.67152; yPos: -2.25527; zPos: 2.45819 }
- ListElement{ xPos: -0.753832; yPos: 1.1682; zPos: -1.95913 }
- ListElement{ xPos: -2.05131; yPos: 3.04537; zPos: 1.91954 }
- ListElement{ xPos: -0.695378; yPos: 2.88924; zPos: 1.41965 }
- ListElement{ xPos: 3.25767; yPos: -2.76934; zPos: -0.354127 }
- ListElement{ xPos: -0.746795; yPos: 1.36034; zPos: 1.85953 }
- ListElement{ xPos: 0.859135; yPos: 1.08222; zPos: 0.959116 }
- ListElement{ xPos: 1.15898; yPos: 1.32443; zPos: 3.41981 }
- ListElement{ xPos: 3.67954; yPos: 0.447177; zPos: -0.414029 }
- ListElement{ xPos: 0.907323; yPos: 2.12852; zPos: 1.95837 }
- ListElement{ xPos: -0.683456; yPos: -0.247536; zPos: 1.05621 }
- ListElement{ xPos: -1.67809; yPos: 0.641544; zPos: -1.31143 }
- ListElement{ xPos: -1.30192; yPos: -0.677394; zPos: -1.95159 }
- ListElement{ xPos: -0.105665; yPos: 0.365205; zPos: -1.2567 }
- ListElement{ xPos: 1.12189; yPos: -1.48969; zPos: 0.957166 }
- ListElement{ xPos: 1.25554; yPos: -1.92186; zPos: -0.904086 }
- ListElement{ xPos: 0.117786; yPos: 2.23836; zPos: -0.498009 }
- ListElement{ xPos: -2.85788; yPos: 0.643364; zPos: 0.55867 }
- ListElement{ xPos: -1.66115; yPos: 2.56146; zPos: -2.28632 }
- ListElement{ xPos: -3.29334; yPos: -0.0894367; zPos: -0.656519 }
- ListElement{ xPos: 3.15561; yPos: -0.769732; zPos: 1.15695 }
- ListElement{ xPos: 1.25684; yPos: 0.64652; zPos: -2.6002 }
- ListElement{ xPos: 2.65231; yPos: -3.52625; zPos: 1.55617 }
- ListElement{ xPos: -1.8573; yPos: -1.76276; zPos: -1.74075 }
- ListElement{ xPos: -1.55648; yPos: 1.2592; zPos: 2.1585 }
- ListElement{ xPos: -0.555522; yPos: 2.88068; zPos: -2.85423 }
- ListElement{ xPos: -3.14249; yPos: -0.288592; zPos: -3.35534 }
- ListElement{ xPos: 2.45413; yPos: 0.0854903; zPos: -2.20507 }
- ListElement{ xPos: -2.05464; yPos: 0.887836; zPos: -0.658349 }
- ListElement{ xPos: 1.12708; yPos: -0.568106; zPos: -3.65865 }
- ListElement{ xPos: -0.59147; yPos: -0.685439; zPos: 0.301612 }
- ListElement{ xPos: 0.473679; yPos: 0.886411; zPos: -1.65386 }
- ListElement{ xPos: 1.65166; yPos: 0.166741; zPos: 0.751119 }
- ListElement{ xPos: -0.299287; yPos: 1.72233; zPos: 0.618559 }
- ListElement{ xPos: 1.15181; yPos: -0.488026; zPos: 0.124448 }
- ListElement{ xPos: 0.0561315; yPos: 1.04877; zPos: 2.15922 }
- ListElement{ xPos: 0.154258; yPos: -0.64401; zPos: -1.31179 }
- ListElement{ xPos: 1.75863; yPos: -1.88571; zPos: -2.8537 }
- ListElement{ xPos: 3.35024; yPos: 1.28154; zPos: -1.05461 }
- ListElement{ xPos: -3.71738; yPos: -2.88631; zPos: -1.05314 }
- ListElement{ xPos: -1.78258; yPos: 3.08967; zPos: 0.150476 }
- ListElement{ xPos: 3.47828; yPos: -2.524; zPos: -2.45502 }
- ListElement{ xPos: -0.159138; yPos: 0.160633; zPos: -0.338796 }
- ListElement{ xPos: -2.15885; yPos: -0.82959; zPos: 1.25022 }
- ListElement{ xPos: -1.95268; yPos: -0.841195; zPos: -3.19487 }
- ListElement{ xPos: -0.281381; yPos: -0.887435; zPos: -3.55807 }
- ListElement{ xPos: 0.415164; yPos: 0.326482; zPos: -1.55411 }
- ListElement{ xPos: 1.92868; yPos: -2.84771; zPos: -0.556196 }
- ListElement{ xPos: 1.05804; yPos: 1.32866; zPos: 0.66596 }
- ListElement{ xPos: 2.46545; yPos: 1.00747; zPos: 2.35957 }
- ListElement{ xPos: -0.77358; yPos: 0.284677; zPos: -1.38805 }
- ListElement{ xPos: 0.851046; yPos: 0.960742; zPos: -2.70934 }
- ListElement{ xPos: -0.858208; yPos: -0.884015; zPos: 1.16663 }
- ListElement{ xPos: 1.55291; yPos: 0.282705; zPos: -3.18254 }
- ListElement{ xPos: 1.99034; yPos: 0.286298; zPos: -1.75821 }
- ListElement{ xPos: 0.259097; yPos: -2.04379; zPos: -0.858936 }
- ListElement{ xPos: -1.5956; yPos: 2.04693; zPos: -1.35234 }
- ListElement{ xPos: -0.775432; yPos: 1.24465; zPos: 1.95935 }
- ListElement{ xPos: 1.65595; yPos: -1.04954; zPos: -0.954437 }
- ListElement{ xPos: -2.35417; yPos: -1.76095; zPos: -0.248306 }
- ListElement{ xPos: 0.855717; yPos: -2.92161; zPos: 3.4496 }
- ListElement{ xPos: -0.717941; yPos: 2.52993; zPos: 1.25007 }
- ListElement{ xPos: -3.42927; yPos: 0.673305; zPos: 0.995742 }
- }
-
- ListModel {
- id: dataModelThree
- ListElement{ xPos: 8.00000; yPos: -2.05136; zPos: 4.02113 }
- ListElement{ xPos: 7.88929; yPos: -2.2029; zPos: 5.0000 }
- ListElement{ xPos: 7.61596; yPos: -2.44569; zPos: 4.54892 }
- ListElement{ xPos: 7.41949; yPos: -2.64169; zPos: 3.82339 }
- ListElement{ xPos: 7.21192; yPos: -2.87947; zPos: 4.89423 }
- ListElement{ xPos: 7.08346; yPos: -2.38649; zPos: 4.19212 }
- ListElement{ xPos: 6.90279; yPos: -3.33038; zPos: 4.9273 }
- ListElement{ xPos: 6.78959; yPos: -3.55575; zPos: 3.55127 }
- ListElement{ xPos: 6.57074; yPos: -3.75902; zPos: 3.32517 }
- ListElement{ xPos: 6.30756; yPos: -3.40499; zPos: 3.78366 }
- ListElement{ xPos: 7.90893; yPos: -3.3237; zPos: 2.48012 }
- ListElement{ xPos: 6.24078; yPos: -4.04978; zPos: 3.47459 }
- ListElement{ xPos: 7.93452; yPos: -4.6865; zPos: 4.08057 }
- ListElement{ xPos: 5.98731; yPos: -2.26113; zPos: 2.82166 }
- ListElement{ xPos: 5.46898; yPos: -3.99581; zPos: 3.25024 }
- ListElement{ xPos: 7.92353; yPos: -3.34471; zPos: 3.42168 }
- ListElement{ xPos: 6.8456; yPos: -5.00000; zPos: 2.36145 }
- ListElement{ xPos: 7.62888; yPos: -3.82465; zPos: 2.7879 }
- ListElement{ xPos: 7.18034; yPos: -3.94376; zPos: 2.74348 }
- ListElement{ xPos: 6.02527; yPos: -4.36523; zPos: 2.56247 }
- ListElement{ xPos: 7.82353; yPos: -3.04345; zPos: 2.62974 }
- ListElement{ xPos: 7.82539; yPos: -3.6881; zPos: 2.96164 }
- ListElement{ xPos: 7.10508; yPos: -3.6174; zPos: 4.22416 }
- ListElement{ xPos: 7.64684; yPos: -3.88431; zPos: 3.9336 }
- ListElement{ xPos: 7.46411; yPos: -4.21516; zPos: 3.32001 }
- ListElement{ xPos: 6.98777; yPos: -3.94024; zPos: 3.14694 }
- ListElement{ xPos: 7.36355; yPos: -4.24875; zPos: 1.72061 }
- ListElement{ xPos: 7.92773; yPos: -4.52065; zPos: 2.62078 }
- ListElement{ xPos: 6.04598; yPos: -4.48682; zPos: 2.74494 }
- ListElement{ xPos: 7.83353; yPos: -3.9271; zPos: 3.82815 }
- ListElement{ xPos: 6.76279; yPos: -3.58031; zPos: 2.92525 }
- ListElement{ xPos: 7.14794; yPos: -4.42742; zPos: 2.62365 }
- ListElement{ xPos: 5.32696; yPos: -3.28733; zPos: 3.34916 }
- ListElement{ xPos: 6.43655; yPos: -4.60784; zPos: 2.41548 }
- ListElement{ xPos: 5.66033; yPos: -4.98497; zPos: 3.72282 }
- }
-}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
deleted file mode 100644
index bafdaac4..00000000
--- a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
+++ /dev/null
@@ -1,243 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
-
-Rectangle {
- id: mainView
- width: 1280
- height: 720
-
- Data {
- id: graphData
- }
-
- Item {
- id: dataView
- anchors.bottom: parent.bottom
- width: parent.width
- height: parent.height - buttonLayout.height
-
- //! [0]
- Scatter3D {
- //! [0]
- id: scatterGraph
- width: dataView.width
- height: dataView.height
- theme: Theme3D { type: Theme3D.ThemeDigia }
- shadowQuality: AbstractGraph3D.ShadowQualityMedium
- scene.activeCamera.yRotation: 30.0
- //! [1]
- inputHandler: null
- //! [1]
-
- Scatter3DSeries {
- id: scatterSeriesOne
- itemLabelFormat: "One - X:@xLabel Y:@yLabel Z:@zLabel"
- mesh: Abstract3DSeries.MeshCube
-
- ItemModelScatterDataProxy {
- itemModel: graphData.modelOne
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- }
- }
-
- Scatter3DSeries {
- id: scatterSeriesTwo
- itemLabelFormat: "Two - X:@xLabel Y:@yLabel Z:@zLabel"
- mesh: Abstract3DSeries.MeshCube
-
- ItemModelScatterDataProxy {
- itemModel: graphData.modelTwo
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- }
- }
-
- Scatter3DSeries {
- id: scatterSeriesThree
- itemLabelFormat: "Three - X:@xLabel Y:@yLabel Z:@zLabel"
- mesh: Abstract3DSeries.MeshCube
-
- ItemModelScatterDataProxy {
- itemModel: graphData.modelThree
- xPosRole: "xPos"
- yPosRole: "yPos"
- zPosRole: "zPos"
- }
- }
- }
-
- //! [2]
- MouseArea {
- id: inputArea
- anchors.fill: parent
- hoverEnabled: true
- acceptedButtons: Qt.LeftButton | Qt.RightButton
- property int mouseX: -1
- property int mouseY: -1
- //! [2]
-
- //! [3]
- onPositionChanged: {
- mouseX = mouse.x;
- mouseY = mouse.y;
- }
- //! [3]
-
- //! [5]
- onWheel: {
- // Adjust zoom level based on what zoom range we're in.
- var zoomLevel = scatterGraph.scene.activeCamera.zoomLevel;
- if (zoomLevel > 100)
- zoomLevel += wheel.angleDelta.y / 12.0;
- else if (zoomLevel > 50)
- zoomLevel += wheel.angleDelta.y / 60.0;
- else
- zoomLevel += wheel.angleDelta.y / 120.0;
- if (zoomLevel > 500)
- zoomLevel = 500;
- else if (zoomLevel < 10)
- zoomLevel = 10;
-
- scatterGraph.scene.activeCamera.zoomLevel = zoomLevel;
- }
- //! [5]
- }
-
- //! [4]
- Timer {
- id: reselectTimer
- interval: 10
- running: true
- repeat: true
- onTriggered: {
- scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, inputArea.mouseY);
- }
- }
- //! [4]
- }
-
- //! [6]
- NumberAnimation {
- id: cameraAnimationX
- loops: Animation.Infinite
- running: true
- target: scatterGraph.scene.activeCamera
- property:"xRotation"
- from: 0.0
- to: 360.0
- duration: 20000
- }
- //! [6]
-
-
- //! [7]
- SequentialAnimation {
- id: cameraAnimationY
- loops: Animation.Infinite
- running: true
-
- NumberAnimation {
- target: scatterGraph.scene.activeCamera
- property:"yRotation"
- from: 5.0
- to: 45.0
- duration: 9000
- easing.type: Easing.InOutSine
- }
-
- NumberAnimation {
- target: scatterGraph.scene.activeCamera
- property:"yRotation"
- from: 45.0
- to: 5.0
- duration: 9000
- easing.type: Easing.InOutSine
- }
- }
- //! [7]
-
- RowLayout {
- id: buttonLayout
- Layout.minimumHeight: shadowToggle.height
- width: parent.width
- anchors.left: parent.left
- spacing: 0
-
- NewButton {
- id: shadowToggle
- Layout.fillHeight: true
- Layout.minimumWidth: parent.width / 3 // 3 buttons divided equally in the layout
- text: scatterGraph.shadowsSupported ? "Hide Shadows" : "Shadows not supported"
- enabled: scatterGraph.shadowsSupported
-
- onClicked: {
- if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
- text = "Hide Shadows";
- } else {
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
- text = "Show Shadows";
- }
- }
- }
-
- NewButton {
- id: cameraToggle
- Layout.fillHeight: true
- Layout.minimumWidth: parent.width / 3
- text: "Pause Camera"
-
- onClicked: {
- cameraAnimationX.paused = !cameraAnimationX.paused;
- cameraAnimationY.paused = cameraAnimationX.paused;
- if (cameraAnimationX.paused) {
- text = "Animate Camera";
- } else {
- text = "Pause Camera";
- }
- }
- }
-
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.minimumWidth: parent.width / 3
- text: "Quit"
- onClicked: Qt.quit(0);
- }
- }
-}
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.pro b/examples/datavisualization/qmlcustominput/qmlcustominput.pro
deleted file mode 100644
index 356bb26f..00000000
--- a/examples/datavisualization/qmlcustominput/qmlcustominput.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmlcustominput.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlcustominput/*
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.qrc b/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
deleted file mode 100644
index 5800150a..00000000
--- a/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmlcustominput/Data.qml</file>
- <file>qml/qmlcustominput/main.qml</file>
- <file>qml/qmlcustominput/NewButton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png b/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
deleted file mode 100644
index ee546077..00000000
--- a/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc b/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
deleted file mode 100644
index f7aa1458..00000000
--- a/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmllegend
- \title Qt Quick 2 Legend Example
- \ingroup qtdatavisualization_examples
- \brief Showing graph legend in a QML application.
-
- The Qt Quick 2 legend example shows how to make an interactive legend for a graph.
-
- \image qmllegend-example.png
-
- The interesting thing about this example is displaying the legend. We'll concentrate on
- that and skip explaining the basic functionality - for
- more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Legend
-
- The legend is simply a column of custom \c LegendItem items inside a transparent rectangle.
- Each item is supplied with a series and the graph theme:
-
- \snippet qmllegend/qml/qmllegend/main.qml 0
-
- The legend items consist of a marker rectangle, which indicates the color of the series,
- and a text field, which shows the name of the series. The colors we get from the series and
- the theme supplied at legend item initialization:
-
- \snippet qmllegend/qml/qmllegend/LegendItem.qml 0
- \dots 4
- \snippet qmllegend/qml/qmllegend/LegendItem.qml 1
-
- We want the legend to be interactive, so we add additional logic to enable selection of a
- series by clicking on a legend item, as well as highlighting the legend item corresponding
- to the selected series.
-
- The highlight depends on the selection state of the series, so we define two states, which
- follow the Bar3DSeries::selectedBar property and adjust the \c legendItem color appropriately:
-
- \snippet qmllegend/qml/qmllegend/LegendItem.qml 3
-
- To make the legend item interactive, we define a MouseArea to detect clicks on it and adjust
- the series selection accordingly:
-
- \snippet qmllegend/qml/qmllegend/LegendItem.qml 2
-
- The \c previousSelection used above is another custom property of \c LegendItem, which we update
- whenever selection changes on the series. This way we remember the last selected bar of
- each series:
-
- \snippet qmllegend/qml/qmllegend/LegendItem.qml 4
-*/
diff --git a/examples/datavisualization/qmllegend/main.cpp b/examples/datavisualization/qmllegend/main.cpp
deleted file mode 100644
index c7876ca0..00000000
--- a/examples/datavisualization/qmllegend/main.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("Legend example"));
-
- viewer.setSource(QUrl("qrc:/qml/qmllegend/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml b/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
deleted file mode 100644
index b70fb196..00000000
--- a/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-
-Item {
- property alias model: dataModel
-
- ListModel {
- id: dataModel
- ListElement{ year: "2010"; month: "Jan"; s1: "-14"; s2: "-15"; s3: "-15" }
- ListElement{ year: "2010"; month: "Feb"; s1: "-15"; s2: "-16"; s3: "-9" }
- ListElement{ year: "2010"; month: "Mar"; s1: "-7"; s2: "-4"; s3: "-2" }
- ListElement{ year: "2010"; month: "Apr"; s1: "3"; s2: "2"; s3: "2" }
- ListElement{ year: "2010"; month: "May"; s1: "7"; s2: "9"; s3: "10" }
- ListElement{ year: "2010"; month: "Jun"; s1: "12"; s2: "13"; s3: "22" }
- ListElement{ year: "2010"; month: "Jul"; s1: "18"; s2: "19"; s3: "24" }
- ListElement{ year: "2010"; month: "Aug"; s1: "15"; s2: "13"; s3: "16" }
- ListElement{ year: "2010"; month: "Sep"; s1: "6"; s2: "3"; s3: "4" }
- ListElement{ year: "2010"; month: "Oct"; s1: "1"; s2: "2"; s3: "-2" }
- ListElement{ year: "2010"; month: "Nov"; s1: "-2"; s2: "-5"; s3: "-6" }
- ListElement{ year: "2010"; month: "Dec"; s1: "-3"; s2: "-3"; s3: "-9" }
-
- ListElement{ year: "2011"; month: "Jan"; s1: "-12"; s2: "-11"; s3: "-14" }
- ListElement{ year: "2011"; month: "Feb"; s1: "-13"; s2: "-12"; s3: "-10" }
- ListElement{ year: "2011"; month: "Mar"; s1: "-6"; s2: "-4"; s3: "-3" }
- ListElement{ year: "2011"; month: "Apr"; s1: "0"; s2: "1"; s3: "3" }
- ListElement{ year: "2011"; month: "May"; s1: "4"; s2: "12"; s3: "11" }
- ListElement{ year: "2011"; month: "Jun"; s1: "9"; s2: "17"; s3: "23" }
- ListElement{ year: "2011"; month: "Jul"; s1: "15"; s2: "22"; s3: "25" }
- ListElement{ year: "2011"; month: "Aug"; s1: "12"; s2: "15"; s3: "12" }
- ListElement{ year: "2011"; month: "Sep"; s1: "2"; s2: "4"; s3: "7" }
- ListElement{ year: "2011"; month: "Oct"; s1: "-2"; s2: "4"; s3: "-4" }
- ListElement{ year: "2011"; month: "Nov"; s1: "-4"; s2: "-8"; s3: "-5" }
- ListElement{ year: "2011"; month: "Dec"; s1: "-6"; s2: "-6"; s3: "-7" }
-
- ListElement{ year: "2012"; month: "Jan"; s1: "-10"; s2: "-19"; s3: "-11" }
- ListElement{ year: "2012"; month: "Feb"; s1: "-11"; s2: "-17"; s3: "-4" }
- ListElement{ year: "2012"; month: "Mar"; s1: "-6"; s2: "-3"; s3: "-1" }
- ListElement{ year: "2012"; month: "Apr"; s1: "5"; s2: "1"; s3: "2" }
- ListElement{ year: "2012"; month: "May"; s1: "9"; s2: "12"; s3: "13" }
- ListElement{ year: "2012"; month: "Jun"; s1: "11"; s2: "16"; s3: "26" }
- ListElement{ year: "2012"; month: "Jul"; s1: "18"; s2: "20"; s3: "23" }
- ListElement{ year: "2012"; month: "Aug"; s1: "19"; s2: "12"; s3: "12" }
- ListElement{ year: "2012"; month: "Sep"; s1: "9"; s2: "1"; s3: "3" }
- ListElement{ year: "2012"; month: "Oct"; s1: "-3"; s2: "2"; s3: "-1" }
- ListElement{ year: "2012"; month: "Nov"; s1: "-5"; s2: "-4"; s3: "-3" }
- ListElement{ year: "2012"; month: "Dec"; s1: "-7"; s2: "-2"; s3: "-4" }
-
- ListElement{ year: "2013"; month: "Jan"; s1: "-18"; s2: "-19"; s3: "-19" }
- ListElement{ year: "2013"; month: "Feb"; s1: "-17"; s2: "-19"; s3: "-12" }
- ListElement{ year: "2013"; month: "Mar"; s1: "-9"; s2: "-6"; s3: "-5" }
- ListElement{ year: "2013"; month: "Apr"; s1: "0"; s2: "0"; s3: "0" }
- ListElement{ year: "2013"; month: "May"; s1: "4"; s2: "7"; s3: "9" }
- ListElement{ year: "2013"; month: "Jun"; s1: "9"; s2: "11"; s3: "18" }
- ListElement{ year: "2013"; month: "Jul"; s1: "13"; s2: "15"; s3: "20" }
- ListElement{ year: "2013"; month: "Aug"; s1: "10"; s2: "11"; s3: "13" }
- ListElement{ year: "2013"; month: "Sep"; s1: "3"; s2: "1"; s3: "2" }
- ListElement{ year: "2013"; month: "Oct"; s1: "0"; s2: "1"; s3: "-4" }
- ListElement{ year: "2013"; month: "Nov"; s1: "-5"; s2: "-6"; s3: "-5" }
- ListElement{ year: "2013"; month: "Dec"; s1: "-6"; s2: "-7"; s3: "-10" }
- }
-}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
deleted file mode 100644
index 7f1dcda4..00000000
--- a/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtQuick.Window 2.1
-import QtDataVisualization 1.0
-
-Rectangle {
- //! [0]
- property Theme3D theme
- property Bar3DSeries series
- //! [0]
- property point previousSelection
-
- id: legendItem
- state: "unselected"
-
- // Workaround for a layout bug that in some situations causes changing from fully opaque color
- // to a transparent one to use black background instead of what is actually under the items.
- // Having the control always slighthly transparent forces the background to be refreshed
- // properly.
- opacity: 0.999
-
- //! [1]
- RowLayout {
- anchors.fill: parent
- spacing: 0
- clip: true
- Item {
- id: markerSpace
- Layout.minimumWidth: 20
- Layout.minimumHeight: 20
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.alignment: Qt.AlignVCenter
- Rectangle {
- x: parent.x + parent.width / 4
- y: parent.y + parent.height / 4
- width: parent.width / 2
- height: width
- border.color: "black"
- color: series.baseColor
- }
- }
- Item {
- height: markerSpace.height
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.alignment: Qt.AlignVCenter
- Layout.minimumWidth: 100
- Text {
- anchors.fill: parent
- text: series.name
- verticalAlignment: Text.AlignVCenter
- clip: true
- color: theme.labelTextColor
- font: theme.font
- }
- }
- }
- //! [1]
-
- //! [2]
- MouseArea {
- id: mouseArea
- anchors.fill: legendItem
- onClicked: {
- if (legendItem.state === "selected") {
- series.selectedBar = series.invalidSelectionPosition
- } else {
- series.selectedBar = previousSelection
- }
- }
- }
- //! [2]
-
- //! [4]
- Connections {
- target: series
- onSelectedBarChanged: {
- if (position != series.invalidSelectionPosition) {
- previousSelection = position
- }
- }
- }
- //! [4]
-
- //! [3]
- states: [
- State {
- name: "selected"
- when: series.selectedBar != series.invalidSelectionPosition
- PropertyChanges {
- target: legendItem
- color: series.singleHighlightColor
- }
- },
- State {
- name: "unselected"
- when: series.selectedBar == series.invalidSelectionPosition
- PropertyChanges {
- target: legendItem
- color: theme.labelBackgroundColor
- }
- }
- ]
- //! [3]
-}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml b/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/main.qml b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
deleted file mode 100644
index a380303e..00000000
--- a/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
+++ /dev/null
@@ -1,241 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
-
-Rectangle {
- id: mainView
- width: 800
- height: 600
-
- property int buttonLayoutHeight: 180;
-
- Data {
- id: graphData
- }
-
- Theme3D {
- id: firstTheme
- type: Theme3D.ThemeQt
- }
-
- Theme3D {
- id: secondTheme
- type: Theme3D.ThemeEbony
- }
-
- Item {
- id: dataView
- anchors.fill: parent
-
- Bars3D {
- id: barGraph
- anchors.fill: parent
- selectionMode: AbstractGraph3D.SelectionItemAndRow
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
- theme: firstTheme
- valueAxis.labelFormat: "%d\u00B0C"
-
- Bar3DSeries {
- id: station1
- name: "Station 1"
- itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
-
- ItemModelBarDataProxy {
- itemModel: graphData.model
- rowRole: "year"
- columnRole: "month"
- valueRole: "s1"
- }
- }
- Bar3DSeries {
- id: station2
- name: "Station 2"
- itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
-
- ItemModelBarDataProxy {
- itemModel: graphData.model
- rowRole: "year"
- columnRole: "month"
- valueRole: "s2"
- }
- }
- Bar3DSeries {
- id: station3
- name: "Station 3"
- itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
-
- ItemModelBarDataProxy {
- itemModel: graphData.model
- rowRole: "year"
- columnRole: "month"
- valueRole: "s2"
- }
- }
- }
- }
-
- Rectangle {
- property int legendLocation: 3
- // Make the height and width fractional of main view height and width.
- // Reverse the relation if screen is in portrait - this makes legend look the same
- // if the orientation is rotated.
- property int fractionalHeight: mainView.width > mainView.height ? mainView.height / 5 : mainView.width / 5
- property int fractionalWidth: mainView.width > mainView.height ? mainView.width / 5 : mainView.height / 5
-
- id: legendPanel
- width: fractionalWidth > 150 ? fractionalWidth : 150
- // Adjust legendpanel height to avoid gaps between layouted items.
- height: fractionalHeight > 99 ? fractionalHeight - fractionalHeight % 3 : 99
- border.color: barGraph.theme.labelTextColor
- border.width: 3
- color: "#00000000" // Transparent
-
- //! [0]
- ColumnLayout {
- anchors.fill: parent
- anchors.margins: parent.border.width
- spacing: 0
- clip: true
- LegendItem {
- Layout.fillWidth: true
- Layout.fillHeight: true
- series: station1
- theme: barGraph.theme
- }
- LegendItem {
- Layout.fillWidth: true
- Layout.fillHeight: true
- series: station2
- theme: barGraph.theme
- }
- LegendItem {
- Layout.fillWidth: true
- Layout.fillHeight: true
- series: station3
- theme: barGraph.theme
- }
- }
- //! [0]
-
- states: [
- State {
- name: "topleft"
- when: legendPanel.legendLocation === 1
- AnchorChanges {
- target: legendPanel
- anchors.top: buttonLayout.bottom
- anchors.bottom: undefined
- anchors.left: dataView.left
- anchors.right: undefined
- }
- },
- State {
- name: "topright"
- when: legendPanel.legendLocation === 2
- AnchorChanges {
- target: legendPanel
- anchors.top: buttonLayout.bottom
- anchors.bottom: undefined
- anchors.left: undefined
- anchors.right: dataView.right
- }
- },
- State {
- name: "bottomleft"
- when: legendPanel.legendLocation === 3
- AnchorChanges {
- target: legendPanel
- anchors.top: undefined
- anchors.bottom: dataView.bottom
- anchors.left: dataView.left
- anchors.right: undefined
- }
- },
- State {
- name: "bottomright"
- when: legendPanel.legendLocation === 4
- AnchorChanges {
- target: legendPanel
- anchors.top: undefined
- anchors.bottom: dataView.bottom
- anchors.left: undefined
- anchors.right: dataView.right
- }
- }
- ]
- }
-
- RowLayout {
- id: buttonLayout
- Layout.minimumHeight: themeToggle.height
- width: parent.width
- anchors.left: parent.left
- spacing: 0
-
- NewButton {
- id: themeToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Change Theme"
- onClicked: {
- if (barGraph.theme === firstTheme) {
- barGraph.theme = secondTheme
- } else {
- barGraph.theme = firstTheme
- }
- }
- }
- NewButton {
- id: repositionLegend
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Reposition Legend"
- onClicked: {
- if (legendPanel.legendLocation === 4) {
- legendPanel.legendLocation = 1
- } else {
- legendPanel.legendLocation++
- }
- }
- }
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Quit"
- onClicked: Qt.quit(0);
- }
- }
-
-}
diff --git a/examples/datavisualization/qmllegend/qmllegend.pro b/examples/datavisualization/qmllegend/qmllegend.pro
deleted file mode 100644
index af449d8d..00000000
--- a/examples/datavisualization/qmllegend/qmllegend.pro
+++ /dev/null
@@ -1,13 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmllegend.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmllegend/*
-
diff --git a/examples/datavisualization/qmllegend/qmllegend.qrc b/examples/datavisualization/qmllegend/qmllegend.qrc
deleted file mode 100644
index b9777b37..00000000
--- a/examples/datavisualization/qmllegend/qmllegend.qrc
+++ /dev/null
@@ -1,8 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmllegend/Data.qml</file>
- <file>qml/qmllegend/LegendItem.qml</file>
- <file>qml/qmllegend/main.qml</file>
- <file>qml/qmllegend/NewButton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png b/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
deleted file mode 100644
index 79073f5f..00000000
--- a/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc b/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
deleted file mode 100644
index 64985c21..00000000
--- a/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlmultigraph
- \title Qt Quick 2 Multiple Graphs Example
- \ingroup qtdatavisualization_examples
- \brief Showing multiple graphs simultaneously in a QML application.
-
- The Qt Quick 2 multiple graphs example demonstrates using multiple graphs in single window.
-
- \image qmlmultigraph-example.png
-
- The interesting thing about this example is demonstrating that multiple graphs can be used
- simultaneously, so most functionality is not explained in detail.
- For more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Multiple Graphs
-
- Using multiple graphs in a single application doesn't require anything special, simply define
- and position the graphs as normal. In this example the graphs are shown in a 2 x 2 grid with
- \c{GridLayout}:
-
- \snippet qmlmultigraph/qml/qmlmultigraph/main.qml 0
-
- Each graph has a parent \c Rectangle item to provide it with a border.
-
- Note that one of the grid cells is used for buttons in an another \c{GridLayout}.
-*/
diff --git a/examples/datavisualization/qmlmultigraph/main.cpp b/examples/datavisualization/qmlmultigraph/main.cpp
deleted file mode 100644
index b7ca9b99..00000000
--- a/examples/datavisualization/qmlmultigraph/main.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("QML multigraph example"));
- viewer.setSource(QUrl("qrc:/qml/qmlmultigraph/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
deleted file mode 100644
index 183c69ee..00000000
--- a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-
-Item {
- property alias sharedData: dataModel
-
- ListModel {
- id: dataModel
- ListElement{ row: "0"; col: "0"; longitude: "20.0"; latitude: "10.0"; pop_density: "4.75"; }
- ListElement{ row: "1"; col: "0"; longitude: "21.1"; latitude: "10.3"; pop_density: "3.00"; }
- ListElement{ row: "2"; col: "0"; longitude: "22.5"; latitude: "10.7"; pop_density: "1.24"; }
- ListElement{ row: "3"; col: "0"; longitude: "24.0"; latitude: "10.5"; pop_density: "2.53"; }
- ListElement{ row: "0"; col: "1"; longitude: "20.2"; latitude: "11.2"; pop_density: "3.55"; }
- ListElement{ row: "1"; col: "1"; longitude: "21.3"; latitude: "11.5"; pop_density: "3.03"; }
- ListElement{ row: "2"; col: "1"; longitude: "22.6"; latitude: "11.7"; pop_density: "3.46"; }
- ListElement{ row: "3"; col: "1"; longitude: "23.4"; latitude: "11.5"; pop_density: "4.12"; }
- ListElement{ row: "0"; col: "2"; longitude: "20.2"; latitude: "12.3"; pop_density: "3.37"; }
- ListElement{ row: "1"; col: "2"; longitude: "21.1"; latitude: "12.4"; pop_density: "2.98"; }
- ListElement{ row: "2"; col: "2"; longitude: "22.5"; latitude: "12.1"; pop_density: "3.33"; }
- ListElement{ row: "3"; col: "2"; longitude: "23.3"; latitude: "12.7"; pop_density: "3.23"; }
- ListElement{ row: "0"; col: "3"; longitude: "20.7"; latitude: "13.3"; pop_density: "5.34"; }
- ListElement{ row: "1"; col: "3"; longitude: "21.5"; latitude: "13.2"; pop_density: "4.54"; }
- ListElement{ row: "2"; col: "3"; longitude: "22.4"; latitude: "13.6"; pop_density: "4.65"; }
- ListElement{ row: "3"; col: "3"; longitude: "23.2"; latitude: "13.4"; pop_density: "6.67"; }
- ListElement{ row: "0"; col: "4"; longitude: "20.6"; latitude: "15.0"; pop_density: "6.01"; }
- ListElement{ row: "1"; col: "4"; longitude: "21.3"; latitude: "14.6"; pop_density: "5.83"; }
- ListElement{ row: "2"; col: "4"; longitude: "22.5"; latitude: "14.8"; pop_density: "7.32"; }
- ListElement{ row: "3"; col: "4"; longitude: "23.7"; latitude: "14.3"; pop_density: "6.90"; }
- }
-}
-
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
deleted file mode 100644
index 269859c7..00000000
--- a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
+++ /dev/null
@@ -1,221 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
-
-Rectangle {
- id: mainView
- width: 800
- height: 600
-
- Data {
- id: data
- }
-
- //! [0]
- GridLayout {
- id: gridLayout
- columns: 2
- Layout.fillHeight: true
- Layout.fillWidth: true
- anchors.top: mainView.top
- anchors.bottom: mainView.bottom
- anchors.left: mainView.left
- anchors.right: mainView.right
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: surfaceGraph.theme.gridLineColor
- border.width: 2
-
- Surface3D {
- id: surfaceGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D {
- type: Theme3D.ThemePrimaryColors
- font.pointSize: 60
- }
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Surface3DSeries {
- itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
- ItemModelSurfaceDataProxy {
- itemModel: data.sharedData
- // The surface data points are not neatly lined up in rows and columns,
- // so we define explicit row and column roles.
- rowRole: "row"
- columnRole: "col"
- xPosRole: "latitude"
- zPosRole: "longitude"
- yPosRole: "pop_density"
- }
- }
- }
- }
-
- // We'll use one grid cell for buttons
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
-
- GridLayout {
- anchors.right: parent.right
- anchors.left: parent.left
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- columns: 2
-
- NewButton {
- Layout.minimumWidth: parent.width / 2
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Clear Selections"
- onClicked: clearSelections() // call a helper function to keep button itself simpler
- }
-
- NewButton {
- Layout.minimumWidth: parent.width / 2
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Quit"
- onClicked: Qt.quit(0);
- }
-
- NewButton {
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Reset Cameras"
- onClicked: resetCameras() // call a helper function to keep button itself simpler
- }
-
- NewButton {
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Toggle Mesh Styles"
- onClicked: toggleMeshStyle() // call a helper function to keep button itself simpler
- }
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: scatterGraph.theme.gridLineColor
- border.width: 2
-
- Scatter3D {
- id: scatterGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D {
- type: Theme3D.ThemeDigia
- font.pointSize: 60
- }
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Scatter3DSeries {
- itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
- ItemModelScatterDataProxy {
- itemModel: data.sharedData
- // Mapping model roles to scatter series item coordinates.
- xPosRole: "latitude"
- zPosRole: "longitude"
- yPosRole: "pop_density"
- }
- }
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- border.color: barGraph.theme.gridLineColor
- border.width: 2
-
- Bars3D {
- id: barGraph
- anchors.fill: parent
- anchors.margins: parent.border.width
- theme: Theme3D {
- type: Theme3D.ThemeQt
- font.pointSize: 60
- }
- selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
-
- Bar3DSeries {
- itemLabelFormat: "@seriesName: @valueLabel"
- name: "Population density"
-
- ItemModelBarDataProxy {
- itemModel: data.sharedData
- // Mapping model roles to bar series rows, columns, and values.
- rowRole: "row"
- columnRole: "col"
- valueRole: "pop_density"
- }
- }
- }
- }
- }
- //! [0]
-
- function clearSelections() {
- barGraph.clearSelection()
- scatterGraph.clearSelection()
- surfaceGraph.clearSelection()
- }
-
- function resetCameras() {
- surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
- scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
- barGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
- surfaceGraph.scene.activeCamera.zoomLevel = 100.0
- scatterGraph.scene.activeCamera.zoomLevel = 100.0
- barGraph.scene.activeCamera.zoomLevel = 100.0
- }
-
- function toggleMeshStyle() {
- if (barGraph.seriesList[0].meshSmooth === true) {
- barGraph.seriesList[0].meshSmooth = false
- if (surfaceGraph.seriesList[0].flatShadingSupported)
- surfaceGraph.seriesList[0].flatShadingEnabled = true
- scatterGraph.seriesList[0].meshSmooth = false
- } else {
- barGraph.seriesList[0].meshSmooth = true
- surfaceGraph.seriesList[0].flatShadingEnabled = false
- scatterGraph.seriesList[0].meshSmooth = true
- }
- }
-}
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro b/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
deleted file mode 100644
index 8cc4c60c..00000000
--- a/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmlmultigraph.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlmultigraph/*
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc b/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
deleted file mode 100644
index c5e63a1c..00000000
--- a/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmlmultigraph/Data.qml</file>
- <file>qml/qmlmultigraph/main.qml</file>
- <file>qml/qmlmultigraph/NewButton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h
deleted file mode 100644
index 39a7f830..00000000
--- a/examples/datavisualization/qmloscilloscope/datasource.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef DATASOURCE_H
-#define DATASOURCE_H
-
-#include <QtDataVisualization/QSurface3DSeries>
-
-using namespace QtDataVisualization;
-
-class DataSource : public QObject
-{
- Q_OBJECT
-public:
- explicit DataSource(QObject *parent = 0);
- virtual ~DataSource();
-
- //! [0]
-public Q_SLOTS:
- void generateData(int cacheCount, int rowCount, int columnCount,
- float xMin, float xMax, float yMin, float yMax, float zMin, float zMax);
-
- void update(QSurface3DSeries *series);
- //! [0]
-private:
- void clearData();
-
- QList<QSurfaceDataArray> m_data;
- int m_index;
- QSurfaceDataArray *m_resetArray;
-};
-
-#endif
diff --git a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
deleted file mode 100644
index d8a79a36..00000000
--- a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
deleted file mode 100644
index 748bbc6c..00000000
--- a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmloscilloscope
- \title Qt Quick 2 Oscilloscope Example
- \ingroup qtdatavisualization_examples
- \brief Example of a hybrid C++ and QML application.
-
- The Qt Quick 2 oscilloscope example shows how to combine C++ and QML in an application,
- as well as showing data that changes realtime.
-
- \image qmloscilloscope-example.png
-
- The interesting thing about this example is combining C++ and QML, so we'll concentrate on
- that and skip explaining the basic functionality - for
- more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Data Source in C++
-
- The item model based proxies are good for simple and/or static graphs, but to achieve
- best performance when displaying data changing in realtime, the basic proxies should be used.
- Those are not supported in QML, as the data items they store are not \l{QObject}s and
- cannot therefore be directly manipulated from QML code.
- To overcome this limitation, we implement a simple \c DataSource class in C++ to populate the
- data proxy of the series.
-
- The \c DataSource class provides three methods that can be called from QML:
-
- \snippet qmloscilloscope/datasource.h 0
-
- The first method, \c generateData(), creates a cache of simulated oscilloscope data for us
- to display. The data is cached in a format accepted by QSurfaceDataProxy:
-
- \snippet qmloscilloscope/datasource.cpp 0
-
- The second method, \c update(), copies one set of the cached data into another array, which we
- set to the data proxy of the series by calling QSurfaceDataProxy::resetArray().
- We reuse the same array if the array dimensions have not changed to minimize overhead:
-
- \snippet qmloscilloscope/datasource.cpp 1
-
- \note Even though we are operating on the array pointer we have previously set to the proxy
- we still need to call QSurfaceDataProxy::resetArray() after changing the data in it to prompt
- the graph to render the data.
-
- To be able to access the \c DataSource methods from QML, we need to expose it. We do this by
- defining a context property in application main:
-
- \snippet qmloscilloscope/main.cpp 0
-
- To make it possible to use QSurface3DSeries pointers as parameters on the
- \c DataSource class methods on all environments and builds, we need to make sure the meta
- type is registered:
-
- \snippet qmloscilloscope/datasource.cpp 3
- \dots 0
- \snippet qmloscilloscope/datasource.cpp 4
-
- \section1 QML
-
- In the QML codes, we define a Surface3D graph normally and give it a Surface3DSeries:
-
- \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 0
-
- One interesting detail is that we don't specify a proxy for the Surface3DSeries we attach
- to the graph. This makes the series to utilize the default QSurfaceDataProxy.
-
- We also hide the item label with \l{Abstract3DSeries::itemLabelVisible}{itemLabelVisible}, since
- we want to display the selected item information in a \c Text element instead of a floating
- label above the selection pointer.
- This is done because the selection pointer moves around a lot as the data changes, which makes
- the regular selection label difficult to read.
-
- We initialize the \c DataSource cache when the graph is complete by calling a helper function
- \c generateData(), which calls the method with the same name on the \c DataSource:
-
- \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 2
- \dots 4
- \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 4
-
- To trigger the updates in data, we define a \c Timer item which calls the \c update() method on the \c
- DataSource at requested intervals. The label update is also triggered on each cycle:
-
- \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 3
-
- \section1 Enabling Direct Rendering
-
- Since this application potentially deals with a lot of rapidly changing data, we use direct
- rendering mode for performance. To enable antialiasing in this mode the surface format of the application
- window needs to be changed, as the default format used by QQuickView doesn't support antialiasing.
- We use the utility function provided by Qt Data Visualization to change the surface format
- in \c main.cpp:
-
- \snippet qmloscilloscope/main.cpp 1
- \dots 0
- \snippet qmloscilloscope/main.cpp 2
-
- On the QML side, direct rendering mode is enabled via \l{AbstractGraph3D::renderingMode}{renderingMode} property:
-
- \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 5
-*/
diff --git a/examples/datavisualization/qmloscilloscope/main.cpp b/examples/datavisualization/qmloscilloscope/main.cpp
deleted file mode 100644
index 685f2cd8..00000000
--- a/examples/datavisualization/qmloscilloscope/main.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "datasource.h"
-
-//! [2]
-#include <QtDataVisualization/qutils.h>
-//! [2]
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQml/QQmlContext>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // Enable antialiasing in direct rendering mode
- //! [1]
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
- //! [1]
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
-
- viewer.setTitle(QStringLiteral("Oscilloscope example"));
-
- //! [0]
- DataSource dataSource;
- viewer.rootContext()->setContextProperty("dataSource", &dataSource);
- //! [0]
-
- viewer.setSource(QUrl("qrc:/qml/qmloscilloscope/main.qml"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
deleted file mode 100644
index c6a64cc2..00000000
--- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
+++ /dev/null
@@ -1,338 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtQuick.Controls 1.0
-import QtDataVisualization 1.1
-import "."
-
-Item {
- id: mainView
- width: 1280
- height: 1024
-
- property int sampleColumns: sampleSlider.value
- property int sampleRows: sampleColumns / 2
- property int sampleCache: 24
-
- onSampleRowsChanged: {
- surfaceSeries.selectedPoint = surfaceSeries.invalidSelectionPosition
- generateData()
- }
-
- Item {
- id: dataView
- anchors.bottom: parent.bottom
- width: parent.width
- height: parent.height - buttonLayout.height
-
- Surface3D {
- id: surfaceGraph
-
- width: dataView.width
- height: dataView.height
- shadowQuality: AbstractGraph3D.ShadowQualityNone
- selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
- //! [5]
- renderingMode: AbstractGraph3D.RenderDirectToBackground
- //! [5]
-
- axisX.labelFormat: "%d ms"
- axisY.labelFormat: "%d W"
- axisZ.labelFormat: "%d mV"
- axisX.min: 0
- axisY.min: 0
- axisZ.min: 0
- axisX.max: 1000
- axisY.max: 100
- axisZ.max: 800
- axisX.segmentCount: 4
- axisY.segmentCount: 4
- axisZ.segmentCount: 4
- measureFps: true
-
- onCurrentFpsChanged: {
- if (fps > 10)
- fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps)
- else
- fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps * 10.0) / 10.0
- }
-
- //! [0]
- Surface3DSeries {
- id: surfaceSeries
- drawMode: Surface3DSeries.DrawSurface;
- flatShadingEnabled: false;
- meshSmooth: true
- itemLabelFormat: "@xLabel, @zLabel: @yLabel"
- itemLabelVisible: false
-
- onItemLabelChanged: {
- if (surfaceSeries.selectedPoint === surfaceSeries.invalidSelectionPosition)
- selectionText.text = "No selection"
- else
- selectionText.text = surfaceSeries.itemLabel
- }
- }
- //! [0]
-
- //! [2]
- Component.onCompleted: mainView.generateData()
- //! [2]
- }
- }
-
- //! [3]
- Timer {
- id: refreshTimer
- interval: 1000 / frequencySlider.value
- running: true
- repeat: true
- onTriggered: dataSource.update(surfaceSeries)
- }
- //! [3]
-
- Rectangle {
- width: parent.width
- height: flatShadingToggle.height * 2
- anchors.left: parent.left
- anchors.top: parent.top
- color: surfaceGraph.theme.backgroundColor
-
- ColumnLayout {
- anchors.fill: parent
- RowLayout {
- id: sliderLayout
- anchors.top: parent.top
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumHeight: flatShadingToggle.height
- spacing: 0
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: samplesText.implicitWidth + 120
- Layout.maximumWidth: samplesText.implicitWidth + 120
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- border.color: "gray"
- border.width: 1
- radius: 4
-
- RowLayout {
- anchors.fill: parent
- anchors.margins: parent.border.width + 1
-
- Slider {
- id: sampleSlider
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
- Layout.minimumWidth: 80
- minimumValue: mainView.sampleCache * 2
- maximumValue: minimumValue * 10
- stepSize: mainView.sampleCache
- updateValueWhileDragging: false
- Component.onCompleted: value = minimumValue * 2
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: samplesText.implicitWidth + 10
- Layout.maximumWidth: samplesText.implicitWidth + 10
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- Text {
- id: samplesText
- text: "Samples: " + (mainView.sampleRows * mainView.sampleColumns)
- anchors.fill: parent
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: frequencyText.implicitWidth + 120
- Layout.maximumWidth: frequencyText.implicitWidth + 120
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- border.color: "gray"
- border.width: 1
- radius: 4
-
- RowLayout {
- anchors.fill: parent
- anchors.margins: parent.border.width + 1
-
- Slider {
- id: frequencySlider
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
- Layout.minimumWidth: 80
- minimumValue: 2
- maximumValue: 60
- stepSize: 2
- updateValueWhileDragging: true
- value: 30
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: frequencyText.implicitWidth + 10
- Layout.maximumWidth: frequencyText.implicitWidth + 10
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- Text {
- id: frequencyText
- text: "Freq: " + frequencySlider.value + " Hz"
- anchors.fill: parent
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: fpsText.implicitWidth + 10
- Layout.maximumWidth: fpsText.implicitWidth + 10
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- border.color: "gray"
- border.width: 1
- radius: 4
-
- Text {
- id: fpsText
- anchors.fill: parent
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
-
- Rectangle {
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumWidth: selectionText.implicitWidth + 10
- Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
-
- border.color: "gray"
- border.width: 1
- radius: 4
-
- Text {
- id: selectionText
- anchors.fill: parent
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- text: "No selection"
- }
- }
- }
-
- RowLayout {
- id: buttonLayout
- Layout.fillHeight: true
- Layout.fillWidth: true
- Layout.minimumHeight: flatShadingToggle.height
- anchors.bottom: parent.bottom
- spacing: 0
-
- NewButton {
- id: flatShadingToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
-
- text: surfaceSeries.flatShadingSupported ? "Show Flat" : "Flat not supported"
- enabled: surfaceSeries.flatShadingSupported
-
- onClicked: {
- if (surfaceSeries.flatShadingEnabled === true) {
- surfaceSeries.flatShadingEnabled = false;
- text = "Show Flat"
- } else {
- surfaceSeries.flatShadingEnabled = true;
- text = "Show Smooth"
- }
- }
- }
-
- NewButton {
- id: surfaceGridToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
-
- text: "Show Surface Grid"
-
- onClicked: {
- if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
- surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
- text = "Show Surface Grid"
- } else {
- surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
- text = "Hide Surface Grid"
- }
- }
- }
-
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.fillWidth: true
-
- text: "Quit"
-
- onClicked: Qt.quit(0);
- }
- }
- }
-
- }
-
- //! [4]
- function generateData() {
- dataSource.generateData(mainView.sampleCache, mainView.sampleRows,
- mainView.sampleColumns, surfaceGraph.axisX.min,
- surfaceGraph.axisX.max, surfaceGraph.axisY.min,
- surfaceGraph.axisY.max, surfaceGraph.axisZ.min,
- surfaceGraph.axisZ.max)
- }
- //! [4]
-}
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc b/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
deleted file mode 100644
index a2358789..00000000
--- a/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmloscilloscope/main.qml</file>
- <file>qml/qmloscilloscope/NewButton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlscatter/CMakeLists.txt b/examples/datavisualization/qmlscatter/CMakeLists.txt
new file mode 100644
index 00000000..381ffd79
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(qmlscatter LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Qml)
+find_package(Qt6 COMPONENTS Quick)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(qmlscatter
+ main.cpp
+)
+set_target_properties(qmlscatter PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_link_libraries(qmlscatter PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Qml
+ Qt::Quick
+ Qt::DataVisualization
+)
+
+qt6_add_qml_module(qmlscatter
+ URI Scatter
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ QML_FILES
+ qml/qmlscatter/Data.qml
+ qml/qmlscatter/main.qml
+)
+
+install(TARGETS qmlscatter
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
index 65ec4816..5d5de700 100644
--- a/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
+++ b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
index 9d13f0bb..980fc60d 100644
--- a/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
+++ b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
@@ -1,42 +1,20 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\example qmlscatter
- \title Qt Quick 2 Scatter Example
- \ingroup qtdatavisualization_examples
+ \meta tags {DataVisualization, Scatter3D, Multiple Series}
+ \title Simple Scatter Graph
+ \ingroup qtdatavisualization_qmlexamples
\brief Using Scatter3D in a QML application.
- The Qt Quick 2 scatter example shows how to make a simple scatter graph visualization using
- Scatter3D and Qt Quick 2.
+ \e {Simple Scatter Graph} shows how to make a simple scatter graph visualization using
+ Scatter3D and QML.
- For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
+ For instructions about how to interact with the graph, see
+ \l{Qt Data Visualization Interacting with Data}{this page}.
- For instructions how to create a new Qt Quick 2 application of your own, see Qt Creator help.
+ For instructions on how to create a new Qt Quick application of your own, see Qt Creator help.
\image qmlscatter-example.png
@@ -44,132 +22,142 @@
\section1 Application Basics
- Before diving into the QML code, let's take a look at the application \c main.cpp.
+ Before diving into the QML code, take a look at the application \c main.cpp.
- This application implements a 'Quit' button in the UI, so we want to connect the QQmlEngine::quit()
- signal to our application's QWindow::close() slot:
+ This application implements a 'Quit' button in the UI, so you want to connect the QQmlEngine::quit()
+ signal to the application's QWindow::close() slot:
\snippet qmlscatter/main.cpp 4
- To make deployment little simpler, we gather all of the application's \c .qml files to a resource
+ To make deployment a little simpler, gather all of the application's \c .qml files to a resource
file (\c qmlscatter.qrc):
- \code
+ \badcode
<RCC>
<qresource prefix="/">
<file>qml/qmlscatter/Data.qml</file>
<file>qml/qmlscatter/main.qml</file>
- <file>qml/qmlscatter/NewButton.qml</file>
</qresource>
</RCC>
\endcode
- This also requires us to set the \c main.qml to be read from the resource (\c{qrc:}):
+ This also requires setting the \c main.qml to be read from the resource (\c{qrc:}):
\snippet qmlscatter/main.cpp 3
- Lastly, we want the application to run in a maximized window:
+ When using cmake instead of qmake, the \c .qml files are added into a QML module in the
+ \c {CMakeLists.txt} instead:
+
+ \badcode
+ qt6_add_qml_module(qmlscatter
+ URI Scatter
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ QML_FILES
+ qml/qmlscatter/Data.qml
+ qml/qmlscatter/main.qml
+ )
+ \endcode
+
+ Finally, make the application run in a maximized window:
\snippet qmlscatter/main.cpp 2
\section1 Setting up the Graph
- First we'll import all the QML modules we need:
+ First, import all the needed QML modules:
\snippet qmlscatter/qml/qmlscatter/main.qml 0
- The last \c import just imports all the qml files in the same directory as our \c {main.qml},
- because that's where \c NewButton.qml and \c Data.qml are.
-
- Then we create our main \c Rectangle and call it \c mainView:
+ Then, create the main \c Item and call it \c mainView:
\snippet qmlscatter/qml/qmlscatter/main.qml 1
- Then we'll add another \c Item inside the main \c Rectangle, and call it \c dataView.
- This will be the item to hold the Scatter3D graph. We'll anchor it to the parent bottom:
+ Then, add another \c Item inside the main \c Item, and call it \c {dataView}.
+ This will be the item to hold the Scatter3D graph. Anchor it to the parent bottom:
\snippet qmlscatter/qml/qmlscatter/main.qml 9
- Next we're ready to add the Scatter3D graph itself. We'll add it inside the \c dataView and
- name it \c {scatterGraph}. Let's make it fill the \c {dataView}:
+ Next, add the Scatter3D graph itself. Add it inside the \c dataView and
+ name it \c {scatterGraph}. Make it fill the \c {dataView}:
\snippet qmlscatter/qml/qmlscatter/main.qml 2
Now the graph is ready for use, but has no data. It also has the default axes and visual
properties.
- Let's modify some visual properties first by adding the following inside \c {scatterGraph}:
+ Next, modify some visual properties first by adding the following inside \c {scatterGraph}:
\snippet qmlscatter/qml/qmlscatter/main.qml 3
- We added a customized theme and changed the shadow quality.
- We're happy with the other visual properties, so we won't change them.
+ A customized theme was added, the shadow quality changed, and the camera position adjusted.
+ The other visual properties are fine, so there is no need to change them.
- The custom theme is based on a predefined theme, but we change the font in it:
+ The custom theme is based on a predefined theme, \c {Theme3D.ThemeQt}, but the font in it
+ is changed:
\snippet qmlscatter/qml/qmlscatter/main.qml 13
- Then it's time to start feeding the graph some data.
+ Then, start feeding the graph some data.
\section1 Adding Data to the Graph
- Let's create a \c Data item inside the \c mainView and name it \c seriesData:
+ Create a \c Data item inside the \c mainView and name it \c seriesData:
\snippet qmlscatter/qml/qmlscatter/main.qml 4
- The \c seriesData item contains the data models for all three series we use in this example.
+ The \c seriesData item contains the data models for all three series used in this example.
- This is the component that holds our data in \c {Data.qml}. It has an \c Item as the main
+ This is the component that holds the data in \c {Data.qml}. It has an \c Item as the main
component.
- In the main component we'll add the data itself in a \c ListModel and name it
- \c {dataModel}:
+ In the main component, add the data itself to a \c ListModel and name it \c {dataModel}:
\snippet qmlscatter/qml/qmlscatter/Data.qml 0
\dots
- We'll add two more of these for the other two series, and name them \c dataModelTwo and
+ Add two more of these to the other two series, and name them \c dataModelTwo and
\c {dataModelThree}.
- Then we need to expose the data models to be usable from \c {main.qml}. We do this by defining
+ Then, expose the data models to be usable from \c {main.qml}. Do this by defining
them as aliases in the main data component:
\snippet qmlscatter/qml/qmlscatter/Data.qml 1
- Now we can use the data from \c Data.qml with \c scatterGraph in \c {main.qml}. First we'll add
+ Now you can use the data from \c Data.qml with \c scatterGraph in \c {main.qml}. First, add
a Scatter3DSeries and call it \c {scatterSeries}:
\snippet qmlscatter/qml/qmlscatter/main.qml 5
- Then we'll set up selection label format for the series:
+ Then, set up selection label format for the series:
\snippet qmlscatter/qml/qmlscatter/main.qml 10
- And finally the data for series one in a ItemModelScatterDataProxy. We set the data itself as
- \c itemModel for the proxy:
+ And finally, add the data for series one in a ItemModelScatterDataProxy. Set the data itself as
+ the \c itemModel for the proxy:
\snippet qmlscatter/qml/qmlscatter/main.qml 11
- We'll add the other two series in the same way, but modify some series-specific details a bit:
+ Add the other two series in the same way, but modify some series-specific details a bit:
\snippet qmlscatter/qml/qmlscatter/main.qml 12
\dots
- Then we'll modify the properties of the default axes in \c scatterGraph a bit:
+ Then, modify the properties of the default axes in \c scatterGraph a bit:
\snippet qmlscatter/qml/qmlscatter/main.qml 6
- After that we'll just add a few buttons to the \c mainView to control the graph. We'll only
- show one as an example:
+ After that, add a few buttons to the \c mainView to control the graph, one of which is shown as
+ an example:
\snippet qmlscatter/qml/qmlscatter/main.qml 7
- Then we'll modify \c dataView to make room for the buttons at the top:
+ Then, modify \c dataView to make some room for the buttons at the top:
\snippet qmlscatter/qml/qmlscatter/main.qml 8
\dots
- And we're done!
+ And you're done!
\section1 Example Contents
*/
diff --git a/examples/datavisualization/qmlscatter/main.cpp b/examples/datavisualization/qmlscatter/main.cpp
index 03a45c7e..e9332869 100644
--- a/examples/datavisualization/qmlscatter/main.cpp
+++ b/examples/datavisualization/qmlscatter/main.cpp
@@ -1,31 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui/QGuiApplication>
#include <QtCore/QDir>
@@ -34,6 +8,7 @@
int main(int argc, char *argv[])
{
+ qputenv("QSG_RHI_BACKEND", "opengl");
QGuiApplication app(argc, argv);
QQuickView viewer;
@@ -51,7 +26,7 @@ int main(int argc, char *argv[])
QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
//! [4]
- viewer.setTitle(QStringLiteral("QML scatter example"));
+ viewer.setTitle(QStringLiteral("Simple Scatter Graph"));
//! [3]
viewer.setSource(QUrl("qrc:/qml/qmlscatter/main.qml"));
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
index e077669f..e38bba91 100644
--- a/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
@@ -1,33 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-import QtQuick 2.1
+import QtQuick
Item {
//! [1]
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
index 002f9d93..f1ccabde 100644
--- a/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
@@ -1,45 +1,25 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
//! [0]
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
//! [0]
//! [1]
-Rectangle {
+Item {
id: mainView
//! [1]
- width: 500
- height: 500
+ width: 1600
+ height: 1200
+
+ property bool portraitMode: width < height
+ // Adjust the button width based on screen orientation:
+ // If we're in portrait mode, just fit two buttons side-by-side, otherwise
+ // fit all of the buttons side-by-side.
+ property real buttonWidth: mainView.portraitMode ? (mainView.width / 2 - 8)
+ : (mainView.width / 6 - 6)
//! [4]
Data {
@@ -49,16 +29,15 @@ Rectangle {
//! [13]
Theme3D {
- id: themeIsabelle
- type: Theme3D.ThemeIsabelle
- font.family: "Lucida Handwriting"
+ id: themeQt
+ type: Theme3D.ThemeQt
font.pointSize: 40
}
//! [13]
Theme3D {
- id: themeArmyBlue
- type: Theme3D.ThemeArmyBlue
+ id: themeRetro
+ type: Theme3D.ThemeRetro
}
//! [8]
@@ -68,18 +47,21 @@ Rectangle {
anchors.bottom: parent.bottom
//! [9]
width: parent.width
- height: parent.height - buttonLayout.height
+ // Adjust the space based on screen orientation:
+ // If we're in portrait mode, we have 3 rows of buttons, otherwise they are all in one row.
+ height: parent.height - (mainView.portraitMode ? shadowToggle.implicitHeight * 3 + 25
+ : shadowToggle.implicitHeight + 10)
//! [8]
//! [2]
Scatter3D {
id: scatterGraph
- width: dataView.width
- height: dataView.height
+ anchors.fill: parent
//! [2]
//! [3]
- theme: themeIsabelle
- shadowQuality: AbstractGraph3D.ShadowQualitySoftLow
+ theme: themeQt
+ shadowQuality: AbstractGraph3D.ShadowQualityHigh
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetFront
//! [3]
//! [6]
axisX.segmentCount: 3
@@ -114,7 +96,7 @@ Rectangle {
Scatter3DSeries {
id: scatterSeriesTwo
itemLabelFormat: "Series 2: X:@xLabel Y:@yLabel Z:@zLabel"
- itemSize: 0.1
+ itemSize: 0.05
mesh: Abstract3DSeries.MeshCube
//! [12]
@@ -128,7 +110,7 @@ Rectangle {
Scatter3DSeries {
id: scatterSeriesThree
itemLabelFormat: "Series 3: X:@xLabel Y:@yLabel Z:@zLabel"
- itemSize: 0.2
+ itemSize: 0.1
mesh: Abstract3DSeries.MeshMinimal
ItemModelScatterDataProxy {
@@ -141,103 +123,106 @@ Rectangle {
}
}
- RowLayout {
- id: buttonLayout
- Layout.minimumHeight: cameraToggle.height
- width: parent.width
+ //! [7]
+ Button {
+ id: shadowToggle
+ width: mainView.buttonWidth // Calculated elsewhere based on screen orientation
anchors.left: parent.left
- spacing: 0
- //! [7]
- NewButton {
- id: shadowToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: scatterGraph.shadowsSupported ? "Hide Shadows" : "Shadows not supported"
- enabled: scatterGraph.shadowsSupported
- onClicked: {
- if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftLow;
- text = "Hide Shadows";
- } else {
- scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
- text = "Show Shadows";
- }
+ anchors.top: parent.top
+ anchors.margins: 5
+ text: scatterGraph.shadowsSupported ? "Hide Shadows" : "Shadows not supported"
+ enabled: scatterGraph.shadowsSupported
+ onClicked: {
+ if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityHigh;
+ text = "Hide Shadows";
+ } else {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
+ text = "Show Shadows";
}
}
- //! [7]
-
- NewButton {
- id: smoothToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Use Smooth for Series One"
- onClicked: {
- if (scatterSeries.meshSmooth === false) {
- text = "Use Flat for Series One";
- scatterSeries.meshSmooth = true;
- } else {
- text = "Use Smooth for Series One"
- scatterSeries.meshSmooth = false;
- }
+ }
+ //! [7]
+
+ Button {
+ id: smoothToggle
+ width: mainView.buttonWidth
+ anchors.left: shadowToggle.right
+ anchors.top: parent.top
+ anchors.margins: 5
+ text: "Use Smooth for Series One"
+ onClicked: {
+ if (!scatterSeries.meshSmooth) {
+ text = "Use Flat for Series One";
+ scatterSeries.meshSmooth = true;
+ } else {
+ text = "Use Smooth for Series One";
+ scatterSeries.meshSmooth = false;
}
}
+ }
- NewButton {
- id: cameraToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Change Camera Placement"
- onClicked: {
- if (scatterGraph.scene.activeCamera.cameraPreset === Camera3D.CameraPresetFront) {
- scatterGraph.scene.activeCamera.cameraPreset =
- Camera3D.CameraPresetIsometricRightHigh;
- } else {
- scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetFront;
- }
+ Button {
+ id: cameraToggle
+ width: mainView.buttonWidth
+ anchors.left: mainView.portraitMode ? parent.left : smoothToggle.right
+ anchors.top: mainView.portraitMode ? smoothToggle.bottom : parent.top
+ anchors.margins: 5
+ text: "Change Camera Placement"
+ onClicked: {
+ if (scatterGraph.scene.activeCamera.cameraPreset === Camera3D.CameraPresetFront) {
+ scatterGraph.scene.activeCamera.cameraPreset =
+ Camera3D.CameraPresetIsometricRightHigh;
+ } else {
+ scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetFront;
}
}
+ }
- NewButton {
- id: themeToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Change Theme"
- onClicked: {
- if (scatterGraph.theme.type === Theme3D.ThemeArmyBlue) {
- scatterGraph.theme = themeIsabelle
- } else {
- scatterGraph.theme = themeArmyBlue
- }
- if (scatterGraph.theme.backgroundEnabled === true) {
- backgroundToggle.text = "Hide Background";
- } else {
- backgroundToggle.text = "Show Background";
- }
- }
+ Button {
+ id: themeToggle
+ width: mainView.buttonWidth
+ anchors.left: cameraToggle.right
+ anchors.top: mainView.portraitMode ? smoothToggle.bottom : parent.top
+ anchors.margins: 5
+ text: "Change Theme"
+ onClicked: {
+ if (scatterGraph.theme.type === Theme3D.ThemeRetro)
+ scatterGraph.theme = themeQt;
+ else
+ scatterGraph.theme = themeRetro;
+ if (scatterGraph.theme.backgroundEnabled)
+ backgroundToggle.text = "Hide Background";
+ else
+ backgroundToggle.text = "Show Background";
}
+ }
- NewButton {
- id: backgroundToggle
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Hide Background"
- onClicked: {
- if (scatterGraph.theme.backgroundEnabled === true) {
- scatterGraph.theme.backgroundEnabled = false;
- text = "Show Background";
- } else {
- scatterGraph.theme.backgroundEnabled = true;
- text = "Hide Background";
- }
+ Button {
+ id: backgroundToggle
+ width: mainView.buttonWidth
+ anchors.left: mainView.portraitMode ? parent.left : themeToggle.right
+ anchors.top: mainView.portraitMode ? themeToggle.bottom : parent.top
+ anchors.margins: 5
+ text: "Hide Background"
+ onClicked: {
+ if (scatterGraph.theme.backgroundEnabled) {
+ scatterGraph.theme.backgroundEnabled = false;
+ text = "Show Background";
+ } else {
+ scatterGraph.theme.backgroundEnabled = true;
+ text = "Hide Background";
}
}
+ }
- NewButton {
- id: exitButton
- Layout.fillHeight: true
- Layout.fillWidth: true
- text: "Quit"
- onClicked: Qt.quit(0);
- }
+ Button {
+ id: exitButton
+ width: mainView.buttonWidth
+ anchors.left: backgroundToggle.right
+ anchors.top: mainView.portraitMode ? themeToggle.bottom : parent.top
+ anchors.margins: 5
+ text: "Quit"
+ onClicked: Qt.quit();
}
}
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.pro b/examples/datavisualization/qmlscatter/qmlscatter.pro
index b97ca7be..2ca00874 100644
--- a/examples/datavisualization/qmlscatter/qmlscatter.pro
+++ b/examples/datavisualization/qmlscatter/qmlscatter.pro
@@ -2,7 +2,6 @@
error( "Couldn't find the examples.pri file!" )
}
-# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp
RESOURCES += qmlscatter.qrc
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.qrc b/examples/datavisualization/qmlscatter/qmlscatter.qrc
index 225d78b0..f36c81c5 100644
--- a/examples/datavisualization/qmlscatter/qmlscatter.qrc
+++ b/examples/datavisualization/qmlscatter/qmlscatter.qrc
@@ -2,6 +2,5 @@
<qresource prefix="/">
<file>qml/qmlscatter/Data.qml</file>
<file>qml/qmlscatter/main.qml</file>
- <file>qml/qmlscatter/NewButton.qml</file>
</qresource>
</RCC>
diff --git a/examples/datavisualization/qmlspectrogram/doc/images/qmlspectrogram-example.png b/examples/datavisualization/qmlspectrogram/doc/images/qmlspectrogram-example.png
deleted file mode 100644
index de376cd9..00000000
--- a/examples/datavisualization/qmlspectrogram/doc/images/qmlspectrogram-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc b/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc
deleted file mode 100644
index a0c2ef62..00000000
--- a/examples/datavisualization/qmlspectrogram/doc/src/qmlspectrogram.qdoc
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlspectrogram
- \title Qt Quick 2 Spectrogram Example
- \ingroup qtdatavisualization_examples
- \brief Showing spectrogram graph in a QML application.
-
- The Qt Quick 2 Spectrogram example demonstrates how to show a polar and cartesian spectrograms
- and how to utilize orthographic projection to show them in 2D.
-
- \image qmlspectrogram-example.png
-
- Spectrogram is simply a surface graph with a range gradient used to emphasize the different
- values. Typically spectrograms are shown with two dimensional surfaces, which we simulate
- with a top down orthographic view of the graph. To enforce the 2D effect, we disable the
- graph rotation via mouse or touch when in the orthographic mode.
-
- The focus in this example is on showing how to display spectrograms, so the basic
- functionality is not explained. For more detailed QML example documentation,
- see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Creating a Spectrogram
-
- To create a 2D spectrogram, we define a Surface3D item:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 0
-
- The key properties for enabling the 2D effect are
- \l{AbstractGraph3D::orthoProjection}{orthoProjection} and
- \l{Camera3D::cameraPreset}{scene.activeCamera.cameraPreset}. We remove the perspective by
- enabling orthographic projection for the graph, and then we eliminate the Y-dimension by
- viewing the graph directly from above:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 1
-
- Since this viewpoint causes the horizontal axis grid to be mostly obscured by the surface,
- we also specify that the horizontal grid should be drawn on top of the graph:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 2
-
- \section1 Polar Spectrogram
-
- Depending on the data, it is sometimes more natural to use a polar graph instead of a cartesian
- one. Qt Data Visualization supports this via \l{AbstractGraph3D::polar}{polar} property.
- In this example we provide a button to switch between polar and cartesian modes:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 3
-
- In the polar mode, the X-axis is converted into the angular polar axis, and the Z-axis is
- converted into the radial polar axis. The surface points are recalculated according to new axes.
-
- The radial axis labels are drawn outside the graph by default, but in this example we want to
- draw them right next to the 0 degree angular axis inside the graph, so we define only a tiny
- offset for them:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 4
-
- To enforce the 2D effect, graph rotation via user input is disabled when in orthographic mode.
- We do this by specifying a new input handler:
-
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 5
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 7
- \dots 0
- \snippet qmlspectrogram/qml/qmlspectrogram/main.qml 6
- \dots 0
-
- When the projection mode changes, we adjust the value of the
- \l{InputHandler3D::rotationEnabled}{rotationEnabled} property of the \c{customInputHandler}
- to control the rotation.
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/qmlspectrogram/main.cpp b/examples/datavisualization/qmlspectrogram/main.cpp
deleted file mode 100644
index 6f93c1e2..00000000
--- a/examples/datavisualization/qmlspectrogram/main.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlApplicationEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQmlApplicationEngine engine;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- engine.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
- engine.load(QUrl(QStringLiteral("qrc:/qml/qml/qmlspectrogram/main.qml")));
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/NewButton.qml b/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml b/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml
deleted file mode 100644
index 23eb8312..00000000
--- a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/main.qml
+++ /dev/null
@@ -1,304 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtQuick.Window 2.1
-import QtDataVisualization 1.2
-import "."
-
-Window {
- id: mainview
- title: "Qt Quick 2 Spectrogram Example"
- visible: true
- width: 1024
- height: 768
- color: surfaceGraph.theme.windowColor
-
- Data {
- id: surfaceData
- }
-
- Item {
- id: surfaceView
- width: mainview.width
- height: mainview.height
- anchors.top: mainview.top
- anchors.left: mainview.left
-
- ColorGradient {
- id: surfaceGradient
- ColorGradientStop { position: 0.0; color: "black" }
- ColorGradientStop { position: 0.2; color: "red" }
- ColorGradientStop { position: 0.5; color: "blue" }
- ColorGradientStop { position: 0.8; color: "yellow" }
- ColorGradientStop { position: 1.0; color: "white" }
- }
-
- ValueAxis3D {
- id: xAxis
- segmentCount: 8
- labelFormat: "%i\u00B0"
- title: "Angle"
- titleVisible: true
- titleFixed: false
- }
-
- ValueAxis3D {
- id: yAxis
- segmentCount: 8
- labelFormat: "%i \%"
- title: "Value"
- titleVisible: true
- labelAutoRotation: 0
- titleFixed: false
- }
-
- ValueAxis3D {
- id: zAxis
- segmentCount: 5
- labelFormat: "%i nm"
- title: "Radius"
- titleVisible: true
- titleFixed: false
- }
-
- Theme3D {
- id: customTheme
- type: Theme3D.ThemeQt
- // Don't show specular spotlight as we don't want it to distort the colors
- lightStrength: 0.0
- ambientLightStrength: 1.0
- backgroundEnabled: false
- gridLineColor: "#AAAAAA"
- windowColor: "#EEEEEE"
- }
-
-
- //! [5]
- TouchInputHandler3D {
- id: customInputHandler
- rotationEnabled: false
- }
- //! [5]
-
- //! [0]
- //! [7]
- Surface3D {
- //! [7]
- id: surfaceGraph
- width: surfaceView.width
- height: surfaceView.height
-
- shadowQuality: AbstractGraph3D.ShadowQualityNone
- selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndColumn
- axisX: xAxis
- axisY: yAxis
- axisZ: zAxis
-
- theme: customTheme
- //! [6]
- inputHandler: customInputHandler
- //! [6]
-
- // Remove the perspective and view the graph from top down to achieve 2D effect
- //! [1]
- orthoProjection: true
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetDirectlyAbove
- //! [1]
-
- //! [2]
- flipHorizontalGrid: true
- //! [2]
-
- //! [4]
- radialLabelOffset: 0.01
- //! [4]
-
- horizontalAspectRatio: 1
- scene.activeCamera.zoomLevel: 85
-
- Surface3DSeries {
- id: surfaceSeries
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
- baseGradient: surfaceGradient
- colorStyle: Theme3D.ColorStyleRangeGradient
- itemLabelFormat: "(@xLabel, @zLabel): @yLabel"
-
- ItemModelSurfaceDataProxy {
- itemModel: surfaceData.model
- rowRole: "radius"
- columnRole: "angle"
- yPosRole: "value"
- }
- }
- }
- //! [0]
- }
-
- RowLayout {
- id: buttonLayout
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.right: parent.right
- opacity: 0.5
-
- //! [3]
- NewButton {
- id: polarToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Switch to polar"
- onClicked: {
- if (surfaceGraph.polar === false) {
- surfaceGraph.polar = true
- text = "Switch to cartesian"
- } else {
- surfaceGraph.polar = false
- text = "Switch to polar"
- }
- }
- }
- //! [3]
-
- NewButton {
- id: orthoToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Switch to perspective"
- onClicked: {
- if (surfaceGraph.orthoProjection === true) {
- surfaceGraph.orthoProjection = false;
- xAxis.labelAutoRotation = 30
- yAxis.labelAutoRotation = 30
- zAxis.labelAutoRotation = 30
- customInputHandler.rotationEnabled = true
- text = "Switch to orthographic"
- } else {
- surfaceGraph.orthoProjection = true;
- surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetDirectlyAbove
- surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
- xAxis.labelAutoRotation = 0
- yAxis.labelAutoRotation = 0
- zAxis.labelAutoRotation = 0
- customInputHandler.rotationEnabled = false
- text = "Switch to perspective"
- }
- }
- }
-
- NewButton {
- id: flipGridToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Toggle axis grid on top"
- onClicked: {
- onClicked: {
- if (surfaceGraph.flipHorizontalGrid === true) {
- surfaceGraph.flipHorizontalGrid = false;
- } else {
- surfaceGraph.flipHorizontalGrid = true;
- }
- }
- }
- }
-
- NewButton {
- id: labelOffsetToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Toggle radial label position"
- visible: surfaceGraph.polar
- onClicked: {
- if (surfaceGraph.radialLabelOffset >= 1.0) {
- surfaceGraph.radialLabelOffset = 0.01
- } else {
- surfaceGraph.radialLabelOffset = 1.0
- }
- }
- }
-
- NewButton {
- id: surfaceGridToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Toggle surface grid"
- visible: !surfaceGraph.orthoProjection
- onClicked: {
- if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
- surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
- } else {
- surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
- }
- }
- }
-
- }
-
- Rectangle {
- id: legend
- anchors.margins: 20
- anchors.bottom: parent.bottom
- anchors.top: buttonLayout.bottom
- anchors.right: parent.right
- border.color: "black"
- border.width: 1
- width: 50
- rotation: 180
- gradient: Gradient {
- GradientStop { position: 0.0; color: "black" }
- GradientStop { position: 0.2; color: "red" }
- GradientStop { position: 0.5; color: "blue" }
- GradientStop { position: 0.8; color: "yellow" }
- GradientStop { position: 1.0; color: "white" }
- }
- }
-
- Text {
- anchors.verticalCenter: legend.bottom
- anchors.right: legend.left
- anchors.margins: 2
- text: surfaceGraph.axisY.min + "%"
- }
-
- Text {
- anchors.verticalCenter: legend.verticalCenter
- anchors.right: legend.left
- anchors.margins: 2
- text: (surfaceGraph.axisY.max + surfaceGraph.axisY.min) / 2 + "%"
- }
-
- Text {
- anchors.verticalCenter: legend.top
- anchors.right: legend.left
- anchors.margins: 2
- text: surfaceGraph.axisY.max + "%"
- }
-}
diff --git a/examples/datavisualization/qmlspectrogram/qmlspectrogram.pro b/examples/datavisualization/qmlspectrogram/qmlspectrogram.pro
deleted file mode 100644
index 655fb0b8..00000000
--- a/examples/datavisualization/qmlspectrogram/qmlspectrogram.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmlspectrogram.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlspectrogram/*
diff --git a/examples/datavisualization/qmlspectrogram/qmlspectrogram.qrc b/examples/datavisualization/qmlspectrogram/qmlspectrogram.qrc
deleted file mode 100644
index 9f024404..00000000
--- a/examples/datavisualization/qmlspectrogram/qmlspectrogram.qrc
+++ /dev/null
@@ -1,7 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file>qml/qmlspectrogram/Data.qml</file>
- <file>qml/qmlspectrogram/main.qml</file>
- <file>qml/qmlspectrogram/NewButton.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png b/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
deleted file mode 100644
index 5e37b42c..00000000
--- a/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc b/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
deleted file mode 100644
index e8073cff..00000000
--- a/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlsurface
- \title Qt Quick 2 Surface Example
- \ingroup qtdatavisualization_examples
- \brief Using Surface3D in a QML application.
-
- The Qt Quick 2 surface example shows how to make a simple 3D surface plot using Surface3D with
- Qt Quick 2.
-
- \image qmlsurface-example.png
-
- The focus in this example is on generating a surface graph from height data, so in this section
- we skip explaining the application creation. For more detailed QML example documentation,
- see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Adding Data to the Graph
-
- This example shows two methods to set data to surface graph, using the HeightMapSurfaceDataProxy
- and ItemModelSurfaceDataProxy. First we go through setting the data using the height map specific
- data proxy. It is done with the code snippet below. The proxy itself is contained in a
- Surface3DSeries. Inside the HeightMapSurfaceDataProxy the \c heightMapFile specifies the
- image file containing the height data. The value properties in the proxy define the minimum
- and maximum values for surface area width and depth. This example shows the terrain around Tycho
- crater at imaginary position from 67 to 97 and from 30 to 60. Note that on the graph the scale
- on the Y dimension exaggerates the height.
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 4
-
- The other method to set surface data used in this example is with model mapping. We do that by
- first defining a \c ListModel containing the data for the surface:
-
- \snippet qmlsurface/qml/qmlsurface/Data.qml 0
- \dots 4
-
- Then we set up a Surface3DSeries with a ItemModelSurfaceDataProxy:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 5
- \dots
-
- We add the actual data to the \c itemModel of the ItemModelSurfaceDataProxy. We also define the
- roles for columns, rows and values. In this example the row holds values for longitude, column
- for latitude and the value is for height.
-
- \dots 0
- \snippet qmlsurface/qml/qmlsurface/main.qml 6
-
- \section1 Showing Data
-
- In the \c main.qml, we set up the Surface3D element to show the data and various UI elements
- to illustrate few interesting features.
-
- First is the gradient to be used for the surface, which can be defined as seen in the following
- snippet. With the ColorGradient we set example colors from position 0.0 to 1.0.
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 0
-
- This element is set into the \c baseGradients property in the \c theme used in Surface3D:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 7
-
- Other interesting features can be controlled with buttons.
-
- The first button is to toggle on and off the surface grid, for which we use the following code:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 1
-
- Second button is for surface shading mode, which is controlled with this code:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 2
-
- Third button is for series visibility, which is controlled with this code:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 8
-
- Notice that the \c drawMode and \c flatShadingEnable properties are set for both series.
-
- Fourth and fifth buttons are for controlling background features.
-
- The last button is for switching between the two series, one of which uses
- HeightMapSurfaceDataProxy and the other one ItemModelSurfaceDataProxy. For this we use the
- following code:
-
- \snippet qmlsurface/qml/qmlsurface/main.qml 3
-
- We also set the maximum value to 500 in model proxy to make the surface flatter and
- 250 on height map proxy to show exaggerated height. At the same time the middle color position
- on the gradient is modified to match the value range change.
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/qmlsurface/heightmap.png b/examples/datavisualization/qmlsurface/heightmap.png
deleted file mode 100644
index 051a0125..00000000
--- a/examples/datavisualization/qmlsurface/heightmap.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurface/main.cpp b/examples/datavisualization/qmlsurface/main.cpp
deleted file mode 100644
index 40df60f0..00000000
--- a/examples/datavisualization/qmlsurface/main.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
-
- viewer.setSource(QUrl("qrc:/qml/qml/qmlsurface/main.qml"));
-
- viewer.setTitle(QStringLiteral("Tycho crater on the Moon (height exaggerated)"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
deleted file mode 100644
index 062db602..00000000
--- a/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
+++ /dev/null
@@ -1,10040 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-
-Item {
- property alias model: dataModel
-
- //! [0]
- ListModel {
- id: dataModel
- ListElement{ longitude: "0"; latitude: "0"; height: "124"; }
- ListElement{ longitude: "0"; latitude: "1"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "2"; height: "124"; }
- //! [0]
- ListElement{ longitude: "0"; latitude: "3"; height: "118"; }
- ListElement{ longitude: "0"; latitude: "4"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "5"; height: "111"; }
- ListElement{ longitude: "0"; latitude: "6"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "7"; height: "102"; }
- ListElement{ longitude: "0"; latitude: "8"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "9"; height: "126"; }
- ListElement{ longitude: "0"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "0"; latitude: "11"; height: "127"; }
- ListElement{ longitude: "0"; latitude: "12"; height: "124"; }
- ListElement{ longitude: "0"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "0"; latitude: "14"; height: "117"; }
- ListElement{ longitude: "0"; latitude: "15"; height: "116"; }
- ListElement{ longitude: "0"; latitude: "16"; height: "114"; }
- ListElement{ longitude: "0"; latitude: "17"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "18"; height: "114"; }
- ListElement{ longitude: "0"; latitude: "19"; height: "114"; }
- ListElement{ longitude: "0"; latitude: "20"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "21"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "22"; height: "116"; }
- ListElement{ longitude: "0"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "0"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "0"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "0"; latitude: "26"; height: "117"; }
- ListElement{ longitude: "0"; latitude: "27"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "28"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "29"; height: "109"; }
- ListElement{ longitude: "0"; latitude: "30"; height: "108"; }
- ListElement{ longitude: "0"; latitude: "31"; height: "105"; }
- ListElement{ longitude: "0"; latitude: "32"; height: "105"; }
- ListElement{ longitude: "0"; latitude: "33"; height: "104"; }
- ListElement{ longitude: "0"; latitude: "34"; height: "105"; }
- ListElement{ longitude: "0"; latitude: "35"; height: "107"; }
- ListElement{ longitude: "0"; latitude: "36"; height: "110"; }
- ListElement{ longitude: "0"; latitude: "37"; height: "114"; }
- ListElement{ longitude: "0"; latitude: "38"; height: "117"; }
- ListElement{ longitude: "0"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "0"; latitude: "40"; height: "121"; }
- ListElement{ longitude: "0"; latitude: "41"; height: "123"; }
- ListElement{ longitude: "0"; latitude: "42"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "0"; latitude: "44"; height: "119"; }
- ListElement{ longitude: "0"; latitude: "45"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "46"; height: "114"; }
- ListElement{ longitude: "0"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "0"; latitude: "48"; height: "131"; }
- ListElement{ longitude: "0"; latitude: "49"; height: "130"; }
- ListElement{ longitude: "0"; latitude: "50"; height: "128"; }
- ListElement{ longitude: "0"; latitude: "51"; height: "124"; }
- ListElement{ longitude: "0"; latitude: "52"; height: "121"; }
- ListElement{ longitude: "0"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "0"; latitude: "54"; height: "118"; }
- ListElement{ longitude: "0"; latitude: "55"; height: "116"; }
- ListElement{ longitude: "0"; latitude: "56"; height: "116"; }
- ListElement{ longitude: "0"; latitude: "57"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "58"; height: "112"; }
- ListElement{ longitude: "0"; latitude: "59"; height: "110"; }
- ListElement{ longitude: "0"; latitude: "60"; height: "109"; }
- ListElement{ longitude: "0"; latitude: "61"; height: "107"; }
- ListElement{ longitude: "0"; latitude: "62"; height: "107"; }
- ListElement{ longitude: "0"; latitude: "63"; height: "108"; }
- ListElement{ longitude: "0"; latitude: "64"; height: "110"; }
- ListElement{ longitude: "0"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "0"; latitude: "66"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "0"; latitude: "68"; height: "119"; }
- ListElement{ longitude: "0"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "0"; latitude: "70"; height: "122"; }
- ListElement{ longitude: "0"; latitude: "71"; height: "124"; }
- ListElement{ longitude: "0"; latitude: "72"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "73"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "74"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "75"; height: "123"; }
- ListElement{ longitude: "0"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "0"; latitude: "77"; height: "122"; }
- ListElement{ longitude: "0"; latitude: "78"; height: "125"; }
- ListElement{ longitude: "0"; latitude: "79"; height: "129"; }
- ListElement{ longitude: "0"; latitude: "80"; height: "135"; }
- ListElement{ longitude: "0"; latitude: "81"; height: "138"; }
- ListElement{ longitude: "0"; latitude: "82"; height: "136"; }
- ListElement{ longitude: "0"; latitude: "83"; height: "129"; }
- ListElement{ longitude: "0"; latitude: "84"; height: "121"; }
- ListElement{ longitude: "0"; latitude: "85"; height: "116"; }
- ListElement{ longitude: "0"; latitude: "86"; height: "115"; }
- ListElement{ longitude: "0"; latitude: "87"; height: "118"; }
- ListElement{ longitude: "0"; latitude: "88"; height: "122"; }
- ListElement{ longitude: "0"; latitude: "89"; height: "127"; }
- ListElement{ longitude: "0"; latitude: "90"; height: "129"; }
- ListElement{ longitude: "0"; latitude: "91"; height: "130"; }
- ListElement{ longitude: "0"; latitude: "92"; height: "130"; }
- ListElement{ longitude: "0"; latitude: "93"; height: "128"; }
- ListElement{ longitude: "0"; latitude: "94"; height: "128"; }
- ListElement{ longitude: "0"; latitude: "95"; height: "129"; }
- ListElement{ longitude: "0"; latitude: "96"; height: "133"; }
- ListElement{ longitude: "0"; latitude: "97"; height: "138"; }
- ListElement{ longitude: "0"; latitude: "98"; height: "139"; }
- ListElement{ longitude: "0"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "2"; height: "118"; }
- ListElement{ longitude: "1"; latitude: "3"; height: "110"; }
- ListElement{ longitude: "1"; latitude: "4"; height: "105"; }
- ListElement{ longitude: "1"; latitude: "5"; height: "110"; }
- ListElement{ longitude: "1"; latitude: "6"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "7"; height: "117"; }
- ListElement{ longitude: "1"; latitude: "8"; height: "123"; }
- ListElement{ longitude: "1"; latitude: "9"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "10"; height: "131"; }
- ListElement{ longitude: "1"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "1"; latitude: "12"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "1"; latitude: "14"; height: "119"; }
- ListElement{ longitude: "1"; latitude: "15"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "16"; height: "113"; }
- ListElement{ longitude: "1"; latitude: "17"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "18"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "19"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "20"; height: "107"; }
- ListElement{ longitude: "1"; latitude: "21"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "22"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "23"; height: "114"; }
- ListElement{ longitude: "1"; latitude: "24"; height: "117"; }
- ListElement{ longitude: "1"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "1"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "27"; height: "118"; }
- ListElement{ longitude: "1"; latitude: "28"; height: "115"; }
- ListElement{ longitude: "1"; latitude: "29"; height: "112"; }
- ListElement{ longitude: "1"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "1"; latitude: "31"; height: "104"; }
- ListElement{ longitude: "1"; latitude: "32"; height: "104"; }
- ListElement{ longitude: "1"; latitude: "33"; height: "103"; }
- ListElement{ longitude: "1"; latitude: "34"; height: "101"; }
- ListElement{ longitude: "1"; latitude: "35"; height: "105"; }
- ListElement{ longitude: "1"; latitude: "36"; height: "108"; }
- ListElement{ longitude: "1"; latitude: "37"; height: "113"; }
- ListElement{ longitude: "1"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "39"; height: "117"; }
- ListElement{ longitude: "1"; latitude: "40"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "1"; latitude: "42"; height: "121"; }
- ListElement{ longitude: "1"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "1"; latitude: "46"; height: "130"; }
- ListElement{ longitude: "1"; latitude: "47"; height: "133"; }
- ListElement{ longitude: "1"; latitude: "48"; height: "134"; }
- ListElement{ longitude: "1"; latitude: "49"; height: "133"; }
- ListElement{ longitude: "1"; latitude: "50"; height: "133"; }
- ListElement{ longitude: "1"; latitude: "51"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "52"; height: "125"; }
- ListElement{ longitude: "1"; latitude: "53"; height: "122"; }
- ListElement{ longitude: "1"; latitude: "54"; height: "118"; }
- ListElement{ longitude: "1"; latitude: "55"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "56"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "57"; height: "117"; }
- ListElement{ longitude: "1"; latitude: "58"; height: "114"; }
- ListElement{ longitude: "1"; latitude: "59"; height: "113"; }
- ListElement{ longitude: "1"; latitude: "60"; height: "109"; }
- ListElement{ longitude: "1"; latitude: "61"; height: "106"; }
- ListElement{ longitude: "1"; latitude: "62"; height: "103"; }
- ListElement{ longitude: "1"; latitude: "63"; height: "105"; }
- ListElement{ longitude: "1"; latitude: "64"; height: "105"; }
- ListElement{ longitude: "1"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "1"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "1"; latitude: "67"; height: "114"; }
- ListElement{ longitude: "1"; latitude: "68"; height: "117"; }
- ListElement{ longitude: "1"; latitude: "69"; height: "119"; }
- ListElement{ longitude: "1"; latitude: "70"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "71"; height: "122"; }
- ListElement{ longitude: "1"; latitude: "72"; height: "123"; }
- ListElement{ longitude: "1"; latitude: "73"; height: "125"; }
- ListElement{ longitude: "1"; latitude: "74"; height: "124"; }
- ListElement{ longitude: "1"; latitude: "75"; height: "123"; }
- ListElement{ longitude: "1"; latitude: "76"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "77"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "78"; height: "122"; }
- ListElement{ longitude: "1"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "1"; latitude: "80"; height: "135"; }
- ListElement{ longitude: "1"; latitude: "81"; height: "140"; }
- ListElement{ longitude: "1"; latitude: "82"; height: "137"; }
- ListElement{ longitude: "1"; latitude: "83"; height: "132"; }
- ListElement{ longitude: "1"; latitude: "84"; height: "124"; }
- ListElement{ longitude: "1"; latitude: "85"; height: "116"; }
- ListElement{ longitude: "1"; latitude: "86"; height: "115"; }
- ListElement{ longitude: "1"; latitude: "87"; height: "120"; }
- ListElement{ longitude: "1"; latitude: "88"; height: "125"; }
- ListElement{ longitude: "1"; latitude: "89"; height: "131"; }
- ListElement{ longitude: "1"; latitude: "90"; height: "134"; }
- ListElement{ longitude: "1"; latitude: "91"; height: "136"; }
- ListElement{ longitude: "1"; latitude: "92"; height: "134"; }
- ListElement{ longitude: "1"; latitude: "93"; height: "131"; }
- ListElement{ longitude: "1"; latitude: "94"; height: "130"; }
- ListElement{ longitude: "1"; latitude: "95"; height: "130"; }
- ListElement{ longitude: "1"; latitude: "96"; height: "133"; }
- ListElement{ longitude: "1"; latitude: "97"; height: "139"; }
- ListElement{ longitude: "1"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "1"; latitude: "99"; height: "124"; }
- ListElement{ longitude: "2"; latitude: "0"; height: "116"; }
- ListElement{ longitude: "2"; latitude: "1"; height: "116"; }
- ListElement{ longitude: "2"; latitude: "2"; height: "111"; }
- ListElement{ longitude: "2"; latitude: "3"; height: "105"; }
- ListElement{ longitude: "2"; latitude: "4"; height: "108"; }
- ListElement{ longitude: "2"; latitude: "5"; height: "110"; }
- ListElement{ longitude: "2"; latitude: "6"; height: "114"; }
- ListElement{ longitude: "2"; latitude: "7"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "8"; height: "124"; }
- ListElement{ longitude: "2"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "2"; latitude: "10"; height: "131"; }
- ListElement{ longitude: "2"; latitude: "11"; height: "134"; }
- ListElement{ longitude: "2"; latitude: "12"; height: "133"; }
- ListElement{ longitude: "2"; latitude: "13"; height: "128"; }
- ListElement{ longitude: "2"; latitude: "14"; height: "125"; }
- ListElement{ longitude: "2"; latitude: "15"; height: "119"; }
- ListElement{ longitude: "2"; latitude: "16"; height: "115"; }
- ListElement{ longitude: "2"; latitude: "17"; height: "111"; }
- ListElement{ longitude: "2"; latitude: "18"; height: "105"; }
- ListElement{ longitude: "2"; latitude: "19"; height: "102"; }
- ListElement{ longitude: "2"; latitude: "20"; height: "99"; }
- ListElement{ longitude: "2"; latitude: "21"; height: "102"; }
- ListElement{ longitude: "2"; latitude: "22"; height: "106"; }
- ListElement{ longitude: "2"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "2"; latitude: "24"; height: "115"; }
- ListElement{ longitude: "2"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "2"; latitude: "26"; height: "122"; }
- ListElement{ longitude: "2"; latitude: "27"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "28"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "29"; height: "115"; }
- ListElement{ longitude: "2"; latitude: "30"; height: "111"; }
- ListElement{ longitude: "2"; latitude: "31"; height: "79"; }
- ListElement{ longitude: "2"; latitude: "32"; height: "94"; }
- ListElement{ longitude: "2"; latitude: "33"; height: "103"; }
- ListElement{ longitude: "2"; latitude: "34"; height: "102"; }
- ListElement{ longitude: "2"; latitude: "35"; height: "103"; }
- ListElement{ longitude: "2"; latitude: "36"; height: "107"; }
- ListElement{ longitude: "2"; latitude: "37"; height: "113"; }
- ListElement{ longitude: "2"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "2"; latitude: "39"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "40"; height: "117"; }
- ListElement{ longitude: "2"; latitude: "41"; height: "119"; }
- ListElement{ longitude: "2"; latitude: "42"; height: "119"; }
- ListElement{ longitude: "2"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "2"; latitude: "46"; height: "131"; }
- ListElement{ longitude: "2"; latitude: "47"; height: "132"; }
- ListElement{ longitude: "2"; latitude: "48"; height: "132"; }
- ListElement{ longitude: "2"; latitude: "49"; height: "135"; }
- ListElement{ longitude: "2"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "2"; latitude: "51"; height: "130"; }
- ListElement{ longitude: "2"; latitude: "52"; height: "128"; }
- ListElement{ longitude: "2"; latitude: "53"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "2"; latitude: "55"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "56"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "58"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "59"; height: "120"; }
- ListElement{ longitude: "2"; latitude: "60"; height: "114"; }
- ListElement{ longitude: "2"; latitude: "61"; height: "107"; }
- ListElement{ longitude: "2"; latitude: "62"; height: "103"; }
- ListElement{ longitude: "2"; latitude: "63"; height: "103"; }
- ListElement{ longitude: "2"; latitude: "64"; height: "106"; }
- ListElement{ longitude: "2"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "2"; latitude: "66"; height: "109"; }
- ListElement{ longitude: "2"; latitude: "67"; height: "114"; }
- ListElement{ longitude: "2"; latitude: "68"; height: "117"; }
- ListElement{ longitude: "2"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "70"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "71"; height: "122"; }
- ListElement{ longitude: "2"; latitude: "72"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "73"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "2"; latitude: "75"; height: "123"; }
- ListElement{ longitude: "2"; latitude: "76"; height: "120"; }
- ListElement{ longitude: "2"; latitude: "77"; height: "118"; }
- ListElement{ longitude: "2"; latitude: "78"; height: "119"; }
- ListElement{ longitude: "2"; latitude: "79"; height: "125"; }
- ListElement{ longitude: "2"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "2"; latitude: "81"; height: "138"; }
- ListElement{ longitude: "2"; latitude: "82"; height: "138"; }
- ListElement{ longitude: "2"; latitude: "83"; height: "131"; }
- ListElement{ longitude: "2"; latitude: "84"; height: "125"; }
- ListElement{ longitude: "2"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "2"; latitude: "86"; height: "121"; }
- ListElement{ longitude: "2"; latitude: "87"; height: "133"; }
- ListElement{ longitude: "2"; latitude: "88"; height: "132"; }
- ListElement{ longitude: "2"; latitude: "89"; height: "135"; }
- ListElement{ longitude: "2"; latitude: "90"; height: "138"; }
- ListElement{ longitude: "2"; latitude: "91"; height: "137"; }
- ListElement{ longitude: "2"; latitude: "92"; height: "137"; }
- ListElement{ longitude: "2"; latitude: "93"; height: "134"; }
- ListElement{ longitude: "2"; latitude: "94"; height: "133"; }
- ListElement{ longitude: "2"; latitude: "95"; height: "133"; }
- ListElement{ longitude: "2"; latitude: "96"; height: "133"; }
- ListElement{ longitude: "2"; latitude: "97"; height: "140"; }
- ListElement{ longitude: "2"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "2"; latitude: "99"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "0"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "1"; height: "111"; }
- ListElement{ longitude: "3"; latitude: "2"; height: "108"; }
- ListElement{ longitude: "3"; latitude: "3"; height: "107"; }
- ListElement{ longitude: "3"; latitude: "4"; height: "108"; }
- ListElement{ longitude: "3"; latitude: "5"; height: "111"; }
- ListElement{ longitude: "3"; latitude: "6"; height: "117"; }
- ListElement{ longitude: "3"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "3"; latitude: "8"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "3"; latitude: "10"; height: "133"; }
- ListElement{ longitude: "3"; latitude: "11"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "12"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "13"; height: "132"; }
- ListElement{ longitude: "3"; latitude: "14"; height: "129"; }
- ListElement{ longitude: "3"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "3"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "3"; latitude: "17"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "3"; latitude: "19"; height: "101"; }
- ListElement{ longitude: "3"; latitude: "20"; height: "99"; }
- ListElement{ longitude: "3"; latitude: "21"; height: "98"; }
- ListElement{ longitude: "3"; latitude: "22"; height: "103"; }
- ListElement{ longitude: "3"; latitude: "23"; height: "109"; }
- ListElement{ longitude: "3"; latitude: "24"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "26"; height: "126"; }
- ListElement{ longitude: "3"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "3"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "3"; latitude: "29"; height: "117"; }
- ListElement{ longitude: "3"; latitude: "30"; height: "116"; }
- ListElement{ longitude: "3"; latitude: "31"; height: "106"; }
- ListElement{ longitude: "3"; latitude: "32"; height: "105"; }
- ListElement{ longitude: "3"; latitude: "33"; height: "100"; }
- ListElement{ longitude: "3"; latitude: "34"; height: "99"; }
- ListElement{ longitude: "3"; latitude: "35"; height: "103"; }
- ListElement{ longitude: "3"; latitude: "36"; height: "106"; }
- ListElement{ longitude: "3"; latitude: "37"; height: "114"; }
- ListElement{ longitude: "3"; latitude: "38"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "39"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "40"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "41"; height: "116"; }
- ListElement{ longitude: "3"; latitude: "42"; height: "117"; }
- ListElement{ longitude: "3"; latitude: "43"; height: "119"; }
- ListElement{ longitude: "3"; latitude: "44"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "3"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "3"; latitude: "47"; height: "128"; }
- ListElement{ longitude: "3"; latitude: "48"; height: "135"; }
- ListElement{ longitude: "3"; latitude: "49"; height: "139"; }
- ListElement{ longitude: "3"; latitude: "50"; height: "139"; }
- ListElement{ longitude: "3"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "3"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "3"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "3"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "57"; height: "128"; }
- ListElement{ longitude: "3"; latitude: "58"; height: "98"; }
- ListElement{ longitude: "3"; latitude: "59"; height: "78"; }
- ListElement{ longitude: "3"; latitude: "60"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "61"; height: "112"; }
- ListElement{ longitude: "3"; latitude: "62"; height: "108"; }
- ListElement{ longitude: "3"; latitude: "63"; height: "106"; }
- ListElement{ longitude: "3"; latitude: "64"; height: "105"; }
- ListElement{ longitude: "3"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "3"; latitude: "66"; height: "111"; }
- ListElement{ longitude: "3"; latitude: "67"; height: "115"; }
- ListElement{ longitude: "3"; latitude: "68"; height: "120"; }
- ListElement{ longitude: "3"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "70"; height: "123"; }
- ListElement{ longitude: "3"; latitude: "71"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "72"; height: "126"; }
- ListElement{ longitude: "3"; latitude: "73"; height: "127"; }
- ListElement{ longitude: "3"; latitude: "74"; height: "126"; }
- ListElement{ longitude: "3"; latitude: "75"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "76"; height: "121"; }
- ListElement{ longitude: "3"; latitude: "77"; height: "117"; }
- ListElement{ longitude: "3"; latitude: "78"; height: "113"; }
- ListElement{ longitude: "3"; latitude: "79"; height: "119"; }
- ListElement{ longitude: "3"; latitude: "80"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "81"; height: "130"; }
- ListElement{ longitude: "3"; latitude: "82"; height: "133"; }
- ListElement{ longitude: "3"; latitude: "83"; height: "131"; }
- ListElement{ longitude: "3"; latitude: "84"; height: "124"; }
- ListElement{ longitude: "3"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "3"; latitude: "86"; height: "66"; }
- ListElement{ longitude: "3"; latitude: "87"; height: "109"; }
- ListElement{ longitude: "3"; latitude: "88"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "89"; height: "142"; }
- ListElement{ longitude: "3"; latitude: "90"; height: "144"; }
- ListElement{ longitude: "3"; latitude: "91"; height: "144"; }
- ListElement{ longitude: "3"; latitude: "92"; height: "141"; }
- ListElement{ longitude: "3"; latitude: "93"; height: "137"; }
- ListElement{ longitude: "3"; latitude: "94"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "95"; height: "136"; }
- ListElement{ longitude: "3"; latitude: "96"; height: "139"; }
- ListElement{ longitude: "3"; latitude: "97"; height: "142"; }
- ListElement{ longitude: "3"; latitude: "98"; height: "142"; }
- ListElement{ longitude: "3"; latitude: "99"; height: "120"; }
- ListElement{ longitude: "4"; latitude: "0"; height: "112"; }
- ListElement{ longitude: "4"; latitude: "1"; height: "107"; }
- ListElement{ longitude: "4"; latitude: "2"; height: "107"; }
- ListElement{ longitude: "4"; latitude: "3"; height: "106"; }
- ListElement{ longitude: "4"; latitude: "4"; height: "110"; }
- ListElement{ longitude: "4"; latitude: "5"; height: "113"; }
- ListElement{ longitude: "4"; latitude: "6"; height: "117"; }
- ListElement{ longitude: "4"; latitude: "7"; height: "122"; }
- ListElement{ longitude: "4"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "9"; height: "131"; }
- ListElement{ longitude: "4"; latitude: "10"; height: "134"; }
- ListElement{ longitude: "4"; latitude: "11"; height: "135"; }
- ListElement{ longitude: "4"; latitude: "12"; height: "135"; }
- ListElement{ longitude: "4"; latitude: "13"; height: "135"; }
- ListElement{ longitude: "4"; latitude: "14"; height: "133"; }
- ListElement{ longitude: "4"; latitude: "15"; height: "131"; }
- ListElement{ longitude: "4"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "4"; latitude: "17"; height: "119"; }
- ListElement{ longitude: "4"; latitude: "18"; height: "111"; }
- ListElement{ longitude: "4"; latitude: "19"; height: "107"; }
- ListElement{ longitude: "4"; latitude: "20"; height: "100"; }
- ListElement{ longitude: "4"; latitude: "21"; height: "102"; }
- ListElement{ longitude: "4"; latitude: "22"; height: "103"; }
- ListElement{ longitude: "4"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "4"; latitude: "24"; height: "115"; }
- ListElement{ longitude: "4"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "4"; latitude: "26"; height: "126"; }
- ListElement{ longitude: "4"; latitude: "27"; height: "131"; }
- ListElement{ longitude: "4"; latitude: "28"; height: "108"; }
- ListElement{ longitude: "4"; latitude: "29"; height: "103"; }
- ListElement{ longitude: "4"; latitude: "30"; height: "117"; }
- ListElement{ longitude: "4"; latitude: "31"; height: "114"; }
- ListElement{ longitude: "4"; latitude: "32"; height: "105"; }
- ListElement{ longitude: "4"; latitude: "33"; height: "101"; }
- ListElement{ longitude: "4"; latitude: "34"; height: "101"; }
- ListElement{ longitude: "4"; latitude: "35"; height: "103"; }
- ListElement{ longitude: "4"; latitude: "36"; height: "108"; }
- ListElement{ longitude: "4"; latitude: "37"; height: "112"; }
- ListElement{ longitude: "4"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "4"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "40"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "41"; height: "117"; }
- ListElement{ longitude: "4"; latitude: "42"; height: "117"; }
- ListElement{ longitude: "4"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "4"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "4"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "4"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "4"; latitude: "47"; height: "130"; }
- ListElement{ longitude: "4"; latitude: "48"; height: "137"; }
- ListElement{ longitude: "4"; latitude: "49"; height: "147"; }
- ListElement{ longitude: "4"; latitude: "50"; height: "143"; }
- ListElement{ longitude: "4"; latitude: "51"; height: "143"; }
- ListElement{ longitude: "4"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "4"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "4"; latitude: "54"; height: "123"; }
- ListElement{ longitude: "4"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "4"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "4"; latitude: "57"; height: "132"; }
- ListElement{ longitude: "4"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "4"; latitude: "59"; height: "120"; }
- ListElement{ longitude: "4"; latitude: "60"; height: "123"; }
- ListElement{ longitude: "4"; latitude: "61"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "62"; height: "111"; }
- ListElement{ longitude: "4"; latitude: "63"; height: "109"; }
- ListElement{ longitude: "4"; latitude: "64"; height: "107"; }
- ListElement{ longitude: "4"; latitude: "65"; height: "110"; }
- ListElement{ longitude: "4"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "4"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "4"; latitude: "68"; height: "123"; }
- ListElement{ longitude: "4"; latitude: "69"; height: "126"; }
- ListElement{ longitude: "4"; latitude: "70"; height: "127"; }
- ListElement{ longitude: "4"; latitude: "71"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "72"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "73"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "74"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "75"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "76"; height: "130"; }
- ListElement{ longitude: "4"; latitude: "77"; height: "116"; }
- ListElement{ longitude: "4"; latitude: "78"; height: "112"; }
- ListElement{ longitude: "4"; latitude: "79"; height: "115"; }
- ListElement{ longitude: "4"; latitude: "80"; height: "120"; }
- ListElement{ longitude: "4"; latitude: "81"; height: "126"; }
- ListElement{ longitude: "4"; latitude: "82"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "83"; height: "126"; }
- ListElement{ longitude: "4"; latitude: "84"; height: "124"; }
- ListElement{ longitude: "4"; latitude: "85"; height: "128"; }
- ListElement{ longitude: "4"; latitude: "86"; height: "121"; }
- ListElement{ longitude: "4"; latitude: "87"; height: "132"; }
- ListElement{ longitude: "4"; latitude: "88"; height: "141"; }
- ListElement{ longitude: "4"; latitude: "89"; height: "147"; }
- ListElement{ longitude: "4"; latitude: "90"; height: "148"; }
- ListElement{ longitude: "4"; latitude: "91"; height: "147"; }
- ListElement{ longitude: "4"; latitude: "92"; height: "144"; }
- ListElement{ longitude: "4"; latitude: "93"; height: "141"; }
- ListElement{ longitude: "4"; latitude: "94"; height: "138"; }
- ListElement{ longitude: "4"; latitude: "95"; height: "138"; }
- ListElement{ longitude: "4"; latitude: "96"; height: "141"; }
- ListElement{ longitude: "4"; latitude: "97"; height: "145"; }
- ListElement{ longitude: "4"; latitude: "98"; height: "143"; }
- ListElement{ longitude: "4"; latitude: "99"; height: "121"; }
- ListElement{ longitude: "5"; latitude: "0"; height: "112"; }
- ListElement{ longitude: "5"; latitude: "1"; height: "109"; }
- ListElement{ longitude: "5"; latitude: "2"; height: "108"; }
- ListElement{ longitude: "5"; latitude: "3"; height: "107"; }
- ListElement{ longitude: "5"; latitude: "4"; height: "112"; }
- ListElement{ longitude: "5"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "6"; height: "122"; }
- ListElement{ longitude: "5"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "5"; latitude: "8"; height: "130"; }
- ListElement{ longitude: "5"; latitude: "9"; height: "133"; }
- ListElement{ longitude: "5"; latitude: "10"; height: "135"; }
- ListElement{ longitude: "5"; latitude: "11"; height: "136"; }
- ListElement{ longitude: "5"; latitude: "12"; height: "137"; }
- ListElement{ longitude: "5"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "5"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "5"; latitude: "15"; height: "134"; }
- ListElement{ longitude: "5"; latitude: "16"; height: "129"; }
- ListElement{ longitude: "5"; latitude: "17"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "18"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "19"; height: "108"; }
- ListElement{ longitude: "5"; latitude: "20"; height: "102"; }
- ListElement{ longitude: "5"; latitude: "21"; height: "102"; }
- ListElement{ longitude: "5"; latitude: "22"; height: "105"; }
- ListElement{ longitude: "5"; latitude: "23"; height: "113"; }
- ListElement{ longitude: "5"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "5"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "26"; height: "130"; }
- ListElement{ longitude: "5"; latitude: "27"; height: "133"; }
- ListElement{ longitude: "5"; latitude: "28"; height: "129"; }
- ListElement{ longitude: "5"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "30"; height: "66"; }
- ListElement{ longitude: "5"; latitude: "31"; height: "102"; }
- ListElement{ longitude: "5"; latitude: "32"; height: "106"; }
- ListElement{ longitude: "5"; latitude: "33"; height: "100"; }
- ListElement{ longitude: "5"; latitude: "34"; height: "100"; }
- ListElement{ longitude: "5"; latitude: "35"; height: "104"; }
- ListElement{ longitude: "5"; latitude: "36"; height: "107"; }
- ListElement{ longitude: "5"; latitude: "37"; height: "110"; }
- ListElement{ longitude: "5"; latitude: "38"; height: "112"; }
- ListElement{ longitude: "5"; latitude: "39"; height: "113"; }
- ListElement{ longitude: "5"; latitude: "40"; height: "114"; }
- ListElement{ longitude: "5"; latitude: "41"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "42"; height: "118"; }
- ListElement{ longitude: "5"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "5"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "47"; height: "130"; }
- ListElement{ longitude: "5"; latitude: "48"; height: "137"; }
- ListElement{ longitude: "5"; latitude: "49"; height: "139"; }
- ListElement{ longitude: "5"; latitude: "50"; height: "77"; }
- ListElement{ longitude: "5"; latitude: "51"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "5"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "5"; latitude: "54"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "56"; height: "124"; }
- ListElement{ longitude: "5"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "58"; height: "129"; }
- ListElement{ longitude: "5"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "5"; latitude: "60"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "5"; latitude: "62"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "63"; height: "113"; }
- ListElement{ longitude: "5"; latitude: "64"; height: "110"; }
- ListElement{ longitude: "5"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "5"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "67"; height: "121"; }
- ListElement{ longitude: "5"; latitude: "68"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "69"; height: "130"; }
- ListElement{ longitude: "5"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "5"; latitude: "71"; height: "131"; }
- ListElement{ longitude: "5"; latitude: "72"; height: "133"; }
- ListElement{ longitude: "5"; latitude: "73"; height: "128"; }
- ListElement{ longitude: "5"; latitude: "74"; height: "107"; }
- ListElement{ longitude: "5"; latitude: "75"; height: "74"; }
- ListElement{ longitude: "5"; latitude: "76"; height: "121"; }
- ListElement{ longitude: "5"; latitude: "77"; height: "116"; }
- ListElement{ longitude: "5"; latitude: "78"; height: "109"; }
- ListElement{ longitude: "5"; latitude: "79"; height: "110"; }
- ListElement{ longitude: "5"; latitude: "80"; height: "113"; }
- ListElement{ longitude: "5"; latitude: "81"; height: "118"; }
- ListElement{ longitude: "5"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "5"; latitude: "83"; height: "124"; }
- ListElement{ longitude: "5"; latitude: "84"; height: "123"; }
- ListElement{ longitude: "5"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "5"; latitude: "86"; height: "127"; }
- ListElement{ longitude: "5"; latitude: "87"; height: "135"; }
- ListElement{ longitude: "5"; latitude: "88"; height: "140"; }
- ListElement{ longitude: "5"; latitude: "89"; height: "146"; }
- ListElement{ longitude: "5"; latitude: "90"; height: "150"; }
- ListElement{ longitude: "5"; latitude: "91"; height: "148"; }
- ListElement{ longitude: "5"; latitude: "92"; height: "146"; }
- ListElement{ longitude: "5"; latitude: "93"; height: "142"; }
- ListElement{ longitude: "5"; latitude: "94"; height: "140"; }
- ListElement{ longitude: "5"; latitude: "95"; height: "140"; }
- ListElement{ longitude: "5"; latitude: "96"; height: "142"; }
- ListElement{ longitude: "5"; latitude: "97"; height: "144"; }
- ListElement{ longitude: "5"; latitude: "98"; height: "145"; }
- ListElement{ longitude: "5"; latitude: "99"; height: "123"; }
- ListElement{ longitude: "6"; latitude: "0"; height: "115"; }
- ListElement{ longitude: "6"; latitude: "1"; height: "111"; }
- ListElement{ longitude: "6"; latitude: "2"; height: "110"; }
- ListElement{ longitude: "6"; latitude: "3"; height: "111"; }
- ListElement{ longitude: "6"; latitude: "4"; height: "116"; }
- ListElement{ longitude: "6"; latitude: "5"; height: "119"; }
- ListElement{ longitude: "6"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "6"; latitude: "7"; height: "129"; }
- ListElement{ longitude: "6"; latitude: "8"; height: "132"; }
- ListElement{ longitude: "6"; latitude: "9"; height: "132"; }
- ListElement{ longitude: "6"; latitude: "10"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "11"; height: "136"; }
- ListElement{ longitude: "6"; latitude: "12"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "6"; latitude: "14"; height: "137"; }
- ListElement{ longitude: "6"; latitude: "15"; height: "136"; }
- ListElement{ longitude: "6"; latitude: "16"; height: "132"; }
- ListElement{ longitude: "6"; latitude: "17"; height: "128"; }
- ListElement{ longitude: "6"; latitude: "18"; height: "118"; }
- ListElement{ longitude: "6"; latitude: "19"; height: "111"; }
- ListElement{ longitude: "6"; latitude: "20"; height: "105"; }
- ListElement{ longitude: "6"; latitude: "21"; height: "106"; }
- ListElement{ longitude: "6"; latitude: "22"; height: "107"; }
- ListElement{ longitude: "6"; latitude: "23"; height: "115"; }
- ListElement{ longitude: "6"; latitude: "24"; height: "121"; }
- ListElement{ longitude: "6"; latitude: "25"; height: "111"; }
- ListElement{ longitude: "6"; latitude: "26"; height: "78"; }
- ListElement{ longitude: "6"; latitude: "27"; height: "131"; }
- ListElement{ longitude: "6"; latitude: "28"; height: "130"; }
- ListElement{ longitude: "6"; latitude: "29"; height: "129"; }
- ListElement{ longitude: "6"; latitude: "30"; height: "103"; }
- ListElement{ longitude: "6"; latitude: "31"; height: "113"; }
- ListElement{ longitude: "6"; latitude: "32"; height: "108"; }
- ListElement{ longitude: "6"; latitude: "33"; height: "103"; }
- ListElement{ longitude: "6"; latitude: "34"; height: "103"; }
- ListElement{ longitude: "6"; latitude: "35"; height: "107"; }
- ListElement{ longitude: "6"; latitude: "36"; height: "109"; }
- ListElement{ longitude: "6"; latitude: "37"; height: "113"; }
- ListElement{ longitude: "6"; latitude: "38"; height: "112"; }
- ListElement{ longitude: "6"; latitude: "39"; height: "115"; }
- ListElement{ longitude: "6"; latitude: "40"; height: "115"; }
- ListElement{ longitude: "6"; latitude: "41"; height: "119"; }
- ListElement{ longitude: "6"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "6"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "6"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "6"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "6"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "6"; latitude: "47"; height: "131"; }
- ListElement{ longitude: "6"; latitude: "48"; height: "133"; }
- ListElement{ longitude: "6"; latitude: "49"; height: "141"; }
- ListElement{ longitude: "6"; latitude: "50"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "51"; height: "137"; }
- ListElement{ longitude: "6"; latitude: "52"; height: "132"; }
- ListElement{ longitude: "6"; latitude: "53"; height: "124"; }
- ListElement{ longitude: "6"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "6"; latitude: "55"; height: "125"; }
- ListElement{ longitude: "6"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "6"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "6"; latitude: "58"; height: "128"; }
- ListElement{ longitude: "6"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "6"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "6"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "6"; latitude: "62"; height: "120"; }
- ListElement{ longitude: "6"; latitude: "63"; height: "118"; }
- ListElement{ longitude: "6"; latitude: "64"; height: "118"; }
- ListElement{ longitude: "6"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "6"; latitude: "66"; height: "119"; }
- ListElement{ longitude: "6"; latitude: "67"; height: "124"; }
- ListElement{ longitude: "6"; latitude: "68"; height: "125"; }
- ListElement{ longitude: "6"; latitude: "69"; height: "130"; }
- ListElement{ longitude: "6"; latitude: "70"; height: "132"; }
- ListElement{ longitude: "6"; latitude: "71"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "72"; height: "136"; }
- ListElement{ longitude: "6"; latitude: "73"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "74"; height: "131"; }
- ListElement{ longitude: "6"; latitude: "75"; height: "135"; }
- ListElement{ longitude: "6"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "6"; latitude: "77"; height: "112"; }
- ListElement{ longitude: "6"; latitude: "78"; height: "106"; }
- ListElement{ longitude: "6"; latitude: "79"; height: "106"; }
- ListElement{ longitude: "6"; latitude: "80"; height: "107"; }
- ListElement{ longitude: "6"; latitude: "81"; height: "110"; }
- ListElement{ longitude: "6"; latitude: "82"; height: "114"; }
- ListElement{ longitude: "6"; latitude: "83"; height: "116"; }
- ListElement{ longitude: "6"; latitude: "84"; height: "92"; }
- ListElement{ longitude: "6"; latitude: "85"; height: "105"; }
- ListElement{ longitude: "6"; latitude: "86"; height: "124"; }
- ListElement{ longitude: "6"; latitude: "87"; height: "130"; }
- ListElement{ longitude: "6"; latitude: "88"; height: "138"; }
- ListElement{ longitude: "6"; latitude: "89"; height: "142"; }
- ListElement{ longitude: "6"; latitude: "90"; height: "147"; }
- ListElement{ longitude: "6"; latitude: "91"; height: "147"; }
- ListElement{ longitude: "6"; latitude: "92"; height: "142"; }
- ListElement{ longitude: "6"; latitude: "93"; height: "139"; }
- ListElement{ longitude: "6"; latitude: "94"; height: "138"; }
- ListElement{ longitude: "6"; latitude: "95"; height: "136"; }
- ListElement{ longitude: "6"; latitude: "96"; height: "141"; }
- ListElement{ longitude: "6"; latitude: "97"; height: "142"; }
- ListElement{ longitude: "6"; latitude: "98"; height: "146"; }
- ListElement{ longitude: "6"; latitude: "99"; height: "126"; }
- ListElement{ longitude: "7"; latitude: "0"; height: "117"; }
- ListElement{ longitude: "7"; latitude: "1"; height: "111"; }
- ListElement{ longitude: "7"; latitude: "2"; height: "108"; }
- ListElement{ longitude: "7"; latitude: "3"; height: "112"; }
- ListElement{ longitude: "7"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "7"; latitude: "5"; height: "124"; }
- ListElement{ longitude: "7"; latitude: "6"; height: "130"; }
- ListElement{ longitude: "7"; latitude: "7"; height: "131"; }
- ListElement{ longitude: "7"; latitude: "8"; height: "133"; }
- ListElement{ longitude: "7"; latitude: "9"; height: "136"; }
- ListElement{ longitude: "7"; latitude: "10"; height: "133"; }
- ListElement{ longitude: "7"; latitude: "11"; height: "134"; }
- ListElement{ longitude: "7"; latitude: "12"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "13"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "14"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "15"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "16"; height: "136"; }
- ListElement{ longitude: "7"; latitude: "17"; height: "129"; }
- ListElement{ longitude: "7"; latitude: "18"; height: "123"; }
- ListElement{ longitude: "7"; latitude: "19"; height: "115"; }
- ListElement{ longitude: "7"; latitude: "20"; height: "109"; }
- ListElement{ longitude: "7"; latitude: "21"; height: "109"; }
- ListElement{ longitude: "7"; latitude: "22"; height: "109"; }
- ListElement{ longitude: "7"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "7"; latitude: "24"; height: "124"; }
- ListElement{ longitude: "7"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "7"; latitude: "26"; height: "105"; }
- ListElement{ longitude: "7"; latitude: "27"; height: "131"; }
- ListElement{ longitude: "7"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "7"; latitude: "31"; height: "115"; }
- ListElement{ longitude: "7"; latitude: "32"; height: "110"; }
- ListElement{ longitude: "7"; latitude: "33"; height: "108"; }
- ListElement{ longitude: "7"; latitude: "34"; height: "107"; }
- ListElement{ longitude: "7"; latitude: "35"; height: "113"; }
- ListElement{ longitude: "7"; latitude: "36"; height: "115"; }
- ListElement{ longitude: "7"; latitude: "37"; height: "115"; }
- ListElement{ longitude: "7"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "7"; latitude: "39"; height: "114"; }
- ListElement{ longitude: "7"; latitude: "40"; height: "116"; }
- ListElement{ longitude: "7"; latitude: "41"; height: "119"; }
- ListElement{ longitude: "7"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "7"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "44"; height: "129"; }
- ListElement{ longitude: "7"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "7"; latitude: "46"; height: "132"; }
- ListElement{ longitude: "7"; latitude: "47"; height: "132"; }
- ListElement{ longitude: "7"; latitude: "48"; height: "135"; }
- ListElement{ longitude: "7"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "7"; latitude: "50"; height: "137"; }
- ListElement{ longitude: "7"; latitude: "51"; height: "133"; }
- ListElement{ longitude: "7"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "7"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "7"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "7"; latitude: "55"; height: "125"; }
- ListElement{ longitude: "7"; latitude: "56"; height: "124"; }
- ListElement{ longitude: "7"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "7"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "61"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "7"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "7"; latitude: "64"; height: "121"; }
- ListElement{ longitude: "7"; latitude: "65"; height: "122"; }
- ListElement{ longitude: "7"; latitude: "66"; height: "127"; }
- ListElement{ longitude: "7"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "7"; latitude: "68"; height: "130"; }
- ListElement{ longitude: "7"; latitude: "69"; height: "129"; }
- ListElement{ longitude: "7"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "7"; latitude: "71"; height: "136"; }
- ListElement{ longitude: "7"; latitude: "72"; height: "135"; }
- ListElement{ longitude: "7"; latitude: "73"; height: "136"; }
- ListElement{ longitude: "7"; latitude: "74"; height: "132"; }
- ListElement{ longitude: "7"; latitude: "75"; height: "124"; }
- ListElement{ longitude: "7"; latitude: "76"; height: "118"; }
- ListElement{ longitude: "7"; latitude: "77"; height: "110"; }
- ListElement{ longitude: "7"; latitude: "78"; height: "103"; }
- ListElement{ longitude: "7"; latitude: "79"; height: "101"; }
- ListElement{ longitude: "7"; latitude: "80"; height: "103"; }
- ListElement{ longitude: "7"; latitude: "81"; height: "105"; }
- ListElement{ longitude: "7"; latitude: "82"; height: "107"; }
- ListElement{ longitude: "7"; latitude: "83"; height: "112"; }
- ListElement{ longitude: "7"; latitude: "84"; height: "104"; }
- ListElement{ longitude: "7"; latitude: "85"; height: "109"; }
- ListElement{ longitude: "7"; latitude: "86"; height: "119"; }
- ListElement{ longitude: "7"; latitude: "87"; height: "125"; }
- ListElement{ longitude: "7"; latitude: "88"; height: "132"; }
- ListElement{ longitude: "7"; latitude: "89"; height: "139"; }
- ListElement{ longitude: "7"; latitude: "90"; height: "143"; }
- ListElement{ longitude: "7"; latitude: "91"; height: "146"; }
- ListElement{ longitude: "7"; latitude: "92"; height: "143"; }
- ListElement{ longitude: "7"; latitude: "93"; height: "139"; }
- ListElement{ longitude: "7"; latitude: "94"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "95"; height: "138"; }
- ListElement{ longitude: "7"; latitude: "96"; height: "141"; }
- ListElement{ longitude: "7"; latitude: "97"; height: "143"; }
- ListElement{ longitude: "7"; latitude: "98"; height: "147"; }
- ListElement{ longitude: "7"; latitude: "99"; height: "130"; }
- ListElement{ longitude: "8"; latitude: "0"; height: "119"; }
- ListElement{ longitude: "8"; latitude: "1"; height: "113"; }
- ListElement{ longitude: "8"; latitude: "2"; height: "114"; }
- ListElement{ longitude: "8"; latitude: "3"; height: "115"; }
- ListElement{ longitude: "8"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "8"; latitude: "5"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "6"; height: "132"; }
- ListElement{ longitude: "8"; latitude: "7"; height: "132"; }
- ListElement{ longitude: "8"; latitude: "8"; height: "134"; }
- ListElement{ longitude: "8"; latitude: "9"; height: "135"; }
- ListElement{ longitude: "8"; latitude: "10"; height: "133"; }
- ListElement{ longitude: "8"; latitude: "11"; height: "135"; }
- ListElement{ longitude: "8"; latitude: "12"; height: "138"; }
- ListElement{ longitude: "8"; latitude: "13"; height: "137"; }
- ListElement{ longitude: "8"; latitude: "14"; height: "137"; }
- ListElement{ longitude: "8"; latitude: "15"; height: "138"; }
- ListElement{ longitude: "8"; latitude: "16"; height: "138"; }
- ListElement{ longitude: "8"; latitude: "17"; height: "133"; }
- ListElement{ longitude: "8"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "19"; height: "118"; }
- ListElement{ longitude: "8"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "8"; latitude: "21"; height: "114"; }
- ListElement{ longitude: "8"; latitude: "22"; height: "115"; }
- ListElement{ longitude: "8"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "8"; latitude: "24"; height: "123"; }
- ListElement{ longitude: "8"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "8"; latitude: "26"; height: "129"; }
- ListElement{ longitude: "8"; latitude: "27"; height: "130"; }
- ListElement{ longitude: "8"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "8"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "8"; latitude: "31"; height: "116"; }
- ListElement{ longitude: "8"; latitude: "32"; height: "115"; }
- ListElement{ longitude: "8"; latitude: "33"; height: "113"; }
- ListElement{ longitude: "8"; latitude: "34"; height: "114"; }
- ListElement{ longitude: "8"; latitude: "35"; height: "119"; }
- ListElement{ longitude: "8"; latitude: "36"; height: "117"; }
- ListElement{ longitude: "8"; latitude: "37"; height: "117"; }
- ListElement{ longitude: "8"; latitude: "38"; height: "118"; }
- ListElement{ longitude: "8"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "8"; latitude: "40"; height: "118"; }
- ListElement{ longitude: "8"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "8"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "8"; latitude: "44"; height: "130"; }
- ListElement{ longitude: "8"; latitude: "45"; height: "133"; }
- ListElement{ longitude: "8"; latitude: "46"; height: "132"; }
- ListElement{ longitude: "8"; latitude: "47"; height: "133"; }
- ListElement{ longitude: "8"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "51"; height: "132"; }
- ListElement{ longitude: "8"; latitude: "52"; height: "129"; }
- ListElement{ longitude: "8"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "8"; latitude: "55"; height: "125"; }
- ListElement{ longitude: "8"; latitude: "56"; height: "124"; }
- ListElement{ longitude: "8"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "61"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "62"; height: "116"; }
- ListElement{ longitude: "8"; latitude: "63"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "64"; height: "128"; }
- ListElement{ longitude: "8"; latitude: "65"; height: "129"; }
- ListElement{ longitude: "8"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "8"; latitude: "67"; height: "107"; }
- ListElement{ longitude: "8"; latitude: "68"; height: "124"; }
- ListElement{ longitude: "8"; latitude: "69"; height: "131"; }
- ListElement{ longitude: "8"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "8"; latitude: "71"; height: "134"; }
- ListElement{ longitude: "8"; latitude: "72"; height: "138"; }
- ListElement{ longitude: "8"; latitude: "73"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "74"; height: "127"; }
- ListElement{ longitude: "8"; latitude: "75"; height: "117"; }
- ListElement{ longitude: "8"; latitude: "76"; height: "115"; }
- ListElement{ longitude: "8"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "8"; latitude: "78"; height: "100"; }
- ListElement{ longitude: "8"; latitude: "79"; height: "99"; }
- ListElement{ longitude: "8"; latitude: "80"; height: "99"; }
- ListElement{ longitude: "8"; latitude: "81"; height: "102"; }
- ListElement{ longitude: "8"; latitude: "82"; height: "101"; }
- ListElement{ longitude: "8"; latitude: "83"; height: "105"; }
- ListElement{ longitude: "8"; latitude: "84"; height: "107"; }
- ListElement{ longitude: "8"; latitude: "85"; height: "103"; }
- ListElement{ longitude: "8"; latitude: "86"; height: "110"; }
- ListElement{ longitude: "8"; latitude: "87"; height: "119"; }
- ListElement{ longitude: "8"; latitude: "88"; height: "126"; }
- ListElement{ longitude: "8"; latitude: "89"; height: "134"; }
- ListElement{ longitude: "8"; latitude: "90"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "91"; height: "138"; }
- ListElement{ longitude: "8"; latitude: "92"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "93"; height: "137"; }
- ListElement{ longitude: "8"; latitude: "94"; height: "136"; }
- ListElement{ longitude: "8"; latitude: "95"; height: "134"; }
- ListElement{ longitude: "8"; latitude: "96"; height: "135"; }
- ListElement{ longitude: "8"; latitude: "97"; height: "137"; }
- ListElement{ longitude: "8"; latitude: "98"; height: "143"; }
- ListElement{ longitude: "8"; latitude: "99"; height: "137"; }
- ListElement{ longitude: "9"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "9"; latitude: "2"; height: "118"; }
- ListElement{ longitude: "9"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "4"; height: "126"; }
- ListElement{ longitude: "9"; latitude: "5"; height: "129"; }
- ListElement{ longitude: "9"; latitude: "6"; height: "133"; }
- ListElement{ longitude: "9"; latitude: "7"; height: "132"; }
- ListElement{ longitude: "9"; latitude: "8"; height: "133"; }
- ListElement{ longitude: "9"; latitude: "9"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "10"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "11"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "12"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "13"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "14"; height: "136"; }
- ListElement{ longitude: "9"; latitude: "15"; height: "137"; }
- ListElement{ longitude: "9"; latitude: "16"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "17"; height: "119"; }
- ListElement{ longitude: "9"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "9"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "9"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "21"; height: "117"; }
- ListElement{ longitude: "9"; latitude: "22"; height: "116"; }
- ListElement{ longitude: "9"; latitude: "23"; height: "119"; }
- ListElement{ longitude: "9"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "9"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "9"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "27"; height: "121"; }
- ListElement{ longitude: "9"; latitude: "28"; height: "121"; }
- ListElement{ longitude: "9"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "30"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "31"; height: "117"; }
- ListElement{ longitude: "9"; latitude: "32"; height: "116"; }
- ListElement{ longitude: "9"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "9"; latitude: "34"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "9"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "9"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "9"; latitude: "38"; height: "121"; }
- ListElement{ longitude: "9"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "9"; latitude: "40"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "9"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "9"; latitude: "43"; height: "132"; }
- ListElement{ longitude: "9"; latitude: "44"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "45"; height: "135"; }
- ListElement{ longitude: "9"; latitude: "46"; height: "135"; }
- ListElement{ longitude: "9"; latitude: "47"; height: "133"; }
- ListElement{ longitude: "9"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "9"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "9"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "9"; latitude: "51"; height: "132"; }
- ListElement{ longitude: "9"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "9"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "9"; latitude: "55"; height: "125"; }
- ListElement{ longitude: "9"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "9"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "9"; latitude: "58"; height: "126"; }
- ListElement{ longitude: "9"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "9"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "9"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "9"; latitude: "62"; height: "129"; }
- ListElement{ longitude: "9"; latitude: "63"; height: "127"; }
- ListElement{ longitude: "9"; latitude: "64"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "65"; height: "122"; }
- ListElement{ longitude: "9"; latitude: "66"; height: "107"; }
- ListElement{ longitude: "9"; latitude: "67"; height: "103"; }
- ListElement{ longitude: "9"; latitude: "68"; height: "105"; }
- ListElement{ longitude: "9"; latitude: "69"; height: "112"; }
- ListElement{ longitude: "9"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "9"; latitude: "71"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "72"; height: "140"; }
- ListElement{ longitude: "9"; latitude: "73"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "74"; height: "129"; }
- ListElement{ longitude: "9"; latitude: "75"; height: "120"; }
- ListElement{ longitude: "9"; latitude: "76"; height: "117"; }
- ListElement{ longitude: "9"; latitude: "77"; height: "113"; }
- ListElement{ longitude: "9"; latitude: "78"; height: "102"; }
- ListElement{ longitude: "9"; latitude: "79"; height: "99"; }
- ListElement{ longitude: "9"; latitude: "80"; height: "101"; }
- ListElement{ longitude: "9"; latitude: "81"; height: "101"; }
- ListElement{ longitude: "9"; latitude: "82"; height: "101"; }
- ListElement{ longitude: "9"; latitude: "83"; height: "101"; }
- ListElement{ longitude: "9"; latitude: "84"; height: "96"; }
- ListElement{ longitude: "9"; latitude: "85"; height: "98"; }
- ListElement{ longitude: "9"; latitude: "86"; height: "106"; }
- ListElement{ longitude: "9"; latitude: "87"; height: "112"; }
- ListElement{ longitude: "9"; latitude: "88"; height: "119"; }
- ListElement{ longitude: "9"; latitude: "89"; height: "126"; }
- ListElement{ longitude: "9"; latitude: "90"; height: "128"; }
- ListElement{ longitude: "9"; latitude: "91"; height: "132"; }
- ListElement{ longitude: "9"; latitude: "92"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "93"; height: "134"; }
- ListElement{ longitude: "9"; latitude: "94"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "95"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "9"; latitude: "97"; height: "137"; }
- ListElement{ longitude: "9"; latitude: "98"; height: "141"; }
- ListElement{ longitude: "9"; latitude: "99"; height: "139"; }
- ListElement{ longitude: "10"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "1"; height: "121"; }
- ListElement{ longitude: "10"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "3"; height: "124"; }
- ListElement{ longitude: "10"; latitude: "4"; height: "129"; }
- ListElement{ longitude: "10"; latitude: "5"; height: "131"; }
- ListElement{ longitude: "10"; latitude: "6"; height: "132"; }
- ListElement{ longitude: "10"; latitude: "7"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "8"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "10"; height: "133"; }
- ListElement{ longitude: "10"; latitude: "11"; height: "135"; }
- ListElement{ longitude: "10"; latitude: "12"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "13"; height: "134"; }
- ListElement{ longitude: "10"; latitude: "14"; height: "135"; }
- ListElement{ longitude: "10"; latitude: "15"; height: "133"; }
- ListElement{ longitude: "10"; latitude: "16"; height: "129"; }
- ListElement{ longitude: "10"; latitude: "17"; height: "105"; }
- ListElement{ longitude: "10"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "10"; latitude: "19"; height: "124"; }
- ListElement{ longitude: "10"; latitude: "20"; height: "115"; }
- ListElement{ longitude: "10"; latitude: "21"; height: "101"; }
- ListElement{ longitude: "10"; latitude: "22"; height: "103"; }
- ListElement{ longitude: "10"; latitude: "23"; height: "113"; }
- ListElement{ longitude: "10"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "10"; latitude: "25"; height: "120"; }
- ListElement{ longitude: "10"; latitude: "26"; height: "118"; }
- ListElement{ longitude: "10"; latitude: "27"; height: "118"; }
- ListElement{ longitude: "10"; latitude: "28"; height: "120"; }
- ListElement{ longitude: "10"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "10"; latitude: "30"; height: "120"; }
- ListElement{ longitude: "10"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "10"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "10"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "10"; latitude: "34"; height: "123"; }
- ListElement{ longitude: "10"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "10"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "10"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "10"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "10"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "10"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "43"; height: "135"; }
- ListElement{ longitude: "10"; latitude: "44"; height: "135"; }
- ListElement{ longitude: "10"; latitude: "45"; height: "138"; }
- ListElement{ longitude: "10"; latitude: "46"; height: "136"; }
- ListElement{ longitude: "10"; latitude: "47"; height: "136"; }
- ListElement{ longitude: "10"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "10"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "10"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "10"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "10"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "10"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "10"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "10"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "57"; height: "124"; }
- ListElement{ longitude: "10"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "10"; latitude: "59"; height: "126"; }
- ListElement{ longitude: "10"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "10"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "10"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "10"; latitude: "63"; height: "115"; }
- ListElement{ longitude: "10"; latitude: "64"; height: "133"; }
- ListElement{ longitude: "10"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "10"; latitude: "66"; height: "115"; }
- ListElement{ longitude: "10"; latitude: "67"; height: "105"; }
- ListElement{ longitude: "10"; latitude: "68"; height: "98"; }
- ListElement{ longitude: "10"; latitude: "69"; height: "106"; }
- ListElement{ longitude: "10"; latitude: "70"; height: "132"; }
- ListElement{ longitude: "10"; latitude: "71"; height: "134"; }
- ListElement{ longitude: "10"; latitude: "72"; height: "139"; }
- ListElement{ longitude: "10"; latitude: "73"; height: "137"; }
- ListElement{ longitude: "10"; latitude: "74"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "75"; height: "122"; }
- ListElement{ longitude: "10"; latitude: "76"; height: "116"; }
- ListElement{ longitude: "10"; latitude: "77"; height: "107"; }
- ListElement{ longitude: "10"; latitude: "78"; height: "104"; }
- ListElement{ longitude: "10"; latitude: "79"; height: "104"; }
- ListElement{ longitude: "10"; latitude: "80"; height: "104"; }
- ListElement{ longitude: "10"; latitude: "81"; height: "105"; }
- ListElement{ longitude: "10"; latitude: "82"; height: "102"; }
- ListElement{ longitude: "10"; latitude: "83"; height: "100"; }
- ListElement{ longitude: "10"; latitude: "84"; height: "99"; }
- ListElement{ longitude: "10"; latitude: "85"; height: "102"; }
- ListElement{ longitude: "10"; latitude: "86"; height: "101"; }
- ListElement{ longitude: "10"; latitude: "87"; height: "110"; }
- ListElement{ longitude: "10"; latitude: "88"; height: "114"; }
- ListElement{ longitude: "10"; latitude: "89"; height: "121"; }
- ListElement{ longitude: "10"; latitude: "90"; height: "125"; }
- ListElement{ longitude: "10"; latitude: "91"; height: "128"; }
- ListElement{ longitude: "10"; latitude: "92"; height: "128"; }
- ListElement{ longitude: "10"; latitude: "93"; height: "130"; }
- ListElement{ longitude: "10"; latitude: "94"; height: "129"; }
- ListElement{ longitude: "10"; latitude: "95"; height: "131"; }
- ListElement{ longitude: "10"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "10"; latitude: "97"; height: "132"; }
- ListElement{ longitude: "10"; latitude: "98"; height: "139"; }
- ListElement{ longitude: "10"; latitude: "99"; height: "140"; }
- ListElement{ longitude: "11"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "11"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "11"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "3"; height: "129"; }
- ListElement{ longitude: "11"; latitude: "4"; height: "131"; }
- ListElement{ longitude: "11"; latitude: "5"; height: "132"; }
- ListElement{ longitude: "11"; latitude: "6"; height: "132"; }
- ListElement{ longitude: "11"; latitude: "7"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "8"; height: "131"; }
- ListElement{ longitude: "11"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "10"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "11"; height: "133"; }
- ListElement{ longitude: "11"; latitude: "12"; height: "131"; }
- ListElement{ longitude: "11"; latitude: "13"; height: "134"; }
- ListElement{ longitude: "11"; latitude: "14"; height: "135"; }
- ListElement{ longitude: "11"; latitude: "15"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "16"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "17"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "19"; height: "124"; }
- ListElement{ longitude: "11"; latitude: "20"; height: "100"; }
- ListElement{ longitude: "11"; latitude: "21"; height: "86"; }
- ListElement{ longitude: "11"; latitude: "22"; height: "90"; }
- ListElement{ longitude: "11"; latitude: "23"; height: "104"; }
- ListElement{ longitude: "11"; latitude: "24"; height: "117"; }
- ListElement{ longitude: "11"; latitude: "25"; height: "120"; }
- ListElement{ longitude: "11"; latitude: "26"; height: "115"; }
- ListElement{ longitude: "11"; latitude: "27"; height: "115"; }
- ListElement{ longitude: "11"; latitude: "28"; height: "117"; }
- ListElement{ longitude: "11"; latitude: "29"; height: "118"; }
- ListElement{ longitude: "11"; latitude: "30"; height: "116"; }
- ListElement{ longitude: "11"; latitude: "31"; height: "117"; }
- ListElement{ longitude: "11"; latitude: "32"; height: "118"; }
- ListElement{ longitude: "11"; latitude: "33"; height: "120"; }
- ListElement{ longitude: "11"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "35"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "36"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "11"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "11"; latitude: "42"; height: "131"; }
- ListElement{ longitude: "11"; latitude: "43"; height: "135"; }
- ListElement{ longitude: "11"; latitude: "44"; height: "135"; }
- ListElement{ longitude: "11"; latitude: "45"; height: "138"; }
- ListElement{ longitude: "11"; latitude: "46"; height: "135"; }
- ListElement{ longitude: "11"; latitude: "47"; height: "136"; }
- ListElement{ longitude: "11"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "11"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "11"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "11"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "11"; latitude: "52"; height: "132"; }
- ListElement{ longitude: "11"; latitude: "53"; height: "129"; }
- ListElement{ longitude: "11"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "11"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "11"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "11"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "11"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "11"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "11"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "11"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "11"; latitude: "63"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "64"; height: "131"; }
- ListElement{ longitude: "11"; latitude: "65"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "66"; height: "103"; }
- ListElement{ longitude: "11"; latitude: "67"; height: "110"; }
- ListElement{ longitude: "11"; latitude: "68"; height: "102"; }
- ListElement{ longitude: "11"; latitude: "69"; height: "114"; }
- ListElement{ longitude: "11"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "71"; height: "134"; }
- ListElement{ longitude: "11"; latitude: "72"; height: "137"; }
- ListElement{ longitude: "11"; latitude: "73"; height: "133"; }
- ListElement{ longitude: "11"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "11"; latitude: "75"; height: "120"; }
- ListElement{ longitude: "11"; latitude: "76"; height: "114"; }
- ListElement{ longitude: "11"; latitude: "77"; height: "110"; }
- ListElement{ longitude: "11"; latitude: "78"; height: "109"; }
- ListElement{ longitude: "11"; latitude: "79"; height: "111"; }
- ListElement{ longitude: "11"; latitude: "80"; height: "111"; }
- ListElement{ longitude: "11"; latitude: "81"; height: "111"; }
- ListElement{ longitude: "11"; latitude: "82"; height: "103"; }
- ListElement{ longitude: "11"; latitude: "83"; height: "102"; }
- ListElement{ longitude: "11"; latitude: "84"; height: "98"; }
- ListElement{ longitude: "11"; latitude: "85"; height: "100"; }
- ListElement{ longitude: "11"; latitude: "86"; height: "102"; }
- ListElement{ longitude: "11"; latitude: "87"; height: "104"; }
- ListElement{ longitude: "11"; latitude: "88"; height: "110"; }
- ListElement{ longitude: "11"; latitude: "89"; height: "115"; }
- ListElement{ longitude: "11"; latitude: "90"; height: "119"; }
- ListElement{ longitude: "11"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "11"; latitude: "92"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "93"; height: "126"; }
- ListElement{ longitude: "11"; latitude: "94"; height: "127"; }
- ListElement{ longitude: "11"; latitude: "95"; height: "128"; }
- ListElement{ longitude: "11"; latitude: "96"; height: "130"; }
- ListElement{ longitude: "11"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "11"; latitude: "98"; height: "141"; }
- ListElement{ longitude: "11"; latitude: "99"; height: "142"; }
- ListElement{ longitude: "12"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "12"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "12"; latitude: "2"; height: "130"; }
- ListElement{ longitude: "12"; latitude: "3"; height: "134"; }
- ListElement{ longitude: "12"; latitude: "4"; height: "136"; }
- ListElement{ longitude: "12"; latitude: "5"; height: "134"; }
- ListElement{ longitude: "12"; latitude: "6"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "7"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "8"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "9"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "10"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "12"; latitude: "12"; height: "133"; }
- ListElement{ longitude: "12"; latitude: "13"; height: "133"; }
- ListElement{ longitude: "12"; latitude: "14"; height: "132"; }
- ListElement{ longitude: "12"; latitude: "15"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "16"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "12"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "19"; height: "119"; }
- ListElement{ longitude: "12"; latitude: "20"; height: "98"; }
- ListElement{ longitude: "12"; latitude: "21"; height: "84"; }
- ListElement{ longitude: "12"; latitude: "22"; height: "87"; }
- ListElement{ longitude: "12"; latitude: "23"; height: "103"; }
- ListElement{ longitude: "12"; latitude: "24"; height: "119"; }
- ListElement{ longitude: "12"; latitude: "25"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "12"; latitude: "27"; height: "112"; }
- ListElement{ longitude: "12"; latitude: "28"; height: "113"; }
- ListElement{ longitude: "12"; latitude: "29"; height: "114"; }
- ListElement{ longitude: "12"; latitude: "30"; height: "115"; }
- ListElement{ longitude: "12"; latitude: "31"; height: "118"; }
- ListElement{ longitude: "12"; latitude: "32"; height: "118"; }
- ListElement{ longitude: "12"; latitude: "33"; height: "121"; }
- ListElement{ longitude: "12"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "12"; latitude: "35"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "36"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "38"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "43"; height: "133"; }
- ListElement{ longitude: "12"; latitude: "44"; height: "134"; }
- ListElement{ longitude: "12"; latitude: "45"; height: "137"; }
- ListElement{ longitude: "12"; latitude: "46"; height: "136"; }
- ListElement{ longitude: "12"; latitude: "47"; height: "135"; }
- ListElement{ longitude: "12"; latitude: "48"; height: "135"; }
- ListElement{ longitude: "12"; latitude: "49"; height: "135"; }
- ListElement{ longitude: "12"; latitude: "50"; height: "135"; }
- ListElement{ longitude: "12"; latitude: "51"; height: "135"; }
- ListElement{ longitude: "12"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "12"; latitude: "53"; height: "130"; }
- ListElement{ longitude: "12"; latitude: "54"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "12"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "12"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "12"; latitude: "58"; height: "121"; }
- ListElement{ longitude: "12"; latitude: "59"; height: "123"; }
- ListElement{ longitude: "12"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "12"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "12"; latitude: "63"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "64"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "65"; height: "127"; }
- ListElement{ longitude: "12"; latitude: "66"; height: "119"; }
- ListElement{ longitude: "12"; latitude: "67"; height: "118"; }
- ListElement{ longitude: "12"; latitude: "68"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "69"; height: "123"; }
- ListElement{ longitude: "12"; latitude: "70"; height: "128"; }
- ListElement{ longitude: "12"; latitude: "71"; height: "130"; }
- ListElement{ longitude: "12"; latitude: "72"; height: "132"; }
- ListElement{ longitude: "12"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "12"; latitude: "74"; height: "111"; }
- ListElement{ longitude: "12"; latitude: "75"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "76"; height: "113"; }
- ListElement{ longitude: "12"; latitude: "77"; height: "112"; }
- ListElement{ longitude: "12"; latitude: "78"; height: "114"; }
- ListElement{ longitude: "12"; latitude: "79"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "80"; height: "117"; }
- ListElement{ longitude: "12"; latitude: "81"; height: "115"; }
- ListElement{ longitude: "12"; latitude: "82"; height: "110"; }
- ListElement{ longitude: "12"; latitude: "83"; height: "105"; }
- ListElement{ longitude: "12"; latitude: "84"; height: "102"; }
- ListElement{ longitude: "12"; latitude: "85"; height: "101"; }
- ListElement{ longitude: "12"; latitude: "86"; height: "102"; }
- ListElement{ longitude: "12"; latitude: "87"; height: "105"; }
- ListElement{ longitude: "12"; latitude: "88"; height: "108"; }
- ListElement{ longitude: "12"; latitude: "89"; height: "111"; }
- ListElement{ longitude: "12"; latitude: "90"; height: "116"; }
- ListElement{ longitude: "12"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "12"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "12"; latitude: "93"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "94"; height: "126"; }
- ListElement{ longitude: "12"; latitude: "95"; height: "129"; }
- ListElement{ longitude: "12"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "97"; height: "131"; }
- ListElement{ longitude: "12"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "12"; latitude: "99"; height: "142"; }
- ListElement{ longitude: "13"; latitude: "0"; height: "108"; }
- ListElement{ longitude: "13"; latitude: "1"; height: "113"; }
- ListElement{ longitude: "13"; latitude: "2"; height: "131"; }
- ListElement{ longitude: "13"; latitude: "3"; height: "136"; }
- ListElement{ longitude: "13"; latitude: "4"; height: "137"; }
- ListElement{ longitude: "13"; latitude: "5"; height: "136"; }
- ListElement{ longitude: "13"; latitude: "6"; height: "130"; }
- ListElement{ longitude: "13"; latitude: "7"; height: "131"; }
- ListElement{ longitude: "13"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "13"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "13"; latitude: "12"; height: "132"; }
- ListElement{ longitude: "13"; latitude: "13"; height: "132"; }
- ListElement{ longitude: "13"; latitude: "14"; height: "132"; }
- ListElement{ longitude: "13"; latitude: "15"; height: "129"; }
- ListElement{ longitude: "13"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "18"; height: "124"; }
- ListElement{ longitude: "13"; latitude: "19"; height: "122"; }
- ListElement{ longitude: "13"; latitude: "20"; height: "106"; }
- ListElement{ longitude: "13"; latitude: "21"; height: "95"; }
- ListElement{ longitude: "13"; latitude: "22"; height: "98"; }
- ListElement{ longitude: "13"; latitude: "23"; height: "111"; }
- ListElement{ longitude: "13"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "13"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "13"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "13"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "13"; latitude: "28"; height: "111"; }
- ListElement{ longitude: "13"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "13"; latitude: "30"; height: "116"; }
- ListElement{ longitude: "13"; latitude: "31"; height: "118"; }
- ListElement{ longitude: "13"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "13"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "13"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "13"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "13"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "13"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "38"; height: "129"; }
- ListElement{ longitude: "13"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "13"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "13"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "13"; latitude: "44"; height: "131"; }
- ListElement{ longitude: "13"; latitude: "45"; height: "133"; }
- ListElement{ longitude: "13"; latitude: "46"; height: "134"; }
- ListElement{ longitude: "13"; latitude: "47"; height: "132"; }
- ListElement{ longitude: "13"; latitude: "48"; height: "133"; }
- ListElement{ longitude: "13"; latitude: "49"; height: "133"; }
- ListElement{ longitude: "13"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "13"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "13"; latitude: "52"; height: "135"; }
- ListElement{ longitude: "13"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "13"; latitude: "54"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "55"; height: "124"; }
- ListElement{ longitude: "13"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "13"; latitude: "57"; height: "120"; }
- ListElement{ longitude: "13"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "13"; latitude: "59"; height: "123"; }
- ListElement{ longitude: "13"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "13"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "63"; height: "126"; }
- ListElement{ longitude: "13"; latitude: "64"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "65"; height: "118"; }
- ListElement{ longitude: "13"; latitude: "66"; height: "121"; }
- ListElement{ longitude: "13"; latitude: "67"; height: "122"; }
- ListElement{ longitude: "13"; latitude: "68"; height: "120"; }
- ListElement{ longitude: "13"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "13"; latitude: "70"; height: "124"; }
- ListElement{ longitude: "13"; latitude: "71"; height: "128"; }
- ListElement{ longitude: "13"; latitude: "72"; height: "130"; }
- ListElement{ longitude: "13"; latitude: "73"; height: "126"; }
- ListElement{ longitude: "13"; latitude: "74"; height: "114"; }
- ListElement{ longitude: "13"; latitude: "75"; height: "116"; }
- ListElement{ longitude: "13"; latitude: "76"; height: "114"; }
- ListElement{ longitude: "13"; latitude: "77"; height: "114"; }
- ListElement{ longitude: "13"; latitude: "78"; height: "117"; }
- ListElement{ longitude: "13"; latitude: "79"; height: "119"; }
- ListElement{ longitude: "13"; latitude: "80"; height: "118"; }
- ListElement{ longitude: "13"; latitude: "81"; height: "119"; }
- ListElement{ longitude: "13"; latitude: "82"; height: "114"; }
- ListElement{ longitude: "13"; latitude: "83"; height: "110"; }
- ListElement{ longitude: "13"; latitude: "84"; height: "103"; }
- ListElement{ longitude: "13"; latitude: "85"; height: "103"; }
- ListElement{ longitude: "13"; latitude: "86"; height: "105"; }
- ListElement{ longitude: "13"; latitude: "87"; height: "104"; }
- ListElement{ longitude: "13"; latitude: "88"; height: "106"; }
- ListElement{ longitude: "13"; latitude: "89"; height: "109"; }
- ListElement{ longitude: "13"; latitude: "90"; height: "116"; }
- ListElement{ longitude: "13"; latitude: "91"; height: "119"; }
- ListElement{ longitude: "13"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "13"; latitude: "93"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "13"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "13"; latitude: "96"; height: "129"; }
- ListElement{ longitude: "13"; latitude: "97"; height: "132"; }
- ListElement{ longitude: "13"; latitude: "98"; height: "137"; }
- ListElement{ longitude: "13"; latitude: "99"; height: "140"; }
- ListElement{ longitude: "14"; latitude: "0"; height: "103"; }
- ListElement{ longitude: "14"; latitude: "1"; height: "99"; }
- ListElement{ longitude: "14"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "14"; latitude: "3"; height: "137"; }
- ListElement{ longitude: "14"; latitude: "4"; height: "134"; }
- ListElement{ longitude: "14"; latitude: "5"; height: "131"; }
- ListElement{ longitude: "14"; latitude: "6"; height: "130"; }
- ListElement{ longitude: "14"; latitude: "7"; height: "128"; }
- ListElement{ longitude: "14"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "14"; latitude: "9"; height: "126"; }
- ListElement{ longitude: "14"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "14"; latitude: "11"; height: "127"; }
- ListElement{ longitude: "14"; latitude: "12"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "13"; height: "132"; }
- ListElement{ longitude: "14"; latitude: "14"; height: "132"; }
- ListElement{ longitude: "14"; latitude: "15"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "16"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "14"; latitude: "18"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "19"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "20"; height: "116"; }
- ListElement{ longitude: "14"; latitude: "21"; height: "115"; }
- ListElement{ longitude: "14"; latitude: "22"; height: "116"; }
- ListElement{ longitude: "14"; latitude: "23"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "14"; latitude: "25"; height: "114"; }
- ListElement{ longitude: "14"; latitude: "26"; height: "108"; }
- ListElement{ longitude: "14"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "14"; latitude: "28"; height: "111"; }
- ListElement{ longitude: "14"; latitude: "29"; height: "114"; }
- ListElement{ longitude: "14"; latitude: "30"; height: "114"; }
- ListElement{ longitude: "14"; latitude: "31"; height: "115"; }
- ListElement{ longitude: "14"; latitude: "32"; height: "118"; }
- ListElement{ longitude: "14"; latitude: "33"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "34"; height: "116"; }
- ListElement{ longitude: "14"; latitude: "35"; height: "119"; }
- ListElement{ longitude: "14"; latitude: "36"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "14"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "14"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "14"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "14"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "14"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "14"; latitude: "44"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "46"; height: "130"; }
- ListElement{ longitude: "14"; latitude: "47"; height: "131"; }
- ListElement{ longitude: "14"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "14"; latitude: "49"; height: "131"; }
- ListElement{ longitude: "14"; latitude: "50"; height: "130"; }
- ListElement{ longitude: "14"; latitude: "51"; height: "131"; }
- ListElement{ longitude: "14"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "14"; latitude: "53"; height: "132"; }
- ListElement{ longitude: "14"; latitude: "54"; height: "130"; }
- ListElement{ longitude: "14"; latitude: "55"; height: "127"; }
- ListElement{ longitude: "14"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "57"; height: "120"; }
- ListElement{ longitude: "14"; latitude: "58"; height: "120"; }
- ListElement{ longitude: "14"; latitude: "59"; height: "118"; }
- ListElement{ longitude: "14"; latitude: "60"; height: "121"; }
- ListElement{ longitude: "14"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "62"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "65"; height: "123"; }
- ListElement{ longitude: "14"; latitude: "66"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "67"; height: "121"; }
- ListElement{ longitude: "14"; latitude: "68"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "69"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "70"; height: "118"; }
- ListElement{ longitude: "14"; latitude: "71"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "14"; latitude: "73"; height: "120"; }
- ListElement{ longitude: "14"; latitude: "74"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "75"; height: "112"; }
- ListElement{ longitude: "14"; latitude: "76"; height: "113"; }
- ListElement{ longitude: "14"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "14"; latitude: "78"; height: "113"; }
- ListElement{ longitude: "14"; latitude: "79"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "80"; height: "121"; }
- ListElement{ longitude: "14"; latitude: "81"; height: "121"; }
- ListElement{ longitude: "14"; latitude: "82"; height: "119"; }
- ListElement{ longitude: "14"; latitude: "83"; height: "112"; }
- ListElement{ longitude: "14"; latitude: "84"; height: "108"; }
- ListElement{ longitude: "14"; latitude: "85"; height: "107"; }
- ListElement{ longitude: "14"; latitude: "86"; height: "104"; }
- ListElement{ longitude: "14"; latitude: "87"; height: "103"; }
- ListElement{ longitude: "14"; latitude: "88"; height: "105"; }
- ListElement{ longitude: "14"; latitude: "89"; height: "108"; }
- ListElement{ longitude: "14"; latitude: "90"; height: "114"; }
- ListElement{ longitude: "14"; latitude: "91"; height: "117"; }
- ListElement{ longitude: "14"; latitude: "92"; height: "108"; }
- ListElement{ longitude: "14"; latitude: "93"; height: "125"; }
- ListElement{ longitude: "14"; latitude: "94"; height: "126"; }
- ListElement{ longitude: "14"; latitude: "95"; height: "126"; }
- ListElement{ longitude: "14"; latitude: "96"; height: "128"; }
- ListElement{ longitude: "14"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "14"; latitude: "98"; height: "137"; }
- ListElement{ longitude: "14"; latitude: "99"; height: "136"; }
- ListElement{ longitude: "15"; latitude: "0"; height: "96"; }
- ListElement{ longitude: "15"; latitude: "1"; height: "98"; }
- ListElement{ longitude: "15"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "15"; latitude: "3"; height: "138"; }
- ListElement{ longitude: "15"; latitude: "4"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "5"; height: "131"; }
- ListElement{ longitude: "15"; latitude: "6"; height: "132"; }
- ListElement{ longitude: "15"; latitude: "7"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "15"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "15"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "15"; latitude: "12"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "13"; height: "131"; }
- ListElement{ longitude: "15"; latitude: "14"; height: "133"; }
- ListElement{ longitude: "15"; latitude: "15"; height: "132"; }
- ListElement{ longitude: "15"; latitude: "16"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "15"; latitude: "18"; height: "124"; }
- ListElement{ longitude: "15"; latitude: "19"; height: "122"; }
- ListElement{ longitude: "15"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "15"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "15"; latitude: "22"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "23"; height: "122"; }
- ListElement{ longitude: "15"; latitude: "24"; height: "117"; }
- ListElement{ longitude: "15"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "15"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "15"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "15"; latitude: "28"; height: "112"; }
- ListElement{ longitude: "15"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "15"; latitude: "30"; height: "115"; }
- ListElement{ longitude: "15"; latitude: "31"; height: "118"; }
- ListElement{ longitude: "15"; latitude: "32"; height: "118"; }
- ListElement{ longitude: "15"; latitude: "33"; height: "116"; }
- ListElement{ longitude: "15"; latitude: "34"; height: "116"; }
- ListElement{ longitude: "15"; latitude: "35"; height: "117"; }
- ListElement{ longitude: "15"; latitude: "36"; height: "117"; }
- ListElement{ longitude: "15"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "15"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "15"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "15"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "15"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "44"; height: "130"; }
- ListElement{ longitude: "15"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "15"; latitude: "46"; height: "130"; }
- ListElement{ longitude: "15"; latitude: "47"; height: "128"; }
- ListElement{ longitude: "15"; latitude: "48"; height: "127"; }
- ListElement{ longitude: "15"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "15"; latitude: "50"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "51"; height: "130"; }
- ListElement{ longitude: "15"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "15"; latitude: "53"; height: "132"; }
- ListElement{ longitude: "15"; latitude: "54"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "55"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "56"; height: "124"; }
- ListElement{ longitude: "15"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "15"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "15"; latitude: "59"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "60"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "15"; latitude: "62"; height: "120"; }
- ListElement{ longitude: "15"; latitude: "63"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "64"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "65"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "15"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "15"; latitude: "68"; height: "115"; }
- ListElement{ longitude: "15"; latitude: "69"; height: "114"; }
- ListElement{ longitude: "15"; latitude: "70"; height: "116"; }
- ListElement{ longitude: "15"; latitude: "71"; height: "117"; }
- ListElement{ longitude: "15"; latitude: "72"; height: "118"; }
- ListElement{ longitude: "15"; latitude: "73"; height: "115"; }
- ListElement{ longitude: "15"; latitude: "74"; height: "113"; }
- ListElement{ longitude: "15"; latitude: "75"; height: "111"; }
- ListElement{ longitude: "15"; latitude: "76"; height: "110"; }
- ListElement{ longitude: "15"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "15"; latitude: "78"; height: "113"; }
- ListElement{ longitude: "15"; latitude: "79"; height: "113"; }
- ListElement{ longitude: "15"; latitude: "80"; height: "121"; }
- ListElement{ longitude: "15"; latitude: "81"; height: "123"; }
- ListElement{ longitude: "15"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "15"; latitude: "83"; height: "121"; }
- ListElement{ longitude: "15"; latitude: "84"; height: "112"; }
- ListElement{ longitude: "15"; latitude: "85"; height: "107"; }
- ListElement{ longitude: "15"; latitude: "86"; height: "105"; }
- ListElement{ longitude: "15"; latitude: "87"; height: "104"; }
- ListElement{ longitude: "15"; latitude: "88"; height: "101"; }
- ListElement{ longitude: "15"; latitude: "89"; height: "108"; }
- ListElement{ longitude: "15"; latitude: "90"; height: "112"; }
- ListElement{ longitude: "15"; latitude: "91"; height: "119"; }
- ListElement{ longitude: "15"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "15"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "15"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "15"; latitude: "95"; height: "126"; }
- ListElement{ longitude: "15"; latitude: "96"; height: "129"; }
- ListElement{ longitude: "15"; latitude: "97"; height: "132"; }
- ListElement{ longitude: "15"; latitude: "98"; height: "133"; }
- ListElement{ longitude: "15"; latitude: "99"; height: "132"; }
- ListElement{ longitude: "16"; latitude: "0"; height: "99"; }
- ListElement{ longitude: "16"; latitude: "1"; height: "105"; }
- ListElement{ longitude: "16"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "3"; height: "135"; }
- ListElement{ longitude: "16"; latitude: "4"; height: "139"; }
- ListElement{ longitude: "16"; latitude: "5"; height: "138"; }
- ListElement{ longitude: "16"; latitude: "6"; height: "133"; }
- ListElement{ longitude: "16"; latitude: "7"; height: "129"; }
- ListElement{ longitude: "16"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "16"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "16"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "16"; latitude: "11"; height: "123"; }
- ListElement{ longitude: "16"; latitude: "12"; height: "126"; }
- ListElement{ longitude: "16"; latitude: "13"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "14"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "15"; height: "129"; }
- ListElement{ longitude: "16"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "16"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "16"; latitude: "18"; height: "123"; }
- ListElement{ longitude: "16"; latitude: "19"; height: "123"; }
- ListElement{ longitude: "16"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "24"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "25"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "16"; latitude: "27"; height: "113"; }
- ListElement{ longitude: "16"; latitude: "28"; height: "114"; }
- ListElement{ longitude: "16"; latitude: "29"; height: "116"; }
- ListElement{ longitude: "16"; latitude: "30"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "31"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "32"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "33"; height: "116"; }
- ListElement{ longitude: "16"; latitude: "34"; height: "114"; }
- ListElement{ longitude: "16"; latitude: "35"; height: "116"; }
- ListElement{ longitude: "16"; latitude: "36"; height: "118"; }
- ListElement{ longitude: "16"; latitude: "37"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "38"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "16"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "16"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "16"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "16"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "16"; latitude: "44"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "16"; latitude: "47"; height: "128"; }
- ListElement{ longitude: "16"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "16"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "16"; latitude: "50"; height: "124"; }
- ListElement{ longitude: "16"; latitude: "51"; height: "126"; }
- ListElement{ longitude: "16"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "16"; latitude: "54"; height: "133"; }
- ListElement{ longitude: "16"; latitude: "55"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "56"; height: "127"; }
- ListElement{ longitude: "16"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "16"; latitude: "58"; height: "121"; }
- ListElement{ longitude: "16"; latitude: "59"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "60"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "61"; height: "120"; }
- ListElement{ longitude: "16"; latitude: "62"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "63"; height: "121"; }
- ListElement{ longitude: "16"; latitude: "64"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "66"; height: "114"; }
- ListElement{ longitude: "16"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "16"; latitude: "68"; height: "116"; }
- ListElement{ longitude: "16"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "16"; latitude: "70"; height: "111"; }
- ListElement{ longitude: "16"; latitude: "71"; height: "112"; }
- ListElement{ longitude: "16"; latitude: "72"; height: "114"; }
- ListElement{ longitude: "16"; latitude: "73"; height: "112"; }
- ListElement{ longitude: "16"; latitude: "74"; height: "112"; }
- ListElement{ longitude: "16"; latitude: "75"; height: "109"; }
- ListElement{ longitude: "16"; latitude: "76"; height: "109"; }
- ListElement{ longitude: "16"; latitude: "77"; height: "110"; }
- ListElement{ longitude: "16"; latitude: "78"; height: "98"; }
- ListElement{ longitude: "16"; latitude: "79"; height: "91"; }
- ListElement{ longitude: "16"; latitude: "80"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "81"; height: "122"; }
- ListElement{ longitude: "16"; latitude: "82"; height: "109"; }
- ListElement{ longitude: "16"; latitude: "83"; height: "112"; }
- ListElement{ longitude: "16"; latitude: "84"; height: "118"; }
- ListElement{ longitude: "16"; latitude: "85"; height: "109"; }
- ListElement{ longitude: "16"; latitude: "86"; height: "105"; }
- ListElement{ longitude: "16"; latitude: "87"; height: "105"; }
- ListElement{ longitude: "16"; latitude: "88"; height: "90"; }
- ListElement{ longitude: "16"; latitude: "89"; height: "106"; }
- ListElement{ longitude: "16"; latitude: "90"; height: "110"; }
- ListElement{ longitude: "16"; latitude: "91"; height: "113"; }
- ListElement{ longitude: "16"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "16"; latitude: "93"; height: "116"; }
- ListElement{ longitude: "16"; latitude: "94"; height: "119"; }
- ListElement{ longitude: "16"; latitude: "95"; height: "124"; }
- ListElement{ longitude: "16"; latitude: "96"; height: "127"; }
- ListElement{ longitude: "16"; latitude: "97"; height: "130"; }
- ListElement{ longitude: "16"; latitude: "98"; height: "132"; }
- ListElement{ longitude: "16"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "0"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "1"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "2"; height: "130"; }
- ListElement{ longitude: "17"; latitude: "3"; height: "136"; }
- ListElement{ longitude: "17"; latitude: "4"; height: "138"; }
- ListElement{ longitude: "17"; latitude: "5"; height: "132"; }
- ListElement{ longitude: "17"; latitude: "6"; height: "134"; }
- ListElement{ longitude: "17"; latitude: "7"; height: "129"; }
- ListElement{ longitude: "17"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "17"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "17"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "17"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "17"; latitude: "12"; height: "127"; }
- ListElement{ longitude: "17"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "17"; latitude: "14"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "17"; latitude: "16"; height: "124"; }
- ListElement{ longitude: "17"; latitude: "17"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "18"; height: "118"; }
- ListElement{ longitude: "17"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "17"; latitude: "20"; height: "116"; }
- ListElement{ longitude: "17"; latitude: "21"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "22"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "24"; height: "119"; }
- ListElement{ longitude: "17"; latitude: "25"; height: "118"; }
- ListElement{ longitude: "17"; latitude: "26"; height: "115"; }
- ListElement{ longitude: "17"; latitude: "27"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "17"; latitude: "29"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "17"; latitude: "31"; height: "121"; }
- ListElement{ longitude: "17"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "17"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "17"; latitude: "34"; height: "115"; }
- ListElement{ longitude: "17"; latitude: "35"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "36"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "39"; height: "126"; }
- ListElement{ longitude: "17"; latitude: "40"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "17"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "17"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "44"; height: "130"; }
- ListElement{ longitude: "17"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "17"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "17"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "17"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "17"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "17"; latitude: "50"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "51"; height: "124"; }
- ListElement{ longitude: "17"; latitude: "52"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "53"; height: "130"; }
- ListElement{ longitude: "17"; latitude: "54"; height: "134"; }
- ListElement{ longitude: "17"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "17"; latitude: "56"; height: "129"; }
- ListElement{ longitude: "17"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "17"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "17"; latitude: "60"; height: "121"; }
- ListElement{ longitude: "17"; latitude: "61"; height: "118"; }
- ListElement{ longitude: "17"; latitude: "62"; height: "107"; }
- ListElement{ longitude: "17"; latitude: "63"; height: "118"; }
- ListElement{ longitude: "17"; latitude: "64"; height: "113"; }
- ListElement{ longitude: "17"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "17"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "17"; latitude: "67"; height: "111"; }
- ListElement{ longitude: "17"; latitude: "68"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "69"; height: "109"; }
- ListElement{ longitude: "17"; latitude: "70"; height: "109"; }
- ListElement{ longitude: "17"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "72"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "73"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "74"; height: "109"; }
- ListElement{ longitude: "17"; latitude: "75"; height: "109"; }
- ListElement{ longitude: "17"; latitude: "76"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "17"; latitude: "78"; height: "106"; }
- ListElement{ longitude: "17"; latitude: "79"; height: "101"; }
- ListElement{ longitude: "17"; latitude: "80"; height: "115"; }
- ListElement{ longitude: "17"; latitude: "81"; height: "119"; }
- ListElement{ longitude: "17"; latitude: "82"; height: "108"; }
- ListElement{ longitude: "17"; latitude: "83"; height: "116"; }
- ListElement{ longitude: "17"; latitude: "84"; height: "119"; }
- ListElement{ longitude: "17"; latitude: "85"; height: "112"; }
- ListElement{ longitude: "17"; latitude: "86"; height: "108"; }
- ListElement{ longitude: "17"; latitude: "87"; height: "105"; }
- ListElement{ longitude: "17"; latitude: "88"; height: "104"; }
- ListElement{ longitude: "17"; latitude: "89"; height: "105"; }
- ListElement{ longitude: "17"; latitude: "90"; height: "106"; }
- ListElement{ longitude: "17"; latitude: "91"; height: "110"; }
- ListElement{ longitude: "17"; latitude: "92"; height: "111"; }
- ListElement{ longitude: "17"; latitude: "93"; height: "113"; }
- ListElement{ longitude: "17"; latitude: "94"; height: "116"; }
- ListElement{ longitude: "17"; latitude: "95"; height: "121"; }
- ListElement{ longitude: "17"; latitude: "96"; height: "125"; }
- ListElement{ longitude: "17"; latitude: "97"; height: "128"; }
- ListElement{ longitude: "17"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "17"; latitude: "99"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "0"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "1"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "2"; height: "131"; }
- ListElement{ longitude: "18"; latitude: "3"; height: "133"; }
- ListElement{ longitude: "18"; latitude: "4"; height: "135"; }
- ListElement{ longitude: "18"; latitude: "5"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "6"; height: "133"; }
- ListElement{ longitude: "18"; latitude: "7"; height: "130"; }
- ListElement{ longitude: "18"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "18"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "18"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "18"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "18"; latitude: "12"; height: "125"; }
- ListElement{ longitude: "18"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "18"; latitude: "15"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "16"; height: "112"; }
- ListElement{ longitude: "18"; latitude: "17"; height: "111"; }
- ListElement{ longitude: "18"; latitude: "18"; height: "116"; }
- ListElement{ longitude: "18"; latitude: "19"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "21"; height: "117"; }
- ListElement{ longitude: "18"; latitude: "22"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "23"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "18"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "18"; latitude: "27"; height: "118"; }
- ListElement{ longitude: "18"; latitude: "28"; height: "120"; }
- ListElement{ longitude: "18"; latitude: "29"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "18"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "18"; latitude: "32"; height: "123"; }
- ListElement{ longitude: "18"; latitude: "33"; height: "123"; }
- ListElement{ longitude: "18"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "35"; height: "120"; }
- ListElement{ longitude: "18"; latitude: "36"; height: "121"; }
- ListElement{ longitude: "18"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "18"; latitude: "40"; height: "129"; }
- ListElement{ longitude: "18"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "18"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "18"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "18"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "18"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "18"; latitude: "46"; height: "128"; }
- ListElement{ longitude: "18"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "18"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "18"; latitude: "50"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "51"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "52"; height: "126"; }
- ListElement{ longitude: "18"; latitude: "53"; height: "129"; }
- ListElement{ longitude: "18"; latitude: "54"; height: "131"; }
- ListElement{ longitude: "18"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "18"; latitude: "56"; height: "130"; }
- ListElement{ longitude: "18"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "18"; latitude: "58"; height: "123"; }
- ListElement{ longitude: "18"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "60"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "18"; latitude: "62"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "63"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "64"; height: "111"; }
- ListElement{ longitude: "18"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "18"; latitude: "66"; height: "114"; }
- ListElement{ longitude: "18"; latitude: "67"; height: "107"; }
- ListElement{ longitude: "18"; latitude: "68"; height: "108"; }
- ListElement{ longitude: "18"; latitude: "69"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "70"; height: "108"; }
- ListElement{ longitude: "18"; latitude: "71"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "72"; height: "111"; }
- ListElement{ longitude: "18"; latitude: "73"; height: "110"; }
- ListElement{ longitude: "18"; latitude: "74"; height: "111"; }
- ListElement{ longitude: "18"; latitude: "75"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "76"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "77"; height: "110"; }
- ListElement{ longitude: "18"; latitude: "78"; height: "110"; }
- ListElement{ longitude: "18"; latitude: "79"; height: "91"; }
- ListElement{ longitude: "18"; latitude: "80"; height: "106"; }
- ListElement{ longitude: "18"; latitude: "81"; height: "115"; }
- ListElement{ longitude: "18"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "18"; latitude: "83"; height: "123"; }
- ListElement{ longitude: "18"; latitude: "84"; height: "117"; }
- ListElement{ longitude: "18"; latitude: "85"; height: "110"; }
- ListElement{ longitude: "18"; latitude: "86"; height: "104"; }
- ListElement{ longitude: "18"; latitude: "87"; height: "101"; }
- ListElement{ longitude: "18"; latitude: "88"; height: "102"; }
- ListElement{ longitude: "18"; latitude: "89"; height: "103"; }
- ListElement{ longitude: "18"; latitude: "90"; height: "104"; }
- ListElement{ longitude: "18"; latitude: "91"; height: "107"; }
- ListElement{ longitude: "18"; latitude: "92"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "93"; height: "109"; }
- ListElement{ longitude: "18"; latitude: "94"; height: "113"; }
- ListElement{ longitude: "18"; latitude: "95"; height: "119"; }
- ListElement{ longitude: "18"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "18"; latitude: "97"; height: "123"; }
- ListElement{ longitude: "18"; latitude: "98"; height: "130"; }
- ListElement{ longitude: "18"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "0"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "3"; height: "128"; }
- ListElement{ longitude: "19"; latitude: "4"; height: "134"; }
- ListElement{ longitude: "19"; latitude: "5"; height: "134"; }
- ListElement{ longitude: "19"; latitude: "6"; height: "131"; }
- ListElement{ longitude: "19"; latitude: "7"; height: "128"; }
- ListElement{ longitude: "19"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "19"; latitude: "10"; height: "123"; }
- ListElement{ longitude: "19"; latitude: "11"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "12"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "13"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "14"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "15"; height: "113"; }
- ListElement{ longitude: "19"; latitude: "16"; height: "111"; }
- ListElement{ longitude: "19"; latitude: "17"; height: "113"; }
- ListElement{ longitude: "19"; latitude: "18"; height: "115"; }
- ListElement{ longitude: "19"; latitude: "19"; height: "119"; }
- ListElement{ longitude: "19"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "19"; latitude: "22"; height: "117"; }
- ListElement{ longitude: "19"; latitude: "23"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "24"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "27"; height: "117"; }
- ListElement{ longitude: "19"; latitude: "28"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "31"; height: "124"; }
- ListElement{ longitude: "19"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "19"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "19"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "37"; height: "128"; }
- ListElement{ longitude: "19"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "19"; latitude: "39"; height: "130"; }
- ListElement{ longitude: "19"; latitude: "40"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "44"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "45"; height: "128"; }
- ListElement{ longitude: "19"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "19"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "19"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "19"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "50"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "52"; height: "123"; }
- ListElement{ longitude: "19"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "19"; latitude: "54"; height: "129"; }
- ListElement{ longitude: "19"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "19"; latitude: "56"; height: "128"; }
- ListElement{ longitude: "19"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "19"; latitude: "58"; height: "118"; }
- ListElement{ longitude: "19"; latitude: "59"; height: "121"; }
- ListElement{ longitude: "19"; latitude: "60"; height: "122"; }
- ListElement{ longitude: "19"; latitude: "61"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "62"; height: "113"; }
- ListElement{ longitude: "19"; latitude: "63"; height: "119"; }
- ListElement{ longitude: "19"; latitude: "64"; height: "108"; }
- ListElement{ longitude: "19"; latitude: "65"; height: "105"; }
- ListElement{ longitude: "19"; latitude: "66"; height: "109"; }
- ListElement{ longitude: "19"; latitude: "67"; height: "108"; }
- ListElement{ longitude: "19"; latitude: "68"; height: "105"; }
- ListElement{ longitude: "19"; latitude: "69"; height: "107"; }
- ListElement{ longitude: "19"; latitude: "70"; height: "107"; }
- ListElement{ longitude: "19"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "19"; latitude: "72"; height: "112"; }
- ListElement{ longitude: "19"; latitude: "73"; height: "112"; }
- ListElement{ longitude: "19"; latitude: "74"; height: "110"; }
- ListElement{ longitude: "19"; latitude: "75"; height: "111"; }
- ListElement{ longitude: "19"; latitude: "76"; height: "111"; }
- ListElement{ longitude: "19"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "19"; latitude: "78"; height: "111"; }
- ListElement{ longitude: "19"; latitude: "79"; height: "110"; }
- ListElement{ longitude: "19"; latitude: "80"; height: "109"; }
- ListElement{ longitude: "19"; latitude: "81"; height: "110"; }
- ListElement{ longitude: "19"; latitude: "82"; height: "113"; }
- ListElement{ longitude: "19"; latitude: "83"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "84"; height: "116"; }
- ListElement{ longitude: "19"; latitude: "85"; height: "112"; }
- ListElement{ longitude: "19"; latitude: "86"; height: "105"; }
- ListElement{ longitude: "19"; latitude: "87"; height: "102"; }
- ListElement{ longitude: "19"; latitude: "88"; height: "101"; }
- ListElement{ longitude: "19"; latitude: "89"; height: "102"; }
- ListElement{ longitude: "19"; latitude: "90"; height: "105"; }
- ListElement{ longitude: "19"; latitude: "91"; height: "99"; }
- ListElement{ longitude: "19"; latitude: "92"; height: "103"; }
- ListElement{ longitude: "19"; latitude: "93"; height: "104"; }
- ListElement{ longitude: "19"; latitude: "94"; height: "110"; }
- ListElement{ longitude: "19"; latitude: "95"; height: "114"; }
- ListElement{ longitude: "19"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "19"; latitude: "97"; height: "123"; }
- ListElement{ longitude: "19"; latitude: "98"; height: "127"; }
- ListElement{ longitude: "19"; latitude: "99"; height: "114"; }
- ListElement{ longitude: "20"; latitude: "0"; height: "117"; }
- ListElement{ longitude: "20"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "20"; latitude: "4"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "5"; height: "127"; }
- ListElement{ longitude: "20"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "7"; height: "123"; }
- ListElement{ longitude: "20"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "10"; height: "123"; }
- ListElement{ longitude: "20"; latitude: "11"; height: "122"; }
- ListElement{ longitude: "20"; latitude: "12"; height: "123"; }
- ListElement{ longitude: "20"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "20"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "15"; height: "114"; }
- ListElement{ longitude: "20"; latitude: "16"; height: "112"; }
- ListElement{ longitude: "20"; latitude: "17"; height: "113"; }
- ListElement{ longitude: "20"; latitude: "18"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "22"; height: "119"; }
- ListElement{ longitude: "20"; latitude: "23"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "24"; height: "116"; }
- ListElement{ longitude: "20"; latitude: "25"; height: "117"; }
- ListElement{ longitude: "20"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "20"; latitude: "27"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "28"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "30"; height: "119"; }
- ListElement{ longitude: "20"; latitude: "31"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "20"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "20"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "20"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "20"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "20"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "20"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "20"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "20"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "20"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "20"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "50"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "20"; latitude: "52"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "53"; height: "123"; }
- ListElement{ longitude: "20"; latitude: "54"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "55"; height: "129"; }
- ListElement{ longitude: "20"; latitude: "56"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "57"; height: "111"; }
- ListElement{ longitude: "20"; latitude: "58"; height: "108"; }
- ListElement{ longitude: "20"; latitude: "59"; height: "118"; }
- ListElement{ longitude: "20"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "20"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "20"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "20"; latitude: "65"; height: "116"; }
- ListElement{ longitude: "20"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "20"; latitude: "67"; height: "108"; }
- ListElement{ longitude: "20"; latitude: "68"; height: "105"; }
- ListElement{ longitude: "20"; latitude: "69"; height: "107"; }
- ListElement{ longitude: "20"; latitude: "70"; height: "106"; }
- ListElement{ longitude: "20"; latitude: "71"; height: "109"; }
- ListElement{ longitude: "20"; latitude: "72"; height: "112"; }
- ListElement{ longitude: "20"; latitude: "73"; height: "112"; }
- ListElement{ longitude: "20"; latitude: "74"; height: "112"; }
- ListElement{ longitude: "20"; latitude: "75"; height: "110"; }
- ListElement{ longitude: "20"; latitude: "76"; height: "111"; }
- ListElement{ longitude: "20"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "20"; latitude: "78"; height: "110"; }
- ListElement{ longitude: "20"; latitude: "79"; height: "107"; }
- ListElement{ longitude: "20"; latitude: "80"; height: "107"; }
- ListElement{ longitude: "20"; latitude: "81"; height: "109"; }
- ListElement{ longitude: "20"; latitude: "82"; height: "113"; }
- ListElement{ longitude: "20"; latitude: "83"; height: "116"; }
- ListElement{ longitude: "20"; latitude: "84"; height: "109"; }
- ListElement{ longitude: "20"; latitude: "85"; height: "102"; }
- ListElement{ longitude: "20"; latitude: "86"; height: "107"; }
- ListElement{ longitude: "20"; latitude: "87"; height: "103"; }
- ListElement{ longitude: "20"; latitude: "88"; height: "102"; }
- ListElement{ longitude: "20"; latitude: "89"; height: "102"; }
- ListElement{ longitude: "20"; latitude: "90"; height: "104"; }
- ListElement{ longitude: "20"; latitude: "91"; height: "101"; }
- ListElement{ longitude: "20"; latitude: "92"; height: "110"; }
- ListElement{ longitude: "20"; latitude: "93"; height: "110"; }
- ListElement{ longitude: "20"; latitude: "94"; height: "111"; }
- ListElement{ longitude: "20"; latitude: "95"; height: "111"; }
- ListElement{ longitude: "20"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "20"; latitude: "97"; height: "121"; }
- ListElement{ longitude: "20"; latitude: "98"; height: "122"; }
- ListElement{ longitude: "20"; latitude: "99"; height: "112"; }
- ListElement{ longitude: "21"; latitude: "0"; height: "116"; }
- ListElement{ longitude: "21"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "21"; latitude: "2"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "5"; height: "123"; }
- ListElement{ longitude: "21"; latitude: "6"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "8"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "9"; height: "123"; }
- ListElement{ longitude: "21"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "12"; height: "124"; }
- ListElement{ longitude: "21"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "14"; height: "124"; }
- ListElement{ longitude: "21"; latitude: "15"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "17"; height: "118"; }
- ListElement{ longitude: "21"; latitude: "18"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "21"; latitude: "24"; height: "116"; }
- ListElement{ longitude: "21"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "21"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "21"; latitude: "27"; height: "115"; }
- ListElement{ longitude: "21"; latitude: "28"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "30"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "21"; latitude: "32"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "21"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "21"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "21"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "21"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "21"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "21"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "21"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "50"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "53"; height: "121"; }
- ListElement{ longitude: "21"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "55"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "21"; latitude: "57"; height: "114"; }
- ListElement{ longitude: "21"; latitude: "58"; height: "111"; }
- ListElement{ longitude: "21"; latitude: "59"; height: "120"; }
- ListElement{ longitude: "21"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "21"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "21"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "21"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "21"; latitude: "64"; height: "118"; }
- ListElement{ longitude: "21"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "21"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "21"; latitude: "67"; height: "109"; }
- ListElement{ longitude: "21"; latitude: "68"; height: "108"; }
- ListElement{ longitude: "21"; latitude: "69"; height: "109"; }
- ListElement{ longitude: "21"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "72"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "73"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "74"; height: "112"; }
- ListElement{ longitude: "21"; latitude: "75"; height: "112"; }
- ListElement{ longitude: "21"; latitude: "76"; height: "111"; }
- ListElement{ longitude: "21"; latitude: "77"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "78"; height: "109"; }
- ListElement{ longitude: "21"; latitude: "79"; height: "106"; }
- ListElement{ longitude: "21"; latitude: "80"; height: "106"; }
- ListElement{ longitude: "21"; latitude: "81"; height: "107"; }
- ListElement{ longitude: "21"; latitude: "82"; height: "110"; }
- ListElement{ longitude: "21"; latitude: "83"; height: "118"; }
- ListElement{ longitude: "21"; latitude: "84"; height: "109"; }
- ListElement{ longitude: "21"; latitude: "85"; height: "107"; }
- ListElement{ longitude: "21"; latitude: "86"; height: "113"; }
- ListElement{ longitude: "21"; latitude: "87"; height: "103"; }
- ListElement{ longitude: "21"; latitude: "88"; height: "103"; }
- ListElement{ longitude: "21"; latitude: "89"; height: "105"; }
- ListElement{ longitude: "21"; latitude: "90"; height: "104"; }
- ListElement{ longitude: "21"; latitude: "91"; height: "102"; }
- ListElement{ longitude: "21"; latitude: "92"; height: "102"; }
- ListElement{ longitude: "21"; latitude: "93"; height: "104"; }
- ListElement{ longitude: "21"; latitude: "94"; height: "105"; }
- ListElement{ longitude: "21"; latitude: "95"; height: "113"; }
- ListElement{ longitude: "21"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "21"; latitude: "97"; height: "122"; }
- ListElement{ longitude: "21"; latitude: "98"; height: "123"; }
- ListElement{ longitude: "21"; latitude: "99"; height: "114"; }
- ListElement{ longitude: "22"; latitude: "0"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "2"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "3"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "7"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "8"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "12"; height: "127"; }
- ListElement{ longitude: "22"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "22"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "16"; height: "122"; }
- ListElement{ longitude: "22"; latitude: "17"; height: "122"; }
- ListElement{ longitude: "22"; latitude: "18"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "19"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "20"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "23"; height: "116"; }
- ListElement{ longitude: "22"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "22"; latitude: "25"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "27"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "28"; height: "117"; }
- ListElement{ longitude: "22"; latitude: "29"; height: "117"; }
- ListElement{ longitude: "22"; latitude: "30"; height: "118"; }
- ListElement{ longitude: "22"; latitude: "31"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "32"; height: "122"; }
- ListElement{ longitude: "22"; latitude: "33"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "22"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "22"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "40"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "46"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "22"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "22"; latitude: "50"; height: "121"; }
- ListElement{ longitude: "22"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "53"; height: "119"; }
- ListElement{ longitude: "22"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "22"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "22"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "58"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "22"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "22"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "22"; latitude: "64"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "65"; height: "118"; }
- ListElement{ longitude: "22"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "22"; latitude: "67"; height: "115"; }
- ListElement{ longitude: "22"; latitude: "68"; height: "116"; }
- ListElement{ longitude: "22"; latitude: "69"; height: "114"; }
- ListElement{ longitude: "22"; latitude: "70"; height: "113"; }
- ListElement{ longitude: "22"; latitude: "71"; height: "112"; }
- ListElement{ longitude: "22"; latitude: "72"; height: "113"; }
- ListElement{ longitude: "22"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "22"; latitude: "74"; height: "112"; }
- ListElement{ longitude: "22"; latitude: "75"; height: "110"; }
- ListElement{ longitude: "22"; latitude: "76"; height: "110"; }
- ListElement{ longitude: "22"; latitude: "77"; height: "107"; }
- ListElement{ longitude: "22"; latitude: "78"; height: "105"; }
- ListElement{ longitude: "22"; latitude: "79"; height: "102"; }
- ListElement{ longitude: "22"; latitude: "80"; height: "104"; }
- ListElement{ longitude: "22"; latitude: "81"; height: "108"; }
- ListElement{ longitude: "22"; latitude: "82"; height: "110"; }
- ListElement{ longitude: "22"; latitude: "83"; height: "114"; }
- ListElement{ longitude: "22"; latitude: "84"; height: "118"; }
- ListElement{ longitude: "22"; latitude: "85"; height: "117"; }
- ListElement{ longitude: "22"; latitude: "86"; height: "111"; }
- ListElement{ longitude: "22"; latitude: "87"; height: "107"; }
- ListElement{ longitude: "22"; latitude: "88"; height: "107"; }
- ListElement{ longitude: "22"; latitude: "89"; height: "107"; }
- ListElement{ longitude: "22"; latitude: "90"; height: "103"; }
- ListElement{ longitude: "22"; latitude: "91"; height: "102"; }
- ListElement{ longitude: "22"; latitude: "92"; height: "101"; }
- ListElement{ longitude: "22"; latitude: "93"; height: "108"; }
- ListElement{ longitude: "22"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "22"; latitude: "95"; height: "117"; }
- ListElement{ longitude: "22"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "22"; latitude: "97"; height: "125"; }
- ListElement{ longitude: "22"; latitude: "98"; height: "128"; }
- ListElement{ longitude: "22"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "23"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "23"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "5"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "7"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "8"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "10"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "11"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "12"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "13"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "15"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "16"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "17"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "18"; height: "123"; }
- ListElement{ longitude: "23"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "20"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "24"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "25"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "26"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "28"; height: "116"; }
- ListElement{ longitude: "23"; latitude: "29"; height: "116"; }
- ListElement{ longitude: "23"; latitude: "30"; height: "118"; }
- ListElement{ longitude: "23"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "32"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "34"; height: "123"; }
- ListElement{ longitude: "23"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "23"; latitude: "37"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "38"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "23"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "45"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "23"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "23"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "23"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "23"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "23"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "23"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "23"; latitude: "59"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "60"; height: "130"; }
- ListElement{ longitude: "23"; latitude: "61"; height: "133"; }
- ListElement{ longitude: "23"; latitude: "62"; height: "130"; }
- ListElement{ longitude: "23"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "23"; latitude: "65"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "66"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "67"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "68"; height: "122"; }
- ListElement{ longitude: "23"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "23"; latitude: "70"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "71"; height: "115"; }
- ListElement{ longitude: "23"; latitude: "72"; height: "114"; }
- ListElement{ longitude: "23"; latitude: "73"; height: "112"; }
- ListElement{ longitude: "23"; latitude: "74"; height: "111"; }
- ListElement{ longitude: "23"; latitude: "75"; height: "111"; }
- ListElement{ longitude: "23"; latitude: "76"; height: "108"; }
- ListElement{ longitude: "23"; latitude: "77"; height: "107"; }
- ListElement{ longitude: "23"; latitude: "78"; height: "103"; }
- ListElement{ longitude: "23"; latitude: "79"; height: "102"; }
- ListElement{ longitude: "23"; latitude: "80"; height: "101"; }
- ListElement{ longitude: "23"; latitude: "81"; height: "106"; }
- ListElement{ longitude: "23"; latitude: "82"; height: "113"; }
- ListElement{ longitude: "23"; latitude: "83"; height: "112"; }
- ListElement{ longitude: "23"; latitude: "84"; height: "115"; }
- ListElement{ longitude: "23"; latitude: "85"; height: "111"; }
- ListElement{ longitude: "23"; latitude: "86"; height: "111"; }
- ListElement{ longitude: "23"; latitude: "87"; height: "109"; }
- ListElement{ longitude: "23"; latitude: "88"; height: "108"; }
- ListElement{ longitude: "23"; latitude: "89"; height: "108"; }
- ListElement{ longitude: "23"; latitude: "90"; height: "106"; }
- ListElement{ longitude: "23"; latitude: "91"; height: "103"; }
- ListElement{ longitude: "23"; latitude: "92"; height: "102"; }
- ListElement{ longitude: "23"; latitude: "93"; height: "108"; }
- ListElement{ longitude: "23"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "23"; latitude: "95"; height: "119"; }
- ListElement{ longitude: "23"; latitude: "96"; height: "125"; }
- ListElement{ longitude: "23"; latitude: "97"; height: "128"; }
- ListElement{ longitude: "23"; latitude: "98"; height: "135"; }
- ListElement{ longitude: "23"; latitude: "99"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "4"; height: "118"; }
- ListElement{ longitude: "24"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "7"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "8"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "9"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "10"; height: "124"; }
- ListElement{ longitude: "24"; latitude: "11"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "15"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "16"; height: "118"; }
- ListElement{ longitude: "24"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "18"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "24"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "24"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "25"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "26"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "28"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "24"; latitude: "31"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "32"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "24"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "24"; latitude: "39"; height: "125"; }
- ListElement{ longitude: "24"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "24"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "24"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "24"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "24"; latitude: "44"; height: "129"; }
- ListElement{ longitude: "24"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "24"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "24"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "24"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "24"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "24"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "24"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "24"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "24"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "24"; latitude: "58"; height: "126"; }
- ListElement{ longitude: "24"; latitude: "59"; height: "131"; }
- ListElement{ longitude: "24"; latitude: "60"; height: "133"; }
- ListElement{ longitude: "24"; latitude: "61"; height: "134"; }
- ListElement{ longitude: "24"; latitude: "62"; height: "132"; }
- ListElement{ longitude: "24"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "24"; latitude: "64"; height: "126"; }
- ListElement{ longitude: "24"; latitude: "65"; height: "125"; }
- ListElement{ longitude: "24"; latitude: "66"; height: "125"; }
- ListElement{ longitude: "24"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "24"; latitude: "68"; height: "128"; }
- ListElement{ longitude: "24"; latitude: "69"; height: "126"; }
- ListElement{ longitude: "24"; latitude: "70"; height: "124"; }
- ListElement{ longitude: "24"; latitude: "71"; height: "120"; }
- ListElement{ longitude: "24"; latitude: "72"; height: "117"; }
- ListElement{ longitude: "24"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "24"; latitude: "74"; height: "112"; }
- ListElement{ longitude: "24"; latitude: "75"; height: "112"; }
- ListElement{ longitude: "24"; latitude: "76"; height: "106"; }
- ListElement{ longitude: "24"; latitude: "77"; height: "105"; }
- ListElement{ longitude: "24"; latitude: "78"; height: "100"; }
- ListElement{ longitude: "24"; latitude: "79"; height: "99"; }
- ListElement{ longitude: "24"; latitude: "80"; height: "101"; }
- ListElement{ longitude: "24"; latitude: "81"; height: "104"; }
- ListElement{ longitude: "24"; latitude: "82"; height: "111"; }
- ListElement{ longitude: "24"; latitude: "83"; height: "114"; }
- ListElement{ longitude: "24"; latitude: "84"; height: "117"; }
- ListElement{ longitude: "24"; latitude: "85"; height: "114"; }
- ListElement{ longitude: "24"; latitude: "86"; height: "115"; }
- ListElement{ longitude: "24"; latitude: "87"; height: "112"; }
- ListElement{ longitude: "24"; latitude: "88"; height: "110"; }
- ListElement{ longitude: "24"; latitude: "89"; height: "108"; }
- ListElement{ longitude: "24"; latitude: "90"; height: "107"; }
- ListElement{ longitude: "24"; latitude: "91"; height: "104"; }
- ListElement{ longitude: "24"; latitude: "92"; height: "106"; }
- ListElement{ longitude: "24"; latitude: "93"; height: "110"; }
- ListElement{ longitude: "24"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "24"; latitude: "95"; height: "125"; }
- ListElement{ longitude: "24"; latitude: "96"; height: "130"; }
- ListElement{ longitude: "24"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "24"; latitude: "98"; height: "137"; }
- ListElement{ longitude: "24"; latitude: "99"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "0"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "2"; height: "116"; }
- ListElement{ longitude: "25"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "4"; height: "115"; }
- ListElement{ longitude: "25"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "25"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "11"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "12"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "13"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "14"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "15"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "25"; latitude: "23"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "26"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "27"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "30"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "31"; height: "124"; }
- ListElement{ longitude: "25"; latitude: "32"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "34"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "35"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "36"; height: "121"; }
- ListElement{ longitude: "25"; latitude: "37"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "25"; latitude: "39"; height: "126"; }
- ListElement{ longitude: "25"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "25"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "25"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "25"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "25"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "25"; latitude: "46"; height: "131"; }
- ListElement{ longitude: "25"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "25"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "50"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "25"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "25"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "25"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "25"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "25"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "25"; latitude: "60"; height: "130"; }
- ListElement{ longitude: "25"; latitude: "61"; height: "132"; }
- ListElement{ longitude: "25"; latitude: "62"; height: "132"; }
- ListElement{ longitude: "25"; latitude: "63"; height: "131"; }
- ListElement{ longitude: "25"; latitude: "64"; height: "130"; }
- ListElement{ longitude: "25"; latitude: "65"; height: "131"; }
- ListElement{ longitude: "25"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "25"; latitude: "67"; height: "133"; }
- ListElement{ longitude: "25"; latitude: "68"; height: "134"; }
- ListElement{ longitude: "25"; latitude: "69"; height: "133"; }
- ListElement{ longitude: "25"; latitude: "70"; height: "129"; }
- ListElement{ longitude: "25"; latitude: "71"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "25"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "74"; height: "116"; }
- ListElement{ longitude: "25"; latitude: "75"; height: "114"; }
- ListElement{ longitude: "25"; latitude: "76"; height: "109"; }
- ListElement{ longitude: "25"; latitude: "77"; height: "106"; }
- ListElement{ longitude: "25"; latitude: "78"; height: "102"; }
- ListElement{ longitude: "25"; latitude: "79"; height: "101"; }
- ListElement{ longitude: "25"; latitude: "80"; height: "102"; }
- ListElement{ longitude: "25"; latitude: "81"; height: "107"; }
- ListElement{ longitude: "25"; latitude: "82"; height: "111"; }
- ListElement{ longitude: "25"; latitude: "83"; height: "113"; }
- ListElement{ longitude: "25"; latitude: "84"; height: "115"; }
- ListElement{ longitude: "25"; latitude: "85"; height: "116"; }
- ListElement{ longitude: "25"; latitude: "86"; height: "118"; }
- ListElement{ longitude: "25"; latitude: "87"; height: "121"; }
- ListElement{ longitude: "25"; latitude: "88"; height: "119"; }
- ListElement{ longitude: "25"; latitude: "89"; height: "113"; }
- ListElement{ longitude: "25"; latitude: "90"; height: "103"; }
- ListElement{ longitude: "25"; latitude: "91"; height: "104"; }
- ListElement{ longitude: "25"; latitude: "92"; height: "106"; }
- ListElement{ longitude: "25"; latitude: "93"; height: "117"; }
- ListElement{ longitude: "25"; latitude: "94"; height: "111"; }
- ListElement{ longitude: "25"; latitude: "95"; height: "125"; }
- ListElement{ longitude: "25"; latitude: "96"; height: "134"; }
- ListElement{ longitude: "25"; latitude: "97"; height: "135"; }
- ListElement{ longitude: "25"; latitude: "98"; height: "135"; }
- ListElement{ longitude: "25"; latitude: "99"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "1"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "3"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "4"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "9"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "12"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "13"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "16"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "17"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "18"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "26"; latitude: "23"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "27"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "28"; height: "122"; }
- ListElement{ longitude: "26"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "26"; latitude: "32"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "34"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "35"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "26"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "26"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "26"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "26"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "26"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "45"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "26"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "26"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "50"; height: "122"; }
- ListElement{ longitude: "26"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "26"; latitude: "58"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "26"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "61"; height: "130"; }
- ListElement{ longitude: "26"; latitude: "62"; height: "130"; }
- ListElement{ longitude: "26"; latitude: "63"; height: "130"; }
- ListElement{ longitude: "26"; latitude: "64"; height: "130"; }
- ListElement{ longitude: "26"; latitude: "65"; height: "130"; }
- ListElement{ longitude: "26"; latitude: "66"; height: "131"; }
- ListElement{ longitude: "26"; latitude: "67"; height: "133"; }
- ListElement{ longitude: "26"; latitude: "68"; height: "136"; }
- ListElement{ longitude: "26"; latitude: "69"; height: "134"; }
- ListElement{ longitude: "26"; latitude: "70"; height: "133"; }
- ListElement{ longitude: "26"; latitude: "71"; height: "132"; }
- ListElement{ longitude: "26"; latitude: "72"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "73"; height: "126"; }
- ListElement{ longitude: "26"; latitude: "74"; height: "121"; }
- ListElement{ longitude: "26"; latitude: "75"; height: "116"; }
- ListElement{ longitude: "26"; latitude: "76"; height: "112"; }
- ListElement{ longitude: "26"; latitude: "77"; height: "109"; }
- ListElement{ longitude: "26"; latitude: "78"; height: "105"; }
- ListElement{ longitude: "26"; latitude: "79"; height: "106"; }
- ListElement{ longitude: "26"; latitude: "80"; height: "107"; }
- ListElement{ longitude: "26"; latitude: "81"; height: "114"; }
- ListElement{ longitude: "26"; latitude: "82"; height: "117"; }
- ListElement{ longitude: "26"; latitude: "83"; height: "117"; }
- ListElement{ longitude: "26"; latitude: "84"; height: "118"; }
- ListElement{ longitude: "26"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "86"; height: "120"; }
- ListElement{ longitude: "26"; latitude: "87"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "88"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "89"; height: "113"; }
- ListElement{ longitude: "26"; latitude: "90"; height: "100"; }
- ListElement{ longitude: "26"; latitude: "91"; height: "103"; }
- ListElement{ longitude: "26"; latitude: "92"; height: "105"; }
- ListElement{ longitude: "26"; latitude: "93"; height: "119"; }
- ListElement{ longitude: "26"; latitude: "94"; height: "128"; }
- ListElement{ longitude: "26"; latitude: "95"; height: "134"; }
- ListElement{ longitude: "26"; latitude: "96"; height: "137"; }
- ListElement{ longitude: "26"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "26"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "26"; latitude: "99"; height: "116"; }
- ListElement{ longitude: "27"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "1"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "2"; height: "130"; }
- ListElement{ longitude: "27"; latitude: "3"; height: "130"; }
- ListElement{ longitude: "27"; latitude: "4"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "5"; height: "127"; }
- ListElement{ longitude: "27"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "8"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "10"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "12"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "13"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "14"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "19"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "20"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "21"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "22"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "23"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "24"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "27"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "29"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "27"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "27"; latitude: "34"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "35"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "39"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "27"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "27"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "44"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "46"; height: "128"; }
- ListElement{ longitude: "27"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "27"; latitude: "50"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "51"; height: "118"; }
- ListElement{ longitude: "27"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "27"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "27"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "27"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "27"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "27"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "27"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "27"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "61"; height: "126"; }
- ListElement{ longitude: "27"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "27"; latitude: "63"; height: "127"; }
- ListElement{ longitude: "27"; latitude: "64"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "65"; height: "129"; }
- ListElement{ longitude: "27"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "27"; latitude: "67"; height: "130"; }
- ListElement{ longitude: "27"; latitude: "68"; height: "134"; }
- ListElement{ longitude: "27"; latitude: "69"; height: "135"; }
- ListElement{ longitude: "27"; latitude: "70"; height: "136"; }
- ListElement{ longitude: "27"; latitude: "71"; height: "137"; }
- ListElement{ longitude: "27"; latitude: "72"; height: "136"; }
- ListElement{ longitude: "27"; latitude: "73"; height: "133"; }
- ListElement{ longitude: "27"; latitude: "74"; height: "128"; }
- ListElement{ longitude: "27"; latitude: "75"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "76"; height: "117"; }
- ListElement{ longitude: "27"; latitude: "77"; height: "113"; }
- ListElement{ longitude: "27"; latitude: "78"; height: "111"; }
- ListElement{ longitude: "27"; latitude: "79"; height: "109"; }
- ListElement{ longitude: "27"; latitude: "80"; height: "110"; }
- ListElement{ longitude: "27"; latitude: "81"; height: "113"; }
- ListElement{ longitude: "27"; latitude: "82"; height: "117"; }
- ListElement{ longitude: "27"; latitude: "83"; height: "115"; }
- ListElement{ longitude: "27"; latitude: "84"; height: "120"; }
- ListElement{ longitude: "27"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "27"; latitude: "86"; height: "121"; }
- ListElement{ longitude: "27"; latitude: "87"; height: "118"; }
- ListElement{ longitude: "27"; latitude: "88"; height: "117"; }
- ListElement{ longitude: "27"; latitude: "89"; height: "114"; }
- ListElement{ longitude: "27"; latitude: "90"; height: "107"; }
- ListElement{ longitude: "27"; latitude: "91"; height: "106"; }
- ListElement{ longitude: "27"; latitude: "92"; height: "109"; }
- ListElement{ longitude: "27"; latitude: "93"; height: "119"; }
- ListElement{ longitude: "27"; latitude: "94"; height: "127"; }
- ListElement{ longitude: "27"; latitude: "95"; height: "136"; }
- ListElement{ longitude: "27"; latitude: "96"; height: "136"; }
- ListElement{ longitude: "27"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "27"; latitude: "98"; height: "128"; }
- ListElement{ longitude: "27"; latitude: "99"; height: "111"; }
- ListElement{ longitude: "28"; latitude: "0"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "28"; latitude: "2"; height: "129"; }
- ListElement{ longitude: "28"; latitude: "3"; height: "129"; }
- ListElement{ longitude: "28"; latitude: "4"; height: "128"; }
- ListElement{ longitude: "28"; latitude: "5"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "8"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "10"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "13"; height: "123"; }
- ListElement{ longitude: "28"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "28"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "16"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "17"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "18"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "19"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "20"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "22"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "26"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "27"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "28"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "28"; latitude: "30"; height: "118"; }
- ListElement{ longitude: "28"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "32"; height: "115"; }
- ListElement{ longitude: "28"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "28"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "35"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "36"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "38"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "28"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "28"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "28"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "45"; height: "128"; }
- ListElement{ longitude: "28"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "28"; latitude: "48"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "49"; height: "119"; }
- ListElement{ longitude: "28"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "28"; latitude: "51"; height: "117"; }
- ListElement{ longitude: "28"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "28"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "28"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "28"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "28"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "60"; height: "123"; }
- ListElement{ longitude: "28"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "28"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "28"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "28"; latitude: "64"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "66"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "28"; latitude: "68"; height: "131"; }
- ListElement{ longitude: "28"; latitude: "69"; height: "136"; }
- ListElement{ longitude: "28"; latitude: "70"; height: "137"; }
- ListElement{ longitude: "28"; latitude: "71"; height: "141"; }
- ListElement{ longitude: "28"; latitude: "72"; height: "143"; }
- ListElement{ longitude: "28"; latitude: "73"; height: "139"; }
- ListElement{ longitude: "28"; latitude: "74"; height: "136"; }
- ListElement{ longitude: "28"; latitude: "75"; height: "129"; }
- ListElement{ longitude: "28"; latitude: "76"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "77"; height: "118"; }
- ListElement{ longitude: "28"; latitude: "78"; height: "117"; }
- ListElement{ longitude: "28"; latitude: "79"; height: "111"; }
- ListElement{ longitude: "28"; latitude: "80"; height: "114"; }
- ListElement{ longitude: "28"; latitude: "81"; height: "117"; }
- ListElement{ longitude: "28"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "28"; latitude: "83"; height: "119"; }
- ListElement{ longitude: "28"; latitude: "84"; height: "122"; }
- ListElement{ longitude: "28"; latitude: "85"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "86"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "87"; height: "120"; }
- ListElement{ longitude: "28"; latitude: "88"; height: "116"; }
- ListElement{ longitude: "28"; latitude: "89"; height: "114"; }
- ListElement{ longitude: "28"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "28"; latitude: "91"; height: "111"; }
- ListElement{ longitude: "28"; latitude: "92"; height: "113"; }
- ListElement{ longitude: "28"; latitude: "93"; height: "121"; }
- ListElement{ longitude: "28"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "28"; latitude: "95"; height: "133"; }
- ListElement{ longitude: "28"; latitude: "96"; height: "134"; }
- ListElement{ longitude: "28"; latitude: "97"; height: "132"; }
- ListElement{ longitude: "28"; latitude: "98"; height: "126"; }
- ListElement{ longitude: "28"; latitude: "99"; height: "109"; }
- ListElement{ longitude: "29"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "3"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "4"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "29"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "9"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "12"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "21"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "23"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "29"; latitude: "29"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "29"; latitude: "31"; height: "124"; }
- ListElement{ longitude: "29"; latitude: "32"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "34"; height: "121"; }
- ListElement{ longitude: "29"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "29"; latitude: "38"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "29"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "29"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "29"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "44"; height: "116"; }
- ListElement{ longitude: "29"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "46"; height: "125"; }
- ListElement{ longitude: "29"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "29"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "49"; height: "119"; }
- ListElement{ longitude: "29"; latitude: "50"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "51"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "52"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "58"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "60"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "62"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "64"; height: "125"; }
- ListElement{ longitude: "29"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "66"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "67"; height: "128"; }
- ListElement{ longitude: "29"; latitude: "68"; height: "131"; }
- ListElement{ longitude: "29"; latitude: "69"; height: "134"; }
- ListElement{ longitude: "29"; latitude: "70"; height: "140"; }
- ListElement{ longitude: "29"; latitude: "71"; height: "146"; }
- ListElement{ longitude: "29"; latitude: "72"; height: "147"; }
- ListElement{ longitude: "29"; latitude: "73"; height: "144"; }
- ListElement{ longitude: "29"; latitude: "74"; height: "140"; }
- ListElement{ longitude: "29"; latitude: "75"; height: "134"; }
- ListElement{ longitude: "29"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "29"; latitude: "77"; height: "123"; }
- ListElement{ longitude: "29"; latitude: "78"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "79"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "80"; height: "120"; }
- ListElement{ longitude: "29"; latitude: "81"; height: "119"; }
- ListElement{ longitude: "29"; latitude: "82"; height: "119"; }
- ListElement{ longitude: "29"; latitude: "83"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "84"; height: "116"; }
- ListElement{ longitude: "29"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "29"; latitude: "86"; height: "121"; }
- ListElement{ longitude: "29"; latitude: "87"; height: "121"; }
- ListElement{ longitude: "29"; latitude: "88"; height: "119"; }
- ListElement{ longitude: "29"; latitude: "89"; height: "114"; }
- ListElement{ longitude: "29"; latitude: "90"; height: "117"; }
- ListElement{ longitude: "29"; latitude: "91"; height: "111"; }
- ListElement{ longitude: "29"; latitude: "92"; height: "112"; }
- ListElement{ longitude: "29"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "29"; latitude: "94"; height: "124"; }
- ListElement{ longitude: "29"; latitude: "95"; height: "129"; }
- ListElement{ longitude: "29"; latitude: "96"; height: "132"; }
- ListElement{ longitude: "29"; latitude: "97"; height: "131"; }
- ListElement{ longitude: "29"; latitude: "98"; height: "124"; }
- ListElement{ longitude: "29"; latitude: "99"; height: "109"; }
- ListElement{ longitude: "30"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "2"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "3"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "4"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "5"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "12"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "20"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "22"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "23"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "30"; height: "126"; }
- ListElement{ longitude: "30"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "33"; height: "120"; }
- ListElement{ longitude: "30"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "30"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "43"; height: "114"; }
- ListElement{ longitude: "30"; latitude: "44"; height: "105"; }
- ListElement{ longitude: "30"; latitude: "45"; height: "114"; }
- ListElement{ longitude: "30"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "48"; height: "120"; }
- ListElement{ longitude: "30"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "30"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "30"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "53"; height: "116"; }
- ListElement{ longitude: "30"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "30"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "30"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "30"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "30"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "30"; latitude: "60"; height: "123"; }
- ListElement{ longitude: "30"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "63"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "30"; latitude: "65"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "66"; height: "125"; }
- ListElement{ longitude: "30"; latitude: "67"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "30"; latitude: "69"; height: "135"; }
- ListElement{ longitude: "30"; latitude: "70"; height: "142"; }
- ListElement{ longitude: "30"; latitude: "71"; height: "146"; }
- ListElement{ longitude: "30"; latitude: "72"; height: "150"; }
- ListElement{ longitude: "30"; latitude: "73"; height: "149"; }
- ListElement{ longitude: "30"; latitude: "74"; height: "147"; }
- ListElement{ longitude: "30"; latitude: "75"; height: "137"; }
- ListElement{ longitude: "30"; latitude: "76"; height: "130"; }
- ListElement{ longitude: "30"; latitude: "77"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "78"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "79"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "80"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "81"; height: "117"; }
- ListElement{ longitude: "30"; latitude: "82"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "83"; height: "115"; }
- ListElement{ longitude: "30"; latitude: "84"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "30"; latitude: "86"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "87"; height: "121"; }
- ListElement{ longitude: "30"; latitude: "88"; height: "120"; }
- ListElement{ longitude: "30"; latitude: "89"; height: "117"; }
- ListElement{ longitude: "30"; latitude: "90"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "91"; height: "118"; }
- ListElement{ longitude: "30"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "30"; latitude: "93"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "94"; height: "127"; }
- ListElement{ longitude: "30"; latitude: "95"; height: "124"; }
- ListElement{ longitude: "30"; latitude: "96"; height: "123"; }
- ListElement{ longitude: "30"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "30"; latitude: "98"; height: "128"; }
- ListElement{ longitude: "30"; latitude: "99"; height: "111"; }
- ListElement{ longitude: "31"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "31"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "31"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "3"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "12"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "19"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "20"; height: "128"; }
- ListElement{ longitude: "31"; latitude: "21"; height: "129"; }
- ListElement{ longitude: "31"; latitude: "22"; height: "128"; }
- ListElement{ longitude: "31"; latitude: "23"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "31"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "33"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "35"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "43"; height: "118"; }
- ListElement{ longitude: "31"; latitude: "44"; height: "116"; }
- ListElement{ longitude: "31"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "46"; height: "120"; }
- ListElement{ longitude: "31"; latitude: "47"; height: "116"; }
- ListElement{ longitude: "31"; latitude: "48"; height: "117"; }
- ListElement{ longitude: "31"; latitude: "49"; height: "117"; }
- ListElement{ longitude: "31"; latitude: "50"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "31"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "31"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "31"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "31"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "31"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "60"; height: "122"; }
- ListElement{ longitude: "31"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "31"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "31"; latitude: "63"; height: "121"; }
- ListElement{ longitude: "31"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "31"; latitude: "65"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "66"; height: "126"; }
- ListElement{ longitude: "31"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "31"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "31"; latitude: "69"; height: "137"; }
- ListElement{ longitude: "31"; latitude: "70"; height: "143"; }
- ListElement{ longitude: "31"; latitude: "71"; height: "147"; }
- ListElement{ longitude: "31"; latitude: "72"; height: "149"; }
- ListElement{ longitude: "31"; latitude: "73"; height: "148"; }
- ListElement{ longitude: "31"; latitude: "74"; height: "146"; }
- ListElement{ longitude: "31"; latitude: "75"; height: "138"; }
- ListElement{ longitude: "31"; latitude: "76"; height: "130"; }
- ListElement{ longitude: "31"; latitude: "77"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "78"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "79"; height: "122"; }
- ListElement{ longitude: "31"; latitude: "80"; height: "116"; }
- ListElement{ longitude: "31"; latitude: "81"; height: "115"; }
- ListElement{ longitude: "31"; latitude: "82"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "83"; height: "117"; }
- ListElement{ longitude: "31"; latitude: "84"; height: "117"; }
- ListElement{ longitude: "31"; latitude: "85"; height: "116"; }
- ListElement{ longitude: "31"; latitude: "86"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "87"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "88"; height: "119"; }
- ListElement{ longitude: "31"; latitude: "89"; height: "120"; }
- ListElement{ longitude: "31"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "31"; latitude: "91"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "31"; latitude: "93"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "31"; latitude: "95"; height: "122"; }
- ListElement{ longitude: "31"; latitude: "96"; height: "114"; }
- ListElement{ longitude: "31"; latitude: "97"; height: "125"; }
- ListElement{ longitude: "31"; latitude: "98"; height: "127"; }
- ListElement{ longitude: "31"; latitude: "99"; height: "115"; }
- ListElement{ longitude: "32"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "32"; latitude: "1"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "32"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "32"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "12"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "32"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "19"; height: "128"; }
- ListElement{ longitude: "32"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "21"; height: "129"; }
- ListElement{ longitude: "32"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "32"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "45"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "32"; latitude: "47"; height: "118"; }
- ListElement{ longitude: "32"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "49"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "50"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "32"; latitude: "53"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "32"; latitude: "56"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "58"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "60"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "61"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "66"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "67"; height: "131"; }
- ListElement{ longitude: "32"; latitude: "68"; height: "137"; }
- ListElement{ longitude: "32"; latitude: "69"; height: "141"; }
- ListElement{ longitude: "32"; latitude: "70"; height: "145"; }
- ListElement{ longitude: "32"; latitude: "71"; height: "148"; }
- ListElement{ longitude: "32"; latitude: "72"; height: "151"; }
- ListElement{ longitude: "32"; latitude: "73"; height: "148"; }
- ListElement{ longitude: "32"; latitude: "74"; height: "144"; }
- ListElement{ longitude: "32"; latitude: "75"; height: "138"; }
- ListElement{ longitude: "32"; latitude: "76"; height: "130"; }
- ListElement{ longitude: "32"; latitude: "77"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "79"; height: "124"; }
- ListElement{ longitude: "32"; latitude: "80"; height: "120"; }
- ListElement{ longitude: "32"; latitude: "81"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "32"; latitude: "83"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "84"; height: "117"; }
- ListElement{ longitude: "32"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "86"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "87"; height: "121"; }
- ListElement{ longitude: "32"; latitude: "88"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "89"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "90"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "91"; height: "129"; }
- ListElement{ longitude: "32"; latitude: "92"; height: "127"; }
- ListElement{ longitude: "32"; latitude: "93"; height: "125"; }
- ListElement{ longitude: "32"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "32"; latitude: "95"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "32"; latitude: "97"; height: "119"; }
- ListElement{ longitude: "32"; latitude: "98"; height: "126"; }
- ListElement{ longitude: "32"; latitude: "99"; height: "120"; }
- ListElement{ longitude: "33"; latitude: "0"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "1"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "3"; height: "116"; }
- ListElement{ longitude: "33"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "33"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "8"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "10"; height: "130"; }
- ListElement{ longitude: "33"; latitude: "11"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "12"; height: "128"; }
- ListElement{ longitude: "33"; latitude: "13"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "19"; height: "128"; }
- ListElement{ longitude: "33"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "21"; height: "129"; }
- ListElement{ longitude: "33"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "33"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "25"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "32"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "33"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "34"; height: "128"; }
- ListElement{ longitude: "33"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "37"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "44"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "45"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "46"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "33"; latitude: "48"; height: "118"; }
- ListElement{ longitude: "33"; latitude: "49"; height: "118"; }
- ListElement{ longitude: "33"; latitude: "50"; height: "119"; }
- ListElement{ longitude: "33"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "33"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "33"; latitude: "53"; height: "119"; }
- ListElement{ longitude: "33"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "55"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "59"; height: "126"; }
- ListElement{ longitude: "33"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "62"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "65"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "33"; latitude: "67"; height: "133"; }
- ListElement{ longitude: "33"; latitude: "68"; height: "141"; }
- ListElement{ longitude: "33"; latitude: "69"; height: "144"; }
- ListElement{ longitude: "33"; latitude: "70"; height: "147"; }
- ListElement{ longitude: "33"; latitude: "71"; height: "149"; }
- ListElement{ longitude: "33"; latitude: "72"; height: "149"; }
- ListElement{ longitude: "33"; latitude: "73"; height: "147"; }
- ListElement{ longitude: "33"; latitude: "74"; height: "144"; }
- ListElement{ longitude: "33"; latitude: "75"; height: "137"; }
- ListElement{ longitude: "33"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "77"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "78"; height: "128"; }
- ListElement{ longitude: "33"; latitude: "79"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "80"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "81"; height: "121"; }
- ListElement{ longitude: "33"; latitude: "82"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "83"; height: "118"; }
- ListElement{ longitude: "33"; latitude: "84"; height: "113"; }
- ListElement{ longitude: "33"; latitude: "85"; height: "117"; }
- ListElement{ longitude: "33"; latitude: "86"; height: "118"; }
- ListElement{ longitude: "33"; latitude: "87"; height: "121"; }
- ListElement{ longitude: "33"; latitude: "88"; height: "120"; }
- ListElement{ longitude: "33"; latitude: "89"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "90"; height: "122"; }
- ListElement{ longitude: "33"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "33"; latitude: "92"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "93"; height: "123"; }
- ListElement{ longitude: "33"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "33"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "96"; height: "127"; }
- ListElement{ longitude: "33"; latitude: "97"; height: "124"; }
- ListElement{ longitude: "33"; latitude: "98"; height: "132"; }
- ListElement{ longitude: "33"; latitude: "99"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "1"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "2"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "34"; latitude: "4"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "10"; height: "131"; }
- ListElement{ longitude: "34"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "34"; latitude: "12"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "13"; height: "130"; }
- ListElement{ longitude: "34"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "18"; height: "128"; }
- ListElement{ longitude: "34"; latitude: "19"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "20"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "21"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "30"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "32"; height: "123"; }
- ListElement{ longitude: "34"; latitude: "33"; height: "128"; }
- ListElement{ longitude: "34"; latitude: "34"; height: "130"; }
- ListElement{ longitude: "34"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "34"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "40"; height: "128"; }
- ListElement{ longitude: "34"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "45"; height: "119"; }
- ListElement{ longitude: "34"; latitude: "46"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "48"; height: "121"; }
- ListElement{ longitude: "34"; latitude: "49"; height: "118"; }
- ListElement{ longitude: "34"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "34"; latitude: "51"; height: "117"; }
- ListElement{ longitude: "34"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "34"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "34"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "34"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "62"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "63"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "64"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "34"; latitude: "67"; height: "135"; }
- ListElement{ longitude: "34"; latitude: "68"; height: "142"; }
- ListElement{ longitude: "34"; latitude: "69"; height: "145"; }
- ListElement{ longitude: "34"; latitude: "70"; height: "149"; }
- ListElement{ longitude: "34"; latitude: "71"; height: "149"; }
- ListElement{ longitude: "34"; latitude: "72"; height: "150"; }
- ListElement{ longitude: "34"; latitude: "73"; height: "145"; }
- ListElement{ longitude: "34"; latitude: "74"; height: "144"; }
- ListElement{ longitude: "34"; latitude: "75"; height: "144"; }
- ListElement{ longitude: "34"; latitude: "76"; height: "138"; }
- ListElement{ longitude: "34"; latitude: "77"; height: "141"; }
- ListElement{ longitude: "34"; latitude: "78"; height: "140"; }
- ListElement{ longitude: "34"; latitude: "79"; height: "125"; }
- ListElement{ longitude: "34"; latitude: "80"; height: "131"; }
- ListElement{ longitude: "34"; latitude: "81"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "82"; height: "123"; }
- ListElement{ longitude: "34"; latitude: "83"; height: "123"; }
- ListElement{ longitude: "34"; latitude: "84"; height: "117"; }
- ListElement{ longitude: "34"; latitude: "85"; height: "121"; }
- ListElement{ longitude: "34"; latitude: "86"; height: "119"; }
- ListElement{ longitude: "34"; latitude: "87"; height: "119"; }
- ListElement{ longitude: "34"; latitude: "88"; height: "115"; }
- ListElement{ longitude: "34"; latitude: "89"; height: "118"; }
- ListElement{ longitude: "34"; latitude: "90"; height: "121"; }
- ListElement{ longitude: "34"; latitude: "91"; height: "124"; }
- ListElement{ longitude: "34"; latitude: "92"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "34"; latitude: "94"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "34"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "34"; latitude: "97"; height: "126"; }
- ListElement{ longitude: "34"; latitude: "98"; height: "130"; }
- ListElement{ longitude: "34"; latitude: "99"; height: "123"; }
- ListElement{ longitude: "35"; latitude: "0"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "35"; latitude: "2"; height: "119"; }
- ListElement{ longitude: "35"; latitude: "3"; height: "118"; }
- ListElement{ longitude: "35"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "9"; height: "131"; }
- ListElement{ longitude: "35"; latitude: "10"; height: "130"; }
- ListElement{ longitude: "35"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "35"; latitude: "12"; height: "130"; }
- ListElement{ longitude: "35"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "14"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "15"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "18"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "19"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "20"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "21"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "23"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "26"; height: "130"; }
- ListElement{ longitude: "35"; latitude: "27"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "30"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "31"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "33"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "35"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "35"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "35"; latitude: "45"; height: "123"; }
- ListElement{ longitude: "35"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "48"; height: "120"; }
- ListElement{ longitude: "35"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "35"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "35"; latitude: "51"; height: "117"; }
- ListElement{ longitude: "35"; latitude: "52"; height: "117"; }
- ListElement{ longitude: "35"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "35"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "55"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "58"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "59"; height: "123"; }
- ListElement{ longitude: "35"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "61"; height: "120"; }
- ListElement{ longitude: "35"; latitude: "62"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "64"; height: "124"; }
- ListElement{ longitude: "35"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "35"; latitude: "67"; height: "135"; }
- ListElement{ longitude: "35"; latitude: "68"; height: "140"; }
- ListElement{ longitude: "35"; latitude: "69"; height: "146"; }
- ListElement{ longitude: "35"; latitude: "70"; height: "147"; }
- ListElement{ longitude: "35"; latitude: "71"; height: "148"; }
- ListElement{ longitude: "35"; latitude: "72"; height: "148"; }
- ListElement{ longitude: "35"; latitude: "73"; height: "144"; }
- ListElement{ longitude: "35"; latitude: "74"; height: "143"; }
- ListElement{ longitude: "35"; latitude: "75"; height: "145"; }
- ListElement{ longitude: "35"; latitude: "76"; height: "146"; }
- ListElement{ longitude: "35"; latitude: "77"; height: "151"; }
- ListElement{ longitude: "35"; latitude: "78"; height: "146"; }
- ListElement{ longitude: "35"; latitude: "79"; height: "136"; }
- ListElement{ longitude: "35"; latitude: "80"; height: "119"; }
- ListElement{ longitude: "35"; latitude: "81"; height: "122"; }
- ListElement{ longitude: "35"; latitude: "82"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "83"; height: "116"; }
- ListElement{ longitude: "35"; latitude: "84"; height: "101"; }
- ListElement{ longitude: "35"; latitude: "85"; height: "111"; }
- ListElement{ longitude: "35"; latitude: "86"; height: "115"; }
- ListElement{ longitude: "35"; latitude: "87"; height: "126"; }
- ListElement{ longitude: "35"; latitude: "88"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "89"; height: "125"; }
- ListElement{ longitude: "35"; latitude: "90"; height: "128"; }
- ListElement{ longitude: "35"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "35"; latitude: "92"; height: "127"; }
- ListElement{ longitude: "35"; latitude: "93"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "94"; height: "129"; }
- ListElement{ longitude: "35"; latitude: "95"; height: "119"; }
- ListElement{ longitude: "35"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "35"; latitude: "97"; height: "135"; }
- ListElement{ longitude: "35"; latitude: "98"; height: "135"; }
- ListElement{ longitude: "35"; latitude: "99"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "0"; height: "123"; }
- ListElement{ longitude: "36"; latitude: "1"; height: "119"; }
- ListElement{ longitude: "36"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "36"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "36"; latitude: "5"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "36"; latitude: "10"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "36"; latitude: "12"; height: "130"; }
- ListElement{ longitude: "36"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "36"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "19"; height: "126"; }
- ListElement{ longitude: "36"; latitude: "20"; height: "128"; }
- ListElement{ longitude: "36"; latitude: "21"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "23"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "24"; height: "128"; }
- ListElement{ longitude: "36"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "26"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "27"; height: "123"; }
- ListElement{ longitude: "36"; latitude: "28"; height: "128"; }
- ListElement{ longitude: "36"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "32"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "33"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "36"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "36"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "45"; height: "123"; }
- ListElement{ longitude: "36"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "36"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "48"; height: "120"; }
- ListElement{ longitude: "36"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "36"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "36"; latitude: "51"; height: "117"; }
- ListElement{ longitude: "36"; latitude: "52"; height: "117"; }
- ListElement{ longitude: "36"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "36"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "36"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "36"; latitude: "56"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "57"; height: "126"; }
- ListElement{ longitude: "36"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "59"; height: "123"; }
- ListElement{ longitude: "36"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "36"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "64"; height: "124"; }
- ListElement{ longitude: "36"; latitude: "65"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "68"; height: "137"; }
- ListElement{ longitude: "36"; latitude: "69"; height: "142"; }
- ListElement{ longitude: "36"; latitude: "70"; height: "146"; }
- ListElement{ longitude: "36"; latitude: "71"; height: "148"; }
- ListElement{ longitude: "36"; latitude: "72"; height: "148"; }
- ListElement{ longitude: "36"; latitude: "73"; height: "145"; }
- ListElement{ longitude: "36"; latitude: "74"; height: "141"; }
- ListElement{ longitude: "36"; latitude: "75"; height: "148"; }
- ListElement{ longitude: "36"; latitude: "76"; height: "152"; }
- ListElement{ longitude: "36"; latitude: "77"; height: "146"; }
- ListElement{ longitude: "36"; latitude: "78"; height: "146"; }
- ListElement{ longitude: "36"; latitude: "79"; height: "154"; }
- ListElement{ longitude: "36"; latitude: "80"; height: "146"; }
- ListElement{ longitude: "36"; latitude: "81"; height: "131"; }
- ListElement{ longitude: "36"; latitude: "82"; height: "103"; }
- ListElement{ longitude: "36"; latitude: "83"; height: "94"; }
- ListElement{ longitude: "36"; latitude: "84"; height: "78"; }
- ListElement{ longitude: "36"; latitude: "85"; height: "73"; }
- ListElement{ longitude: "36"; latitude: "86"; height: "87"; }
- ListElement{ longitude: "36"; latitude: "87"; height: "103"; }
- ListElement{ longitude: "36"; latitude: "88"; height: "98"; }
- ListElement{ longitude: "36"; latitude: "89"; height: "110"; }
- ListElement{ longitude: "36"; latitude: "90"; height: "113"; }
- ListElement{ longitude: "36"; latitude: "91"; height: "125"; }
- ListElement{ longitude: "36"; latitude: "92"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "93"; height: "127"; }
- ListElement{ longitude: "36"; latitude: "94"; height: "129"; }
- ListElement{ longitude: "36"; latitude: "95"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "36"; latitude: "97"; height: "128"; }
- ListElement{ longitude: "36"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "36"; latitude: "99"; height: "129"; }
- ListElement{ longitude: "37"; latitude: "0"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "37"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "37"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "37"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "7"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "37"; latitude: "9"; height: "132"; }
- ListElement{ longitude: "37"; latitude: "10"; height: "129"; }
- ListElement{ longitude: "37"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "37"; latitude: "12"; height: "130"; }
- ListElement{ longitude: "37"; latitude: "13"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "14"; height: "128"; }
- ListElement{ longitude: "37"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "16"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "17"; height: "128"; }
- ListElement{ longitude: "37"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "20"; height: "128"; }
- ListElement{ longitude: "37"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "37"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "37"; latitude: "23"; height: "130"; }
- ListElement{ longitude: "37"; latitude: "24"; height: "128"; }
- ListElement{ longitude: "37"; latitude: "25"; height: "110"; }
- ListElement{ longitude: "37"; latitude: "26"; height: "98"; }
- ListElement{ longitude: "37"; latitude: "27"; height: "97"; }
- ListElement{ longitude: "37"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "32"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "33"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "37"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "37"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "44"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "45"; height: "121"; }
- ListElement{ longitude: "37"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "37"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "37"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "37"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "37"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "37"; latitude: "52"; height: "117"; }
- ListElement{ longitude: "37"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "37"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "58"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "59"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "37"; latitude: "63"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "64"; height: "124"; }
- ListElement{ longitude: "37"; latitude: "65"; height: "123"; }
- ListElement{ longitude: "37"; latitude: "66"; height: "126"; }
- ListElement{ longitude: "37"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "37"; latitude: "69"; height: "138"; }
- ListElement{ longitude: "37"; latitude: "70"; height: "145"; }
- ListElement{ longitude: "37"; latitude: "71"; height: "146"; }
- ListElement{ longitude: "37"; latitude: "72"; height: "146"; }
- ListElement{ longitude: "37"; latitude: "73"; height: "149"; }
- ListElement{ longitude: "37"; latitude: "74"; height: "145"; }
- ListElement{ longitude: "37"; latitude: "75"; height: "154"; }
- ListElement{ longitude: "37"; latitude: "76"; height: "153"; }
- ListElement{ longitude: "37"; latitude: "77"; height: "152"; }
- ListElement{ longitude: "37"; latitude: "78"; height: "149"; }
- ListElement{ longitude: "37"; latitude: "79"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "80"; height: "97"; }
- ListElement{ longitude: "37"; latitude: "81"; height: "70"; }
- ListElement{ longitude: "37"; latitude: "82"; height: "66"; }
- ListElement{ longitude: "37"; latitude: "83"; height: "71"; }
- ListElement{ longitude: "37"; latitude: "84"; height: "59"; }
- ListElement{ longitude: "37"; latitude: "85"; height: "48"; }
- ListElement{ longitude: "37"; latitude: "86"; height: "66"; }
- ListElement{ longitude: "37"; latitude: "87"; height: "74"; }
- ListElement{ longitude: "37"; latitude: "88"; height: "78"; }
- ListElement{ longitude: "37"; latitude: "89"; height: "86"; }
- ListElement{ longitude: "37"; latitude: "90"; height: "94"; }
- ListElement{ longitude: "37"; latitude: "91"; height: "107"; }
- ListElement{ longitude: "37"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "37"; latitude: "93"; height: "131"; }
- ListElement{ longitude: "37"; latitude: "94"; height: "129"; }
- ListElement{ longitude: "37"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "37"; latitude: "96"; height: "133"; }
- ListElement{ longitude: "37"; latitude: "97"; height: "135"; }
- ListElement{ longitude: "37"; latitude: "98"; height: "134"; }
- ListElement{ longitude: "37"; latitude: "99"; height: "130"; }
- ListElement{ longitude: "38"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "38"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "38"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "38"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "5"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "38"; latitude: "9"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "10"; height: "129"; }
- ListElement{ longitude: "38"; latitude: "11"; height: "131"; }
- ListElement{ longitude: "38"; latitude: "12"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "13"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "14"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "16"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "20"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "21"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "23"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "25"; height: "103"; }
- ListElement{ longitude: "38"; latitude: "26"; height: "86"; }
- ListElement{ longitude: "38"; latitude: "27"; height: "90"; }
- ListElement{ longitude: "38"; latitude: "28"; height: "116"; }
- ListElement{ longitude: "38"; latitude: "29"; height: "129"; }
- ListElement{ longitude: "38"; latitude: "30"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "32"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "37"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "38"; height: "128"; }
- ListElement{ longitude: "38"; latitude: "39"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "38"; latitude: "45"; height: "122"; }
- ListElement{ longitude: "38"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "38"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "38"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "38"; latitude: "49"; height: "122"; }
- ListElement{ longitude: "38"; latitude: "50"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "38"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "38"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "55"; height: "119"; }
- ListElement{ longitude: "38"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "38"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "38"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "38"; latitude: "64"; height: "127"; }
- ListElement{ longitude: "38"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "66"; height: "124"; }
- ListElement{ longitude: "38"; latitude: "67"; height: "126"; }
- ListElement{ longitude: "38"; latitude: "68"; height: "132"; }
- ListElement{ longitude: "38"; latitude: "69"; height: "137"; }
- ListElement{ longitude: "38"; latitude: "70"; height: "145"; }
- ListElement{ longitude: "38"; latitude: "71"; height: "148"; }
- ListElement{ longitude: "38"; latitude: "72"; height: "155"; }
- ListElement{ longitude: "38"; latitude: "73"; height: "161"; }
- ListElement{ longitude: "38"; latitude: "74"; height: "147"; }
- ListElement{ longitude: "38"; latitude: "75"; height: "146"; }
- ListElement{ longitude: "38"; latitude: "76"; height: "139"; }
- ListElement{ longitude: "38"; latitude: "77"; height: "120"; }
- ListElement{ longitude: "38"; latitude: "78"; height: "108"; }
- ListElement{ longitude: "38"; latitude: "79"; height: "93"; }
- ListElement{ longitude: "38"; latitude: "80"; height: "76"; }
- ListElement{ longitude: "38"; latitude: "81"; height: "59"; }
- ListElement{ longitude: "38"; latitude: "82"; height: "54"; }
- ListElement{ longitude: "38"; latitude: "83"; height: "61"; }
- ListElement{ longitude: "38"; latitude: "84"; height: "24"; }
- ListElement{ longitude: "38"; latitude: "85"; height: "13"; }
- ListElement{ longitude: "38"; latitude: "86"; height: "42"; }
- ListElement{ longitude: "38"; latitude: "87"; height: "58"; }
- ListElement{ longitude: "38"; latitude: "88"; height: "73"; }
- ListElement{ longitude: "38"; latitude: "89"; height: "75"; }
- ListElement{ longitude: "38"; latitude: "90"; height: "74"; }
- ListElement{ longitude: "38"; latitude: "91"; height: "77"; }
- ListElement{ longitude: "38"; latitude: "92"; height: "96"; }
- ListElement{ longitude: "38"; latitude: "93"; height: "116"; }
- ListElement{ longitude: "38"; latitude: "94"; height: "133"; }
- ListElement{ longitude: "38"; latitude: "95"; height: "131"; }
- ListElement{ longitude: "38"; latitude: "96"; height: "137"; }
- ListElement{ longitude: "38"; latitude: "97"; height: "137"; }
- ListElement{ longitude: "38"; latitude: "98"; height: "134"; }
- ListElement{ longitude: "38"; latitude: "99"; height: "130"; }
- ListElement{ longitude: "39"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "39"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "39"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "39"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "7"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "10"; height: "130"; }
- ListElement{ longitude: "39"; latitude: "11"; height: "132"; }
- ListElement{ longitude: "39"; latitude: "12"; height: "128"; }
- ListElement{ longitude: "39"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "14"; height: "128"; }
- ListElement{ longitude: "39"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "19"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "20"; height: "123"; }
- ListElement{ longitude: "39"; latitude: "21"; height: "128"; }
- ListElement{ longitude: "39"; latitude: "22"; height: "128"; }
- ListElement{ longitude: "39"; latitude: "23"; height: "130"; }
- ListElement{ longitude: "39"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "25"; height: "108"; }
- ListElement{ longitude: "39"; latitude: "26"; height: "88"; }
- ListElement{ longitude: "39"; latitude: "27"; height: "80"; }
- ListElement{ longitude: "39"; latitude: "28"; height: "108"; }
- ListElement{ longitude: "39"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "30"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "31"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "39"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "35"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "37"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "39"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "39"; latitude: "44"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "48"; height: "118"; }
- ListElement{ longitude: "39"; latitude: "49"; height: "118"; }
- ListElement{ longitude: "39"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "39"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "39"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "39"; latitude: "53"; height: "116"; }
- ListElement{ longitude: "39"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "39"; latitude: "55"; height: "117"; }
- ListElement{ longitude: "39"; latitude: "56"; height: "119"; }
- ListElement{ longitude: "39"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "39"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "39"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "39"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "39"; latitude: "63"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "64"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "65"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "39"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "39"; latitude: "68"; height: "132"; }
- ListElement{ longitude: "39"; latitude: "69"; height: "136"; }
- ListElement{ longitude: "39"; latitude: "70"; height: "146"; }
- ListElement{ longitude: "39"; latitude: "71"; height: "153"; }
- ListElement{ longitude: "39"; latitude: "72"; height: "161"; }
- ListElement{ longitude: "39"; latitude: "73"; height: "157"; }
- ListElement{ longitude: "39"; latitude: "74"; height: "152"; }
- ListElement{ longitude: "39"; latitude: "75"; height: "139"; }
- ListElement{ longitude: "39"; latitude: "76"; height: "120"; }
- ListElement{ longitude: "39"; latitude: "77"; height: "116"; }
- ListElement{ longitude: "39"; latitude: "78"; height: "97"; }
- ListElement{ longitude: "39"; latitude: "79"; height: "49"; }
- ListElement{ longitude: "39"; latitude: "80"; height: "16"; }
- ListElement{ longitude: "39"; latitude: "81"; height: "11"; }
- ListElement{ longitude: "39"; latitude: "82"; height: "24"; }
- ListElement{ longitude: "39"; latitude: "83"; height: "58"; }
- ListElement{ longitude: "39"; latitude: "84"; height: "13"; }
- ListElement{ longitude: "39"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "39"; latitude: "86"; height: "31"; }
- ListElement{ longitude: "39"; latitude: "87"; height: "58"; }
- ListElement{ longitude: "39"; latitude: "88"; height: "43"; }
- ListElement{ longitude: "39"; latitude: "89"; height: "48"; }
- ListElement{ longitude: "39"; latitude: "90"; height: "67"; }
- ListElement{ longitude: "39"; latitude: "91"; height: "71"; }
- ListElement{ longitude: "39"; latitude: "92"; height: "81"; }
- ListElement{ longitude: "39"; latitude: "93"; height: "92"; }
- ListElement{ longitude: "39"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "39"; latitude: "95"; height: "143"; }
- ListElement{ longitude: "39"; latitude: "96"; height: "135"; }
- ListElement{ longitude: "39"; latitude: "97"; height: "139"; }
- ListElement{ longitude: "39"; latitude: "98"; height: "136"; }
- ListElement{ longitude: "39"; latitude: "99"; height: "129"; }
- ListElement{ longitude: "40"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "40"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "40"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "5"; height: "119"; }
- ListElement{ longitude: "40"; latitude: "6"; height: "123"; }
- ListElement{ longitude: "40"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "40"; latitude: "12"; height: "131"; }
- ListElement{ longitude: "40"; latitude: "13"; height: "129"; }
- ListElement{ longitude: "40"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "20"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "22"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "23"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "24"; height: "129"; }
- ListElement{ longitude: "40"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "40"; latitude: "26"; height: "103"; }
- ListElement{ longitude: "40"; latitude: "27"; height: "110"; }
- ListElement{ longitude: "40"; latitude: "28"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "29"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "30"; height: "124"; }
- ListElement{ longitude: "40"; latitude: "31"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "32"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "33"; height: "124"; }
- ListElement{ longitude: "40"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "39"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "40"; height: "128"; }
- ListElement{ longitude: "40"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "40"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "46"; height: "123"; }
- ListElement{ longitude: "40"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "40"; latitude: "48"; height: "117"; }
- ListElement{ longitude: "40"; latitude: "49"; height: "117"; }
- ListElement{ longitude: "40"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "40"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "40"; latitude: "55"; height: "119"; }
- ListElement{ longitude: "40"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "40"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "40"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "40"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "40"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "61"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "62"; height: "129"; }
- ListElement{ longitude: "40"; latitude: "63"; height: "129"; }
- ListElement{ longitude: "40"; latitude: "64"; height: "133"; }
- ListElement{ longitude: "40"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "40"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "40"; latitude: "67"; height: "131"; }
- ListElement{ longitude: "40"; latitude: "68"; height: "134"; }
- ListElement{ longitude: "40"; latitude: "69"; height: "139"; }
- ListElement{ longitude: "40"; latitude: "70"; height: "146"; }
- ListElement{ longitude: "40"; latitude: "71"; height: "157"; }
- ListElement{ longitude: "40"; latitude: "72"; height: "166"; }
- ListElement{ longitude: "40"; latitude: "73"; height: "159"; }
- ListElement{ longitude: "40"; latitude: "74"; height: "151"; }
- ListElement{ longitude: "40"; latitude: "75"; height: "130"; }
- ListElement{ longitude: "40"; latitude: "76"; height: "117"; }
- ListElement{ longitude: "40"; latitude: "77"; height: "98"; }
- ListElement{ longitude: "40"; latitude: "78"; height: "82"; }
- ListElement{ longitude: "40"; latitude: "79"; height: "73"; }
- ListElement{ longitude: "40"; latitude: "80"; height: "49"; }
- ListElement{ longitude: "40"; latitude: "81"; height: "1"; }
- ListElement{ longitude: "40"; latitude: "82"; height: "1"; }
- ListElement{ longitude: "40"; latitude: "83"; height: "1"; }
- ListElement{ longitude: "40"; latitude: "84"; height: "27"; }
- ListElement{ longitude: "40"; latitude: "85"; height: "10"; }
- ListElement{ longitude: "40"; latitude: "86"; height: "17"; }
- ListElement{ longitude: "40"; latitude: "87"; height: "24"; }
- ListElement{ longitude: "40"; latitude: "88"; height: "16"; }
- ListElement{ longitude: "40"; latitude: "89"; height: "35"; }
- ListElement{ longitude: "40"; latitude: "90"; height: "58"; }
- ListElement{ longitude: "40"; latitude: "91"; height: "66"; }
- ListElement{ longitude: "40"; latitude: "92"; height: "78"; }
- ListElement{ longitude: "40"; latitude: "93"; height: "88"; }
- ListElement{ longitude: "40"; latitude: "94"; height: "107"; }
- ListElement{ longitude: "40"; latitude: "95"; height: "139"; }
- ListElement{ longitude: "40"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "40"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "40"; latitude: "98"; height: "133"; }
- ListElement{ longitude: "40"; latitude: "99"; height: "129"; }
- ListElement{ longitude: "41"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "41"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "41"; latitude: "2"; height: "123"; }
- ListElement{ longitude: "41"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "41"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "41"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "41"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "41"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "41"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "41"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "41"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "41"; latitude: "12"; height: "131"; }
- ListElement{ longitude: "41"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "41"; latitude: "14"; height: "112"; }
- ListElement{ longitude: "41"; latitude: "15"; height: "122"; }
- ListElement{ longitude: "41"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "20"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "21"; height: "128"; }
- ListElement{ longitude: "41"; latitude: "22"; height: "128"; }
- ListElement{ longitude: "41"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "25"; height: "131"; }
- ListElement{ longitude: "41"; latitude: "26"; height: "131"; }
- ListElement{ longitude: "41"; latitude: "27"; height: "129"; }
- ListElement{ longitude: "41"; latitude: "28"; height: "129"; }
- ListElement{ longitude: "41"; latitude: "29"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "30"; height: "124"; }
- ListElement{ longitude: "41"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "41"; latitude: "36"; height: "118"; }
- ListElement{ longitude: "41"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "41"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "39"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "40"; height: "124"; }
- ListElement{ longitude: "41"; latitude: "41"; height: "124"; }
- ListElement{ longitude: "41"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "41"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "41"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "41"; latitude: "48"; height: "117"; }
- ListElement{ longitude: "41"; latitude: "49"; height: "116"; }
- ListElement{ longitude: "41"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "41"; latitude: "51"; height: "118"; }
- ListElement{ longitude: "41"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "41"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "41"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "41"; latitude: "55"; height: "118"; }
- ListElement{ longitude: "41"; latitude: "56"; height: "120"; }
- ListElement{ longitude: "41"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "41"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "41"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "41"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "41"; latitude: "62"; height: "130"; }
- ListElement{ longitude: "41"; latitude: "63"; height: "130"; }
- ListElement{ longitude: "41"; latitude: "64"; height: "135"; }
- ListElement{ longitude: "41"; latitude: "65"; height: "135"; }
- ListElement{ longitude: "41"; latitude: "66"; height: "137"; }
- ListElement{ longitude: "41"; latitude: "67"; height: "136"; }
- ListElement{ longitude: "41"; latitude: "68"; height: "135"; }
- ListElement{ longitude: "41"; latitude: "69"; height: "141"; }
- ListElement{ longitude: "41"; latitude: "70"; height: "148"; }
- ListElement{ longitude: "41"; latitude: "71"; height: "159"; }
- ListElement{ longitude: "41"; latitude: "72"; height: "160"; }
- ListElement{ longitude: "41"; latitude: "73"; height: "160"; }
- ListElement{ longitude: "41"; latitude: "74"; height: "148"; }
- ListElement{ longitude: "41"; latitude: "75"; height: "122"; }
- ListElement{ longitude: "41"; latitude: "76"; height: "75"; }
- ListElement{ longitude: "41"; latitude: "77"; height: "4"; }
- ListElement{ longitude: "41"; latitude: "78"; height: "50"; }
- ListElement{ longitude: "41"; latitude: "79"; height: "50"; }
- ListElement{ longitude: "41"; latitude: "80"; height: "46"; }
- ListElement{ longitude: "41"; latitude: "81"; height: "3"; }
- ListElement{ longitude: "41"; latitude: "82"; height: "1"; }
- ListElement{ longitude: "41"; latitude: "83"; height: "1"; }
- ListElement{ longitude: "41"; latitude: "84"; height: "19"; }
- ListElement{ longitude: "41"; latitude: "85"; height: "16"; }
- ListElement{ longitude: "41"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "41"; latitude: "87"; height: "4"; }
- ListElement{ longitude: "41"; latitude: "88"; height: "30"; }
- ListElement{ longitude: "41"; latitude: "89"; height: "18"; }
- ListElement{ longitude: "41"; latitude: "90"; height: "19"; }
- ListElement{ longitude: "41"; latitude: "91"; height: "40"; }
- ListElement{ longitude: "41"; latitude: "92"; height: "64"; }
- ListElement{ longitude: "41"; latitude: "93"; height: "80"; }
- ListElement{ longitude: "41"; latitude: "94"; height: "102"; }
- ListElement{ longitude: "41"; latitude: "95"; height: "125"; }
- ListElement{ longitude: "41"; latitude: "96"; height: "143"; }
- ListElement{ longitude: "41"; latitude: "97"; height: "138"; }
- ListElement{ longitude: "41"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "41"; latitude: "99"; height: "130"; }
- ListElement{ longitude: "42"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "42"; latitude: "1"; height: "124"; }
- ListElement{ longitude: "42"; latitude: "2"; height: "124"; }
- ListElement{ longitude: "42"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "42"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "42"; latitude: "6"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "42"; latitude: "9"; height: "128"; }
- ListElement{ longitude: "42"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "42"; latitude: "11"; height: "130"; }
- ListElement{ longitude: "42"; latitude: "12"; height: "131"; }
- ListElement{ longitude: "42"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "42"; latitude: "15"; height: "122"; }
- ListElement{ longitude: "42"; latitude: "16"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "20"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "21"; height: "128"; }
- ListElement{ longitude: "42"; latitude: "22"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "23"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "25"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "30"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "37"; height: "120"; }
- ListElement{ longitude: "42"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "42"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "42"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "42"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "42"; latitude: "48"; height: "117"; }
- ListElement{ longitude: "42"; latitude: "49"; height: "116"; }
- ListElement{ longitude: "42"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "42"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "42"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "42"; latitude: "53"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "54"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "42"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "42"; latitude: "57"; height: "124"; }
- ListElement{ longitude: "42"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "42"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "42"; latitude: "62"; height: "129"; }
- ListElement{ longitude: "42"; latitude: "63"; height: "132"; }
- ListElement{ longitude: "42"; latitude: "64"; height: "137"; }
- ListElement{ longitude: "42"; latitude: "65"; height: "137"; }
- ListElement{ longitude: "42"; latitude: "66"; height: "139"; }
- ListElement{ longitude: "42"; latitude: "67"; height: "135"; }
- ListElement{ longitude: "42"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "42"; latitude: "69"; height: "132"; }
- ListElement{ longitude: "42"; latitude: "70"; height: "141"; }
- ListElement{ longitude: "42"; latitude: "71"; height: "160"; }
- ListElement{ longitude: "42"; latitude: "72"; height: "156"; }
- ListElement{ longitude: "42"; latitude: "73"; height: "159"; }
- ListElement{ longitude: "42"; latitude: "74"; height: "143"; }
- ListElement{ longitude: "42"; latitude: "75"; height: "126"; }
- ListElement{ longitude: "42"; latitude: "76"; height: "72"; }
- ListElement{ longitude: "42"; latitude: "77"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "78"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "79"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "80"; height: "17"; }
- ListElement{ longitude: "42"; latitude: "81"; height: "12"; }
- ListElement{ longitude: "42"; latitude: "82"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "83"; height: "2"; }
- ListElement{ longitude: "42"; latitude: "84"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "86"; height: "20"; }
- ListElement{ longitude: "42"; latitude: "87"; height: "7"; }
- ListElement{ longitude: "42"; latitude: "88"; height: "20"; }
- ListElement{ longitude: "42"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "42"; latitude: "91"; height: "34"; }
- ListElement{ longitude: "42"; latitude: "92"; height: "55"; }
- ListElement{ longitude: "42"; latitude: "93"; height: "74"; }
- ListElement{ longitude: "42"; latitude: "94"; height: "91"; }
- ListElement{ longitude: "42"; latitude: "95"; height: "133"; }
- ListElement{ longitude: "42"; latitude: "96"; height: "145"; }
- ListElement{ longitude: "42"; latitude: "97"; height: "139"; }
- ListElement{ longitude: "42"; latitude: "98"; height: "133"; }
- ListElement{ longitude: "42"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "43"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "2"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "43"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "7"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "8"; height: "131"; }
- ListElement{ longitude: "43"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "43"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "43"; latitude: "11"; height: "128"; }
- ListElement{ longitude: "43"; latitude: "12"; height: "129"; }
- ListElement{ longitude: "43"; latitude: "13"; height: "128"; }
- ListElement{ longitude: "43"; latitude: "14"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "15"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "20"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "23"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "43"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "37"; height: "120"; }
- ListElement{ longitude: "43"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "41"; height: "123"; }
- ListElement{ longitude: "43"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "43"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "46"; height: "120"; }
- ListElement{ longitude: "43"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "43"; latitude: "48"; height: "118"; }
- ListElement{ longitude: "43"; latitude: "49"; height: "117"; }
- ListElement{ longitude: "43"; latitude: "50"; height: "117"; }
- ListElement{ longitude: "43"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "43"; latitude: "52"; height: "123"; }
- ListElement{ longitude: "43"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "43"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "43"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "43"; latitude: "58"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "43"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "43"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "43"; latitude: "63"; height: "131"; }
- ListElement{ longitude: "43"; latitude: "64"; height: "135"; }
- ListElement{ longitude: "43"; latitude: "65"; height: "139"; }
- ListElement{ longitude: "43"; latitude: "66"; height: "140"; }
- ListElement{ longitude: "43"; latitude: "67"; height: "137"; }
- ListElement{ longitude: "43"; latitude: "68"; height: "139"; }
- ListElement{ longitude: "43"; latitude: "69"; height: "138"; }
- ListElement{ longitude: "43"; latitude: "70"; height: "145"; }
- ListElement{ longitude: "43"; latitude: "71"; height: "162"; }
- ListElement{ longitude: "43"; latitude: "72"; height: "154"; }
- ListElement{ longitude: "43"; latitude: "73"; height: "153"; }
- ListElement{ longitude: "43"; latitude: "74"; height: "136"; }
- ListElement{ longitude: "43"; latitude: "75"; height: "132"; }
- ListElement{ longitude: "43"; latitude: "76"; height: "101"; }
- ListElement{ longitude: "43"; latitude: "77"; height: "32"; }
- ListElement{ longitude: "43"; latitude: "78"; height: "1"; }
- ListElement{ longitude: "43"; latitude: "79"; height: "1"; }
- ListElement{ longitude: "43"; latitude: "80"; height: "23"; }
- ListElement{ longitude: "43"; latitude: "81"; height: "51"; }
- ListElement{ longitude: "43"; latitude: "82"; height: "50"; }
- ListElement{ longitude: "43"; latitude: "83"; height: "65"; }
- ListElement{ longitude: "43"; latitude: "84"; height: "30"; }
- ListElement{ longitude: "43"; latitude: "85"; height: "16"; }
- ListElement{ longitude: "43"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "43"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "43"; latitude: "88"; height: "8"; }
- ListElement{ longitude: "43"; latitude: "89"; height: "2"; }
- ListElement{ longitude: "43"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "43"; latitude: "91"; height: "22"; }
- ListElement{ longitude: "43"; latitude: "92"; height: "42"; }
- ListElement{ longitude: "43"; latitude: "93"; height: "71"; }
- ListElement{ longitude: "43"; latitude: "94"; height: "86"; }
- ListElement{ longitude: "43"; latitude: "95"; height: "109"; }
- ListElement{ longitude: "43"; latitude: "96"; height: "139"; }
- ListElement{ longitude: "43"; latitude: "97"; height: "140"; }
- ListElement{ longitude: "43"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "43"; latitude: "99"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "44"; latitude: "2"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "3"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "5"; height: "123"; }
- ListElement{ longitude: "44"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "44"; latitude: "9"; height: "130"; }
- ListElement{ longitude: "44"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "44"; latitude: "11"; height: "129"; }
- ListElement{ longitude: "44"; latitude: "12"; height: "129"; }
- ListElement{ longitude: "44"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "14"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "21"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "23"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "44"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "38"; height: "127"; }
- ListElement{ longitude: "44"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "44"; latitude: "40"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "41"; height: "123"; }
- ListElement{ longitude: "44"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "44"; latitude: "45"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "46"; height: "120"; }
- ListElement{ longitude: "44"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "48"; height: "121"; }
- ListElement{ longitude: "44"; latitude: "49"; height: "118"; }
- ListElement{ longitude: "44"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "44"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "44"; latitude: "52"; height: "121"; }
- ListElement{ longitude: "44"; latitude: "53"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "44"; latitude: "57"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "58"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "59"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "44"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "44"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "44"; latitude: "63"; height: "129"; }
- ListElement{ longitude: "44"; latitude: "64"; height: "134"; }
- ListElement{ longitude: "44"; latitude: "65"; height: "139"; }
- ListElement{ longitude: "44"; latitude: "66"; height: "139"; }
- ListElement{ longitude: "44"; latitude: "67"; height: "138"; }
- ListElement{ longitude: "44"; latitude: "68"; height: "131"; }
- ListElement{ longitude: "44"; latitude: "69"; height: "130"; }
- ListElement{ longitude: "44"; latitude: "70"; height: "133"; }
- ListElement{ longitude: "44"; latitude: "71"; height: "157"; }
- ListElement{ longitude: "44"; latitude: "72"; height: "153"; }
- ListElement{ longitude: "44"; latitude: "73"; height: "148"; }
- ListElement{ longitude: "44"; latitude: "74"; height: "123"; }
- ListElement{ longitude: "44"; latitude: "75"; height: "108"; }
- ListElement{ longitude: "44"; latitude: "76"; height: "85"; }
- ListElement{ longitude: "44"; latitude: "77"; height: "19"; }
- ListElement{ longitude: "44"; latitude: "78"; height: "1"; }
- ListElement{ longitude: "44"; latitude: "79"; height: "48"; }
- ListElement{ longitude: "44"; latitude: "80"; height: "102"; }
- ListElement{ longitude: "44"; latitude: "81"; height: "112"; }
- ListElement{ longitude: "44"; latitude: "82"; height: "99"; }
- ListElement{ longitude: "44"; latitude: "83"; height: "90"; }
- ListElement{ longitude: "44"; latitude: "84"; height: "71"; }
- ListElement{ longitude: "44"; latitude: "85"; height: "26"; }
- ListElement{ longitude: "44"; latitude: "86"; height: "14"; }
- ListElement{ longitude: "44"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "44"; latitude: "88"; height: "2"; }
- ListElement{ longitude: "44"; latitude: "89"; height: "5"; }
- ListElement{ longitude: "44"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "44"; latitude: "91"; height: "8"; }
- ListElement{ longitude: "44"; latitude: "92"; height: "51"; }
- ListElement{ longitude: "44"; latitude: "93"; height: "67"; }
- ListElement{ longitude: "44"; latitude: "94"; height: "90"; }
- ListElement{ longitude: "44"; latitude: "95"; height: "102"; }
- ListElement{ longitude: "44"; latitude: "96"; height: "132"; }
- ListElement{ longitude: "44"; latitude: "97"; height: "149"; }
- ListElement{ longitude: "44"; latitude: "98"; height: "145"; }
- ListElement{ longitude: "44"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "45"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "1"; height: "121"; }
- ListElement{ longitude: "45"; latitude: "2"; height: "124"; }
- ListElement{ longitude: "45"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "45"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "45"; latitude: "5"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "7"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "45"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "45"; latitude: "10"; height: "129"; }
- ListElement{ longitude: "45"; latitude: "11"; height: "129"; }
- ListElement{ longitude: "45"; latitude: "12"; height: "130"; }
- ListElement{ longitude: "45"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "14"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "15"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "16"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "17"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "22"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "30"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "45"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "45"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "36"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "45"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "45"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "45"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "45"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "46"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "45"; latitude: "48"; height: "121"; }
- ListElement{ longitude: "45"; latitude: "49"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "50"; height: "118"; }
- ListElement{ longitude: "45"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "45"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "45"; latitude: "53"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "45"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "57"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "58"; height: "121"; }
- ListElement{ longitude: "45"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "45"; latitude: "60"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "61"; height: "119"; }
- ListElement{ longitude: "45"; latitude: "62"; height: "120"; }
- ListElement{ longitude: "45"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "45"; latitude: "64"; height: "128"; }
- ListElement{ longitude: "45"; latitude: "65"; height: "132"; }
- ListElement{ longitude: "45"; latitude: "66"; height: "133"; }
- ListElement{ longitude: "45"; latitude: "67"; height: "133"; }
- ListElement{ longitude: "45"; latitude: "68"; height: "131"; }
- ListElement{ longitude: "45"; latitude: "69"; height: "128"; }
- ListElement{ longitude: "45"; latitude: "70"; height: "131"; }
- ListElement{ longitude: "45"; latitude: "71"; height: "156"; }
- ListElement{ longitude: "45"; latitude: "72"; height: "148"; }
- ListElement{ longitude: "45"; latitude: "73"; height: "148"; }
- ListElement{ longitude: "45"; latitude: "74"; height: "117"; }
- ListElement{ longitude: "45"; latitude: "75"; height: "86"; }
- ListElement{ longitude: "45"; latitude: "76"; height: "72"; }
- ListElement{ longitude: "45"; latitude: "77"; height: "42"; }
- ListElement{ longitude: "45"; latitude: "78"; height: "42"; }
- ListElement{ longitude: "45"; latitude: "79"; height: "84"; }
- ListElement{ longitude: "45"; latitude: "80"; height: "116"; }
- ListElement{ longitude: "45"; latitude: "81"; height: "95"; }
- ListElement{ longitude: "45"; latitude: "82"; height: "94"; }
- ListElement{ longitude: "45"; latitude: "83"; height: "84"; }
- ListElement{ longitude: "45"; latitude: "84"; height: "63"; }
- ListElement{ longitude: "45"; latitude: "85"; height: "21"; }
- ListElement{ longitude: "45"; latitude: "86"; height: "18"; }
- ListElement{ longitude: "45"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "45"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "45"; latitude: "89"; height: "2"; }
- ListElement{ longitude: "45"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "45"; latitude: "91"; height: "1"; }
- ListElement{ longitude: "45"; latitude: "92"; height: "39"; }
- ListElement{ longitude: "45"; latitude: "93"; height: "58"; }
- ListElement{ longitude: "45"; latitude: "94"; height: "90"; }
- ListElement{ longitude: "45"; latitude: "95"; height: "103"; }
- ListElement{ longitude: "45"; latitude: "96"; height: "136"; }
- ListElement{ longitude: "45"; latitude: "97"; height: "149"; }
- ListElement{ longitude: "45"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "45"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "46"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "46"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "2"; height: "123"; }
- ListElement{ longitude: "46"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "46"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "12"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "13"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "14"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "21"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "22"; height: "128"; }
- ListElement{ longitude: "46"; latitude: "23"; height: "128"; }
- ListElement{ longitude: "46"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "31"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "32"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "35"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "36"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "46"; latitude: "38"; height: "128"; }
- ListElement{ longitude: "46"; latitude: "39"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "46"; latitude: "41"; height: "124"; }
- ListElement{ longitude: "46"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "46"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "46"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "46"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "46"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "46"; latitude: "49"; height: "117"; }
- ListElement{ longitude: "46"; latitude: "50"; height: "119"; }
- ListElement{ longitude: "46"; latitude: "51"; height: "119"; }
- ListElement{ longitude: "46"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "53"; height: "123"; }
- ListElement{ longitude: "46"; latitude: "54"; height: "123"; }
- ListElement{ longitude: "46"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "46"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "46"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "46"; latitude: "58"; height: "121"; }
- ListElement{ longitude: "46"; latitude: "59"; height: "121"; }
- ListElement{ longitude: "46"; latitude: "60"; height: "118"; }
- ListElement{ longitude: "46"; latitude: "61"; height: "119"; }
- ListElement{ longitude: "46"; latitude: "62"; height: "116"; }
- ListElement{ longitude: "46"; latitude: "63"; height: "118"; }
- ListElement{ longitude: "46"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "46"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "46"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "46"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "46"; latitude: "68"; height: "130"; }
- ListElement{ longitude: "46"; latitude: "69"; height: "131"; }
- ListElement{ longitude: "46"; latitude: "70"; height: "137"; }
- ListElement{ longitude: "46"; latitude: "71"; height: "156"; }
- ListElement{ longitude: "46"; latitude: "72"; height: "151"; }
- ListElement{ longitude: "46"; latitude: "73"; height: "152"; }
- ListElement{ longitude: "46"; latitude: "74"; height: "120"; }
- ListElement{ longitude: "46"; latitude: "75"; height: "85"; }
- ListElement{ longitude: "46"; latitude: "76"; height: "46"; }
- ListElement{ longitude: "46"; latitude: "77"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "78"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "79"; height: "67"; }
- ListElement{ longitude: "46"; latitude: "80"; height: "98"; }
- ListElement{ longitude: "46"; latitude: "81"; height: "68"; }
- ListElement{ longitude: "46"; latitude: "82"; height: "62"; }
- ListElement{ longitude: "46"; latitude: "83"; height: "62"; }
- ListElement{ longitude: "46"; latitude: "84"; height: "77"; }
- ListElement{ longitude: "46"; latitude: "85"; height: "33"; }
- ListElement{ longitude: "46"; latitude: "86"; height: "20"; }
- ListElement{ longitude: "46"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "91"; height: "1"; }
- ListElement{ longitude: "46"; latitude: "92"; height: "41"; }
- ListElement{ longitude: "46"; latitude: "93"; height: "70"; }
- ListElement{ longitude: "46"; latitude: "94"; height: "89"; }
- ListElement{ longitude: "46"; latitude: "95"; height: "108"; }
- ListElement{ longitude: "46"; latitude: "96"; height: "129"; }
- ListElement{ longitude: "46"; latitude: "97"; height: "153"; }
- ListElement{ longitude: "46"; latitude: "98"; height: "141"; }
- ListElement{ longitude: "46"; latitude: "99"; height: "129"; }
- ListElement{ longitude: "47"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "47"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "2"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "9"; height: "128"; }
- ListElement{ longitude: "47"; latitude: "10"; height: "128"; }
- ListElement{ longitude: "47"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "12"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "13"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "14"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "18"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "19"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "20"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "21"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "22"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "23"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "24"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "28"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "47"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "31"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "47"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "34"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "35"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "47"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "47"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "47"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "47"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "47"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "47"; latitude: "47"; height: "120"; }
- ListElement{ longitude: "47"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "47"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "47"; latitude: "50"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "51"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "47"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "47"; latitude: "55"; height: "118"; }
- ListElement{ longitude: "47"; latitude: "56"; height: "117"; }
- ListElement{ longitude: "47"; latitude: "57"; height: "117"; }
- ListElement{ longitude: "47"; latitude: "58"; height: "119"; }
- ListElement{ longitude: "47"; latitude: "59"; height: "119"; }
- ListElement{ longitude: "47"; latitude: "60"; height: "117"; }
- ListElement{ longitude: "47"; latitude: "61"; height: "114"; }
- ListElement{ longitude: "47"; latitude: "62"; height: "111"; }
- ListElement{ longitude: "47"; latitude: "63"; height: "113"; }
- ListElement{ longitude: "47"; latitude: "64"; height: "115"; }
- ListElement{ longitude: "47"; latitude: "65"; height: "118"; }
- ListElement{ longitude: "47"; latitude: "66"; height: "121"; }
- ListElement{ longitude: "47"; latitude: "67"; height: "122"; }
- ListElement{ longitude: "47"; latitude: "68"; height: "125"; }
- ListElement{ longitude: "47"; latitude: "69"; height: "128"; }
- ListElement{ longitude: "47"; latitude: "70"; height: "138"; }
- ListElement{ longitude: "47"; latitude: "71"; height: "161"; }
- ListElement{ longitude: "47"; latitude: "72"; height: "157"; }
- ListElement{ longitude: "47"; latitude: "73"; height: "158"; }
- ListElement{ longitude: "47"; latitude: "74"; height: "120"; }
- ListElement{ longitude: "47"; latitude: "75"; height: "98"; }
- ListElement{ longitude: "47"; latitude: "76"; height: "38"; }
- ListElement{ longitude: "47"; latitude: "77"; height: "4"; }
- ListElement{ longitude: "47"; latitude: "78"; height: "16"; }
- ListElement{ longitude: "47"; latitude: "79"; height: "36"; }
- ListElement{ longitude: "47"; latitude: "80"; height: "103"; }
- ListElement{ longitude: "47"; latitude: "81"; height: "83"; }
- ListElement{ longitude: "47"; latitude: "82"; height: "47"; }
- ListElement{ longitude: "47"; latitude: "83"; height: "72"; }
- ListElement{ longitude: "47"; latitude: "84"; height: "97"; }
- ListElement{ longitude: "47"; latitude: "85"; height: "22"; }
- ListElement{ longitude: "47"; latitude: "86"; height: "18"; }
- ListElement{ longitude: "47"; latitude: "87"; height: "2"; }
- ListElement{ longitude: "47"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "47"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "47"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "47"; latitude: "91"; height: "1"; }
- ListElement{ longitude: "47"; latitude: "92"; height: "43"; }
- ListElement{ longitude: "47"; latitude: "93"; height: "76"; }
- ListElement{ longitude: "47"; latitude: "94"; height: "91"; }
- ListElement{ longitude: "47"; latitude: "95"; height: "106"; }
- ListElement{ longitude: "47"; latitude: "96"; height: "143"; }
- ListElement{ longitude: "47"; latitude: "97"; height: "155"; }
- ListElement{ longitude: "47"; latitude: "98"; height: "141"; }
- ListElement{ longitude: "47"; latitude: "99"; height: "131"; }
- ListElement{ longitude: "48"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "48"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "48"; latitude: "2"; height: "123"; }
- ListElement{ longitude: "48"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "48"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "48"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "48"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "9"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "11"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "12"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "13"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "14"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "16"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "17"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "18"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "19"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "20"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "22"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "27"; height: "127"; }
- ListElement{ longitude: "48"; latitude: "28"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "29"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "30"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "31"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "38"; height: "120"; }
- ListElement{ longitude: "48"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "48"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "48"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "48"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "46"; height: "119"; }
- ListElement{ longitude: "48"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "48"; latitude: "48"; height: "121"; }
- ListElement{ longitude: "48"; latitude: "49"; height: "122"; }
- ListElement{ longitude: "48"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "48"; latitude: "51"; height: "123"; }
- ListElement{ longitude: "48"; latitude: "52"; height: "122"; }
- ListElement{ longitude: "48"; latitude: "53"; height: "120"; }
- ListElement{ longitude: "48"; latitude: "54"; height: "118"; }
- ListElement{ longitude: "48"; latitude: "55"; height: "115"; }
- ListElement{ longitude: "48"; latitude: "56"; height: "115"; }
- ListElement{ longitude: "48"; latitude: "57"; height: "115"; }
- ListElement{ longitude: "48"; latitude: "58"; height: "116"; }
- ListElement{ longitude: "48"; latitude: "59"; height: "116"; }
- ListElement{ longitude: "48"; latitude: "60"; height: "113"; }
- ListElement{ longitude: "48"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "48"; latitude: "62"; height: "110"; }
- ListElement{ longitude: "48"; latitude: "63"; height: "108"; }
- ListElement{ longitude: "48"; latitude: "64"; height: "109"; }
- ListElement{ longitude: "48"; latitude: "65"; height: "115"; }
- ListElement{ longitude: "48"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "48"; latitude: "67"; height: "118"; }
- ListElement{ longitude: "48"; latitude: "68"; height: "121"; }
- ListElement{ longitude: "48"; latitude: "69"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "70"; height: "120"; }
- ListElement{ longitude: "48"; latitude: "71"; height: "145"; }
- ListElement{ longitude: "48"; latitude: "72"; height: "154"; }
- ListElement{ longitude: "48"; latitude: "73"; height: "153"; }
- ListElement{ longitude: "48"; latitude: "74"; height: "125"; }
- ListElement{ longitude: "48"; latitude: "75"; height: "106"; }
- ListElement{ longitude: "48"; latitude: "76"; height: "52"; }
- ListElement{ longitude: "48"; latitude: "77"; height: "6"; }
- ListElement{ longitude: "48"; latitude: "78"; height: "6"; }
- ListElement{ longitude: "48"; latitude: "79"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "80"; height: "67"; }
- ListElement{ longitude: "48"; latitude: "81"; height: "81"; }
- ListElement{ longitude: "48"; latitude: "82"; height: "57"; }
- ListElement{ longitude: "48"; latitude: "83"; height: "93"; }
- ListElement{ longitude: "48"; latitude: "84"; height: "58"; }
- ListElement{ longitude: "48"; latitude: "85"; height: "16"; }
- ListElement{ longitude: "48"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "88"; height: "2"; }
- ListElement{ longitude: "48"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "91"; height: "1"; }
- ListElement{ longitude: "48"; latitude: "92"; height: "45"; }
- ListElement{ longitude: "48"; latitude: "93"; height: "80"; }
- ListElement{ longitude: "48"; latitude: "94"; height: "91"; }
- ListElement{ longitude: "48"; latitude: "95"; height: "97"; }
- ListElement{ longitude: "48"; latitude: "96"; height: "136"; }
- ListElement{ longitude: "48"; latitude: "97"; height: "148"; }
- ListElement{ longitude: "48"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "48"; latitude: "99"; height: "131"; }
- ListElement{ longitude: "49"; latitude: "0"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "49"; latitude: "5"; height: "119"; }
- ListElement{ longitude: "49"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "49"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "49"; latitude: "12"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "13"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "14"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "15"; height: "126"; }
- ListElement{ longitude: "49"; latitude: "16"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "17"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "18"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "19"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "20"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "21"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "22"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "23"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "49"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "49"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "49"; latitude: "27"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "28"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "49"; latitude: "30"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "31"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "33"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "49"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "49"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "49"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "42"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "49"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "49"; latitude: "47"; height: "118"; }
- ListElement{ longitude: "49"; latitude: "48"; height: "118"; }
- ListElement{ longitude: "49"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "49"; latitude: "50"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "51"; height: "125"; }
- ListElement{ longitude: "49"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "49"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "49"; latitude: "54"; height: "116"; }
- ListElement{ longitude: "49"; latitude: "55"; height: "111"; }
- ListElement{ longitude: "49"; latitude: "56"; height: "110"; }
- ListElement{ longitude: "49"; latitude: "57"; height: "108"; }
- ListElement{ longitude: "49"; latitude: "58"; height: "112"; }
- ListElement{ longitude: "49"; latitude: "59"; height: "113"; }
- ListElement{ longitude: "49"; latitude: "60"; height: "113"; }
- ListElement{ longitude: "49"; latitude: "61"; height: "110"; }
- ListElement{ longitude: "49"; latitude: "62"; height: "107"; }
- ListElement{ longitude: "49"; latitude: "63"; height: "108"; }
- ListElement{ longitude: "49"; latitude: "64"; height: "107"; }
- ListElement{ longitude: "49"; latitude: "65"; height: "110"; }
- ListElement{ longitude: "49"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "49"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "49"; latitude: "68"; height: "118"; }
- ListElement{ longitude: "49"; latitude: "69"; height: "124"; }
- ListElement{ longitude: "49"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "49"; latitude: "71"; height: "138"; }
- ListElement{ longitude: "49"; latitude: "72"; height: "153"; }
- ListElement{ longitude: "49"; latitude: "73"; height: "156"; }
- ListElement{ longitude: "49"; latitude: "74"; height: "148"; }
- ListElement{ longitude: "49"; latitude: "75"; height: "112"; }
- ListElement{ longitude: "49"; latitude: "76"; height: "83"; }
- ListElement{ longitude: "49"; latitude: "77"; height: "31"; }
- ListElement{ longitude: "49"; latitude: "78"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "79"; height: "9"; }
- ListElement{ longitude: "49"; latitude: "80"; height: "36"; }
- ListElement{ longitude: "49"; latitude: "81"; height: "12"; }
- ListElement{ longitude: "49"; latitude: "82"; height: "15"; }
- ListElement{ longitude: "49"; latitude: "83"; height: "23"; }
- ListElement{ longitude: "49"; latitude: "84"; height: "22"; }
- ListElement{ longitude: "49"; latitude: "85"; height: "9"; }
- ListElement{ longitude: "49"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "49"; latitude: "91"; height: "5"; }
- ListElement{ longitude: "49"; latitude: "92"; height: "22"; }
- ListElement{ longitude: "49"; latitude: "93"; height: "64"; }
- ListElement{ longitude: "49"; latitude: "94"; height: "87"; }
- ListElement{ longitude: "49"; latitude: "95"; height: "89"; }
- ListElement{ longitude: "49"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "49"; latitude: "97"; height: "139"; }
- ListElement{ longitude: "49"; latitude: "98"; height: "136"; }
- ListElement{ longitude: "49"; latitude: "99"; height: "129"; }
- ListElement{ longitude: "50"; latitude: "0"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "1"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "50"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "50"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "50"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "50"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "13"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "50"; latitude: "15"; height: "118"; }
- ListElement{ longitude: "50"; latitude: "16"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "17"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "18"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "50"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "23"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "50"; latitude: "25"; height: "127"; }
- ListElement{ longitude: "50"; latitude: "26"; height: "127"; }
- ListElement{ longitude: "50"; latitude: "27"; height: "126"; }
- ListElement{ longitude: "50"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "50"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "50"; latitude: "30"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "31"; height: "125"; }
- ListElement{ longitude: "50"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "50"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "50"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "35"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "40"; height: "120"; }
- ListElement{ longitude: "50"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "50"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "50"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "44"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "50"; latitude: "46"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "50"; latitude: "49"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "51"; height: "123"; }
- ListElement{ longitude: "50"; latitude: "52"; height: "121"; }
- ListElement{ longitude: "50"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "50"; latitude: "54"; height: "112"; }
- ListElement{ longitude: "50"; latitude: "55"; height: "107"; }
- ListElement{ longitude: "50"; latitude: "56"; height: "108"; }
- ListElement{ longitude: "50"; latitude: "57"; height: "106"; }
- ListElement{ longitude: "50"; latitude: "58"; height: "107"; }
- ListElement{ longitude: "50"; latitude: "59"; height: "111"; }
- ListElement{ longitude: "50"; latitude: "60"; height: "110"; }
- ListElement{ longitude: "50"; latitude: "61"; height: "111"; }
- ListElement{ longitude: "50"; latitude: "62"; height: "108"; }
- ListElement{ longitude: "50"; latitude: "63"; height: "108"; }
- ListElement{ longitude: "50"; latitude: "64"; height: "108"; }
- ListElement{ longitude: "50"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "50"; latitude: "66"; height: "111"; }
- ListElement{ longitude: "50"; latitude: "67"; height: "114"; }
- ListElement{ longitude: "50"; latitude: "68"; height: "117"; }
- ListElement{ longitude: "50"; latitude: "69"; height: "120"; }
- ListElement{ longitude: "50"; latitude: "70"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "71"; height: "124"; }
- ListElement{ longitude: "50"; latitude: "72"; height: "141"; }
- ListElement{ longitude: "50"; latitude: "73"; height: "150"; }
- ListElement{ longitude: "50"; latitude: "74"; height: "153"; }
- ListElement{ longitude: "50"; latitude: "75"; height: "118"; }
- ListElement{ longitude: "50"; latitude: "76"; height: "85"; }
- ListElement{ longitude: "50"; latitude: "77"; height: "65"; }
- ListElement{ longitude: "50"; latitude: "78"; height: "19"; }
- ListElement{ longitude: "50"; latitude: "79"; height: "18"; }
- ListElement{ longitude: "50"; latitude: "80"; height: "28"; }
- ListElement{ longitude: "50"; latitude: "81"; height: "3"; }
- ListElement{ longitude: "50"; latitude: "82"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "83"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "84"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "89"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "90"; height: "1"; }
- ListElement{ longitude: "50"; latitude: "91"; height: "19"; }
- ListElement{ longitude: "50"; latitude: "92"; height: "10"; }
- ListElement{ longitude: "50"; latitude: "93"; height: "59"; }
- ListElement{ longitude: "50"; latitude: "94"; height: "72"; }
- ListElement{ longitude: "50"; latitude: "95"; height: "95"; }
- ListElement{ longitude: "50"; latitude: "96"; height: "127"; }
- ListElement{ longitude: "50"; latitude: "97"; height: "129"; }
- ListElement{ longitude: "50"; latitude: "98"; height: "132"; }
- ListElement{ longitude: "50"; latitude: "99"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "1"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "11"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "12"; height: "121"; }
- ListElement{ longitude: "51"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "51"; latitude: "14"; height: "119"; }
- ListElement{ longitude: "51"; latitude: "15"; height: "119"; }
- ListElement{ longitude: "51"; latitude: "16"; height: "120"; }
- ListElement{ longitude: "51"; latitude: "17"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "18"; height: "121"; }
- ListElement{ longitude: "51"; latitude: "19"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "20"; height: "118"; }
- ListElement{ longitude: "51"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "51"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "51"; latitude: "23"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "25"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "26"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "27"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "31"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "40"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "41"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "42"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "51"; latitude: "46"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "51"; latitude: "49"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "51"; latitude: "51"; height: "124"; }
- ListElement{ longitude: "51"; latitude: "52"; height: "120"; }
- ListElement{ longitude: "51"; latitude: "53"; height: "117"; }
- ListElement{ longitude: "51"; latitude: "54"; height: "111"; }
- ListElement{ longitude: "51"; latitude: "55"; height: "105"; }
- ListElement{ longitude: "51"; latitude: "56"; height: "102"; }
- ListElement{ longitude: "51"; latitude: "57"; height: "102"; }
- ListElement{ longitude: "51"; latitude: "58"; height: "105"; }
- ListElement{ longitude: "51"; latitude: "59"; height: "111"; }
- ListElement{ longitude: "51"; latitude: "60"; height: "111"; }
- ListElement{ longitude: "51"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "51"; latitude: "62"; height: "109"; }
- ListElement{ longitude: "51"; latitude: "63"; height: "109"; }
- ListElement{ longitude: "51"; latitude: "64"; height: "109"; }
- ListElement{ longitude: "51"; latitude: "65"; height: "110"; }
- ListElement{ longitude: "51"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "51"; latitude: "67"; height: "115"; }
- ListElement{ longitude: "51"; latitude: "68"; height: "116"; }
- ListElement{ longitude: "51"; latitude: "69"; height: "118"; }
- ListElement{ longitude: "51"; latitude: "70"; height: "122"; }
- ListElement{ longitude: "51"; latitude: "71"; height: "121"; }
- ListElement{ longitude: "51"; latitude: "72"; height: "133"; }
- ListElement{ longitude: "51"; latitude: "73"; height: "151"; }
- ListElement{ longitude: "51"; latitude: "74"; height: "153"; }
- ListElement{ longitude: "51"; latitude: "75"; height: "138"; }
- ListElement{ longitude: "51"; latitude: "76"; height: "98"; }
- ListElement{ longitude: "51"; latitude: "77"; height: "64"; }
- ListElement{ longitude: "51"; latitude: "78"; height: "32"; }
- ListElement{ longitude: "51"; latitude: "79"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "80"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "81"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "82"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "83"; height: "6"; }
- ListElement{ longitude: "51"; latitude: "84"; height: "8"; }
- ListElement{ longitude: "51"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "87"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "88"; height: "1"; }
- ListElement{ longitude: "51"; latitude: "89"; height: "13"; }
- ListElement{ longitude: "51"; latitude: "90"; height: "15"; }
- ListElement{ longitude: "51"; latitude: "91"; height: "22"; }
- ListElement{ longitude: "51"; latitude: "92"; height: "33"; }
- ListElement{ longitude: "51"; latitude: "93"; height: "67"; }
- ListElement{ longitude: "51"; latitude: "94"; height: "69"; }
- ListElement{ longitude: "51"; latitude: "95"; height: "110"; }
- ListElement{ longitude: "51"; latitude: "96"; height: "125"; }
- ListElement{ longitude: "51"; latitude: "97"; height: "127"; }
- ListElement{ longitude: "51"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "51"; latitude: "99"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "0"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "1"; height: "119"; }
- ListElement{ longitude: "52"; latitude: "2"; height: "117"; }
- ListElement{ longitude: "52"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "52"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "12"; height: "123"; }
- ListElement{ longitude: "52"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "15"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "16"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "17"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "24"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "25"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "26"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "27"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "31"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "52"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "52"; latitude: "41"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "42"; height: "125"; }
- ListElement{ longitude: "52"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "52"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "52"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "52"; latitude: "50"; height: "123"; }
- ListElement{ longitude: "52"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "52"; height: "119"; }
- ListElement{ longitude: "52"; latitude: "53"; height: "116"; }
- ListElement{ longitude: "52"; latitude: "54"; height: "110"; }
- ListElement{ longitude: "52"; latitude: "55"; height: "106"; }
- ListElement{ longitude: "52"; latitude: "56"; height: "101"; }
- ListElement{ longitude: "52"; latitude: "57"; height: "101"; }
- ListElement{ longitude: "52"; latitude: "58"; height: "104"; }
- ListElement{ longitude: "52"; latitude: "59"; height: "107"; }
- ListElement{ longitude: "52"; latitude: "60"; height: "109"; }
- ListElement{ longitude: "52"; latitude: "61"; height: "112"; }
- ListElement{ longitude: "52"; latitude: "62"; height: "112"; }
- ListElement{ longitude: "52"; latitude: "63"; height: "110"; }
- ListElement{ longitude: "52"; latitude: "64"; height: "110"; }
- ListElement{ longitude: "52"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "52"; latitude: "66"; height: "114"; }
- ListElement{ longitude: "52"; latitude: "67"; height: "116"; }
- ListElement{ longitude: "52"; latitude: "68"; height: "115"; }
- ListElement{ longitude: "52"; latitude: "69"; height: "116"; }
- ListElement{ longitude: "52"; latitude: "70"; height: "117"; }
- ListElement{ longitude: "52"; latitude: "71"; height: "120"; }
- ListElement{ longitude: "52"; latitude: "72"; height: "126"; }
- ListElement{ longitude: "52"; latitude: "73"; height: "146"; }
- ListElement{ longitude: "52"; latitude: "74"; height: "152"; }
- ListElement{ longitude: "52"; latitude: "75"; height: "148"; }
- ListElement{ longitude: "52"; latitude: "76"; height: "117"; }
- ListElement{ longitude: "52"; latitude: "77"; height: "93"; }
- ListElement{ longitude: "52"; latitude: "78"; height: "72"; }
- ListElement{ longitude: "52"; latitude: "79"; height: "50"; }
- ListElement{ longitude: "52"; latitude: "80"; height: "16"; }
- ListElement{ longitude: "52"; latitude: "81"; height: "1"; }
- ListElement{ longitude: "52"; latitude: "82"; height: "3"; }
- ListElement{ longitude: "52"; latitude: "83"; height: "6"; }
- ListElement{ longitude: "52"; latitude: "84"; height: "24"; }
- ListElement{ longitude: "52"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "52"; latitude: "86"; height: "4"; }
- ListElement{ longitude: "52"; latitude: "87"; height: "4"; }
- ListElement{ longitude: "52"; latitude: "88"; height: "7"; }
- ListElement{ longitude: "52"; latitude: "89"; height: "42"; }
- ListElement{ longitude: "52"; latitude: "90"; height: "52"; }
- ListElement{ longitude: "52"; latitude: "91"; height: "47"; }
- ListElement{ longitude: "52"; latitude: "92"; height: "46"; }
- ListElement{ longitude: "52"; latitude: "93"; height: "61"; }
- ListElement{ longitude: "52"; latitude: "94"; height: "73"; }
- ListElement{ longitude: "52"; latitude: "95"; height: "114"; }
- ListElement{ longitude: "52"; latitude: "96"; height: "121"; }
- ListElement{ longitude: "52"; latitude: "97"; height: "127"; }
- ListElement{ longitude: "52"; latitude: "98"; height: "129"; }
- ListElement{ longitude: "52"; latitude: "99"; height: "119"; }
- ListElement{ longitude: "53"; latitude: "0"; height: "119"; }
- ListElement{ longitude: "53"; latitude: "1"; height: "117"; }
- ListElement{ longitude: "53"; latitude: "2"; height: "116"; }
- ListElement{ longitude: "53"; latitude: "3"; height: "119"; }
- ListElement{ longitude: "53"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "53"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "53"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "11"; height: "124"; }
- ListElement{ longitude: "53"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "53"; latitude: "15"; height: "120"; }
- ListElement{ longitude: "53"; latitude: "16"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "17"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "53"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "53"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "53"; latitude: "21"; height: "120"; }
- ListElement{ longitude: "53"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "53"; latitude: "24"; height: "124"; }
- ListElement{ longitude: "53"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "53"; latitude: "26"; height: "124"; }
- ListElement{ longitude: "53"; latitude: "27"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "53"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "53"; latitude: "30"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "31"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "32"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "53"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "48"; height: "127"; }
- ListElement{ longitude: "53"; latitude: "49"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "50"; height: "122"; }
- ListElement{ longitude: "53"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "53"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "53"; latitude: "53"; height: "114"; }
- ListElement{ longitude: "53"; latitude: "54"; height: "106"; }
- ListElement{ longitude: "53"; latitude: "55"; height: "108"; }
- ListElement{ longitude: "53"; latitude: "56"; height: "105"; }
- ListElement{ longitude: "53"; latitude: "57"; height: "104"; }
- ListElement{ longitude: "53"; latitude: "58"; height: "103"; }
- ListElement{ longitude: "53"; latitude: "59"; height: "107"; }
- ListElement{ longitude: "53"; latitude: "60"; height: "109"; }
- ListElement{ longitude: "53"; latitude: "61"; height: "112"; }
- ListElement{ longitude: "53"; latitude: "62"; height: "111"; }
- ListElement{ longitude: "53"; latitude: "63"; height: "113"; }
- ListElement{ longitude: "53"; latitude: "64"; height: "111"; }
- ListElement{ longitude: "53"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "53"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "53"; latitude: "67"; height: "116"; }
- ListElement{ longitude: "53"; latitude: "68"; height: "116"; }
- ListElement{ longitude: "53"; latitude: "69"; height: "114"; }
- ListElement{ longitude: "53"; latitude: "70"; height: "114"; }
- ListElement{ longitude: "53"; latitude: "71"; height: "112"; }
- ListElement{ longitude: "53"; latitude: "72"; height: "118"; }
- ListElement{ longitude: "53"; latitude: "73"; height: "133"; }
- ListElement{ longitude: "53"; latitude: "74"; height: "150"; }
- ListElement{ longitude: "53"; latitude: "75"; height: "154"; }
- ListElement{ longitude: "53"; latitude: "76"; height: "141"; }
- ListElement{ longitude: "53"; latitude: "77"; height: "103"; }
- ListElement{ longitude: "53"; latitude: "78"; height: "97"; }
- ListElement{ longitude: "53"; latitude: "79"; height: "94"; }
- ListElement{ longitude: "53"; latitude: "80"; height: "54"; }
- ListElement{ longitude: "53"; latitude: "81"; height: "17"; }
- ListElement{ longitude: "53"; latitude: "82"; height: "5"; }
- ListElement{ longitude: "53"; latitude: "83"; height: "4"; }
- ListElement{ longitude: "53"; latitude: "84"; height: "1"; }
- ListElement{ longitude: "53"; latitude: "85"; height: "1"; }
- ListElement{ longitude: "53"; latitude: "86"; height: "19"; }
- ListElement{ longitude: "53"; latitude: "87"; height: "9"; }
- ListElement{ longitude: "53"; latitude: "88"; height: "25"; }
- ListElement{ longitude: "53"; latitude: "89"; height: "40"; }
- ListElement{ longitude: "53"; latitude: "90"; height: "55"; }
- ListElement{ longitude: "53"; latitude: "91"; height: "54"; }
- ListElement{ longitude: "53"; latitude: "92"; height: "53"; }
- ListElement{ longitude: "53"; latitude: "93"; height: "69"; }
- ListElement{ longitude: "53"; latitude: "94"; height: "100"; }
- ListElement{ longitude: "53"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "53"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "53"; latitude: "97"; height: "126"; }
- ListElement{ longitude: "53"; latitude: "98"; height: "125"; }
- ListElement{ longitude: "53"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "54"; latitude: "0"; height: "119"; }
- ListElement{ longitude: "54"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "54"; latitude: "2"; height: "118"; }
- ListElement{ longitude: "54"; latitude: "3"; height: "119"; }
- ListElement{ longitude: "54"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "5"; height: "123"; }
- ListElement{ longitude: "54"; latitude: "6"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "54"; latitude: "9"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "54"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "13"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "15"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "16"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "17"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "18"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "19"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "23"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "24"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "26"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "28"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "31"; height: "123"; }
- ListElement{ longitude: "54"; latitude: "32"; height: "121"; }
- ListElement{ longitude: "54"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "54"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "54"; latitude: "39"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "40"; height: "124"; }
- ListElement{ longitude: "54"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "54"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "54"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "54"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "54"; latitude: "50"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "54"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "54"; latitude: "53"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "54"; height: "96"; }
- ListElement{ longitude: "54"; latitude: "55"; height: "107"; }
- ListElement{ longitude: "54"; latitude: "56"; height: "108"; }
- ListElement{ longitude: "54"; latitude: "57"; height: "105"; }
- ListElement{ longitude: "54"; latitude: "58"; height: "105"; }
- ListElement{ longitude: "54"; latitude: "59"; height: "108"; }
- ListElement{ longitude: "54"; latitude: "60"; height: "111"; }
- ListElement{ longitude: "54"; latitude: "61"; height: "111"; }
- ListElement{ longitude: "54"; latitude: "62"; height: "115"; }
- ListElement{ longitude: "54"; latitude: "63"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "64"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "65"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "54"; latitude: "67"; height: "113"; }
- ListElement{ longitude: "54"; latitude: "68"; height: "115"; }
- ListElement{ longitude: "54"; latitude: "69"; height: "115"; }
- ListElement{ longitude: "54"; latitude: "70"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "54"; latitude: "72"; height: "112"; }
- ListElement{ longitude: "54"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "54"; latitude: "74"; height: "140"; }
- ListElement{ longitude: "54"; latitude: "75"; height: "151"; }
- ListElement{ longitude: "54"; latitude: "76"; height: "150"; }
- ListElement{ longitude: "54"; latitude: "77"; height: "140"; }
- ListElement{ longitude: "54"; latitude: "78"; height: "104"; }
- ListElement{ longitude: "54"; latitude: "79"; height: "102"; }
- ListElement{ longitude: "54"; latitude: "80"; height: "90"; }
- ListElement{ longitude: "54"; latitude: "81"; height: "46"; }
- ListElement{ longitude: "54"; latitude: "82"; height: "37"; }
- ListElement{ longitude: "54"; latitude: "83"; height: "30"; }
- ListElement{ longitude: "54"; latitude: "84"; height: "24"; }
- ListElement{ longitude: "54"; latitude: "85"; height: "16"; }
- ListElement{ longitude: "54"; latitude: "86"; height: "18"; }
- ListElement{ longitude: "54"; latitude: "87"; height: "46"; }
- ListElement{ longitude: "54"; latitude: "88"; height: "26"; }
- ListElement{ longitude: "54"; latitude: "89"; height: "28"; }
- ListElement{ longitude: "54"; latitude: "90"; height: "60"; }
- ListElement{ longitude: "54"; latitude: "91"; height: "51"; }
- ListElement{ longitude: "54"; latitude: "92"; height: "54"; }
- ListElement{ longitude: "54"; latitude: "93"; height: "108"; }
- ListElement{ longitude: "54"; latitude: "94"; height: "131"; }
- ListElement{ longitude: "54"; latitude: "95"; height: "116"; }
- ListElement{ longitude: "54"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "54"; latitude: "97"; height: "126"; }
- ListElement{ longitude: "54"; latitude: "98"; height: "125"; }
- ListElement{ longitude: "54"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "55"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "8"; height: "129"; }
- ListElement{ longitude: "55"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "55"; latitude: "10"; height: "127"; }
- ListElement{ longitude: "55"; latitude: "11"; height: "125"; }
- ListElement{ longitude: "55"; latitude: "12"; height: "123"; }
- ListElement{ longitude: "55"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "15"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "17"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "18"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "19"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "55"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "55"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "27"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "29"; height: "119"; }
- ListElement{ longitude: "55"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "31"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "32"; height: "116"; }
- ListElement{ longitude: "55"; latitude: "33"; height: "120"; }
- ListElement{ longitude: "55"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "55"; latitude: "35"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "55"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "55"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "55"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "55"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "55"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "55"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "55"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "55"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "55"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "55"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "55"; latitude: "48"; height: "128"; }
- ListElement{ longitude: "55"; latitude: "49"; height: "126"; }
- ListElement{ longitude: "55"; latitude: "50"; height: "126"; }
- ListElement{ longitude: "55"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "55"; latitude: "52"; height: "117"; }
- ListElement{ longitude: "55"; latitude: "53"; height: "114"; }
- ListElement{ longitude: "55"; latitude: "54"; height: "112"; }
- ListElement{ longitude: "55"; latitude: "55"; height: "115"; }
- ListElement{ longitude: "55"; latitude: "56"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "57"; height: "112"; }
- ListElement{ longitude: "55"; latitude: "58"; height: "110"; }
- ListElement{ longitude: "55"; latitude: "59"; height: "110"; }
- ListElement{ longitude: "55"; latitude: "60"; height: "111"; }
- ListElement{ longitude: "55"; latitude: "61"; height: "111"; }
- ListElement{ longitude: "55"; latitude: "62"; height: "114"; }
- ListElement{ longitude: "55"; latitude: "63"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "64"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "67"; height: "115"; }
- ListElement{ longitude: "55"; latitude: "68"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "55"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "55"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "55"; latitude: "72"; height: "109"; }
- ListElement{ longitude: "55"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "55"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "55"; latitude: "75"; height: "145"; }
- ListElement{ longitude: "55"; latitude: "76"; height: "156"; }
- ListElement{ longitude: "55"; latitude: "77"; height: "161"; }
- ListElement{ longitude: "55"; latitude: "78"; height: "148"; }
- ListElement{ longitude: "55"; latitude: "79"; height: "109"; }
- ListElement{ longitude: "55"; latitude: "80"; height: "99"; }
- ListElement{ longitude: "55"; latitude: "81"; height: "90"; }
- ListElement{ longitude: "55"; latitude: "82"; height: "59"; }
- ListElement{ longitude: "55"; latitude: "83"; height: "48"; }
- ListElement{ longitude: "55"; latitude: "84"; height: "35"; }
- ListElement{ longitude: "55"; latitude: "85"; height: "9"; }
- ListElement{ longitude: "55"; latitude: "86"; height: "1"; }
- ListElement{ longitude: "55"; latitude: "87"; height: "32"; }
- ListElement{ longitude: "55"; latitude: "88"; height: "55"; }
- ListElement{ longitude: "55"; latitude: "89"; height: "52"; }
- ListElement{ longitude: "55"; latitude: "90"; height: "55"; }
- ListElement{ longitude: "55"; latitude: "91"; height: "70"; }
- ListElement{ longitude: "55"; latitude: "92"; height: "90"; }
- ListElement{ longitude: "55"; latitude: "93"; height: "124"; }
- ListElement{ longitude: "55"; latitude: "94"; height: "128"; }
- ListElement{ longitude: "55"; latitude: "95"; height: "118"; }
- ListElement{ longitude: "55"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "55"; latitude: "97"; height: "126"; }
- ListElement{ longitude: "55"; latitude: "98"; height: "126"; }
- ListElement{ longitude: "55"; latitude: "99"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "1"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "2"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "3"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "56"; latitude: "6"; height: "124"; }
- ListElement{ longitude: "56"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "11"; height: "122"; }
- ListElement{ longitude: "56"; latitude: "12"; height: "121"; }
- ListElement{ longitude: "56"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "56"; latitude: "15"; height: "118"; }
- ListElement{ longitude: "56"; latitude: "16"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "56"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "56"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "56"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "27"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "29"; height: "120"; }
- ListElement{ longitude: "56"; latitude: "30"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "32"; height: "123"; }
- ListElement{ longitude: "56"; latitude: "33"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "34"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "37"; height: "123"; }
- ListElement{ longitude: "56"; latitude: "38"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "56"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "56"; latitude: "41"; height: "130"; }
- ListElement{ longitude: "56"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "56"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "56"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "48"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "49"; height: "129"; }
- ListElement{ longitude: "56"; latitude: "50"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "51"; height: "123"; }
- ListElement{ longitude: "56"; latitude: "52"; height: "123"; }
- ListElement{ longitude: "56"; latitude: "53"; height: "118"; }
- ListElement{ longitude: "56"; latitude: "54"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "55"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "56"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "57"; height: "116"; }
- ListElement{ longitude: "56"; latitude: "58"; height: "113"; }
- ListElement{ longitude: "56"; latitude: "59"; height: "114"; }
- ListElement{ longitude: "56"; latitude: "60"; height: "114"; }
- ListElement{ longitude: "56"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "56"; latitude: "62"; height: "115"; }
- ListElement{ longitude: "56"; latitude: "63"; height: "116"; }
- ListElement{ longitude: "56"; latitude: "64"; height: "116"; }
- ListElement{ longitude: "56"; latitude: "65"; height: "116"; }
- ListElement{ longitude: "56"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "56"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "68"; height: "114"; }
- ListElement{ longitude: "56"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "56"; latitude: "70"; height: "111"; }
- ListElement{ longitude: "56"; latitude: "71"; height: "107"; }
- ListElement{ longitude: "56"; latitude: "72"; height: "106"; }
- ListElement{ longitude: "56"; latitude: "73"; height: "112"; }
- ListElement{ longitude: "56"; latitude: "74"; height: "117"; }
- ListElement{ longitude: "56"; latitude: "75"; height: "129"; }
- ListElement{ longitude: "56"; latitude: "76"; height: "142"; }
- ListElement{ longitude: "56"; latitude: "77"; height: "164"; }
- ListElement{ longitude: "56"; latitude: "78"; height: "167"; }
- ListElement{ longitude: "56"; latitude: "79"; height: "152"; }
- ListElement{ longitude: "56"; latitude: "80"; height: "134"; }
- ListElement{ longitude: "56"; latitude: "81"; height: "118"; }
- ListElement{ longitude: "56"; latitude: "82"; height: "99"; }
- ListElement{ longitude: "56"; latitude: "83"; height: "102"; }
- ListElement{ longitude: "56"; latitude: "84"; height: "102"; }
- ListElement{ longitude: "56"; latitude: "85"; height: "88"; }
- ListElement{ longitude: "56"; latitude: "86"; height: "73"; }
- ListElement{ longitude: "56"; latitude: "87"; height: "66"; }
- ListElement{ longitude: "56"; latitude: "88"; height: "56"; }
- ListElement{ longitude: "56"; latitude: "89"; height: "51"; }
- ListElement{ longitude: "56"; latitude: "90"; height: "73"; }
- ListElement{ longitude: "56"; latitude: "91"; height: "104"; }
- ListElement{ longitude: "56"; latitude: "92"; height: "110"; }
- ListElement{ longitude: "56"; latitude: "93"; height: "114"; }
- ListElement{ longitude: "56"; latitude: "94"; height: "119"; }
- ListElement{ longitude: "56"; latitude: "95"; height: "122"; }
- ListElement{ longitude: "56"; latitude: "96"; height: "126"; }
- ListElement{ longitude: "56"; latitude: "97"; height: "128"; }
- ListElement{ longitude: "56"; latitude: "98"; height: "127"; }
- ListElement{ longitude: "56"; latitude: "99"; height: "123"; }
- ListElement{ longitude: "57"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "1"; height: "121"; }
- ListElement{ longitude: "57"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "5"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "6"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "7"; height: "123"; }
- ListElement{ longitude: "57"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "9"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "10"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "11"; height: "124"; }
- ListElement{ longitude: "57"; latitude: "12"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "13"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "14"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "15"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "16"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "57"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "26"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "27"; height: "121"; }
- ListElement{ longitude: "57"; latitude: "28"; height: "121"; }
- ListElement{ longitude: "57"; latitude: "29"; height: "118"; }
- ListElement{ longitude: "57"; latitude: "30"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "31"; height: "123"; }
- ListElement{ longitude: "57"; latitude: "32"; height: "121"; }
- ListElement{ longitude: "57"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "57"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "57"; latitude: "38"; height: "127"; }
- ListElement{ longitude: "57"; latitude: "39"; height: "126"; }
- ListElement{ longitude: "57"; latitude: "40"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "44"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "46"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "57"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "57"; latitude: "49"; height: "130"; }
- ListElement{ longitude: "57"; latitude: "50"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "51"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "52"; height: "118"; }
- ListElement{ longitude: "57"; latitude: "53"; height: "111"; }
- ListElement{ longitude: "57"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "57"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "56"; height: "120"; }
- ListElement{ longitude: "57"; latitude: "57"; height: "118"; }
- ListElement{ longitude: "57"; latitude: "58"; height: "117"; }
- ListElement{ longitude: "57"; latitude: "59"; height: "115"; }
- ListElement{ longitude: "57"; latitude: "60"; height: "116"; }
- ListElement{ longitude: "57"; latitude: "61"; height: "114"; }
- ListElement{ longitude: "57"; latitude: "62"; height: "114"; }
- ListElement{ longitude: "57"; latitude: "63"; height: "116"; }
- ListElement{ longitude: "57"; latitude: "64"; height: "116"; }
- ListElement{ longitude: "57"; latitude: "65"; height: "116"; }
- ListElement{ longitude: "57"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "57"; latitude: "67"; height: "114"; }
- ListElement{ longitude: "57"; latitude: "68"; height: "112"; }
- ListElement{ longitude: "57"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "57"; latitude: "70"; height: "111"; }
- ListElement{ longitude: "57"; latitude: "71"; height: "109"; }
- ListElement{ longitude: "57"; latitude: "72"; height: "110"; }
- ListElement{ longitude: "57"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "57"; latitude: "74"; height: "118"; }
- ListElement{ longitude: "57"; latitude: "75"; height: "125"; }
- ListElement{ longitude: "57"; latitude: "76"; height: "133"; }
- ListElement{ longitude: "57"; latitude: "77"; height: "139"; }
- ListElement{ longitude: "57"; latitude: "78"; height: "148"; }
- ListElement{ longitude: "57"; latitude: "79"; height: "161"; }
- ListElement{ longitude: "57"; latitude: "80"; height: "167"; }
- ListElement{ longitude: "57"; latitude: "81"; height: "167"; }
- ListElement{ longitude: "57"; latitude: "82"; height: "164"; }
- ListElement{ longitude: "57"; latitude: "83"; height: "152"; }
- ListElement{ longitude: "57"; latitude: "84"; height: "143"; }
- ListElement{ longitude: "57"; latitude: "85"; height: "138"; }
- ListElement{ longitude: "57"; latitude: "86"; height: "102"; }
- ListElement{ longitude: "57"; latitude: "87"; height: "94"; }
- ListElement{ longitude: "57"; latitude: "88"; height: "81"; }
- ListElement{ longitude: "57"; latitude: "89"; height: "81"; }
- ListElement{ longitude: "57"; latitude: "90"; height: "91"; }
- ListElement{ longitude: "57"; latitude: "91"; height: "99"; }
- ListElement{ longitude: "57"; latitude: "92"; height: "107"; }
- ListElement{ longitude: "57"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "57"; latitude: "94"; height: "126"; }
- ListElement{ longitude: "57"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "57"; latitude: "96"; height: "128"; }
- ListElement{ longitude: "57"; latitude: "97"; height: "130"; }
- ListElement{ longitude: "57"; latitude: "98"; height: "130"; }
- ListElement{ longitude: "57"; latitude: "99"; height: "128"; }
- ListElement{ longitude: "58"; latitude: "0"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "6"; height: "123"; }
- ListElement{ longitude: "58"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "58"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "58"; latitude: "9"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "10"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "11"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "12"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "13"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "15"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "19"; height: "118"; }
- ListElement{ longitude: "58"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "23"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "26"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "27"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "28"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "29"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "30"; height: "115"; }
- ListElement{ longitude: "58"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "32"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "33"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "34"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "58"; latitude: "36"; height: "125"; }
- ListElement{ longitude: "58"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "58"; latitude: "38"; height: "127"; }
- ListElement{ longitude: "58"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "58"; latitude: "40"; height: "130"; }
- ListElement{ longitude: "58"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "58"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "58"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "58"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "58"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "58"; latitude: "46"; height: "123"; }
- ListElement{ longitude: "58"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "58"; latitude: "48"; height: "130"; }
- ListElement{ longitude: "58"; latitude: "49"; height: "131"; }
- ListElement{ longitude: "58"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "58"; latitude: "51"; height: "131"; }
- ListElement{ longitude: "58"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "58"; latitude: "53"; height: "128"; }
- ListElement{ longitude: "58"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "58"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "58"; latitude: "57"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "58"; height: "120"; }
- ListElement{ longitude: "58"; latitude: "59"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "60"; height: "118"; }
- ListElement{ longitude: "58"; latitude: "61"; height: "116"; }
- ListElement{ longitude: "58"; latitude: "62"; height: "115"; }
- ListElement{ longitude: "58"; latitude: "63"; height: "115"; }
- ListElement{ longitude: "58"; latitude: "64"; height: "115"; }
- ListElement{ longitude: "58"; latitude: "65"; height: "115"; }
- ListElement{ longitude: "58"; latitude: "66"; height: "117"; }
- ListElement{ longitude: "58"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "58"; latitude: "68"; height: "114"; }
- ListElement{ longitude: "58"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "58"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "58"; latitude: "71"; height: "109"; }
- ListElement{ longitude: "58"; latitude: "72"; height: "109"; }
- ListElement{ longitude: "58"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "58"; latitude: "74"; height: "117"; }
- ListElement{ longitude: "58"; latitude: "75"; height: "122"; }
- ListElement{ longitude: "58"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "58"; latitude: "77"; height: "126"; }
- ListElement{ longitude: "58"; latitude: "78"; height: "136"; }
- ListElement{ longitude: "58"; latitude: "79"; height: "139"; }
- ListElement{ longitude: "58"; latitude: "80"; height: "142"; }
- ListElement{ longitude: "58"; latitude: "81"; height: "149"; }
- ListElement{ longitude: "58"; latitude: "82"; height: "153"; }
- ListElement{ longitude: "58"; latitude: "83"; height: "149"; }
- ListElement{ longitude: "58"; latitude: "84"; height: "141"; }
- ListElement{ longitude: "58"; latitude: "85"; height: "134"; }
- ListElement{ longitude: "58"; latitude: "86"; height: "113"; }
- ListElement{ longitude: "58"; latitude: "87"; height: "94"; }
- ListElement{ longitude: "58"; latitude: "88"; height: "83"; }
- ListElement{ longitude: "58"; latitude: "89"; height: "89"; }
- ListElement{ longitude: "58"; latitude: "90"; height: "98"; }
- ListElement{ longitude: "58"; latitude: "91"; height: "109"; }
- ListElement{ longitude: "58"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "58"; latitude: "93"; height: "126"; }
- ListElement{ longitude: "58"; latitude: "94"; height: "128"; }
- ListElement{ longitude: "58"; latitude: "95"; height: "127"; }
- ListElement{ longitude: "58"; latitude: "96"; height: "129"; }
- ListElement{ longitude: "58"; latitude: "97"; height: "131"; }
- ListElement{ longitude: "58"; latitude: "98"; height: "135"; }
- ListElement{ longitude: "58"; latitude: "99"; height: "131"; }
- ListElement{ longitude: "59"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "7"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "10"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "11"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "12"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "13"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "14"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "15"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "19"; height: "118"; }
- ListElement{ longitude: "59"; latitude: "20"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "22"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "23"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "24"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "59"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "59"; latitude: "30"; height: "105"; }
- ListElement{ longitude: "59"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "32"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "33"; height: "121"; }
- ListElement{ longitude: "59"; latitude: "34"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "35"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "36"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "37"; height: "127"; }
- ListElement{ longitude: "59"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "39"; height: "130"; }
- ListElement{ longitude: "59"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "59"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "59"; latitude: "42"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "44"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "46"; height: "129"; }
- ListElement{ longitude: "59"; latitude: "47"; height: "131"; }
- ListElement{ longitude: "59"; latitude: "48"; height: "133"; }
- ListElement{ longitude: "59"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "59"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "59"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "59"; latitude: "52"; height: "132"; }
- ListElement{ longitude: "59"; latitude: "53"; height: "129"; }
- ListElement{ longitude: "59"; latitude: "54"; height: "128"; }
- ListElement{ longitude: "59"; latitude: "55"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "57"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "58"; height: "116"; }
- ListElement{ longitude: "59"; latitude: "59"; height: "115"; }
- ListElement{ longitude: "59"; latitude: "60"; height: "114"; }
- ListElement{ longitude: "59"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "59"; latitude: "62"; height: "112"; }
- ListElement{ longitude: "59"; latitude: "63"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "64"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "59"; latitude: "67"; height: "114"; }
- ListElement{ longitude: "59"; latitude: "68"; height: "113"; }
- ListElement{ longitude: "59"; latitude: "69"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "59"; latitude: "71"; height: "112"; }
- ListElement{ longitude: "59"; latitude: "72"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "73"; height: "116"; }
- ListElement{ longitude: "59"; latitude: "74"; height: "117"; }
- ListElement{ longitude: "59"; latitude: "75"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "76"; height: "124"; }
- ListElement{ longitude: "59"; latitude: "77"; height: "118"; }
- ListElement{ longitude: "59"; latitude: "78"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "79"; height: "122"; }
- ListElement{ longitude: "59"; latitude: "80"; height: "132"; }
- ListElement{ longitude: "59"; latitude: "81"; height: "131"; }
- ListElement{ longitude: "59"; latitude: "82"; height: "132"; }
- ListElement{ longitude: "59"; latitude: "83"; height: "139"; }
- ListElement{ longitude: "59"; latitude: "84"; height: "133"; }
- ListElement{ longitude: "59"; latitude: "85"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "86"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "87"; height: "105"; }
- ListElement{ longitude: "59"; latitude: "88"; height: "92"; }
- ListElement{ longitude: "59"; latitude: "89"; height: "95"; }
- ListElement{ longitude: "59"; latitude: "90"; height: "100"; }
- ListElement{ longitude: "59"; latitude: "91"; height: "111"; }
- ListElement{ longitude: "59"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "59"; latitude: "93"; height: "123"; }
- ListElement{ longitude: "59"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "59"; latitude: "95"; height: "130"; }
- ListElement{ longitude: "59"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "59"; latitude: "97"; height: "137"; }
- ListElement{ longitude: "59"; latitude: "98"; height: "138"; }
- ListElement{ longitude: "59"; latitude: "99"; height: "135"; }
- ListElement{ longitude: "60"; latitude: "0"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "3"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "4"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "60"; latitude: "6"; height: "128"; }
- ListElement{ longitude: "60"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "60"; latitude: "8"; height: "125"; }
- ListElement{ longitude: "60"; latitude: "9"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "10"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "11"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "12"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "13"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "14"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "15"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "16"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "17"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "18"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "20"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "60"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "25"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "26"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "30"; height: "111"; }
- ListElement{ longitude: "60"; latitude: "31"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "32"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "33"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "34"; height: "123"; }
- ListElement{ longitude: "60"; latitude: "35"; height: "129"; }
- ListElement{ longitude: "60"; latitude: "36"; height: "128"; }
- ListElement{ longitude: "60"; latitude: "37"; height: "128"; }
- ListElement{ longitude: "60"; latitude: "38"; height: "128"; }
- ListElement{ longitude: "60"; latitude: "39"; height: "127"; }
- ListElement{ longitude: "60"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "60"; latitude: "41"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "43"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "44"; height: "118"; }
- ListElement{ longitude: "60"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "60"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "60"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "60"; latitude: "48"; height: "130"; }
- ListElement{ longitude: "60"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "60"; latitude: "50"; height: "139"; }
- ListElement{ longitude: "60"; latitude: "51"; height: "135"; }
- ListElement{ longitude: "60"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "60"; latitude: "53"; height: "130"; }
- ListElement{ longitude: "60"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "55"; height: "117"; }
- ListElement{ longitude: "60"; latitude: "56"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "57"; height: "117"; }
- ListElement{ longitude: "60"; latitude: "58"; height: "116"; }
- ListElement{ longitude: "60"; latitude: "59"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "60"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "62"; height: "114"; }
- ListElement{ longitude: "60"; latitude: "63"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "64"; height: "111"; }
- ListElement{ longitude: "60"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "60"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "60"; latitude: "67"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "68"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "69"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "70"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "71"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "72"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "73"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "74"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "75"; height: "117"; }
- ListElement{ longitude: "60"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "60"; latitude: "77"; height: "123"; }
- ListElement{ longitude: "60"; latitude: "78"; height: "127"; }
- ListElement{ longitude: "60"; latitude: "79"; height: "125"; }
- ListElement{ longitude: "60"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "60"; latitude: "81"; height: "124"; }
- ListElement{ longitude: "60"; latitude: "82"; height: "132"; }
- ListElement{ longitude: "60"; latitude: "83"; height: "132"; }
- ListElement{ longitude: "60"; latitude: "84"; height: "130"; }
- ListElement{ longitude: "60"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "86"; height: "113"; }
- ListElement{ longitude: "60"; latitude: "87"; height: "102"; }
- ListElement{ longitude: "60"; latitude: "88"; height: "98"; }
- ListElement{ longitude: "60"; latitude: "89"; height: "103"; }
- ListElement{ longitude: "60"; latitude: "90"; height: "112"; }
- ListElement{ longitude: "60"; latitude: "91"; height: "114"; }
- ListElement{ longitude: "60"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "60"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "60"; latitude: "94"; height: "127"; }
- ListElement{ longitude: "60"; latitude: "95"; height: "129"; }
- ListElement{ longitude: "60"; latitude: "96"; height: "137"; }
- ListElement{ longitude: "60"; latitude: "97"; height: "139"; }
- ListElement{ longitude: "60"; latitude: "98"; height: "140"; }
- ListElement{ longitude: "60"; latitude: "99"; height: "138"; }
- ListElement{ longitude: "61"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "61"; latitude: "1"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "61"; latitude: "3"; height: "122"; }
- ListElement{ longitude: "61"; latitude: "4"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "5"; height: "127"; }
- ListElement{ longitude: "61"; latitude: "6"; height: "129"; }
- ListElement{ longitude: "61"; latitude: "7"; height: "127"; }
- ListElement{ longitude: "61"; latitude: "8"; height: "127"; }
- ListElement{ longitude: "61"; latitude: "9"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "10"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "11"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "12"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "13"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "14"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "15"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "16"; height: "122"; }
- ListElement{ longitude: "61"; latitude: "17"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "18"; height: "118"; }
- ListElement{ longitude: "61"; latitude: "19"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "20"; height: "118"; }
- ListElement{ longitude: "61"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "24"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "26"; height: "117"; }
- ListElement{ longitude: "61"; latitude: "27"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "28"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "29"; height: "118"; }
- ListElement{ longitude: "61"; latitude: "30"; height: "117"; }
- ListElement{ longitude: "61"; latitude: "31"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "32"; height: "126"; }
- ListElement{ longitude: "61"; latitude: "33"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "34"; height: "127"; }
- ListElement{ longitude: "61"; latitude: "35"; height: "130"; }
- ListElement{ longitude: "61"; latitude: "36"; height: "129"; }
- ListElement{ longitude: "61"; latitude: "37"; height: "130"; }
- ListElement{ longitude: "61"; latitude: "38"; height: "129"; }
- ListElement{ longitude: "61"; latitude: "39"; height: "128"; }
- ListElement{ longitude: "61"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "61"; latitude: "41"; height: "107"; }
- ListElement{ longitude: "61"; latitude: "42"; height: "98"; }
- ListElement{ longitude: "61"; latitude: "43"; height: "117"; }
- ListElement{ longitude: "61"; latitude: "44"; height: "117"; }
- ListElement{ longitude: "61"; latitude: "45"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "61"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "48"; height: "130"; }
- ListElement{ longitude: "61"; latitude: "49"; height: "137"; }
- ListElement{ longitude: "61"; latitude: "50"; height: "138"; }
- ListElement{ longitude: "61"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "61"; latitude: "52"; height: "134"; }
- ListElement{ longitude: "61"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "61"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "57"; height: "117"; }
- ListElement{ longitude: "61"; latitude: "58"; height: "113"; }
- ListElement{ longitude: "61"; latitude: "59"; height: "111"; }
- ListElement{ longitude: "61"; latitude: "60"; height: "110"; }
- ListElement{ longitude: "61"; latitude: "61"; height: "109"; }
- ListElement{ longitude: "61"; latitude: "62"; height: "109"; }
- ListElement{ longitude: "61"; latitude: "63"; height: "110"; }
- ListElement{ longitude: "61"; latitude: "64"; height: "108"; }
- ListElement{ longitude: "61"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "61"; latitude: "66"; height: "108"; }
- ListElement{ longitude: "61"; latitude: "67"; height: "108"; }
- ListElement{ longitude: "61"; latitude: "68"; height: "110"; }
- ListElement{ longitude: "61"; latitude: "69"; height: "109"; }
- ListElement{ longitude: "61"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "61"; latitude: "71"; height: "112"; }
- ListElement{ longitude: "61"; latitude: "72"; height: "116"; }
- ListElement{ longitude: "61"; latitude: "73"; height: "116"; }
- ListElement{ longitude: "61"; latitude: "74"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "75"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "61"; latitude: "77"; height: "121"; }
- ListElement{ longitude: "61"; latitude: "78"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "79"; height: "122"; }
- ListElement{ longitude: "61"; latitude: "80"; height: "124"; }
- ListElement{ longitude: "61"; latitude: "81"; height: "125"; }
- ListElement{ longitude: "61"; latitude: "82"; height: "128"; }
- ListElement{ longitude: "61"; latitude: "83"; height: "128"; }
- ListElement{ longitude: "61"; latitude: "84"; height: "124"; }
- ListElement{ longitude: "61"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "86"; height: "116"; }
- ListElement{ longitude: "61"; latitude: "87"; height: "112"; }
- ListElement{ longitude: "61"; latitude: "88"; height: "110"; }
- ListElement{ longitude: "61"; latitude: "89"; height: "109"; }
- ListElement{ longitude: "61"; latitude: "90"; height: "113"; }
- ListElement{ longitude: "61"; latitude: "91"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "61"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "61"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "61"; latitude: "95"; height: "124"; }
- ListElement{ longitude: "61"; latitude: "96"; height: "131"; }
- ListElement{ longitude: "61"; latitude: "97"; height: "144"; }
- ListElement{ longitude: "61"; latitude: "98"; height: "143"; }
- ListElement{ longitude: "61"; latitude: "99"; height: "137"; }
- ListElement{ longitude: "62"; latitude: "0"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "1"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "2"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "3"; height: "124"; }
- ListElement{ longitude: "62"; latitude: "4"; height: "127"; }
- ListElement{ longitude: "62"; latitude: "5"; height: "128"; }
- ListElement{ longitude: "62"; latitude: "6"; height: "128"; }
- ListElement{ longitude: "62"; latitude: "7"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "8"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "9"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "10"; height: "120"; }
- ListElement{ longitude: "62"; latitude: "11"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "12"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "13"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "14"; height: "127"; }
- ListElement{ longitude: "62"; latitude: "15"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "16"; height: "124"; }
- ListElement{ longitude: "62"; latitude: "17"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "18"; height: "120"; }
- ListElement{ longitude: "62"; latitude: "19"; height: "117"; }
- ListElement{ longitude: "62"; latitude: "20"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "62"; latitude: "22"; height: "110"; }
- ListElement{ longitude: "62"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "62"; latitude: "24"; height: "119"; }
- ListElement{ longitude: "62"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "62"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "27"; height: "114"; }
- ListElement{ longitude: "62"; latitude: "28"; height: "114"; }
- ListElement{ longitude: "62"; latitude: "29"; height: "117"; }
- ListElement{ longitude: "62"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "31"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "32"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "62"; latitude: "35"; height: "130"; }
- ListElement{ longitude: "62"; latitude: "36"; height: "128"; }
- ListElement{ longitude: "62"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "62"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "41"; height: "106"; }
- ListElement{ longitude: "62"; latitude: "42"; height: "94"; }
- ListElement{ longitude: "62"; latitude: "43"; height: "120"; }
- ListElement{ longitude: "62"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "62"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "62"; latitude: "47"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "48"; height: "132"; }
- ListElement{ longitude: "62"; latitude: "49"; height: "137"; }
- ListElement{ longitude: "62"; latitude: "50"; height: "137"; }
- ListElement{ longitude: "62"; latitude: "51"; height: "127"; }
- ListElement{ longitude: "62"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "62"; latitude: "53"; height: "128"; }
- ListElement{ longitude: "62"; latitude: "54"; height: "125"; }
- ListElement{ longitude: "62"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "56"; height: "110"; }
- ListElement{ longitude: "62"; latitude: "57"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "58"; height: "112"; }
- ListElement{ longitude: "62"; latitude: "59"; height: "109"; }
- ListElement{ longitude: "62"; latitude: "60"; height: "108"; }
- ListElement{ longitude: "62"; latitude: "61"; height: "107"; }
- ListElement{ longitude: "62"; latitude: "62"; height: "107"; }
- ListElement{ longitude: "62"; latitude: "63"; height: "107"; }
- ListElement{ longitude: "62"; latitude: "64"; height: "108"; }
- ListElement{ longitude: "62"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "62"; latitude: "66"; height: "108"; }
- ListElement{ longitude: "62"; latitude: "67"; height: "106"; }
- ListElement{ longitude: "62"; latitude: "68"; height: "107"; }
- ListElement{ longitude: "62"; latitude: "69"; height: "107"; }
- ListElement{ longitude: "62"; latitude: "70"; height: "109"; }
- ListElement{ longitude: "62"; latitude: "71"; height: "114"; }
- ListElement{ longitude: "62"; latitude: "72"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "73"; height: "118"; }
- ListElement{ longitude: "62"; latitude: "74"; height: "119"; }
- ListElement{ longitude: "62"; latitude: "75"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "76"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "77"; height: "126"; }
- ListElement{ longitude: "62"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "62"; latitude: "79"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "80"; height: "121"; }
- ListElement{ longitude: "62"; latitude: "81"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "82"; height: "123"; }
- ListElement{ longitude: "62"; latitude: "83"; height: "127"; }
- ListElement{ longitude: "62"; latitude: "84"; height: "124"; }
- ListElement{ longitude: "62"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "62"; latitude: "86"; height: "118"; }
- ListElement{ longitude: "62"; latitude: "87"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "88"; height: "117"; }
- ListElement{ longitude: "62"; latitude: "89"; height: "113"; }
- ListElement{ longitude: "62"; latitude: "90"; height: "114"; }
- ListElement{ longitude: "62"; latitude: "91"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "62"; latitude: "93"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "94"; height: "116"; }
- ListElement{ longitude: "62"; latitude: "95"; height: "118"; }
- ListElement{ longitude: "62"; latitude: "96"; height: "126"; }
- ListElement{ longitude: "62"; latitude: "97"; height: "126"; }
- ListElement{ longitude: "62"; latitude: "98"; height: "122"; }
- ListElement{ longitude: "62"; latitude: "99"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "0"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "1"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "2"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "63"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "5"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "7"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "8"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "9"; height: "118"; }
- ListElement{ longitude: "63"; latitude: "10"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "11"; height: "119"; }
- ListElement{ longitude: "63"; latitude: "12"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "13"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "14"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "15"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "16"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "17"; height: "120"; }
- ListElement{ longitude: "63"; latitude: "18"; height: "119"; }
- ListElement{ longitude: "63"; latitude: "19"; height: "116"; }
- ListElement{ longitude: "63"; latitude: "20"; height: "115"; }
- ListElement{ longitude: "63"; latitude: "21"; height: "116"; }
- ListElement{ longitude: "63"; latitude: "22"; height: "109"; }
- ListElement{ longitude: "63"; latitude: "23"; height: "109"; }
- ListElement{ longitude: "63"; latitude: "24"; height: "117"; }
- ListElement{ longitude: "63"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "63"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "63"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "63"; latitude: "28"; height: "111"; }
- ListElement{ longitude: "63"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "63"; latitude: "30"; height: "115"; }
- ListElement{ longitude: "63"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "63"; latitude: "32"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "33"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "34"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "35"; height: "127"; }
- ListElement{ longitude: "63"; latitude: "36"; height: "127"; }
- ListElement{ longitude: "63"; latitude: "37"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "38"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "63"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "42"; height: "118"; }
- ListElement{ longitude: "63"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "63"; latitude: "44"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "46"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "47"; height: "128"; }
- ListElement{ longitude: "63"; latitude: "48"; height: "133"; }
- ListElement{ longitude: "63"; latitude: "49"; height: "135"; }
- ListElement{ longitude: "63"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "63"; latitude: "51"; height: "132"; }
- ListElement{ longitude: "63"; latitude: "52"; height: "128"; }
- ListElement{ longitude: "63"; latitude: "53"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "54"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "55"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "56"; height: "110"; }
- ListElement{ longitude: "63"; latitude: "57"; height: "113"; }
- ListElement{ longitude: "63"; latitude: "58"; height: "113"; }
- ListElement{ longitude: "63"; latitude: "59"; height: "109"; }
- ListElement{ longitude: "63"; latitude: "60"; height: "107"; }
- ListElement{ longitude: "63"; latitude: "61"; height: "106"; }
- ListElement{ longitude: "63"; latitude: "62"; height: "106"; }
- ListElement{ longitude: "63"; latitude: "63"; height: "106"; }
- ListElement{ longitude: "63"; latitude: "64"; height: "104"; }
- ListElement{ longitude: "63"; latitude: "65"; height: "104"; }
- ListElement{ longitude: "63"; latitude: "66"; height: "104"; }
- ListElement{ longitude: "63"; latitude: "67"; height: "106"; }
- ListElement{ longitude: "63"; latitude: "68"; height: "106"; }
- ListElement{ longitude: "63"; latitude: "69"; height: "107"; }
- ListElement{ longitude: "63"; latitude: "70"; height: "109"; }
- ListElement{ longitude: "63"; latitude: "71"; height: "114"; }
- ListElement{ longitude: "63"; latitude: "72"; height: "115"; }
- ListElement{ longitude: "63"; latitude: "73"; height: "117"; }
- ListElement{ longitude: "63"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "75"; height: "123"; }
- ListElement{ longitude: "63"; latitude: "76"; height: "127"; }
- ListElement{ longitude: "63"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "63"; latitude: "78"; height: "127"; }
- ListElement{ longitude: "63"; latitude: "79"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "80"; height: "125"; }
- ListElement{ longitude: "63"; latitude: "81"; height: "122"; }
- ListElement{ longitude: "63"; latitude: "82"; height: "123"; }
- ListElement{ longitude: "63"; latitude: "83"; height: "123"; }
- ListElement{ longitude: "63"; latitude: "84"; height: "123"; }
- ListElement{ longitude: "63"; latitude: "85"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "86"; height: "115"; }
- ListElement{ longitude: "63"; latitude: "87"; height: "115"; }
- ListElement{ longitude: "63"; latitude: "88"; height: "117"; }
- ListElement{ longitude: "63"; latitude: "89"; height: "117"; }
- ListElement{ longitude: "63"; latitude: "90"; height: "118"; }
- ListElement{ longitude: "63"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "63"; latitude: "93"; height: "109"; }
- ListElement{ longitude: "63"; latitude: "94"; height: "111"; }
- ListElement{ longitude: "63"; latitude: "95"; height: "116"; }
- ListElement{ longitude: "63"; latitude: "96"; height: "121"; }
- ListElement{ longitude: "63"; latitude: "97"; height: "119"; }
- ListElement{ longitude: "63"; latitude: "98"; height: "124"; }
- ListElement{ longitude: "63"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "0"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "1"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "3"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "5"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "6"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "7"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "8"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "9"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "10"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "11"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "12"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "13"; height: "115"; }
- ListElement{ longitude: "64"; latitude: "14"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "15"; height: "117"; }
- ListElement{ longitude: "64"; latitude: "16"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "17"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "18"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "19"; height: "115"; }
- ListElement{ longitude: "64"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "21"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "22"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "23"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "64"; latitude: "25"; height: "111"; }
- ListElement{ longitude: "64"; latitude: "26"; height: "109"; }
- ListElement{ longitude: "64"; latitude: "27"; height: "108"; }
- ListElement{ longitude: "64"; latitude: "28"; height: "110"; }
- ListElement{ longitude: "64"; latitude: "29"; height: "110"; }
- ListElement{ longitude: "64"; latitude: "30"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "31"; height: "114"; }
- ListElement{ longitude: "64"; latitude: "32"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "33"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "34"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "35"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "36"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "38"; height: "122"; }
- ListElement{ longitude: "64"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "40"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "41"; height: "123"; }
- ListElement{ longitude: "64"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "64"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "64"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "46"; height: "128"; }
- ListElement{ longitude: "64"; latitude: "47"; height: "130"; }
- ListElement{ longitude: "64"; latitude: "48"; height: "134"; }
- ListElement{ longitude: "64"; latitude: "49"; height: "137"; }
- ListElement{ longitude: "64"; latitude: "50"; height: "135"; }
- ListElement{ longitude: "64"; latitude: "51"; height: "126"; }
- ListElement{ longitude: "64"; latitude: "52"; height: "125"; }
- ListElement{ longitude: "64"; latitude: "53"; height: "122"; }
- ListElement{ longitude: "64"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "57"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "58"; height: "112"; }
- ListElement{ longitude: "64"; latitude: "59"; height: "109"; }
- ListElement{ longitude: "64"; latitude: "60"; height: "107"; }
- ListElement{ longitude: "64"; latitude: "61"; height: "106"; }
- ListElement{ longitude: "64"; latitude: "62"; height: "106"; }
- ListElement{ longitude: "64"; latitude: "63"; height: "106"; }
- ListElement{ longitude: "64"; latitude: "64"; height: "108"; }
- ListElement{ longitude: "64"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "64"; latitude: "66"; height: "108"; }
- ListElement{ longitude: "64"; latitude: "67"; height: "110"; }
- ListElement{ longitude: "64"; latitude: "68"; height: "107"; }
- ListElement{ longitude: "64"; latitude: "69"; height: "110"; }
- ListElement{ longitude: "64"; latitude: "70"; height: "110"; }
- ListElement{ longitude: "64"; latitude: "71"; height: "113"; }
- ListElement{ longitude: "64"; latitude: "72"; height: "115"; }
- ListElement{ longitude: "64"; latitude: "73"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "74"; height: "123"; }
- ListElement{ longitude: "64"; latitude: "75"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "76"; height: "129"; }
- ListElement{ longitude: "64"; latitude: "77"; height: "130"; }
- ListElement{ longitude: "64"; latitude: "78"; height: "131"; }
- ListElement{ longitude: "64"; latitude: "79"; height: "127"; }
- ListElement{ longitude: "64"; latitude: "80"; height: "123"; }
- ListElement{ longitude: "64"; latitude: "81"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "83"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "84"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "85"; height: "121"; }
- ListElement{ longitude: "64"; latitude: "86"; height: "117"; }
- ListElement{ longitude: "64"; latitude: "87"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "88"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "89"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "64"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "93"; height: "106"; }
- ListElement{ longitude: "64"; latitude: "94"; height: "111"; }
- ListElement{ longitude: "64"; latitude: "95"; height: "116"; }
- ListElement{ longitude: "64"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "64"; latitude: "97"; height: "118"; }
- ListElement{ longitude: "64"; latitude: "98"; height: "119"; }
- ListElement{ longitude: "64"; latitude: "99"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "65"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "65"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "65"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "65"; latitude: "4"; height: "122"; }
- ListElement{ longitude: "65"; latitude: "5"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "7"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "8"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "9"; height: "114"; }
- ListElement{ longitude: "65"; latitude: "10"; height: "112"; }
- ListElement{ longitude: "65"; latitude: "11"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "12"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "13"; height: "111"; }
- ListElement{ longitude: "65"; latitude: "14"; height: "113"; }
- ListElement{ longitude: "65"; latitude: "15"; height: "118"; }
- ListElement{ longitude: "65"; latitude: "16"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "17"; height: "114"; }
- ListElement{ longitude: "65"; latitude: "18"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "19"; height: "114"; }
- ListElement{ longitude: "65"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "65"; latitude: "21"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "22"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "65"; latitude: "25"; height: "112"; }
- ListElement{ longitude: "65"; latitude: "26"; height: "107"; }
- ListElement{ longitude: "65"; latitude: "27"; height: "104"; }
- ListElement{ longitude: "65"; latitude: "28"; height: "104"; }
- ListElement{ longitude: "65"; latitude: "29"; height: "108"; }
- ListElement{ longitude: "65"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "31"; height: "112"; }
- ListElement{ longitude: "65"; latitude: "32"; height: "115"; }
- ListElement{ longitude: "65"; latitude: "33"; height: "115"; }
- ListElement{ longitude: "65"; latitude: "34"; height: "115"; }
- ListElement{ longitude: "65"; latitude: "35"; height: "113"; }
- ListElement{ longitude: "65"; latitude: "36"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "37"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "65"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "40"; height: "118"; }
- ListElement{ longitude: "65"; latitude: "41"; height: "122"; }
- ListElement{ longitude: "65"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "65"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "65"; latitude: "44"; height: "131"; }
- ListElement{ longitude: "65"; latitude: "45"; height: "132"; }
- ListElement{ longitude: "65"; latitude: "46"; height: "133"; }
- ListElement{ longitude: "65"; latitude: "47"; height: "134"; }
- ListElement{ longitude: "65"; latitude: "48"; height: "130"; }
- ListElement{ longitude: "65"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "65"; latitude: "50"; height: "133"; }
- ListElement{ longitude: "65"; latitude: "51"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "52"; height: "125"; }
- ListElement{ longitude: "65"; latitude: "53"; height: "124"; }
- ListElement{ longitude: "65"; latitude: "54"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "55"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "56"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "57"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "58"; height: "113"; }
- ListElement{ longitude: "65"; latitude: "59"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "60"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "61"; height: "108"; }
- ListElement{ longitude: "65"; latitude: "62"; height: "109"; }
- ListElement{ longitude: "65"; latitude: "63"; height: "109"; }
- ListElement{ longitude: "65"; latitude: "64"; height: "107"; }
- ListElement{ longitude: "65"; latitude: "65"; height: "107"; }
- ListElement{ longitude: "65"; latitude: "66"; height: "107"; }
- ListElement{ longitude: "65"; latitude: "67"; height: "109"; }
- ListElement{ longitude: "65"; latitude: "68"; height: "104"; }
- ListElement{ longitude: "65"; latitude: "69"; height: "112"; }
- ListElement{ longitude: "65"; latitude: "70"; height: "112"; }
- ListElement{ longitude: "65"; latitude: "71"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "72"; height: "118"; }
- ListElement{ longitude: "65"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "74"; height: "126"; }
- ListElement{ longitude: "65"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "65"; latitude: "76"; height: "132"; }
- ListElement{ longitude: "65"; latitude: "77"; height: "129"; }
- ListElement{ longitude: "65"; latitude: "78"; height: "131"; }
- ListElement{ longitude: "65"; latitude: "79"; height: "129"; }
- ListElement{ longitude: "65"; latitude: "80"; height: "124"; }
- ListElement{ longitude: "65"; latitude: "81"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "83"; height: "121"; }
- ListElement{ longitude: "65"; latitude: "84"; height: "121"; }
- ListElement{ longitude: "65"; latitude: "85"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "86"; height: "119"; }
- ListElement{ longitude: "65"; latitude: "87"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "88"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "89"; height: "118"; }
- ListElement{ longitude: "65"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "65"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "65"; latitude: "93"; height: "111"; }
- ListElement{ longitude: "65"; latitude: "94"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "95"; height: "110"; }
- ListElement{ longitude: "65"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "65"; latitude: "97"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "98"; height: "116"; }
- ListElement{ longitude: "65"; latitude: "99"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "66"; latitude: "1"; height: "130"; }
- ListElement{ longitude: "66"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "66"; latitude: "3"; height: "125"; }
- ListElement{ longitude: "66"; latitude: "4"; height: "123"; }
- ListElement{ longitude: "66"; latitude: "5"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "66"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "8"; height: "115"; }
- ListElement{ longitude: "66"; latitude: "9"; height: "113"; }
- ListElement{ longitude: "66"; latitude: "10"; height: "110"; }
- ListElement{ longitude: "66"; latitude: "11"; height: "107"; }
- ListElement{ longitude: "66"; latitude: "12"; height: "108"; }
- ListElement{ longitude: "66"; latitude: "13"; height: "111"; }
- ListElement{ longitude: "66"; latitude: "14"; height: "111"; }
- ListElement{ longitude: "66"; latitude: "15"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "16"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "17"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "18"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "19"; height: "115"; }
- ListElement{ longitude: "66"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "22"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "24"; height: "115"; }
- ListElement{ longitude: "66"; latitude: "25"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "26"; height: "107"; }
- ListElement{ longitude: "66"; latitude: "27"; height: "102"; }
- ListElement{ longitude: "66"; latitude: "28"; height: "102"; }
- ListElement{ longitude: "66"; latitude: "29"; height: "107"; }
- ListElement{ longitude: "66"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "66"; latitude: "31"; height: "110"; }
- ListElement{ longitude: "66"; latitude: "32"; height: "113"; }
- ListElement{ longitude: "66"; latitude: "33"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "34"; height: "113"; }
- ListElement{ longitude: "66"; latitude: "35"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "36"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "37"; height: "111"; }
- ListElement{ longitude: "66"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "40"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "41"; height: "124"; }
- ListElement{ longitude: "66"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "66"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "66"; latitude: "44"; height: "133"; }
- ListElement{ longitude: "66"; latitude: "45"; height: "136"; }
- ListElement{ longitude: "66"; latitude: "46"; height: "137"; }
- ListElement{ longitude: "66"; latitude: "47"; height: "134"; }
- ListElement{ longitude: "66"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "66"; latitude: "49"; height: "128"; }
- ListElement{ longitude: "66"; latitude: "50"; height: "130"; }
- ListElement{ longitude: "66"; latitude: "51"; height: "121"; }
- ListElement{ longitude: "66"; latitude: "52"; height: "124"; }
- ListElement{ longitude: "66"; latitude: "53"; height: "125"; }
- ListElement{ longitude: "66"; latitude: "54"; height: "121"; }
- ListElement{ longitude: "66"; latitude: "55"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "56"; height: "118"; }
- ListElement{ longitude: "66"; latitude: "57"; height: "118"; }
- ListElement{ longitude: "66"; latitude: "58"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "59"; height: "109"; }
- ListElement{ longitude: "66"; latitude: "60"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "61"; height: "109"; }
- ListElement{ longitude: "66"; latitude: "62"; height: "110"; }
- ListElement{ longitude: "66"; latitude: "63"; height: "111"; }
- ListElement{ longitude: "66"; latitude: "64"; height: "110"; }
- ListElement{ longitude: "66"; latitude: "65"; height: "108"; }
- ListElement{ longitude: "66"; latitude: "66"; height: "108"; }
- ListElement{ longitude: "66"; latitude: "67"; height: "109"; }
- ListElement{ longitude: "66"; latitude: "68"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "69"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "70"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "71"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "72"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "73"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "74"; height: "123"; }
- ListElement{ longitude: "66"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "66"; latitude: "76"; height: "131"; }
- ListElement{ longitude: "66"; latitude: "77"; height: "134"; }
- ListElement{ longitude: "66"; latitude: "78"; height: "136"; }
- ListElement{ longitude: "66"; latitude: "79"; height: "130"; }
- ListElement{ longitude: "66"; latitude: "80"; height: "126"; }
- ListElement{ longitude: "66"; latitude: "81"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "82"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "83"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "84"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "85"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "86"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "87"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "88"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "89"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "90"; height: "117"; }
- ListElement{ longitude: "66"; latitude: "91"; height: "120"; }
- ListElement{ longitude: "66"; latitude: "92"; height: "121"; }
- ListElement{ longitude: "66"; latitude: "93"; height: "114"; }
- ListElement{ longitude: "66"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "66"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "66"; latitude: "96"; height: "119"; }
- ListElement{ longitude: "66"; latitude: "97"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "98"; height: "116"; }
- ListElement{ longitude: "66"; latitude: "99"; height: "119"; }
- ListElement{ longitude: "67"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "67"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "67"; latitude: "3"; height: "126"; }
- ListElement{ longitude: "67"; latitude: "4"; height: "124"; }
- ListElement{ longitude: "67"; latitude: "5"; height: "120"; }
- ListElement{ longitude: "67"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "67"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "67"; latitude: "8"; height: "116"; }
- ListElement{ longitude: "67"; latitude: "9"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "10"; height: "111"; }
- ListElement{ longitude: "67"; latitude: "11"; height: "108"; }
- ListElement{ longitude: "67"; latitude: "12"; height: "108"; }
- ListElement{ longitude: "67"; latitude: "13"; height: "108"; }
- ListElement{ longitude: "67"; latitude: "14"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "15"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "16"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "17"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "18"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "19"; height: "110"; }
- ListElement{ longitude: "67"; latitude: "20"; height: "97"; }
- ListElement{ longitude: "67"; latitude: "21"; height: "113"; }
- ListElement{ longitude: "67"; latitude: "22"; height: "118"; }
- ListElement{ longitude: "67"; latitude: "23"; height: "118"; }
- ListElement{ longitude: "67"; latitude: "24"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "25"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "26"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "27"; height: "105"; }
- ListElement{ longitude: "67"; latitude: "28"; height: "104"; }
- ListElement{ longitude: "67"; latitude: "29"; height: "102"; }
- ListElement{ longitude: "67"; latitude: "30"; height: "107"; }
- ListElement{ longitude: "67"; latitude: "31"; height: "111"; }
- ListElement{ longitude: "67"; latitude: "32"; height: "111"; }
- ListElement{ longitude: "67"; latitude: "33"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "34"; height: "113"; }
- ListElement{ longitude: "67"; latitude: "35"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "36"; height: "110"; }
- ListElement{ longitude: "67"; latitude: "37"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "39"; height: "117"; }
- ListElement{ longitude: "67"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "67"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "67"; latitude: "44"; height: "134"; }
- ListElement{ longitude: "67"; latitude: "45"; height: "136"; }
- ListElement{ longitude: "67"; latitude: "46"; height: "134"; }
- ListElement{ longitude: "67"; latitude: "47"; height: "133"; }
- ListElement{ longitude: "67"; latitude: "48"; height: "136"; }
- ListElement{ longitude: "67"; latitude: "49"; height: "133"; }
- ListElement{ longitude: "67"; latitude: "50"; height: "129"; }
- ListElement{ longitude: "67"; latitude: "51"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "52"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "53"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "54"; height: "123"; }
- ListElement{ longitude: "67"; latitude: "55"; height: "123"; }
- ListElement{ longitude: "67"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "67"; latitude: "57"; height: "118"; }
- ListElement{ longitude: "67"; latitude: "58"; height: "117"; }
- ListElement{ longitude: "67"; latitude: "59"; height: "104"; }
- ListElement{ longitude: "67"; latitude: "60"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "61"; height: "117"; }
- ListElement{ longitude: "67"; latitude: "62"; height: "116"; }
- ListElement{ longitude: "67"; latitude: "63"; height: "114"; }
- ListElement{ longitude: "67"; latitude: "64"; height: "110"; }
- ListElement{ longitude: "67"; latitude: "65"; height: "109"; }
- ListElement{ longitude: "67"; latitude: "66"; height: "111"; }
- ListElement{ longitude: "67"; latitude: "67"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "68"; height: "112"; }
- ListElement{ longitude: "67"; latitude: "69"; height: "116"; }
- ListElement{ longitude: "67"; latitude: "70"; height: "117"; }
- ListElement{ longitude: "67"; latitude: "71"; height: "119"; }
- ListElement{ longitude: "67"; latitude: "72"; height: "118"; }
- ListElement{ longitude: "67"; latitude: "73"; height: "121"; }
- ListElement{ longitude: "67"; latitude: "74"; height: "124"; }
- ListElement{ longitude: "67"; latitude: "75"; height: "127"; }
- ListElement{ longitude: "67"; latitude: "76"; height: "132"; }
- ListElement{ longitude: "67"; latitude: "77"; height: "132"; }
- ListElement{ longitude: "67"; latitude: "78"; height: "132"; }
- ListElement{ longitude: "67"; latitude: "79"; height: "124"; }
- ListElement{ longitude: "67"; latitude: "80"; height: "127"; }
- ListElement{ longitude: "67"; latitude: "81"; height: "123"; }
- ListElement{ longitude: "67"; latitude: "82"; height: "121"; }
- ListElement{ longitude: "67"; latitude: "83"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "84"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "85"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "86"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "87"; height: "120"; }
- ListElement{ longitude: "67"; latitude: "88"; height: "116"; }
- ListElement{ longitude: "67"; latitude: "89"; height: "115"; }
- ListElement{ longitude: "67"; latitude: "90"; height: "115"; }
- ListElement{ longitude: "67"; latitude: "91"; height: "117"; }
- ListElement{ longitude: "67"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "67"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "94"; height: "121"; }
- ListElement{ longitude: "67"; latitude: "95"; height: "120"; }
- ListElement{ longitude: "67"; latitude: "96"; height: "124"; }
- ListElement{ longitude: "67"; latitude: "97"; height: "128"; }
- ListElement{ longitude: "67"; latitude: "98"; height: "122"; }
- ListElement{ longitude: "67"; latitude: "99"; height: "123"; }
- ListElement{ longitude: "68"; latitude: "0"; height: "125"; }
- ListElement{ longitude: "68"; latitude: "1"; height: "126"; }
- ListElement{ longitude: "68"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "68"; latitude: "3"; height: "125"; }
- ListElement{ longitude: "68"; latitude: "4"; height: "121"; }
- ListElement{ longitude: "68"; latitude: "5"; height: "121"; }
- ListElement{ longitude: "68"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "68"; latitude: "7"; height: "118"; }
- ListElement{ longitude: "68"; latitude: "8"; height: "115"; }
- ListElement{ longitude: "68"; latitude: "9"; height: "110"; }
- ListElement{ longitude: "68"; latitude: "10"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "11"; height: "108"; }
- ListElement{ longitude: "68"; latitude: "12"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "13"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "14"; height: "108"; }
- ListElement{ longitude: "68"; latitude: "15"; height: "108"; }
- ListElement{ longitude: "68"; latitude: "16"; height: "104"; }
- ListElement{ longitude: "68"; latitude: "17"; height: "108"; }
- ListElement{ longitude: "68"; latitude: "18"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "19"; height: "113"; }
- ListElement{ longitude: "68"; latitude: "20"; height: "105"; }
- ListElement{ longitude: "68"; latitude: "21"; height: "114"; }
- ListElement{ longitude: "68"; latitude: "22"; height: "114"; }
- ListElement{ longitude: "68"; latitude: "23"; height: "114"; }
- ListElement{ longitude: "68"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "68"; latitude: "25"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "26"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "27"; height: "107"; }
- ListElement{ longitude: "68"; latitude: "28"; height: "105"; }
- ListElement{ longitude: "68"; latitude: "29"; height: "104"; }
- ListElement{ longitude: "68"; latitude: "30"; height: "100"; }
- ListElement{ longitude: "68"; latitude: "31"; height: "105"; }
- ListElement{ longitude: "68"; latitude: "32"; height: "107"; }
- ListElement{ longitude: "68"; latitude: "33"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "34"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "35"; height: "108"; }
- ListElement{ longitude: "68"; latitude: "36"; height: "109"; }
- ListElement{ longitude: "68"; latitude: "37"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "68"; latitude: "39"; height: "118"; }
- ListElement{ longitude: "68"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "68"; latitude: "41"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "42"; height: "131"; }
- ListElement{ longitude: "68"; latitude: "43"; height: "124"; }
- ListElement{ longitude: "68"; latitude: "44"; height: "131"; }
- ListElement{ longitude: "68"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "68"; latitude: "46"; height: "131"; }
- ListElement{ longitude: "68"; latitude: "47"; height: "129"; }
- ListElement{ longitude: "68"; latitude: "48"; height: "130"; }
- ListElement{ longitude: "68"; latitude: "49"; height: "126"; }
- ListElement{ longitude: "68"; latitude: "50"; height: "128"; }
- ListElement{ longitude: "68"; latitude: "51"; height: "130"; }
- ListElement{ longitude: "68"; latitude: "52"; height: "129"; }
- ListElement{ longitude: "68"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "68"; latitude: "54"; height: "126"; }
- ListElement{ longitude: "68"; latitude: "55"; height: "124"; }
- ListElement{ longitude: "68"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "68"; latitude: "57"; height: "119"; }
- ListElement{ longitude: "68"; latitude: "58"; height: "120"; }
- ListElement{ longitude: "68"; latitude: "59"; height: "120"; }
- ListElement{ longitude: "68"; latitude: "60"; height: "120"; }
- ListElement{ longitude: "68"; latitude: "61"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "68"; latitude: "63"; height: "115"; }
- ListElement{ longitude: "68"; latitude: "64"; height: "115"; }
- ListElement{ longitude: "68"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "66"; height: "111"; }
- ListElement{ longitude: "68"; latitude: "67"; height: "112"; }
- ListElement{ longitude: "68"; latitude: "68"; height: "116"; }
- ListElement{ longitude: "68"; latitude: "69"; height: "116"; }
- ListElement{ longitude: "68"; latitude: "70"; height: "119"; }
- ListElement{ longitude: "68"; latitude: "71"; height: "119"; }
- ListElement{ longitude: "68"; latitude: "72"; height: "119"; }
- ListElement{ longitude: "68"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "68"; latitude: "74"; height: "121"; }
- ListElement{ longitude: "68"; latitude: "75"; height: "126"; }
- ListElement{ longitude: "68"; latitude: "76"; height: "127"; }
- ListElement{ longitude: "68"; latitude: "77"; height: "129"; }
- ListElement{ longitude: "68"; latitude: "78"; height: "133"; }
- ListElement{ longitude: "68"; latitude: "79"; height: "130"; }
- ListElement{ longitude: "68"; latitude: "80"; height: "128"; }
- ListElement{ longitude: "68"; latitude: "81"; height: "125"; }
- ListElement{ longitude: "68"; latitude: "82"; height: "123"; }
- ListElement{ longitude: "68"; latitude: "83"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "84"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "85"; height: "123"; }
- ListElement{ longitude: "68"; latitude: "86"; height: "124"; }
- ListElement{ longitude: "68"; latitude: "87"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "88"; height: "117"; }
- ListElement{ longitude: "68"; latitude: "89"; height: "115"; }
- ListElement{ longitude: "68"; latitude: "90"; height: "115"; }
- ListElement{ longitude: "68"; latitude: "91"; height: "116"; }
- ListElement{ longitude: "68"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "68"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "94"; height: "122"; }
- ListElement{ longitude: "68"; latitude: "95"; height: "124"; }
- ListElement{ longitude: "68"; latitude: "96"; height: "128"; }
- ListElement{ longitude: "68"; latitude: "97"; height: "133"; }
- ListElement{ longitude: "68"; latitude: "98"; height: "125"; }
- ListElement{ longitude: "68"; latitude: "99"; height: "124"; }
- ListElement{ longitude: "69"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "1"; height: "122"; }
- ListElement{ longitude: "69"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "3"; height: "124"; }
- ListElement{ longitude: "69"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "69"; latitude: "5"; height: "118"; }
- ListElement{ longitude: "69"; latitude: "6"; height: "118"; }
- ListElement{ longitude: "69"; latitude: "7"; height: "116"; }
- ListElement{ longitude: "69"; latitude: "8"; height: "113"; }
- ListElement{ longitude: "69"; latitude: "9"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "10"; height: "107"; }
- ListElement{ longitude: "69"; latitude: "11"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "12"; height: "108"; }
- ListElement{ longitude: "69"; latitude: "13"; height: "108"; }
- ListElement{ longitude: "69"; latitude: "14"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "15"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "16"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "17"; height: "108"; }
- ListElement{ longitude: "69"; latitude: "18"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "19"; height: "112"; }
- ListElement{ longitude: "69"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "69"; latitude: "21"; height: "114"; }
- ListElement{ longitude: "69"; latitude: "22"; height: "111"; }
- ListElement{ longitude: "69"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "69"; latitude: "24"; height: "112"; }
- ListElement{ longitude: "69"; latitude: "25"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "26"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "27"; height: "107"; }
- ListElement{ longitude: "69"; latitude: "28"; height: "105"; }
- ListElement{ longitude: "69"; latitude: "29"; height: "101"; }
- ListElement{ longitude: "69"; latitude: "30"; height: "100"; }
- ListElement{ longitude: "69"; latitude: "31"; height: "98"; }
- ListElement{ longitude: "69"; latitude: "32"; height: "99"; }
- ListElement{ longitude: "69"; latitude: "33"; height: "101"; }
- ListElement{ longitude: "69"; latitude: "34"; height: "104"; }
- ListElement{ longitude: "69"; latitude: "35"; height: "105"; }
- ListElement{ longitude: "69"; latitude: "36"; height: "109"; }
- ListElement{ longitude: "69"; latitude: "37"; height: "112"; }
- ListElement{ longitude: "69"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "69"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "69"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "41"; height: "130"; }
- ListElement{ longitude: "69"; latitude: "42"; height: "131"; }
- ListElement{ longitude: "69"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "69"; latitude: "44"; height: "131"; }
- ListElement{ longitude: "69"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "46"; height: "128"; }
- ListElement{ longitude: "69"; latitude: "47"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "48"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "49"; height: "129"; }
- ListElement{ longitude: "69"; latitude: "50"; height: "130"; }
- ListElement{ longitude: "69"; latitude: "51"; height: "131"; }
- ListElement{ longitude: "69"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "69"; latitude: "53"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "54"; height: "119"; }
- ListElement{ longitude: "69"; latitude: "55"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "56"; height: "123"; }
- ListElement{ longitude: "69"; latitude: "57"; height: "124"; }
- ListElement{ longitude: "69"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "69"; latitude: "59"; height: "122"; }
- ListElement{ longitude: "69"; latitude: "60"; height: "123"; }
- ListElement{ longitude: "69"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "69"; latitude: "62"; height: "119"; }
- ListElement{ longitude: "69"; latitude: "63"; height: "120"; }
- ListElement{ longitude: "69"; latitude: "64"; height: "118"; }
- ListElement{ longitude: "69"; latitude: "65"; height: "113"; }
- ListElement{ longitude: "69"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "69"; latitude: "67"; height: "116"; }
- ListElement{ longitude: "69"; latitude: "68"; height: "121"; }
- ListElement{ longitude: "69"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "69"; latitude: "70"; height: "123"; }
- ListElement{ longitude: "69"; latitude: "71"; height: "120"; }
- ListElement{ longitude: "69"; latitude: "72"; height: "121"; }
- ListElement{ longitude: "69"; latitude: "73"; height: "118"; }
- ListElement{ longitude: "69"; latitude: "74"; height: "119"; }
- ListElement{ longitude: "69"; latitude: "75"; height: "124"; }
- ListElement{ longitude: "69"; latitude: "76"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "77"; height: "129"; }
- ListElement{ longitude: "69"; latitude: "78"; height: "131"; }
- ListElement{ longitude: "69"; latitude: "79"; height: "133"; }
- ListElement{ longitude: "69"; latitude: "80"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "81"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "82"; height: "126"; }
- ListElement{ longitude: "69"; latitude: "83"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "84"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "85"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "86"; height: "127"; }
- ListElement{ longitude: "69"; latitude: "87"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "88"; height: "120"; }
- ListElement{ longitude: "69"; latitude: "89"; height: "115"; }
- ListElement{ longitude: "69"; latitude: "90"; height: "115"; }
- ListElement{ longitude: "69"; latitude: "91"; height: "114"; }
- ListElement{ longitude: "69"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "69"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "69"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "69"; latitude: "95"; height: "130"; }
- ListElement{ longitude: "69"; latitude: "96"; height: "133"; }
- ListElement{ longitude: "69"; latitude: "97"; height: "136"; }
- ListElement{ longitude: "69"; latitude: "98"; height: "128"; }
- ListElement{ longitude: "69"; latitude: "99"; height: "125"; }
- ListElement{ longitude: "70"; latitude: "0"; height: "125"; }
- ListElement{ longitude: "70"; latitude: "1"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "70"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "70"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "70"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "70"; latitude: "6"; height: "115"; }
- ListElement{ longitude: "70"; latitude: "7"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "8"; height: "112"; }
- ListElement{ longitude: "70"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "70"; latitude: "10"; height: "106"; }
- ListElement{ longitude: "70"; latitude: "11"; height: "105"; }
- ListElement{ longitude: "70"; latitude: "12"; height: "105"; }
- ListElement{ longitude: "70"; latitude: "13"; height: "105"; }
- ListElement{ longitude: "70"; latitude: "14"; height: "108"; }
- ListElement{ longitude: "70"; latitude: "15"; height: "108"; }
- ListElement{ longitude: "70"; latitude: "16"; height: "107"; }
- ListElement{ longitude: "70"; latitude: "17"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "18"; height: "109"; }
- ListElement{ longitude: "70"; latitude: "19"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "20"; height: "112"; }
- ListElement{ longitude: "70"; latitude: "21"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "22"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "23"; height: "109"; }
- ListElement{ longitude: "70"; latitude: "24"; height: "109"; }
- ListElement{ longitude: "70"; latitude: "25"; height: "109"; }
- ListElement{ longitude: "70"; latitude: "26"; height: "107"; }
- ListElement{ longitude: "70"; latitude: "27"; height: "106"; }
- ListElement{ longitude: "70"; latitude: "28"; height: "104"; }
- ListElement{ longitude: "70"; latitude: "29"; height: "101"; }
- ListElement{ longitude: "70"; latitude: "30"; height: "100"; }
- ListElement{ longitude: "70"; latitude: "31"; height: "97"; }
- ListElement{ longitude: "70"; latitude: "32"; height: "98"; }
- ListElement{ longitude: "70"; latitude: "33"; height: "99"; }
- ListElement{ longitude: "70"; latitude: "34"; height: "101"; }
- ListElement{ longitude: "70"; latitude: "35"; height: "104"; }
- ListElement{ longitude: "70"; latitude: "36"; height: "106"; }
- ListElement{ longitude: "70"; latitude: "37"; height: "108"; }
- ListElement{ longitude: "70"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "70"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "70"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "41"; height: "131"; }
- ListElement{ longitude: "70"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "70"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "70"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "70"; latitude: "46"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "47"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "70"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "50"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "51"; height: "132"; }
- ListElement{ longitude: "70"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "70"; latitude: "53"; height: "130"; }
- ListElement{ longitude: "70"; latitude: "54"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "55"; height: "128"; }
- ListElement{ longitude: "70"; latitude: "56"; height: "126"; }
- ListElement{ longitude: "70"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "58"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "59"; height: "128"; }
- ListElement{ longitude: "70"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "70"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "70"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "70"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "70"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "70"; latitude: "65"; height: "115"; }
- ListElement{ longitude: "70"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "70"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "70"; latitude: "68"; height: "126"; }
- ListElement{ longitude: "70"; latitude: "69"; height: "108"; }
- ListElement{ longitude: "70"; latitude: "70"; height: "102"; }
- ListElement{ longitude: "70"; latitude: "71"; height: "98"; }
- ListElement{ longitude: "70"; latitude: "72"; height: "98"; }
- ListElement{ longitude: "70"; latitude: "73"; height: "115"; }
- ListElement{ longitude: "70"; latitude: "74"; height: "120"; }
- ListElement{ longitude: "70"; latitude: "75"; height: "121"; }
- ListElement{ longitude: "70"; latitude: "76"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "77"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "78"; height: "121"; }
- ListElement{ longitude: "70"; latitude: "79"; height: "135"; }
- ListElement{ longitude: "70"; latitude: "80"; height: "131"; }
- ListElement{ longitude: "70"; latitude: "81"; height: "134"; }
- ListElement{ longitude: "70"; latitude: "82"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "83"; height: "128"; }
- ListElement{ longitude: "70"; latitude: "84"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "85"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "86"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "87"; height: "127"; }
- ListElement{ longitude: "70"; latitude: "88"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "89"; height: "119"; }
- ListElement{ longitude: "70"; latitude: "90"; height: "117"; }
- ListElement{ longitude: "70"; latitude: "91"; height: "117"; }
- ListElement{ longitude: "70"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "70"; latitude: "93"; height: "121"; }
- ListElement{ longitude: "70"; latitude: "94"; height: "124"; }
- ListElement{ longitude: "70"; latitude: "95"; height: "129"; }
- ListElement{ longitude: "70"; latitude: "96"; height: "132"; }
- ListElement{ longitude: "70"; latitude: "97"; height: "138"; }
- ListElement{ longitude: "70"; latitude: "98"; height: "134"; }
- ListElement{ longitude: "70"; latitude: "99"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "0"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "1"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "71"; latitude: "3"; height: "123"; }
- ListElement{ longitude: "71"; latitude: "4"; height: "116"; }
- ListElement{ longitude: "71"; latitude: "5"; height: "114"; }
- ListElement{ longitude: "71"; latitude: "6"; height: "110"; }
- ListElement{ longitude: "71"; latitude: "7"; height: "110"; }
- ListElement{ longitude: "71"; latitude: "8"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "71"; latitude: "10"; height: "106"; }
- ListElement{ longitude: "71"; latitude: "11"; height: "104"; }
- ListElement{ longitude: "71"; latitude: "12"; height: "104"; }
- ListElement{ longitude: "71"; latitude: "13"; height: "104"; }
- ListElement{ longitude: "71"; latitude: "14"; height: "104"; }
- ListElement{ longitude: "71"; latitude: "15"; height: "104"; }
- ListElement{ longitude: "71"; latitude: "16"; height: "107"; }
- ListElement{ longitude: "71"; latitude: "17"; height: "108"; }
- ListElement{ longitude: "71"; latitude: "18"; height: "110"; }
- ListElement{ longitude: "71"; latitude: "19"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "20"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "21"; height: "110"; }
- ListElement{ longitude: "71"; latitude: "22"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "23"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "24"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "25"; height: "111"; }
- ListElement{ longitude: "71"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "71"; latitude: "27"; height: "109"; }
- ListElement{ longitude: "71"; latitude: "28"; height: "105"; }
- ListElement{ longitude: "71"; latitude: "29"; height: "101"; }
- ListElement{ longitude: "71"; latitude: "30"; height: "102"; }
- ListElement{ longitude: "71"; latitude: "31"; height: "102"; }
- ListElement{ longitude: "71"; latitude: "32"; height: "102"; }
- ListElement{ longitude: "71"; latitude: "33"; height: "103"; }
- ListElement{ longitude: "71"; latitude: "34"; height: "106"; }
- ListElement{ longitude: "71"; latitude: "35"; height: "105"; }
- ListElement{ longitude: "71"; latitude: "36"; height: "108"; }
- ListElement{ longitude: "71"; latitude: "37"; height: "109"; }
- ListElement{ longitude: "71"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "71"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "71"; latitude: "40"; height: "124"; }
- ListElement{ longitude: "71"; latitude: "41"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "43"; height: "127"; }
- ListElement{ longitude: "71"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "45"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "46"; height: "123"; }
- ListElement{ longitude: "71"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "71"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "71"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "71"; latitude: "50"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "51"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "53"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "54"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "56"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "57"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "58"; height: "128"; }
- ListElement{ longitude: "71"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "71"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "71"; latitude: "61"; height: "127"; }
- ListElement{ longitude: "71"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "71"; latitude: "63"; height: "121"; }
- ListElement{ longitude: "71"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "71"; latitude: "65"; height: "119"; }
- ListElement{ longitude: "71"; latitude: "66"; height: "118"; }
- ListElement{ longitude: "71"; latitude: "67"; height: "121"; }
- ListElement{ longitude: "71"; latitude: "68"; height: "118"; }
- ListElement{ longitude: "71"; latitude: "69"; height: "93"; }
- ListElement{ longitude: "71"; latitude: "70"; height: "94"; }
- ListElement{ longitude: "71"; latitude: "71"; height: "95"; }
- ListElement{ longitude: "71"; latitude: "72"; height: "92"; }
- ListElement{ longitude: "71"; latitude: "73"; height: "100"; }
- ListElement{ longitude: "71"; latitude: "74"; height: "120"; }
- ListElement{ longitude: "71"; latitude: "75"; height: "120"; }
- ListElement{ longitude: "71"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "77"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "78"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "79"; height: "135"; }
- ListElement{ longitude: "71"; latitude: "80"; height: "138"; }
- ListElement{ longitude: "71"; latitude: "81"; height: "134"; }
- ListElement{ longitude: "71"; latitude: "82"; height: "135"; }
- ListElement{ longitude: "71"; latitude: "83"; height: "133"; }
- ListElement{ longitude: "71"; latitude: "84"; height: "130"; }
- ListElement{ longitude: "71"; latitude: "85"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "86"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "87"; height: "131"; }
- ListElement{ longitude: "71"; latitude: "88"; height: "127"; }
- ListElement{ longitude: "71"; latitude: "89"; height: "124"; }
- ListElement{ longitude: "71"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "71"; latitude: "91"; height: "119"; }
- ListElement{ longitude: "71"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "71"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "71"; latitude: "94"; height: "125"; }
- ListElement{ longitude: "71"; latitude: "95"; height: "126"; }
- ListElement{ longitude: "71"; latitude: "96"; height: "132"; }
- ListElement{ longitude: "71"; latitude: "97"; height: "138"; }
- ListElement{ longitude: "71"; latitude: "98"; height: "136"; }
- ListElement{ longitude: "71"; latitude: "99"; height: "126"; }
- ListElement{ longitude: "72"; latitude: "0"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "1"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "2"; height: "124"; }
- ListElement{ longitude: "72"; latitude: "3"; height: "124"; }
- ListElement{ longitude: "72"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "72"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "72"; latitude: "6"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "7"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "8"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "10"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "11"; height: "104"; }
- ListElement{ longitude: "72"; latitude: "12"; height: "103"; }
- ListElement{ longitude: "72"; latitude: "13"; height: "105"; }
- ListElement{ longitude: "72"; latitude: "14"; height: "105"; }
- ListElement{ longitude: "72"; latitude: "15"; height: "105"; }
- ListElement{ longitude: "72"; latitude: "16"; height: "102"; }
- ListElement{ longitude: "72"; latitude: "17"; height: "105"; }
- ListElement{ longitude: "72"; latitude: "18"; height: "107"; }
- ListElement{ longitude: "72"; latitude: "19"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "20"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "21"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "22"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "24"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "25"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "26"; height: "111"; }
- ListElement{ longitude: "72"; latitude: "27"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "28"; height: "109"; }
- ListElement{ longitude: "72"; latitude: "29"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "30"; height: "107"; }
- ListElement{ longitude: "72"; latitude: "31"; height: "105"; }
- ListElement{ longitude: "72"; latitude: "32"; height: "107"; }
- ListElement{ longitude: "72"; latitude: "33"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "34"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "35"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "36"; height: "108"; }
- ListElement{ longitude: "72"; latitude: "37"; height: "107"; }
- ListElement{ longitude: "72"; latitude: "38"; height: "110"; }
- ListElement{ longitude: "72"; latitude: "39"; height: "115"; }
- ListElement{ longitude: "72"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "72"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "42"; height: "131"; }
- ListElement{ longitude: "72"; latitude: "43"; height: "132"; }
- ListElement{ longitude: "72"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "72"; latitude: "46"; height: "122"; }
- ListElement{ longitude: "72"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "72"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "72"; latitude: "49"; height: "128"; }
- ListElement{ longitude: "72"; latitude: "50"; height: "132"; }
- ListElement{ longitude: "72"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "72"; latitude: "52"; height: "134"; }
- ListElement{ longitude: "72"; latitude: "53"; height: "133"; }
- ListElement{ longitude: "72"; latitude: "54"; height: "133"; }
- ListElement{ longitude: "72"; latitude: "55"; height: "133"; }
- ListElement{ longitude: "72"; latitude: "56"; height: "136"; }
- ListElement{ longitude: "72"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "58"; height: "115"; }
- ListElement{ longitude: "72"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "72"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "72"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "72"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "72"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "72"; latitude: "64"; height: "121"; }
- ListElement{ longitude: "72"; latitude: "65"; height: "116"; }
- ListElement{ longitude: "72"; latitude: "66"; height: "117"; }
- ListElement{ longitude: "72"; latitude: "67"; height: "121"; }
- ListElement{ longitude: "72"; latitude: "68"; height: "109"; }
- ListElement{ longitude: "72"; latitude: "69"; height: "101"; }
- ListElement{ longitude: "72"; latitude: "70"; height: "106"; }
- ListElement{ longitude: "72"; latitude: "71"; height: "100"; }
- ListElement{ longitude: "72"; latitude: "72"; height: "91"; }
- ListElement{ longitude: "72"; latitude: "73"; height: "101"; }
- ListElement{ longitude: "72"; latitude: "74"; height: "119"; }
- ListElement{ longitude: "72"; latitude: "75"; height: "121"; }
- ListElement{ longitude: "72"; latitude: "76"; height: "129"; }
- ListElement{ longitude: "72"; latitude: "77"; height: "131"; }
- ListElement{ longitude: "72"; latitude: "78"; height: "135"; }
- ListElement{ longitude: "72"; latitude: "79"; height: "138"; }
- ListElement{ longitude: "72"; latitude: "80"; height: "141"; }
- ListElement{ longitude: "72"; latitude: "81"; height: "139"; }
- ListElement{ longitude: "72"; latitude: "82"; height: "138"; }
- ListElement{ longitude: "72"; latitude: "83"; height: "136"; }
- ListElement{ longitude: "72"; latitude: "84"; height: "134"; }
- ListElement{ longitude: "72"; latitude: "85"; height: "133"; }
- ListElement{ longitude: "72"; latitude: "86"; height: "132"; }
- ListElement{ longitude: "72"; latitude: "87"; height: "131"; }
- ListElement{ longitude: "72"; latitude: "88"; height: "129"; }
- ListElement{ longitude: "72"; latitude: "89"; height: "127"; }
- ListElement{ longitude: "72"; latitude: "90"; height: "122"; }
- ListElement{ longitude: "72"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "72"; latitude: "92"; height: "121"; }
- ListElement{ longitude: "72"; latitude: "93"; height: "120"; }
- ListElement{ longitude: "72"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "72"; latitude: "95"; height: "126"; }
- ListElement{ longitude: "72"; latitude: "96"; height: "130"; }
- ListElement{ longitude: "72"; latitude: "97"; height: "137"; }
- ListElement{ longitude: "72"; latitude: "98"; height: "138"; }
- ListElement{ longitude: "72"; latitude: "99"; height: "125"; }
- ListElement{ longitude: "73"; latitude: "0"; height: "129"; }
- ListElement{ longitude: "73"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "73"; latitude: "2"; height: "127"; }
- ListElement{ longitude: "73"; latitude: "3"; height: "127"; }
- ListElement{ longitude: "73"; latitude: "4"; height: "120"; }
- ListElement{ longitude: "73"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "73"; latitude: "6"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "7"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "8"; height: "111"; }
- ListElement{ longitude: "73"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "73"; latitude: "10"; height: "108"; }
- ListElement{ longitude: "73"; latitude: "11"; height: "106"; }
- ListElement{ longitude: "73"; latitude: "12"; height: "105"; }
- ListElement{ longitude: "73"; latitude: "13"; height: "105"; }
- ListElement{ longitude: "73"; latitude: "14"; height: "103"; }
- ListElement{ longitude: "73"; latitude: "15"; height: "103"; }
- ListElement{ longitude: "73"; latitude: "16"; height: "101"; }
- ListElement{ longitude: "73"; latitude: "17"; height: "104"; }
- ListElement{ longitude: "73"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "73"; latitude: "19"; height: "109"; }
- ListElement{ longitude: "73"; latitude: "20"; height: "111"; }
- ListElement{ longitude: "73"; latitude: "21"; height: "111"; }
- ListElement{ longitude: "73"; latitude: "22"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "24"; height: "112"; }
- ListElement{ longitude: "73"; latitude: "25"; height: "112"; }
- ListElement{ longitude: "73"; latitude: "26"; height: "112"; }
- ListElement{ longitude: "73"; latitude: "27"; height: "108"; }
- ListElement{ longitude: "73"; latitude: "28"; height: "113"; }
- ListElement{ longitude: "73"; latitude: "29"; height: "111"; }
- ListElement{ longitude: "73"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "31"; height: "107"; }
- ListElement{ longitude: "73"; latitude: "32"; height: "108"; }
- ListElement{ longitude: "73"; latitude: "33"; height: "109"; }
- ListElement{ longitude: "73"; latitude: "34"; height: "110"; }
- ListElement{ longitude: "73"; latitude: "35"; height: "106"; }
- ListElement{ longitude: "73"; latitude: "36"; height: "107"; }
- ListElement{ longitude: "73"; latitude: "37"; height: "106"; }
- ListElement{ longitude: "73"; latitude: "38"; height: "107"; }
- ListElement{ longitude: "73"; latitude: "39"; height: "112"; }
- ListElement{ longitude: "73"; latitude: "40"; height: "119"; }
- ListElement{ longitude: "73"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "73"; latitude: "42"; height: "131"; }
- ListElement{ longitude: "73"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "73"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "45"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "46"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "73"; latitude: "48"; height: "127"; }
- ListElement{ longitude: "73"; latitude: "49"; height: "132"; }
- ListElement{ longitude: "73"; latitude: "50"; height: "135"; }
- ListElement{ longitude: "73"; latitude: "51"; height: "135"; }
- ListElement{ longitude: "73"; latitude: "52"; height: "135"; }
- ListElement{ longitude: "73"; latitude: "53"; height: "133"; }
- ListElement{ longitude: "73"; latitude: "54"; height: "133"; }
- ListElement{ longitude: "73"; latitude: "55"; height: "135"; }
- ListElement{ longitude: "73"; latitude: "56"; height: "138"; }
- ListElement{ longitude: "73"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "73"; latitude: "58"; height: "119"; }
- ListElement{ longitude: "73"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "73"; latitude: "60"; height: "129"; }
- ListElement{ longitude: "73"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "73"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "73"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "64"; height: "121"; }
- ListElement{ longitude: "73"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "73"; latitude: "66"; height: "118"; }
- ListElement{ longitude: "73"; latitude: "67"; height: "119"; }
- ListElement{ longitude: "73"; latitude: "68"; height: "108"; }
- ListElement{ longitude: "73"; latitude: "69"; height: "97"; }
- ListElement{ longitude: "73"; latitude: "70"; height: "104"; }
- ListElement{ longitude: "73"; latitude: "71"; height: "102"; }
- ListElement{ longitude: "73"; latitude: "72"; height: "92"; }
- ListElement{ longitude: "73"; latitude: "73"; height: "109"; }
- ListElement{ longitude: "73"; latitude: "74"; height: "123"; }
- ListElement{ longitude: "73"; latitude: "75"; height: "125"; }
- ListElement{ longitude: "73"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "73"; latitude: "77"; height: "132"; }
- ListElement{ longitude: "73"; latitude: "78"; height: "137"; }
- ListElement{ longitude: "73"; latitude: "79"; height: "140"; }
- ListElement{ longitude: "73"; latitude: "80"; height: "143"; }
- ListElement{ longitude: "73"; latitude: "81"; height: "141"; }
- ListElement{ longitude: "73"; latitude: "82"; height: "140"; }
- ListElement{ longitude: "73"; latitude: "83"; height: "136"; }
- ListElement{ longitude: "73"; latitude: "84"; height: "134"; }
- ListElement{ longitude: "73"; latitude: "85"; height: "134"; }
- ListElement{ longitude: "73"; latitude: "86"; height: "133"; }
- ListElement{ longitude: "73"; latitude: "87"; height: "130"; }
- ListElement{ longitude: "73"; latitude: "88"; height: "130"; }
- ListElement{ longitude: "73"; latitude: "89"; height: "128"; }
- ListElement{ longitude: "73"; latitude: "90"; height: "125"; }
- ListElement{ longitude: "73"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "73"; latitude: "93"; height: "120"; }
- ListElement{ longitude: "73"; latitude: "94"; height: "119"; }
- ListElement{ longitude: "73"; latitude: "95"; height: "120"; }
- ListElement{ longitude: "73"; latitude: "96"; height: "122"; }
- ListElement{ longitude: "73"; latitude: "97"; height: "131"; }
- ListElement{ longitude: "73"; latitude: "98"; height: "137"; }
- ListElement{ longitude: "73"; latitude: "99"; height: "123"; }
- ListElement{ longitude: "74"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "3"; height: "127"; }
- ListElement{ longitude: "74"; latitude: "4"; height: "124"; }
- ListElement{ longitude: "74"; latitude: "5"; height: "117"; }
- ListElement{ longitude: "74"; latitude: "6"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "7"; height: "111"; }
- ListElement{ longitude: "74"; latitude: "8"; height: "111"; }
- ListElement{ longitude: "74"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "74"; latitude: "10"; height: "106"; }
- ListElement{ longitude: "74"; latitude: "11"; height: "106"; }
- ListElement{ longitude: "74"; latitude: "12"; height: "105"; }
- ListElement{ longitude: "74"; latitude: "13"; height: "104"; }
- ListElement{ longitude: "74"; latitude: "14"; height: "104"; }
- ListElement{ longitude: "74"; latitude: "15"; height: "104"; }
- ListElement{ longitude: "74"; latitude: "16"; height: "106"; }
- ListElement{ longitude: "74"; latitude: "17"; height: "105"; }
- ListElement{ longitude: "74"; latitude: "18"; height: "107"; }
- ListElement{ longitude: "74"; latitude: "19"; height: "107"; }
- ListElement{ longitude: "74"; latitude: "20"; height: "110"; }
- ListElement{ longitude: "74"; latitude: "21"; height: "111"; }
- ListElement{ longitude: "74"; latitude: "22"; height: "112"; }
- ListElement{ longitude: "74"; latitude: "23"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "27"; height: "113"; }
- ListElement{ longitude: "74"; latitude: "28"; height: "114"; }
- ListElement{ longitude: "74"; latitude: "29"; height: "110"; }
- ListElement{ longitude: "74"; latitude: "30"; height: "112"; }
- ListElement{ longitude: "74"; latitude: "31"; height: "111"; }
- ListElement{ longitude: "74"; latitude: "32"; height: "108"; }
- ListElement{ longitude: "74"; latitude: "33"; height: "109"; }
- ListElement{ longitude: "74"; latitude: "34"; height: "106"; }
- ListElement{ longitude: "74"; latitude: "35"; height: "102"; }
- ListElement{ longitude: "74"; latitude: "36"; height: "104"; }
- ListElement{ longitude: "74"; latitude: "37"; height: "105"; }
- ListElement{ longitude: "74"; latitude: "38"; height: "109"; }
- ListElement{ longitude: "74"; latitude: "39"; height: "114"; }
- ListElement{ longitude: "74"; latitude: "40"; height: "121"; }
- ListElement{ longitude: "74"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "42"; height: "123"; }
- ListElement{ longitude: "74"; latitude: "43"; height: "117"; }
- ListElement{ longitude: "74"; latitude: "44"; height: "119"; }
- ListElement{ longitude: "74"; latitude: "45"; height: "121"; }
- ListElement{ longitude: "74"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "74"; latitude: "47"; height: "122"; }
- ListElement{ longitude: "74"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "74"; latitude: "49"; height: "129"; }
- ListElement{ longitude: "74"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "74"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "74"; latitude: "52"; height: "136"; }
- ListElement{ longitude: "74"; latitude: "53"; height: "134"; }
- ListElement{ longitude: "74"; latitude: "54"; height: "134"; }
- ListElement{ longitude: "74"; latitude: "55"; height: "137"; }
- ListElement{ longitude: "74"; latitude: "56"; height: "138"; }
- ListElement{ longitude: "74"; latitude: "57"; height: "136"; }
- ListElement{ longitude: "74"; latitude: "58"; height: "135"; }
- ListElement{ longitude: "74"; latitude: "59"; height: "134"; }
- ListElement{ longitude: "74"; latitude: "60"; height: "130"; }
- ListElement{ longitude: "74"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "74"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "74"; latitude: "64"; height: "120"; }
- ListElement{ longitude: "74"; latitude: "65"; height: "116"; }
- ListElement{ longitude: "74"; latitude: "66"; height: "117"; }
- ListElement{ longitude: "74"; latitude: "67"; height: "119"; }
- ListElement{ longitude: "74"; latitude: "68"; height: "120"; }
- ListElement{ longitude: "74"; latitude: "69"; height: "103"; }
- ListElement{ longitude: "74"; latitude: "70"; height: "100"; }
- ListElement{ longitude: "74"; latitude: "71"; height: "97"; }
- ListElement{ longitude: "74"; latitude: "72"; height: "96"; }
- ListElement{ longitude: "74"; latitude: "73"; height: "121"; }
- ListElement{ longitude: "74"; latitude: "74"; height: "123"; }
- ListElement{ longitude: "74"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "76"; height: "121"; }
- ListElement{ longitude: "74"; latitude: "77"; height: "133"; }
- ListElement{ longitude: "74"; latitude: "78"; height: "138"; }
- ListElement{ longitude: "74"; latitude: "79"; height: "142"; }
- ListElement{ longitude: "74"; latitude: "80"; height: "143"; }
- ListElement{ longitude: "74"; latitude: "81"; height: "143"; }
- ListElement{ longitude: "74"; latitude: "82"; height: "141"; }
- ListElement{ longitude: "74"; latitude: "83"; height: "137"; }
- ListElement{ longitude: "74"; latitude: "84"; height: "135"; }
- ListElement{ longitude: "74"; latitude: "85"; height: "135"; }
- ListElement{ longitude: "74"; latitude: "86"; height: "134"; }
- ListElement{ longitude: "74"; latitude: "87"; height: "132"; }
- ListElement{ longitude: "74"; latitude: "88"; height: "130"; }
- ListElement{ longitude: "74"; latitude: "89"; height: "128"; }
- ListElement{ longitude: "74"; latitude: "90"; height: "123"; }
- ListElement{ longitude: "74"; latitude: "91"; height: "120"; }
- ListElement{ longitude: "74"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "74"; latitude: "93"; height: "117"; }
- ListElement{ longitude: "74"; latitude: "94"; height: "116"; }
- ListElement{ longitude: "74"; latitude: "95"; height: "116"; }
- ListElement{ longitude: "74"; latitude: "96"; height: "119"; }
- ListElement{ longitude: "74"; latitude: "97"; height: "125"; }
- ListElement{ longitude: "74"; latitude: "98"; height: "131"; }
- ListElement{ longitude: "74"; latitude: "99"; height: "119"; }
- ListElement{ longitude: "75"; latitude: "0"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "1"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "3"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "4"; height: "126"; }
- ListElement{ longitude: "75"; latitude: "5"; height: "120"; }
- ListElement{ longitude: "75"; latitude: "6"; height: "116"; }
- ListElement{ longitude: "75"; latitude: "7"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "8"; height: "110"; }
- ListElement{ longitude: "75"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "75"; latitude: "10"; height: "107"; }
- ListElement{ longitude: "75"; latitude: "11"; height: "105"; }
- ListElement{ longitude: "75"; latitude: "12"; height: "102"; }
- ListElement{ longitude: "75"; latitude: "13"; height: "101"; }
- ListElement{ longitude: "75"; latitude: "14"; height: "101"; }
- ListElement{ longitude: "75"; latitude: "15"; height: "101"; }
- ListElement{ longitude: "75"; latitude: "16"; height: "103"; }
- ListElement{ longitude: "75"; latitude: "17"; height: "102"; }
- ListElement{ longitude: "75"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "75"; latitude: "19"; height: "108"; }
- ListElement{ longitude: "75"; latitude: "20"; height: "110"; }
- ListElement{ longitude: "75"; latitude: "21"; height: "111"; }
- ListElement{ longitude: "75"; latitude: "22"; height: "112"; }
- ListElement{ longitude: "75"; latitude: "23"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "27"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "28"; height: "114"; }
- ListElement{ longitude: "75"; latitude: "29"; height: "111"; }
- ListElement{ longitude: "75"; latitude: "30"; height: "108"; }
- ListElement{ longitude: "75"; latitude: "31"; height: "108"; }
- ListElement{ longitude: "75"; latitude: "32"; height: "105"; }
- ListElement{ longitude: "75"; latitude: "33"; height: "104"; }
- ListElement{ longitude: "75"; latitude: "34"; height: "101"; }
- ListElement{ longitude: "75"; latitude: "35"; height: "102"; }
- ListElement{ longitude: "75"; latitude: "36"; height: "102"; }
- ListElement{ longitude: "75"; latitude: "37"; height: "104"; }
- ListElement{ longitude: "75"; latitude: "38"; height: "110"; }
- ListElement{ longitude: "75"; latitude: "39"; height: "115"; }
- ListElement{ longitude: "75"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "75"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "75"; latitude: "42"; height: "118"; }
- ListElement{ longitude: "75"; latitude: "43"; height: "119"; }
- ListElement{ longitude: "75"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "75"; latitude: "45"; height: "124"; }
- ListElement{ longitude: "75"; latitude: "46"; height: "122"; }
- ListElement{ longitude: "75"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "75"; latitude: "48"; height: "126"; }
- ListElement{ longitude: "75"; latitude: "49"; height: "130"; }
- ListElement{ longitude: "75"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "75"; latitude: "51"; height: "138"; }
- ListElement{ longitude: "75"; latitude: "52"; height: "139"; }
- ListElement{ longitude: "75"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "54"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "55"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "56"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "57"; height: "136"; }
- ListElement{ longitude: "75"; latitude: "58"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "59"; height: "133"; }
- ListElement{ longitude: "75"; latitude: "60"; height: "130"; }
- ListElement{ longitude: "75"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "75"; latitude: "63"; height: "120"; }
- ListElement{ longitude: "75"; latitude: "64"; height: "117"; }
- ListElement{ longitude: "75"; latitude: "65"; height: "114"; }
- ListElement{ longitude: "75"; latitude: "66"; height: "113"; }
- ListElement{ longitude: "75"; latitude: "67"; height: "115"; }
- ListElement{ longitude: "75"; latitude: "68"; height: "119"; }
- ListElement{ longitude: "75"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "75"; latitude: "70"; height: "119"; }
- ListElement{ longitude: "75"; latitude: "71"; height: "110"; }
- ListElement{ longitude: "75"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "75"; latitude: "73"; height: "126"; }
- ListElement{ longitude: "75"; latitude: "74"; height: "127"; }
- ListElement{ longitude: "75"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "76"; height: "127"; }
- ListElement{ longitude: "75"; latitude: "77"; height: "135"; }
- ListElement{ longitude: "75"; latitude: "78"; height: "140"; }
- ListElement{ longitude: "75"; latitude: "79"; height: "144"; }
- ListElement{ longitude: "75"; latitude: "80"; height: "146"; }
- ListElement{ longitude: "75"; latitude: "81"; height: "147"; }
- ListElement{ longitude: "75"; latitude: "82"; height: "140"; }
- ListElement{ longitude: "75"; latitude: "83"; height: "141"; }
- ListElement{ longitude: "75"; latitude: "84"; height: "137"; }
- ListElement{ longitude: "75"; latitude: "85"; height: "134"; }
- ListElement{ longitude: "75"; latitude: "86"; height: "134"; }
- ListElement{ longitude: "75"; latitude: "87"; height: "132"; }
- ListElement{ longitude: "75"; latitude: "88"; height: "130"; }
- ListElement{ longitude: "75"; latitude: "89"; height: "128"; }
- ListElement{ longitude: "75"; latitude: "90"; height: "123"; }
- ListElement{ longitude: "75"; latitude: "91"; height: "120"; }
- ListElement{ longitude: "75"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "75"; latitude: "93"; height: "117"; }
- ListElement{ longitude: "75"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "75"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "75"; latitude: "96"; height: "114"; }
- ListElement{ longitude: "75"; latitude: "97"; height: "120"; }
- ListElement{ longitude: "75"; latitude: "98"; height: "127"; }
- ListElement{ longitude: "75"; latitude: "99"; height: "114"; }
- ListElement{ longitude: "76"; latitude: "0"; height: "127"; }
- ListElement{ longitude: "76"; latitude: "1"; height: "127"; }
- ListElement{ longitude: "76"; latitude: "2"; height: "128"; }
- ListElement{ longitude: "76"; latitude: "3"; height: "128"; }
- ListElement{ longitude: "76"; latitude: "4"; height: "130"; }
- ListElement{ longitude: "76"; latitude: "5"; height: "125"; }
- ListElement{ longitude: "76"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "76"; latitude: "7"; height: "115"; }
- ListElement{ longitude: "76"; latitude: "8"; height: "113"; }
- ListElement{ longitude: "76"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "76"; latitude: "10"; height: "105"; }
- ListElement{ longitude: "76"; latitude: "11"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "12"; height: "99"; }
- ListElement{ longitude: "76"; latitude: "13"; height: "100"; }
- ListElement{ longitude: "76"; latitude: "14"; height: "100"; }
- ListElement{ longitude: "76"; latitude: "15"; height: "100"; }
- ListElement{ longitude: "76"; latitude: "16"; height: "100"; }
- ListElement{ longitude: "76"; latitude: "17"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "18"; height: "103"; }
- ListElement{ longitude: "76"; latitude: "19"; height: "107"; }
- ListElement{ longitude: "76"; latitude: "20"; height: "109"; }
- ListElement{ longitude: "76"; latitude: "21"; height: "110"; }
- ListElement{ longitude: "76"; latitude: "22"; height: "111"; }
- ListElement{ longitude: "76"; latitude: "23"; height: "114"; }
- ListElement{ longitude: "76"; latitude: "24"; height: "113"; }
- ListElement{ longitude: "76"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "76"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "76"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "76"; latitude: "28"; height: "110"; }
- ListElement{ longitude: "76"; latitude: "29"; height: "110"; }
- ListElement{ longitude: "76"; latitude: "30"; height: "106"; }
- ListElement{ longitude: "76"; latitude: "31"; height: "104"; }
- ListElement{ longitude: "76"; latitude: "32"; height: "103"; }
- ListElement{ longitude: "76"; latitude: "33"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "34"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "35"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "36"; height: "102"; }
- ListElement{ longitude: "76"; latitude: "37"; height: "104"; }
- ListElement{ longitude: "76"; latitude: "38"; height: "107"; }
- ListElement{ longitude: "76"; latitude: "39"; height: "114"; }
- ListElement{ longitude: "76"; latitude: "40"; height: "120"; }
- ListElement{ longitude: "76"; latitude: "41"; height: "129"; }
- ListElement{ longitude: "76"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "76"; latitude: "43"; height: "123"; }
- ListElement{ longitude: "76"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "76"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "76"; latitude: "46"; height: "119"; }
- ListElement{ longitude: "76"; latitude: "47"; height: "118"; }
- ListElement{ longitude: "76"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "76"; latitude: "49"; height: "129"; }
- ListElement{ longitude: "76"; latitude: "50"; height: "133"; }
- ListElement{ longitude: "76"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "76"; latitude: "52"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "54"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "55"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "56"; height: "136"; }
- ListElement{ longitude: "76"; latitude: "57"; height: "136"; }
- ListElement{ longitude: "76"; latitude: "58"; height: "134"; }
- ListElement{ longitude: "76"; latitude: "59"; height: "132"; }
- ListElement{ longitude: "76"; latitude: "60"; height: "127"; }
- ListElement{ longitude: "76"; latitude: "61"; height: "126"; }
- ListElement{ longitude: "76"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "76"; latitude: "63"; height: "120"; }
- ListElement{ longitude: "76"; latitude: "64"; height: "117"; }
- ListElement{ longitude: "76"; latitude: "65"; height: "112"; }
- ListElement{ longitude: "76"; latitude: "66"; height: "110"; }
- ListElement{ longitude: "76"; latitude: "67"; height: "110"; }
- ListElement{ longitude: "76"; latitude: "68"; height: "111"; }
- ListElement{ longitude: "76"; latitude: "69"; height: "115"; }
- ListElement{ longitude: "76"; latitude: "70"; height: "121"; }
- ListElement{ longitude: "76"; latitude: "71"; height: "122"; }
- ListElement{ longitude: "76"; latitude: "72"; height: "125"; }
- ListElement{ longitude: "76"; latitude: "73"; height: "127"; }
- ListElement{ longitude: "76"; latitude: "74"; height: "127"; }
- ListElement{ longitude: "76"; latitude: "75"; height: "131"; }
- ListElement{ longitude: "76"; latitude: "76"; height: "134"; }
- ListElement{ longitude: "76"; latitude: "77"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "78"; height: "140"; }
- ListElement{ longitude: "76"; latitude: "79"; height: "143"; }
- ListElement{ longitude: "76"; latitude: "80"; height: "143"; }
- ListElement{ longitude: "76"; latitude: "81"; height: "144"; }
- ListElement{ longitude: "76"; latitude: "82"; height: "141"; }
- ListElement{ longitude: "76"; latitude: "83"; height: "137"; }
- ListElement{ longitude: "76"; latitude: "84"; height: "136"; }
- ListElement{ longitude: "76"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "76"; latitude: "86"; height: "133"; }
- ListElement{ longitude: "76"; latitude: "87"; height: "131"; }
- ListElement{ longitude: "76"; latitude: "88"; height: "129"; }
- ListElement{ longitude: "76"; latitude: "89"; height: "128"; }
- ListElement{ longitude: "76"; latitude: "90"; height: "123"; }
- ListElement{ longitude: "76"; latitude: "91"; height: "120"; }
- ListElement{ longitude: "76"; latitude: "92"; height: "117"; }
- ListElement{ longitude: "76"; latitude: "93"; height: "115"; }
- ListElement{ longitude: "76"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "76"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "76"; latitude: "96"; height: "116"; }
- ListElement{ longitude: "76"; latitude: "97"; height: "116"; }
- ListElement{ longitude: "76"; latitude: "98"; height: "122"; }
- ListElement{ longitude: "76"; latitude: "99"; height: "114"; }
- ListElement{ longitude: "77"; latitude: "0"; height: "124"; }
- ListElement{ longitude: "77"; latitude: "1"; height: "124"; }
- ListElement{ longitude: "77"; latitude: "2"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "3"; height: "127"; }
- ListElement{ longitude: "77"; latitude: "4"; height: "130"; }
- ListElement{ longitude: "77"; latitude: "5"; height: "131"; }
- ListElement{ longitude: "77"; latitude: "6"; height: "123"; }
- ListElement{ longitude: "77"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "77"; latitude: "8"; height: "115"; }
- ListElement{ longitude: "77"; latitude: "9"; height: "110"; }
- ListElement{ longitude: "77"; latitude: "10"; height: "106"; }
- ListElement{ longitude: "77"; latitude: "11"; height: "103"; }
- ListElement{ longitude: "77"; latitude: "12"; height: "99"; }
- ListElement{ longitude: "77"; latitude: "13"; height: "98"; }
- ListElement{ longitude: "77"; latitude: "14"; height: "98"; }
- ListElement{ longitude: "77"; latitude: "15"; height: "100"; }
- ListElement{ longitude: "77"; latitude: "16"; height: "99"; }
- ListElement{ longitude: "77"; latitude: "17"; height: "102"; }
- ListElement{ longitude: "77"; latitude: "18"; height: "104"; }
- ListElement{ longitude: "77"; latitude: "19"; height: "106"; }
- ListElement{ longitude: "77"; latitude: "20"; height: "108"; }
- ListElement{ longitude: "77"; latitude: "21"; height: "104"; }
- ListElement{ longitude: "77"; latitude: "22"; height: "107"; }
- ListElement{ longitude: "77"; latitude: "23"; height: "112"; }
- ListElement{ longitude: "77"; latitude: "24"; height: "111"; }
- ListElement{ longitude: "77"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "77"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "77"; latitude: "27"; height: "112"; }
- ListElement{ longitude: "77"; latitude: "28"; height: "111"; }
- ListElement{ longitude: "77"; latitude: "29"; height: "108"; }
- ListElement{ longitude: "77"; latitude: "30"; height: "104"; }
- ListElement{ longitude: "77"; latitude: "31"; height: "102"; }
- ListElement{ longitude: "77"; latitude: "32"; height: "101"; }
- ListElement{ longitude: "77"; latitude: "33"; height: "101"; }
- ListElement{ longitude: "77"; latitude: "34"; height: "104"; }
- ListElement{ longitude: "77"; latitude: "35"; height: "102"; }
- ListElement{ longitude: "77"; latitude: "36"; height: "102"; }
- ListElement{ longitude: "77"; latitude: "37"; height: "105"; }
- ListElement{ longitude: "77"; latitude: "38"; height: "106"; }
- ListElement{ longitude: "77"; latitude: "39"; height: "112"; }
- ListElement{ longitude: "77"; latitude: "40"; height: "117"; }
- ListElement{ longitude: "77"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "42"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "43"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "77"; latitude: "45"; height: "119"; }
- ListElement{ longitude: "77"; latitude: "46"; height: "118"; }
- ListElement{ longitude: "77"; latitude: "47"; height: "118"; }
- ListElement{ longitude: "77"; latitude: "48"; height: "123"; }
- ListElement{ longitude: "77"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "77"; latitude: "50"; height: "131"; }
- ListElement{ longitude: "77"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "77"; latitude: "52"; height: "136"; }
- ListElement{ longitude: "77"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "77"; latitude: "54"; height: "135"; }
- ListElement{ longitude: "77"; latitude: "55"; height: "136"; }
- ListElement{ longitude: "77"; latitude: "56"; height: "134"; }
- ListElement{ longitude: "77"; latitude: "57"; height: "134"; }
- ListElement{ longitude: "77"; latitude: "58"; height: "133"; }
- ListElement{ longitude: "77"; latitude: "59"; height: "130"; }
- ListElement{ longitude: "77"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "77"; latitude: "62"; height: "120"; }
- ListElement{ longitude: "77"; latitude: "63"; height: "117"; }
- ListElement{ longitude: "77"; latitude: "64"; height: "114"; }
- ListElement{ longitude: "77"; latitude: "65"; height: "111"; }
- ListElement{ longitude: "77"; latitude: "66"; height: "109"; }
- ListElement{ longitude: "77"; latitude: "67"; height: "107"; }
- ListElement{ longitude: "77"; latitude: "68"; height: "106"; }
- ListElement{ longitude: "77"; latitude: "69"; height: "110"; }
- ListElement{ longitude: "77"; latitude: "70"; height: "116"; }
- ListElement{ longitude: "77"; latitude: "71"; height: "119"; }
- ListElement{ longitude: "77"; latitude: "72"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "73"; height: "129"; }
- ListElement{ longitude: "77"; latitude: "74"; height: "132"; }
- ListElement{ longitude: "77"; latitude: "75"; height: "133"; }
- ListElement{ longitude: "77"; latitude: "76"; height: "135"; }
- ListElement{ longitude: "77"; latitude: "77"; height: "137"; }
- ListElement{ longitude: "77"; latitude: "78"; height: "142"; }
- ListElement{ longitude: "77"; latitude: "79"; height: "143"; }
- ListElement{ longitude: "77"; latitude: "80"; height: "141"; }
- ListElement{ longitude: "77"; latitude: "81"; height: "140"; }
- ListElement{ longitude: "77"; latitude: "82"; height: "138"; }
- ListElement{ longitude: "77"; latitude: "83"; height: "138"; }
- ListElement{ longitude: "77"; latitude: "84"; height: "137"; }
- ListElement{ longitude: "77"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "77"; latitude: "86"; height: "135"; }
- ListElement{ longitude: "77"; latitude: "87"; height: "133"; }
- ListElement{ longitude: "77"; latitude: "88"; height: "129"; }
- ListElement{ longitude: "77"; latitude: "89"; height: "128"; }
- ListElement{ longitude: "77"; latitude: "90"; height: "123"; }
- ListElement{ longitude: "77"; latitude: "91"; height: "120"; }
- ListElement{ longitude: "77"; latitude: "92"; height: "118"; }
- ListElement{ longitude: "77"; latitude: "93"; height: "116"; }
- ListElement{ longitude: "77"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "77"; latitude: "95"; height: "116"; }
- ListElement{ longitude: "77"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "77"; latitude: "97"; height: "120"; }
- ListElement{ longitude: "77"; latitude: "98"; height: "125"; }
- ListElement{ longitude: "77"; latitude: "99"; height: "117"; }
- ListElement{ longitude: "78"; latitude: "0"; height: "120"; }
- ListElement{ longitude: "78"; latitude: "1"; height: "118"; }
- ListElement{ longitude: "78"; latitude: "2"; height: "120"; }
- ListElement{ longitude: "78"; latitude: "3"; height: "125"; }
- ListElement{ longitude: "78"; latitude: "4"; height: "129"; }
- ListElement{ longitude: "78"; latitude: "5"; height: "129"; }
- ListElement{ longitude: "78"; latitude: "6"; height: "126"; }
- ListElement{ longitude: "78"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "78"; latitude: "8"; height: "115"; }
- ListElement{ longitude: "78"; latitude: "9"; height: "112"; }
- ListElement{ longitude: "78"; latitude: "10"; height: "110"; }
- ListElement{ longitude: "78"; latitude: "11"; height: "105"; }
- ListElement{ longitude: "78"; latitude: "12"; height: "100"; }
- ListElement{ longitude: "78"; latitude: "13"; height: "101"; }
- ListElement{ longitude: "78"; latitude: "14"; height: "102"; }
- ListElement{ longitude: "78"; latitude: "15"; height: "104"; }
- ListElement{ longitude: "78"; latitude: "16"; height: "105"; }
- ListElement{ longitude: "78"; latitude: "17"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "19"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "20"; height: "99"; }
- ListElement{ longitude: "78"; latitude: "21"; height: "92"; }
- ListElement{ longitude: "78"; latitude: "22"; height: "96"; }
- ListElement{ longitude: "78"; latitude: "23"; height: "110"; }
- ListElement{ longitude: "78"; latitude: "24"; height: "112"; }
- ListElement{ longitude: "78"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "78"; latitude: "26"; height: "114"; }
- ListElement{ longitude: "78"; latitude: "27"; height: "112"; }
- ListElement{ longitude: "78"; latitude: "28"; height: "110"; }
- ListElement{ longitude: "78"; latitude: "29"; height: "105"; }
- ListElement{ longitude: "78"; latitude: "30"; height: "100"; }
- ListElement{ longitude: "78"; latitude: "31"; height: "98"; }
- ListElement{ longitude: "78"; latitude: "32"; height: "99"; }
- ListElement{ longitude: "78"; latitude: "33"; height: "102"; }
- ListElement{ longitude: "78"; latitude: "34"; height: "105"; }
- ListElement{ longitude: "78"; latitude: "35"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "36"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "37"; height: "103"; }
- ListElement{ longitude: "78"; latitude: "38"; height: "104"; }
- ListElement{ longitude: "78"; latitude: "39"; height: "108"; }
- ListElement{ longitude: "78"; latitude: "40"; height: "114"; }
- ListElement{ longitude: "78"; latitude: "41"; height: "118"; }
- ListElement{ longitude: "78"; latitude: "42"; height: "119"; }
- ListElement{ longitude: "78"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "78"; latitude: "44"; height: "121"; }
- ListElement{ longitude: "78"; latitude: "45"; height: "116"; }
- ListElement{ longitude: "78"; latitude: "46"; height: "115"; }
- ListElement{ longitude: "78"; latitude: "47"; height: "116"; }
- ListElement{ longitude: "78"; latitude: "48"; height: "120"; }
- ListElement{ longitude: "78"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "78"; latitude: "50"; height: "127"; }
- ListElement{ longitude: "78"; latitude: "51"; height: "132"; }
- ListElement{ longitude: "78"; latitude: "52"; height: "134"; }
- ListElement{ longitude: "78"; latitude: "53"; height: "135"; }
- ListElement{ longitude: "78"; latitude: "54"; height: "137"; }
- ListElement{ longitude: "78"; latitude: "55"; height: "135"; }
- ListElement{ longitude: "78"; latitude: "56"; height: "133"; }
- ListElement{ longitude: "78"; latitude: "57"; height: "133"; }
- ListElement{ longitude: "78"; latitude: "58"; height: "130"; }
- ListElement{ longitude: "78"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "78"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "78"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "78"; latitude: "62"; height: "119"; }
- ListElement{ longitude: "78"; latitude: "63"; height: "117"; }
- ListElement{ longitude: "78"; latitude: "64"; height: "114"; }
- ListElement{ longitude: "78"; latitude: "65"; height: "110"; }
- ListElement{ longitude: "78"; latitude: "66"; height: "109"; }
- ListElement{ longitude: "78"; latitude: "67"; height: "103"; }
- ListElement{ longitude: "78"; latitude: "68"; height: "104"; }
- ListElement{ longitude: "78"; latitude: "69"; height: "106"; }
- ListElement{ longitude: "78"; latitude: "70"; height: "111"; }
- ListElement{ longitude: "78"; latitude: "71"; height: "120"; }
- ListElement{ longitude: "78"; latitude: "72"; height: "124"; }
- ListElement{ longitude: "78"; latitude: "73"; height: "131"; }
- ListElement{ longitude: "78"; latitude: "74"; height: "135"; }
- ListElement{ longitude: "78"; latitude: "75"; height: "139"; }
- ListElement{ longitude: "78"; latitude: "76"; height: "141"; }
- ListElement{ longitude: "78"; latitude: "77"; height: "140"; }
- ListElement{ longitude: "78"; latitude: "78"; height: "139"; }
- ListElement{ longitude: "78"; latitude: "79"; height: "138"; }
- ListElement{ longitude: "78"; latitude: "80"; height: "137"; }
- ListElement{ longitude: "78"; latitude: "81"; height: "133"; }
- ListElement{ longitude: "78"; latitude: "82"; height: "133"; }
- ListElement{ longitude: "78"; latitude: "83"; height: "135"; }
- ListElement{ longitude: "78"; latitude: "84"; height: "136"; }
- ListElement{ longitude: "78"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "78"; latitude: "86"; height: "136"; }
- ListElement{ longitude: "78"; latitude: "87"; height: "136"; }
- ListElement{ longitude: "78"; latitude: "88"; height: "132"; }
- ListElement{ longitude: "78"; latitude: "89"; height: "129"; }
- ListElement{ longitude: "78"; latitude: "90"; height: "126"; }
- ListElement{ longitude: "78"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "78"; latitude: "92"; height: "121"; }
- ListElement{ longitude: "78"; latitude: "93"; height: "119"; }
- ListElement{ longitude: "78"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "78"; latitude: "95"; height: "120"; }
- ListElement{ longitude: "78"; latitude: "96"; height: "124"; }
- ListElement{ longitude: "78"; latitude: "97"; height: "125"; }
- ListElement{ longitude: "78"; latitude: "98"; height: "130"; }
- ListElement{ longitude: "78"; latitude: "99"; height: "121"; }
- ListElement{ longitude: "79"; latitude: "0"; height: "115"; }
- ListElement{ longitude: "79"; latitude: "1"; height: "114"; }
- ListElement{ longitude: "79"; latitude: "2"; height: "116"; }
- ListElement{ longitude: "79"; latitude: "3"; height: "119"; }
- ListElement{ longitude: "79"; latitude: "4"; height: "125"; }
- ListElement{ longitude: "79"; latitude: "5"; height: "126"; }
- ListElement{ longitude: "79"; latitude: "6"; height: "123"; }
- ListElement{ longitude: "79"; latitude: "7"; height: "121"; }
- ListElement{ longitude: "79"; latitude: "8"; height: "119"; }
- ListElement{ longitude: "79"; latitude: "9"; height: "115"; }
- ListElement{ longitude: "79"; latitude: "10"; height: "113"; }
- ListElement{ longitude: "79"; latitude: "11"; height: "108"; }
- ListElement{ longitude: "79"; latitude: "12"; height: "105"; }
- ListElement{ longitude: "79"; latitude: "13"; height: "104"; }
- ListElement{ longitude: "79"; latitude: "14"; height: "106"; }
- ListElement{ longitude: "79"; latitude: "15"; height: "109"; }
- ListElement{ longitude: "79"; latitude: "16"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "17"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "18"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "19"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "20"; height: "100"; }
- ListElement{ longitude: "79"; latitude: "21"; height: "94"; }
- ListElement{ longitude: "79"; latitude: "22"; height: "96"; }
- ListElement{ longitude: "79"; latitude: "23"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "24"; height: "111"; }
- ListElement{ longitude: "79"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "79"; latitude: "26"; height: "114"; }
- ListElement{ longitude: "79"; latitude: "27"; height: "113"; }
- ListElement{ longitude: "79"; latitude: "28"; height: "109"; }
- ListElement{ longitude: "79"; latitude: "29"; height: "104"; }
- ListElement{ longitude: "79"; latitude: "30"; height: "102"; }
- ListElement{ longitude: "79"; latitude: "31"; height: "98"; }
- ListElement{ longitude: "79"; latitude: "32"; height: "98"; }
- ListElement{ longitude: "79"; latitude: "33"; height: "99"; }
- ListElement{ longitude: "79"; latitude: "34"; height: "102"; }
- ListElement{ longitude: "79"; latitude: "35"; height: "103"; }
- ListElement{ longitude: "79"; latitude: "36"; height: "102"; }
- ListElement{ longitude: "79"; latitude: "37"; height: "102"; }
- ListElement{ longitude: "79"; latitude: "38"; height: "103"; }
- ListElement{ longitude: "79"; latitude: "39"; height: "104"; }
- ListElement{ longitude: "79"; latitude: "40"; height: "110"; }
- ListElement{ longitude: "79"; latitude: "41"; height: "115"; }
- ListElement{ longitude: "79"; latitude: "42"; height: "118"; }
- ListElement{ longitude: "79"; latitude: "43"; height: "118"; }
- ListElement{ longitude: "79"; latitude: "44"; height: "120"; }
- ListElement{ longitude: "79"; latitude: "45"; height: "117"; }
- ListElement{ longitude: "79"; latitude: "46"; height: "118"; }
- ListElement{ longitude: "79"; latitude: "47"; height: "117"; }
- ListElement{ longitude: "79"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "79"; latitude: "49"; height: "124"; }
- ListElement{ longitude: "79"; latitude: "50"; height: "127"; }
- ListElement{ longitude: "79"; latitude: "51"; height: "128"; }
- ListElement{ longitude: "79"; latitude: "52"; height: "131"; }
- ListElement{ longitude: "79"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "79"; latitude: "54"; height: "133"; }
- ListElement{ longitude: "79"; latitude: "55"; height: "134"; }
- ListElement{ longitude: "79"; latitude: "56"; height: "134"; }
- ListElement{ longitude: "79"; latitude: "57"; height: "133"; }
- ListElement{ longitude: "79"; latitude: "58"; height: "129"; }
- ListElement{ longitude: "79"; latitude: "59"; height: "127"; }
- ListElement{ longitude: "79"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "79"; latitude: "61"; height: "121"; }
- ListElement{ longitude: "79"; latitude: "62"; height: "120"; }
- ListElement{ longitude: "79"; latitude: "63"; height: "120"; }
- ListElement{ longitude: "79"; latitude: "64"; height: "118"; }
- ListElement{ longitude: "79"; latitude: "65"; height: "114"; }
- ListElement{ longitude: "79"; latitude: "66"; height: "111"; }
- ListElement{ longitude: "79"; latitude: "67"; height: "106"; }
- ListElement{ longitude: "79"; latitude: "68"; height: "107"; }
- ListElement{ longitude: "79"; latitude: "69"; height: "106"; }
- ListElement{ longitude: "79"; latitude: "70"; height: "112"; }
- ListElement{ longitude: "79"; latitude: "71"; height: "119"; }
- ListElement{ longitude: "79"; latitude: "72"; height: "124"; }
- ListElement{ longitude: "79"; latitude: "73"; height: "132"; }
- ListElement{ longitude: "79"; latitude: "74"; height: "137"; }
- ListElement{ longitude: "79"; latitude: "75"; height: "138"; }
- ListElement{ longitude: "79"; latitude: "76"; height: "141"; }
- ListElement{ longitude: "79"; latitude: "77"; height: "140"; }
- ListElement{ longitude: "79"; latitude: "78"; height: "137"; }
- ListElement{ longitude: "79"; latitude: "79"; height: "132"; }
- ListElement{ longitude: "79"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "79"; latitude: "81"; height: "125"; }
- ListElement{ longitude: "79"; latitude: "82"; height: "125"; }
- ListElement{ longitude: "79"; latitude: "83"; height: "132"; }
- ListElement{ longitude: "79"; latitude: "84"; height: "136"; }
- ListElement{ longitude: "79"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "79"; latitude: "86"; height: "136"; }
- ListElement{ longitude: "79"; latitude: "87"; height: "134"; }
- ListElement{ longitude: "79"; latitude: "88"; height: "132"; }
- ListElement{ longitude: "79"; latitude: "89"; height: "129"; }
- ListElement{ longitude: "79"; latitude: "90"; height: "127"; }
- ListElement{ longitude: "79"; latitude: "91"; height: "125"; }
- ListElement{ longitude: "79"; latitude: "92"; height: "122"; }
- ListElement{ longitude: "79"; latitude: "93"; height: "119"; }
- ListElement{ longitude: "79"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "79"; latitude: "95"; height: "123"; }
- ListElement{ longitude: "79"; latitude: "96"; height: "123"; }
- ListElement{ longitude: "79"; latitude: "97"; height: "122"; }
- ListElement{ longitude: "79"; latitude: "98"; height: "124"; }
- ListElement{ longitude: "79"; latitude: "99"; height: "118"; }
- ListElement{ longitude: "80"; latitude: "0"; height: "111"; }
- ListElement{ longitude: "80"; latitude: "1"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "2"; height: "111"; }
- ListElement{ longitude: "80"; latitude: "3"; height: "114"; }
- ListElement{ longitude: "80"; latitude: "4"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "5"; height: "123"; }
- ListElement{ longitude: "80"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "80"; latitude: "7"; height: "120"; }
- ListElement{ longitude: "80"; latitude: "8"; height: "122"; }
- ListElement{ longitude: "80"; latitude: "9"; height: "118"; }
- ListElement{ longitude: "80"; latitude: "10"; height: "117"; }
- ListElement{ longitude: "80"; latitude: "11"; height: "113"; }
- ListElement{ longitude: "80"; latitude: "12"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "13"; height: "106"; }
- ListElement{ longitude: "80"; latitude: "14"; height: "106"; }
- ListElement{ longitude: "80"; latitude: "15"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "16"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "17"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "18"; height: "107"; }
- ListElement{ longitude: "80"; latitude: "19"; height: "105"; }
- ListElement{ longitude: "80"; latitude: "20"; height: "103"; }
- ListElement{ longitude: "80"; latitude: "21"; height: "100"; }
- ListElement{ longitude: "80"; latitude: "22"; height: "101"; }
- ListElement{ longitude: "80"; latitude: "23"; height: "106"; }
- ListElement{ longitude: "80"; latitude: "24"; height: "110"; }
- ListElement{ longitude: "80"; latitude: "25"; height: "113"; }
- ListElement{ longitude: "80"; latitude: "26"; height: "116"; }
- ListElement{ longitude: "80"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "80"; latitude: "28"; height: "109"; }
- ListElement{ longitude: "80"; latitude: "29"; height: "102"; }
- ListElement{ longitude: "80"; latitude: "30"; height: "100"; }
- ListElement{ longitude: "80"; latitude: "31"; height: "98"; }
- ListElement{ longitude: "80"; latitude: "32"; height: "95"; }
- ListElement{ longitude: "80"; latitude: "33"; height: "97"; }
- ListElement{ longitude: "80"; latitude: "34"; height: "100"; }
- ListElement{ longitude: "80"; latitude: "35"; height: "101"; }
- ListElement{ longitude: "80"; latitude: "36"; height: "103"; }
- ListElement{ longitude: "80"; latitude: "37"; height: "101"; }
- ListElement{ longitude: "80"; latitude: "38"; height: "103"; }
- ListElement{ longitude: "80"; latitude: "39"; height: "106"; }
- ListElement{ longitude: "80"; latitude: "40"; height: "109"; }
- ListElement{ longitude: "80"; latitude: "41"; height: "112"; }
- ListElement{ longitude: "80"; latitude: "42"; height: "115"; }
- ListElement{ longitude: "80"; latitude: "43"; height: "117"; }
- ListElement{ longitude: "80"; latitude: "44"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "45"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "46"; height: "117"; }
- ListElement{ longitude: "80"; latitude: "47"; height: "116"; }
- ListElement{ longitude: "80"; latitude: "48"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "49"; height: "122"; }
- ListElement{ longitude: "80"; latitude: "50"; height: "126"; }
- ListElement{ longitude: "80"; latitude: "51"; height: "126"; }
- ListElement{ longitude: "80"; latitude: "52"; height: "127"; }
- ListElement{ longitude: "80"; latitude: "53"; height: "128"; }
- ListElement{ longitude: "80"; latitude: "54"; height: "131"; }
- ListElement{ longitude: "80"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "80"; latitude: "56"; height: "134"; }
- ListElement{ longitude: "80"; latitude: "57"; height: "133"; }
- ListElement{ longitude: "80"; latitude: "58"; height: "130"; }
- ListElement{ longitude: "80"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "80"; latitude: "60"; height: "125"; }
- ListElement{ longitude: "80"; latitude: "61"; height: "123"; }
- ListElement{ longitude: "80"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "80"; latitude: "63"; height: "122"; }
- ListElement{ longitude: "80"; latitude: "64"; height: "121"; }
- ListElement{ longitude: "80"; latitude: "65"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "80"; latitude: "67"; height: "111"; }
- ListElement{ longitude: "80"; latitude: "68"; height: "108"; }
- ListElement{ longitude: "80"; latitude: "69"; height: "110"; }
- ListElement{ longitude: "80"; latitude: "70"; height: "112"; }
- ListElement{ longitude: "80"; latitude: "71"; height: "117"; }
- ListElement{ longitude: "80"; latitude: "72"; height: "125"; }
- ListElement{ longitude: "80"; latitude: "73"; height: "132"; }
- ListElement{ longitude: "80"; latitude: "74"; height: "139"; }
- ListElement{ longitude: "80"; latitude: "75"; height: "144"; }
- ListElement{ longitude: "80"; latitude: "76"; height: "144"; }
- ListElement{ longitude: "80"; latitude: "77"; height: "141"; }
- ListElement{ longitude: "80"; latitude: "78"; height: "136"; }
- ListElement{ longitude: "80"; latitude: "79"; height: "127"; }
- ListElement{ longitude: "80"; latitude: "80"; height: "128"; }
- ListElement{ longitude: "80"; latitude: "81"; height: "125"; }
- ListElement{ longitude: "80"; latitude: "82"; height: "129"; }
- ListElement{ longitude: "80"; latitude: "83"; height: "131"; }
- ListElement{ longitude: "80"; latitude: "84"; height: "135"; }
- ListElement{ longitude: "80"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "80"; latitude: "86"; height: "135"; }
- ListElement{ longitude: "80"; latitude: "87"; height: "131"; }
- ListElement{ longitude: "80"; latitude: "88"; height: "129"; }
- ListElement{ longitude: "80"; latitude: "89"; height: "129"; }
- ListElement{ longitude: "80"; latitude: "90"; height: "127"; }
- ListElement{ longitude: "80"; latitude: "91"; height: "125"; }
- ListElement{ longitude: "80"; latitude: "92"; height: "121"; }
- ListElement{ longitude: "80"; latitude: "93"; height: "120"; }
- ListElement{ longitude: "80"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "80"; latitude: "95"; height: "119"; }
- ListElement{ longitude: "80"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "80"; latitude: "97"; height: "117"; }
- ListElement{ longitude: "80"; latitude: "98"; height: "116"; }
- ListElement{ longitude: "80"; latitude: "99"; height: "112"; }
- ListElement{ longitude: "81"; latitude: "0"; height: "107"; }
- ListElement{ longitude: "81"; latitude: "1"; height: "105"; }
- ListElement{ longitude: "81"; latitude: "2"; height: "106"; }
- ListElement{ longitude: "81"; latitude: "3"; height: "109"; }
- ListElement{ longitude: "81"; latitude: "4"; height: "114"; }
- ListElement{ longitude: "81"; latitude: "5"; height: "117"; }
- ListElement{ longitude: "81"; latitude: "6"; height: "121"; }
- ListElement{ longitude: "81"; latitude: "7"; height: "123"; }
- ListElement{ longitude: "81"; latitude: "8"; height: "126"; }
- ListElement{ longitude: "81"; latitude: "9"; height: "129"; }
- ListElement{ longitude: "81"; latitude: "10"; height: "120"; }
- ListElement{ longitude: "81"; latitude: "11"; height: "120"; }
- ListElement{ longitude: "81"; latitude: "12"; height: "113"; }
- ListElement{ longitude: "81"; latitude: "13"; height: "108"; }
- ListElement{ longitude: "81"; latitude: "14"; height: "107"; }
- ListElement{ longitude: "81"; latitude: "15"; height: "108"; }
- ListElement{ longitude: "81"; latitude: "16"; height: "108"; }
- ListElement{ longitude: "81"; latitude: "17"; height: "109"; }
- ListElement{ longitude: "81"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "81"; latitude: "19"; height: "104"; }
- ListElement{ longitude: "81"; latitude: "20"; height: "101"; }
- ListElement{ longitude: "81"; latitude: "21"; height: "102"; }
- ListElement{ longitude: "81"; latitude: "22"; height: "103"; }
- ListElement{ longitude: "81"; latitude: "23"; height: "106"; }
- ListElement{ longitude: "81"; latitude: "24"; height: "110"; }
- ListElement{ longitude: "81"; latitude: "25"; height: "114"; }
- ListElement{ longitude: "81"; latitude: "26"; height: "117"; }
- ListElement{ longitude: "81"; latitude: "27"; height: "112"; }
- ListElement{ longitude: "81"; latitude: "28"; height: "110"; }
- ListElement{ longitude: "81"; latitude: "29"; height: "103"; }
- ListElement{ longitude: "81"; latitude: "30"; height: "103"; }
- ListElement{ longitude: "81"; latitude: "31"; height: "99"; }
- ListElement{ longitude: "81"; latitude: "32"; height: "97"; }
- ListElement{ longitude: "81"; latitude: "33"; height: "93"; }
- ListElement{ longitude: "81"; latitude: "34"; height: "95"; }
- ListElement{ longitude: "81"; latitude: "35"; height: "94"; }
- ListElement{ longitude: "81"; latitude: "36"; height: "95"; }
- ListElement{ longitude: "81"; latitude: "37"; height: "99"; }
- ListElement{ longitude: "81"; latitude: "38"; height: "103"; }
- ListElement{ longitude: "81"; latitude: "39"; height: "108"; }
- ListElement{ longitude: "81"; latitude: "40"; height: "112"; }
- ListElement{ longitude: "81"; latitude: "41"; height: "112"; }
- ListElement{ longitude: "81"; latitude: "42"; height: "116"; }
- ListElement{ longitude: "81"; latitude: "43"; height: "118"; }
- ListElement{ longitude: "81"; latitude: "44"; height: "119"; }
- ListElement{ longitude: "81"; latitude: "45"; height: "118"; }
- ListElement{ longitude: "81"; latitude: "46"; height: "120"; }
- ListElement{ longitude: "81"; latitude: "47"; height: "119"; }
- ListElement{ longitude: "81"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "81"; latitude: "49"; height: "122"; }
- ListElement{ longitude: "81"; latitude: "50"; height: "124"; }
- ListElement{ longitude: "81"; latitude: "51"; height: "125"; }
- ListElement{ longitude: "81"; latitude: "52"; height: "125"; }
- ListElement{ longitude: "81"; latitude: "53"; height: "125"; }
- ListElement{ longitude: "81"; latitude: "54"; height: "128"; }
- ListElement{ longitude: "81"; latitude: "55"; height: "132"; }
- ListElement{ longitude: "81"; latitude: "56"; height: "134"; }
- ListElement{ longitude: "81"; latitude: "57"; height: "134"; }
- ListElement{ longitude: "81"; latitude: "58"; height: "133"; }
- ListElement{ longitude: "81"; latitude: "59"; height: "131"; }
- ListElement{ longitude: "81"; latitude: "60"; height: "126"; }
- ListElement{ longitude: "81"; latitude: "61"; height: "126"; }
- ListElement{ longitude: "81"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "81"; latitude: "63"; height: "124"; }
- ListElement{ longitude: "81"; latitude: "64"; height: "125"; }
- ListElement{ longitude: "81"; latitude: "65"; height: "124"; }
- ListElement{ longitude: "81"; latitude: "66"; height: "116"; }
- ListElement{ longitude: "81"; latitude: "67"; height: "120"; }
- ListElement{ longitude: "81"; latitude: "68"; height: "113"; }
- ListElement{ longitude: "81"; latitude: "69"; height: "110"; }
- ListElement{ longitude: "81"; latitude: "70"; height: "113"; }
- ListElement{ longitude: "81"; latitude: "71"; height: "117"; }
- ListElement{ longitude: "81"; latitude: "72"; height: "123"; }
- ListElement{ longitude: "81"; latitude: "73"; height: "130"; }
- ListElement{ longitude: "81"; latitude: "74"; height: "141"; }
- ListElement{ longitude: "81"; latitude: "75"; height: "140"; }
- ListElement{ longitude: "81"; latitude: "76"; height: "141"; }
- ListElement{ longitude: "81"; latitude: "77"; height: "138"; }
- ListElement{ longitude: "81"; latitude: "78"; height: "115"; }
- ListElement{ longitude: "81"; latitude: "79"; height: "118"; }
- ListElement{ longitude: "81"; latitude: "80"; height: "127"; }
- ListElement{ longitude: "81"; latitude: "81"; height: "127"; }
- ListElement{ longitude: "81"; latitude: "82"; height: "131"; }
- ListElement{ longitude: "81"; latitude: "83"; height: "133"; }
- ListElement{ longitude: "81"; latitude: "84"; height: "136"; }
- ListElement{ longitude: "81"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "81"; latitude: "86"; height: "134"; }
- ListElement{ longitude: "81"; latitude: "87"; height: "129"; }
- ListElement{ longitude: "81"; latitude: "88"; height: "127"; }
- ListElement{ longitude: "81"; latitude: "89"; height: "127"; }
- ListElement{ longitude: "81"; latitude: "90"; height: "124"; }
- ListElement{ longitude: "81"; latitude: "91"; height: "125"; }
- ListElement{ longitude: "81"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "81"; latitude: "93"; height: "122"; }
- ListElement{ longitude: "81"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "81"; latitude: "95"; height: "115"; }
- ListElement{ longitude: "81"; latitude: "96"; height: "112"; }
- ListElement{ longitude: "81"; latitude: "97"; height: "108"; }
- ListElement{ longitude: "81"; latitude: "98"; height: "110"; }
- ListElement{ longitude: "81"; latitude: "99"; height: "108"; }
- ListElement{ longitude: "82"; latitude: "0"; height: "107"; }
- ListElement{ longitude: "82"; latitude: "1"; height: "105"; }
- ListElement{ longitude: "82"; latitude: "2"; height: "108"; }
- ListElement{ longitude: "82"; latitude: "3"; height: "109"; }
- ListElement{ longitude: "82"; latitude: "4"; height: "112"; }
- ListElement{ longitude: "82"; latitude: "5"; height: "115"; }
- ListElement{ longitude: "82"; latitude: "6"; height: "119"; }
- ListElement{ longitude: "82"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "82"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "82"; latitude: "9"; height: "127"; }
- ListElement{ longitude: "82"; latitude: "10"; height: "88"; }
- ListElement{ longitude: "82"; latitude: "11"; height: "118"; }
- ListElement{ longitude: "82"; latitude: "12"; height: "115"; }
- ListElement{ longitude: "82"; latitude: "13"; height: "111"; }
- ListElement{ longitude: "82"; latitude: "14"; height: "108"; }
- ListElement{ longitude: "82"; latitude: "15"; height: "107"; }
- ListElement{ longitude: "82"; latitude: "16"; height: "106"; }
- ListElement{ longitude: "82"; latitude: "17"; height: "105"; }
- ListElement{ longitude: "82"; latitude: "18"; height: "104"; }
- ListElement{ longitude: "82"; latitude: "19"; height: "102"; }
- ListElement{ longitude: "82"; latitude: "20"; height: "99"; }
- ListElement{ longitude: "82"; latitude: "21"; height: "99"; }
- ListElement{ longitude: "82"; latitude: "22"; height: "99"; }
- ListElement{ longitude: "82"; latitude: "23"; height: "104"; }
- ListElement{ longitude: "82"; latitude: "24"; height: "107"; }
- ListElement{ longitude: "82"; latitude: "25"; height: "114"; }
- ListElement{ longitude: "82"; latitude: "26"; height: "118"; }
- ListElement{ longitude: "82"; latitude: "27"; height: "115"; }
- ListElement{ longitude: "82"; latitude: "28"; height: "112"; }
- ListElement{ longitude: "82"; latitude: "29"; height: "107"; }
- ListElement{ longitude: "82"; latitude: "30"; height: "105"; }
- ListElement{ longitude: "82"; latitude: "31"; height: "102"; }
- ListElement{ longitude: "82"; latitude: "32"; height: "97"; }
- ListElement{ longitude: "82"; latitude: "33"; height: "95"; }
- ListElement{ longitude: "82"; latitude: "34"; height: "92"; }
- ListElement{ longitude: "82"; latitude: "35"; height: "94"; }
- ListElement{ longitude: "82"; latitude: "36"; height: "96"; }
- ListElement{ longitude: "82"; latitude: "37"; height: "99"; }
- ListElement{ longitude: "82"; latitude: "38"; height: "103"; }
- ListElement{ longitude: "82"; latitude: "39"; height: "108"; }
- ListElement{ longitude: "82"; latitude: "40"; height: "113"; }
- ListElement{ longitude: "82"; latitude: "41"; height: "116"; }
- ListElement{ longitude: "82"; latitude: "42"; height: "117"; }
- ListElement{ longitude: "82"; latitude: "43"; height: "116"; }
- ListElement{ longitude: "82"; latitude: "44"; height: "117"; }
- ListElement{ longitude: "82"; latitude: "45"; height: "120"; }
- ListElement{ longitude: "82"; latitude: "46"; height: "119"; }
- ListElement{ longitude: "82"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "82"; latitude: "48"; height: "122"; }
- ListElement{ longitude: "82"; latitude: "49"; height: "125"; }
- ListElement{ longitude: "82"; latitude: "50"; height: "126"; }
- ListElement{ longitude: "82"; latitude: "51"; height: "125"; }
- ListElement{ longitude: "82"; latitude: "52"; height: "126"; }
- ListElement{ longitude: "82"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "82"; latitude: "54"; height: "130"; }
- ListElement{ longitude: "82"; latitude: "55"; height: "130"; }
- ListElement{ longitude: "82"; latitude: "56"; height: "132"; }
- ListElement{ longitude: "82"; latitude: "57"; height: "134"; }
- ListElement{ longitude: "82"; latitude: "58"; height: "132"; }
- ListElement{ longitude: "82"; latitude: "59"; height: "132"; }
- ListElement{ longitude: "82"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "82"; latitude: "61"; height: "128"; }
- ListElement{ longitude: "82"; latitude: "62"; height: "125"; }
- ListElement{ longitude: "82"; latitude: "63"; height: "127"; }
- ListElement{ longitude: "82"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "82"; latitude: "65"; height: "119"; }
- ListElement{ longitude: "82"; latitude: "66"; height: "112"; }
- ListElement{ longitude: "82"; latitude: "67"; height: "117"; }
- ListElement{ longitude: "82"; latitude: "68"; height: "119"; }
- ListElement{ longitude: "82"; latitude: "69"; height: "117"; }
- ListElement{ longitude: "82"; latitude: "70"; height: "113"; }
- ListElement{ longitude: "82"; latitude: "71"; height: "115"; }
- ListElement{ longitude: "82"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "82"; latitude: "73"; height: "131"; }
- ListElement{ longitude: "82"; latitude: "74"; height: "132"; }
- ListElement{ longitude: "82"; latitude: "75"; height: "108"; }
- ListElement{ longitude: "82"; latitude: "76"; height: "114"; }
- ListElement{ longitude: "82"; latitude: "77"; height: "126"; }
- ListElement{ longitude: "82"; latitude: "78"; height: "100"; }
- ListElement{ longitude: "82"; latitude: "79"; height: "109"; }
- ListElement{ longitude: "82"; latitude: "80"; height: "133"; }
- ListElement{ longitude: "82"; latitude: "81"; height: "132"; }
- ListElement{ longitude: "82"; latitude: "82"; height: "135"; }
- ListElement{ longitude: "82"; latitude: "83"; height: "139"; }
- ListElement{ longitude: "82"; latitude: "84"; height: "139"; }
- ListElement{ longitude: "82"; latitude: "85"; height: "135"; }
- ListElement{ longitude: "82"; latitude: "86"; height: "131"; }
- ListElement{ longitude: "82"; latitude: "87"; height: "128"; }
- ListElement{ longitude: "82"; latitude: "88"; height: "123"; }
- ListElement{ longitude: "82"; latitude: "89"; height: "121"; }
- ListElement{ longitude: "82"; latitude: "90"; height: "122"; }
- ListElement{ longitude: "82"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "82"; latitude: "92"; height: "122"; }
- ListElement{ longitude: "82"; latitude: "93"; height: "123"; }
- ListElement{ longitude: "82"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "82"; latitude: "95"; height: "114"; }
- ListElement{ longitude: "82"; latitude: "96"; height: "106"; }
- ListElement{ longitude: "82"; latitude: "97"; height: "102"; }
- ListElement{ longitude: "82"; latitude: "98"; height: "105"; }
- ListElement{ longitude: "82"; latitude: "99"; height: "106"; }
- ListElement{ longitude: "83"; latitude: "0"; height: "110"; }
- ListElement{ longitude: "83"; latitude: "1"; height: "108"; }
- ListElement{ longitude: "83"; latitude: "2"; height: "110"; }
- ListElement{ longitude: "83"; latitude: "3"; height: "111"; }
- ListElement{ longitude: "83"; latitude: "4"; height: "111"; }
- ListElement{ longitude: "83"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "83"; latitude: "6"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "7"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "8"; height: "131"; }
- ListElement{ longitude: "83"; latitude: "9"; height: "131"; }
- ListElement{ longitude: "83"; latitude: "10"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "12"; height: "114"; }
- ListElement{ longitude: "83"; latitude: "13"; height: "109"; }
- ListElement{ longitude: "83"; latitude: "14"; height: "105"; }
- ListElement{ longitude: "83"; latitude: "15"; height: "102"; }
- ListElement{ longitude: "83"; latitude: "16"; height: "101"; }
- ListElement{ longitude: "83"; latitude: "17"; height: "102"; }
- ListElement{ longitude: "83"; latitude: "18"; height: "100"; }
- ListElement{ longitude: "83"; latitude: "19"; height: "97"; }
- ListElement{ longitude: "83"; latitude: "20"; height: "98"; }
- ListElement{ longitude: "83"; latitude: "21"; height: "97"; }
- ListElement{ longitude: "83"; latitude: "22"; height: "99"; }
- ListElement{ longitude: "83"; latitude: "23"; height: "105"; }
- ListElement{ longitude: "83"; latitude: "24"; height: "112"; }
- ListElement{ longitude: "83"; latitude: "25"; height: "116"; }
- ListElement{ longitude: "83"; latitude: "26"; height: "118"; }
- ListElement{ longitude: "83"; latitude: "27"; height: "117"; }
- ListElement{ longitude: "83"; latitude: "28"; height: "114"; }
- ListElement{ longitude: "83"; latitude: "29"; height: "109"; }
- ListElement{ longitude: "83"; latitude: "30"; height: "107"; }
- ListElement{ longitude: "83"; latitude: "31"; height: "102"; }
- ListElement{ longitude: "83"; latitude: "32"; height: "98"; }
- ListElement{ longitude: "83"; latitude: "33"; height: "96"; }
- ListElement{ longitude: "83"; latitude: "34"; height: "93"; }
- ListElement{ longitude: "83"; latitude: "35"; height: "93"; }
- ListElement{ longitude: "83"; latitude: "36"; height: "95"; }
- ListElement{ longitude: "83"; latitude: "37"; height: "100"; }
- ListElement{ longitude: "83"; latitude: "38"; height: "105"; }
- ListElement{ longitude: "83"; latitude: "39"; height: "111"; }
- ListElement{ longitude: "83"; latitude: "40"; height: "115"; }
- ListElement{ longitude: "83"; latitude: "41"; height: "118"; }
- ListElement{ longitude: "83"; latitude: "42"; height: "117"; }
- ListElement{ longitude: "83"; latitude: "43"; height: "117"; }
- ListElement{ longitude: "83"; latitude: "44"; height: "118"; }
- ListElement{ longitude: "83"; latitude: "45"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "46"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "83"; latitude: "48"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "49"; height: "127"; }
- ListElement{ longitude: "83"; latitude: "50"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "51"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "52"; height: "127"; }
- ListElement{ longitude: "83"; latitude: "53"; height: "128"; }
- ListElement{ longitude: "83"; latitude: "54"; height: "131"; }
- ListElement{ longitude: "83"; latitude: "55"; height: "131"; }
- ListElement{ longitude: "83"; latitude: "56"; height: "134"; }
- ListElement{ longitude: "83"; latitude: "57"; height: "133"; }
- ListElement{ longitude: "83"; latitude: "58"; height: "136"; }
- ListElement{ longitude: "83"; latitude: "59"; height: "133"; }
- ListElement{ longitude: "83"; latitude: "60"; height: "129"; }
- ListElement{ longitude: "83"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "83"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "83"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "83"; latitude: "64"; height: "116"; }
- ListElement{ longitude: "83"; latitude: "65"; height: "118"; }
- ListElement{ longitude: "83"; latitude: "66"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "67"; height: "124"; }
- ListElement{ longitude: "83"; latitude: "68"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "69"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "70"; height: "117"; }
- ListElement{ longitude: "83"; latitude: "71"; height: "118"; }
- ListElement{ longitude: "83"; latitude: "72"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "73"; height: "129"; }
- ListElement{ longitude: "83"; latitude: "74"; height: "130"; }
- ListElement{ longitude: "83"; latitude: "75"; height: "94"; }
- ListElement{ longitude: "83"; latitude: "76"; height: "111"; }
- ListElement{ longitude: "83"; latitude: "77"; height: "131"; }
- ListElement{ longitude: "83"; latitude: "78"; height: "120"; }
- ListElement{ longitude: "83"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "83"; latitude: "80"; height: "135"; }
- ListElement{ longitude: "83"; latitude: "81"; height: "140"; }
- ListElement{ longitude: "83"; latitude: "82"; height: "142"; }
- ListElement{ longitude: "83"; latitude: "83"; height: "143"; }
- ListElement{ longitude: "83"; latitude: "84"; height: "140"; }
- ListElement{ longitude: "83"; latitude: "85"; height: "137"; }
- ListElement{ longitude: "83"; latitude: "86"; height: "133"; }
- ListElement{ longitude: "83"; latitude: "87"; height: "127"; }
- ListElement{ longitude: "83"; latitude: "88"; height: "125"; }
- ListElement{ longitude: "83"; latitude: "89"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "90"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "83"; latitude: "92"; height: "123"; }
- ListElement{ longitude: "83"; latitude: "93"; height: "124"; }
- ListElement{ longitude: "83"; latitude: "94"; height: "122"; }
- ListElement{ longitude: "83"; latitude: "95"; height: "117"; }
- ListElement{ longitude: "83"; latitude: "96"; height: "104"; }
- ListElement{ longitude: "83"; latitude: "97"; height: "97"; }
- ListElement{ longitude: "83"; latitude: "98"; height: "103"; }
- ListElement{ longitude: "83"; latitude: "99"; height: "104"; }
- ListElement{ longitude: "84"; latitude: "0"; height: "111"; }
- ListElement{ longitude: "84"; latitude: "1"; height: "108"; }
- ListElement{ longitude: "84"; latitude: "2"; height: "110"; }
- ListElement{ longitude: "84"; latitude: "3"; height: "111"; }
- ListElement{ longitude: "84"; latitude: "4"; height: "111"; }
- ListElement{ longitude: "84"; latitude: "5"; height: "116"; }
- ListElement{ longitude: "84"; latitude: "6"; height: "118"; }
- ListElement{ longitude: "84"; latitude: "7"; height: "124"; }
- ListElement{ longitude: "84"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "84"; latitude: "9"; height: "99"; }
- ListElement{ longitude: "84"; latitude: "10"; height: "115"; }
- ListElement{ longitude: "84"; latitude: "11"; height: "126"; }
- ListElement{ longitude: "84"; latitude: "12"; height: "116"; }
- ListElement{ longitude: "84"; latitude: "13"; height: "109"; }
- ListElement{ longitude: "84"; latitude: "14"; height: "104"; }
- ListElement{ longitude: "84"; latitude: "15"; height: "100"; }
- ListElement{ longitude: "84"; latitude: "16"; height: "97"; }
- ListElement{ longitude: "84"; latitude: "17"; height: "98"; }
- ListElement{ longitude: "84"; latitude: "18"; height: "99"; }
- ListElement{ longitude: "84"; latitude: "19"; height: "97"; }
- ListElement{ longitude: "84"; latitude: "20"; height: "98"; }
- ListElement{ longitude: "84"; latitude: "21"; height: "100"; }
- ListElement{ longitude: "84"; latitude: "22"; height: "103"; }
- ListElement{ longitude: "84"; latitude: "23"; height: "109"; }
- ListElement{ longitude: "84"; latitude: "24"; height: "114"; }
- ListElement{ longitude: "84"; latitude: "25"; height: "119"; }
- ListElement{ longitude: "84"; latitude: "26"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "27"; height: "119"; }
- ListElement{ longitude: "84"; latitude: "28"; height: "116"; }
- ListElement{ longitude: "84"; latitude: "29"; height: "111"; }
- ListElement{ longitude: "84"; latitude: "30"; height: "109"; }
- ListElement{ longitude: "84"; latitude: "31"; height: "104"; }
- ListElement{ longitude: "84"; latitude: "32"; height: "100"; }
- ListElement{ longitude: "84"; latitude: "33"; height: "100"; }
- ListElement{ longitude: "84"; latitude: "34"; height: "97"; }
- ListElement{ longitude: "84"; latitude: "35"; height: "97"; }
- ListElement{ longitude: "84"; latitude: "36"; height: "99"; }
- ListElement{ longitude: "84"; latitude: "37"; height: "103"; }
- ListElement{ longitude: "84"; latitude: "38"; height: "109"; }
- ListElement{ longitude: "84"; latitude: "39"; height: "114"; }
- ListElement{ longitude: "84"; latitude: "40"; height: "118"; }
- ListElement{ longitude: "84"; latitude: "41"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "42"; height: "121"; }
- ListElement{ longitude: "84"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "84"; latitude: "44"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "45"; height: "122"; }
- ListElement{ longitude: "84"; latitude: "46"; height: "124"; }
- ListElement{ longitude: "84"; latitude: "47"; height: "127"; }
- ListElement{ longitude: "84"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "49"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "50"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "51"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "84"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "84"; latitude: "54"; height: "131"; }
- ListElement{ longitude: "84"; latitude: "55"; height: "132"; }
- ListElement{ longitude: "84"; latitude: "56"; height: "135"; }
- ListElement{ longitude: "84"; latitude: "57"; height: "136"; }
- ListElement{ longitude: "84"; latitude: "58"; height: "135"; }
- ListElement{ longitude: "84"; latitude: "59"; height: "132"; }
- ListElement{ longitude: "84"; latitude: "60"; height: "132"; }
- ListElement{ longitude: "84"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "84"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "84"; latitude: "64"; height: "123"; }
- ListElement{ longitude: "84"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "84"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "84"; latitude: "67"; height: "126"; }
- ListElement{ longitude: "84"; latitude: "68"; height: "123"; }
- ListElement{ longitude: "84"; latitude: "69"; height: "123"; }
- ListElement{ longitude: "84"; latitude: "70"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "71"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "84"; latitude: "73"; height: "126"; }
- ListElement{ longitude: "84"; latitude: "74"; height: "128"; }
- ListElement{ longitude: "84"; latitude: "75"; height: "114"; }
- ListElement{ longitude: "84"; latitude: "76"; height: "109"; }
- ListElement{ longitude: "84"; latitude: "77"; height: "111"; }
- ListElement{ longitude: "84"; latitude: "78"; height: "119"; }
- ListElement{ longitude: "84"; latitude: "79"; height: "129"; }
- ListElement{ longitude: "84"; latitude: "80"; height: "136"; }
- ListElement{ longitude: "84"; latitude: "81"; height: "142"; }
- ListElement{ longitude: "84"; latitude: "82"; height: "148"; }
- ListElement{ longitude: "84"; latitude: "83"; height: "149"; }
- ListElement{ longitude: "84"; latitude: "84"; height: "145"; }
- ListElement{ longitude: "84"; latitude: "85"; height: "142"; }
- ListElement{ longitude: "84"; latitude: "86"; height: "138"; }
- ListElement{ longitude: "84"; latitude: "87"; height: "132"; }
- ListElement{ longitude: "84"; latitude: "88"; height: "128"; }
- ListElement{ longitude: "84"; latitude: "89"; height: "123"; }
- ListElement{ longitude: "84"; latitude: "90"; height: "122"; }
- ListElement{ longitude: "84"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "84"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "84"; latitude: "93"; height: "121"; }
- ListElement{ longitude: "84"; latitude: "94"; height: "119"; }
- ListElement{ longitude: "84"; latitude: "95"; height: "115"; }
- ListElement{ longitude: "84"; latitude: "96"; height: "110"; }
- ListElement{ longitude: "84"; latitude: "97"; height: "107"; }
- ListElement{ longitude: "84"; latitude: "98"; height: "113"; }
- ListElement{ longitude: "84"; latitude: "99"; height: "111"; }
- ListElement{ longitude: "85"; latitude: "0"; height: "112"; }
- ListElement{ longitude: "85"; latitude: "1"; height: "110"; }
- ListElement{ longitude: "85"; latitude: "2"; height: "108"; }
- ListElement{ longitude: "85"; latitude: "3"; height: "110"; }
- ListElement{ longitude: "85"; latitude: "4"; height: "112"; }
- ListElement{ longitude: "85"; latitude: "5"; height: "115"; }
- ListElement{ longitude: "85"; latitude: "6"; height: "119"; }
- ListElement{ longitude: "85"; latitude: "7"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "8"; height: "128"; }
- ListElement{ longitude: "85"; latitude: "9"; height: "117"; }
- ListElement{ longitude: "85"; latitude: "10"; height: "126"; }
- ListElement{ longitude: "85"; latitude: "11"; height: "124"; }
- ListElement{ longitude: "85"; latitude: "12"; height: "116"; }
- ListElement{ longitude: "85"; latitude: "13"; height: "108"; }
- ListElement{ longitude: "85"; latitude: "14"; height: "103"; }
- ListElement{ longitude: "85"; latitude: "15"; height: "98"; }
- ListElement{ longitude: "85"; latitude: "16"; height: "98"; }
- ListElement{ longitude: "85"; latitude: "17"; height: "98"; }
- ListElement{ longitude: "85"; latitude: "18"; height: "99"; }
- ListElement{ longitude: "85"; latitude: "19"; height: "101"; }
- ListElement{ longitude: "85"; latitude: "20"; height: "101"; }
- ListElement{ longitude: "85"; latitude: "21"; height: "107"; }
- ListElement{ longitude: "85"; latitude: "22"; height: "111"; }
- ListElement{ longitude: "85"; latitude: "23"; height: "117"; }
- ListElement{ longitude: "85"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "85"; latitude: "25"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "26"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "27"; height: "121"; }
- ListElement{ longitude: "85"; latitude: "28"; height: "118"; }
- ListElement{ longitude: "85"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "85"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "85"; latitude: "31"; height: "106"; }
- ListElement{ longitude: "85"; latitude: "32"; height: "103"; }
- ListElement{ longitude: "85"; latitude: "33"; height: "101"; }
- ListElement{ longitude: "85"; latitude: "34"; height: "98"; }
- ListElement{ longitude: "85"; latitude: "35"; height: "100"; }
- ListElement{ longitude: "85"; latitude: "36"; height: "102"; }
- ListElement{ longitude: "85"; latitude: "37"; height: "106"; }
- ListElement{ longitude: "85"; latitude: "38"; height: "110"; }
- ListElement{ longitude: "85"; latitude: "39"; height: "115"; }
- ListElement{ longitude: "85"; latitude: "40"; height: "121"; }
- ListElement{ longitude: "85"; latitude: "41"; height: "121"; }
- ListElement{ longitude: "85"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "43"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "44"; height: "123"; }
- ListElement{ longitude: "85"; latitude: "45"; height: "127"; }
- ListElement{ longitude: "85"; latitude: "46"; height: "127"; }
- ListElement{ longitude: "85"; latitude: "47"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "85"; latitude: "49"; height: "131"; }
- ListElement{ longitude: "85"; latitude: "50"; height: "129"; }
- ListElement{ longitude: "85"; latitude: "51"; height: "129"; }
- ListElement{ longitude: "85"; latitude: "52"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "53"; height: "131"; }
- ListElement{ longitude: "85"; latitude: "54"; height: "134"; }
- ListElement{ longitude: "85"; latitude: "55"; height: "134"; }
- ListElement{ longitude: "85"; latitude: "56"; height: "137"; }
- ListElement{ longitude: "85"; latitude: "57"; height: "137"; }
- ListElement{ longitude: "85"; latitude: "58"; height: "134"; }
- ListElement{ longitude: "85"; latitude: "59"; height: "133"; }
- ListElement{ longitude: "85"; latitude: "60"; height: "133"; }
- ListElement{ longitude: "85"; latitude: "61"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "62"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "63"; height: "129"; }
- ListElement{ longitude: "85"; latitude: "64"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "65"; height: "131"; }
- ListElement{ longitude: "85"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "85"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "85"; latitude: "68"; height: "128"; }
- ListElement{ longitude: "85"; latitude: "69"; height: "125"; }
- ListElement{ longitude: "85"; latitude: "70"; height: "124"; }
- ListElement{ longitude: "85"; latitude: "71"; height: "123"; }
- ListElement{ longitude: "85"; latitude: "72"; height: "124"; }
- ListElement{ longitude: "85"; latitude: "73"; height: "127"; }
- ListElement{ longitude: "85"; latitude: "74"; height: "132"; }
- ListElement{ longitude: "85"; latitude: "75"; height: "126"; }
- ListElement{ longitude: "85"; latitude: "76"; height: "115"; }
- ListElement{ longitude: "85"; latitude: "77"; height: "113"; }
- ListElement{ longitude: "85"; latitude: "78"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "79"; height: "130"; }
- ListElement{ longitude: "85"; latitude: "80"; height: "137"; }
- ListElement{ longitude: "85"; latitude: "81"; height: "146"; }
- ListElement{ longitude: "85"; latitude: "82"; height: "152"; }
- ListElement{ longitude: "85"; latitude: "83"; height: "154"; }
- ListElement{ longitude: "85"; latitude: "84"; height: "149"; }
- ListElement{ longitude: "85"; latitude: "85"; height: "148"; }
- ListElement{ longitude: "85"; latitude: "86"; height: "141"; }
- ListElement{ longitude: "85"; latitude: "87"; height: "137"; }
- ListElement{ longitude: "85"; latitude: "88"; height: "133"; }
- ListElement{ longitude: "85"; latitude: "89"; height: "131"; }
- ListElement{ longitude: "85"; latitude: "90"; height: "124"; }
- ListElement{ longitude: "85"; latitude: "91"; height: "122"; }
- ListElement{ longitude: "85"; latitude: "92"; height: "120"; }
- ListElement{ longitude: "85"; latitude: "93"; height: "120"; }
- ListElement{ longitude: "85"; latitude: "94"; height: "116"; }
- ListElement{ longitude: "85"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "85"; latitude: "96"; height: "115"; }
- ListElement{ longitude: "85"; latitude: "97"; height: "116"; }
- ListElement{ longitude: "85"; latitude: "98"; height: "123"; }
- ListElement{ longitude: "85"; latitude: "99"; height: "119"; }
- ListElement{ longitude: "86"; latitude: "0"; height: "112"; }
- ListElement{ longitude: "86"; latitude: "1"; height: "110"; }
- ListElement{ longitude: "86"; latitude: "2"; height: "106"; }
- ListElement{ longitude: "86"; latitude: "3"; height: "108"; }
- ListElement{ longitude: "86"; latitude: "4"; height: "110"; }
- ListElement{ longitude: "86"; latitude: "5"; height: "113"; }
- ListElement{ longitude: "86"; latitude: "6"; height: "116"; }
- ListElement{ longitude: "86"; latitude: "7"; height: "119"; }
- ListElement{ longitude: "86"; latitude: "8"; height: "122"; }
- ListElement{ longitude: "86"; latitude: "9"; height: "124"; }
- ListElement{ longitude: "86"; latitude: "10"; height: "123"; }
- ListElement{ longitude: "86"; latitude: "11"; height: "119"; }
- ListElement{ longitude: "86"; latitude: "12"; height: "113"; }
- ListElement{ longitude: "86"; latitude: "13"; height: "107"; }
- ListElement{ longitude: "86"; latitude: "14"; height: "103"; }
- ListElement{ longitude: "86"; latitude: "15"; height: "100"; }
- ListElement{ longitude: "86"; latitude: "16"; height: "98"; }
- ListElement{ longitude: "86"; latitude: "17"; height: "99"; }
- ListElement{ longitude: "86"; latitude: "18"; height: "101"; }
- ListElement{ longitude: "86"; latitude: "19"; height: "103"; }
- ListElement{ longitude: "86"; latitude: "20"; height: "108"; }
- ListElement{ longitude: "86"; latitude: "21"; height: "113"; }
- ListElement{ longitude: "86"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "86"; latitude: "23"; height: "124"; }
- ListElement{ longitude: "86"; latitude: "24"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "25"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "86"; latitude: "27"; height: "122"; }
- ListElement{ longitude: "86"; latitude: "28"; height: "121"; }
- ListElement{ longitude: "86"; latitude: "29"; height: "116"; }
- ListElement{ longitude: "86"; latitude: "30"; height: "113"; }
- ListElement{ longitude: "86"; latitude: "31"; height: "110"; }
- ListElement{ longitude: "86"; latitude: "32"; height: "107"; }
- ListElement{ longitude: "86"; latitude: "33"; height: "104"; }
- ListElement{ longitude: "86"; latitude: "34"; height: "101"; }
- ListElement{ longitude: "86"; latitude: "35"; height: "103"; }
- ListElement{ longitude: "86"; latitude: "36"; height: "105"; }
- ListElement{ longitude: "86"; latitude: "37"; height: "111"; }
- ListElement{ longitude: "86"; latitude: "38"; height: "115"; }
- ListElement{ longitude: "86"; latitude: "39"; height: "120"; }
- ListElement{ longitude: "86"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "86"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "86"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "86"; latitude: "43"; height: "129"; }
- ListElement{ longitude: "86"; latitude: "44"; height: "127"; }
- ListElement{ longitude: "86"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "86"; latitude: "46"; height: "130"; }
- ListElement{ longitude: "86"; latitude: "47"; height: "133"; }
- ListElement{ longitude: "86"; latitude: "48"; height: "133"; }
- ListElement{ longitude: "86"; latitude: "49"; height: "131"; }
- ListElement{ longitude: "86"; latitude: "50"; height: "130"; }
- ListElement{ longitude: "86"; latitude: "51"; height: "130"; }
- ListElement{ longitude: "86"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "86"; latitude: "53"; height: "135"; }
- ListElement{ longitude: "86"; latitude: "54"; height: "138"; }
- ListElement{ longitude: "86"; latitude: "55"; height: "135"; }
- ListElement{ longitude: "86"; latitude: "56"; height: "138"; }
- ListElement{ longitude: "86"; latitude: "57"; height: "136"; }
- ListElement{ longitude: "86"; latitude: "58"; height: "137"; }
- ListElement{ longitude: "86"; latitude: "59"; height: "134"; }
- ListElement{ longitude: "86"; latitude: "60"; height: "135"; }
- ListElement{ longitude: "86"; latitude: "61"; height: "134"; }
- ListElement{ longitude: "86"; latitude: "62"; height: "135"; }
- ListElement{ longitude: "86"; latitude: "63"; height: "134"; }
- ListElement{ longitude: "86"; latitude: "64"; height: "131"; }
- ListElement{ longitude: "86"; latitude: "65"; height: "131"; }
- ListElement{ longitude: "86"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "86"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "86"; latitude: "68"; height: "129"; }
- ListElement{ longitude: "86"; latitude: "69"; height: "130"; }
- ListElement{ longitude: "86"; latitude: "70"; height: "129"; }
- ListElement{ longitude: "86"; latitude: "71"; height: "127"; }
- ListElement{ longitude: "86"; latitude: "72"; height: "128"; }
- ListElement{ longitude: "86"; latitude: "73"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "74"; height: "127"; }
- ListElement{ longitude: "86"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "86"; latitude: "76"; height: "127"; }
- ListElement{ longitude: "86"; latitude: "77"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "86"; latitude: "80"; height: "137"; }
- ListElement{ longitude: "86"; latitude: "81"; height: "143"; }
- ListElement{ longitude: "86"; latitude: "82"; height: "150"; }
- ListElement{ longitude: "86"; latitude: "83"; height: "151"; }
- ListElement{ longitude: "86"; latitude: "84"; height: "153"; }
- ListElement{ longitude: "86"; latitude: "85"; height: "151"; }
- ListElement{ longitude: "86"; latitude: "86"; height: "147"; }
- ListElement{ longitude: "86"; latitude: "87"; height: "144"; }
- ListElement{ longitude: "86"; latitude: "88"; height: "141"; }
- ListElement{ longitude: "86"; latitude: "89"; height: "137"; }
- ListElement{ longitude: "86"; latitude: "90"; height: "132"; }
- ListElement{ longitude: "86"; latitude: "91"; height: "125"; }
- ListElement{ longitude: "86"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "86"; latitude: "93"; height: "117"; }
- ListElement{ longitude: "86"; latitude: "94"; height: "115"; }
- ListElement{ longitude: "86"; latitude: "95"; height: "112"; }
- ListElement{ longitude: "86"; latitude: "96"; height: "117"; }
- ListElement{ longitude: "86"; latitude: "97"; height: "117"; }
- ListElement{ longitude: "86"; latitude: "98"; height: "126"; }
- ListElement{ longitude: "86"; latitude: "99"; height: "120"; }
- ListElement{ longitude: "87"; latitude: "0"; height: "110"; }
- ListElement{ longitude: "87"; latitude: "1"; height: "108"; }
- ListElement{ longitude: "87"; latitude: "2"; height: "102"; }
- ListElement{ longitude: "87"; latitude: "3"; height: "102"; }
- ListElement{ longitude: "87"; latitude: "4"; height: "107"; }
- ListElement{ longitude: "87"; latitude: "5"; height: "106"; }
- ListElement{ longitude: "87"; latitude: "6"; height: "110"; }
- ListElement{ longitude: "87"; latitude: "7"; height: "116"; }
- ListElement{ longitude: "87"; latitude: "8"; height: "114"; }
- ListElement{ longitude: "87"; latitude: "9"; height: "116"; }
- ListElement{ longitude: "87"; latitude: "10"; height: "115"; }
- ListElement{ longitude: "87"; latitude: "11"; height: "111"; }
- ListElement{ longitude: "87"; latitude: "12"; height: "109"; }
- ListElement{ longitude: "87"; latitude: "13"; height: "106"; }
- ListElement{ longitude: "87"; latitude: "14"; height: "103"; }
- ListElement{ longitude: "87"; latitude: "15"; height: "100"; }
- ListElement{ longitude: "87"; latitude: "16"; height: "98"; }
- ListElement{ longitude: "87"; latitude: "17"; height: "101"; }
- ListElement{ longitude: "87"; latitude: "18"; height: "103"; }
- ListElement{ longitude: "87"; latitude: "19"; height: "107"; }
- ListElement{ longitude: "87"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "87"; latitude: "21"; height: "121"; }
- ListElement{ longitude: "87"; latitude: "22"; height: "129"; }
- ListElement{ longitude: "87"; latitude: "23"; height: "134"; }
- ListElement{ longitude: "87"; latitude: "24"; height: "131"; }
- ListElement{ longitude: "87"; latitude: "25"; height: "130"; }
- ListElement{ longitude: "87"; latitude: "26"; height: "128"; }
- ListElement{ longitude: "87"; latitude: "27"; height: "126"; }
- ListElement{ longitude: "87"; latitude: "28"; height: "125"; }
- ListElement{ longitude: "87"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "87"; latitude: "30"; height: "120"; }
- ListElement{ longitude: "87"; latitude: "31"; height: "117"; }
- ListElement{ longitude: "87"; latitude: "32"; height: "112"; }
- ListElement{ longitude: "87"; latitude: "33"; height: "109"; }
- ListElement{ longitude: "87"; latitude: "34"; height: "106"; }
- ListElement{ longitude: "87"; latitude: "35"; height: "108"; }
- ListElement{ longitude: "87"; latitude: "36"; height: "109"; }
- ListElement{ longitude: "87"; latitude: "37"; height: "114"; }
- ListElement{ longitude: "87"; latitude: "38"; height: "118"; }
- ListElement{ longitude: "87"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "87"; latitude: "40"; height: "127"; }
- ListElement{ longitude: "87"; latitude: "41"; height: "127"; }
- ListElement{ longitude: "87"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "87"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "87"; latitude: "44"; height: "131"; }
- ListElement{ longitude: "87"; latitude: "45"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "46"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "47"; height: "137"; }
- ListElement{ longitude: "87"; latitude: "48"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "49"; height: "132"; }
- ListElement{ longitude: "87"; latitude: "50"; height: "134"; }
- ListElement{ longitude: "87"; latitude: "51"; height: "134"; }
- ListElement{ longitude: "87"; latitude: "52"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "53"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "54"; height: "138"; }
- ListElement{ longitude: "87"; latitude: "55"; height: "137"; }
- ListElement{ longitude: "87"; latitude: "56"; height: "139"; }
- ListElement{ longitude: "87"; latitude: "57"; height: "137"; }
- ListElement{ longitude: "87"; latitude: "58"; height: "138"; }
- ListElement{ longitude: "87"; latitude: "59"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "60"; height: "134"; }
- ListElement{ longitude: "87"; latitude: "61"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "62"; height: "135"; }
- ListElement{ longitude: "87"; latitude: "63"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "64"; height: "127"; }
- ListElement{ longitude: "87"; latitude: "65"; height: "131"; }
- ListElement{ longitude: "87"; latitude: "66"; height: "134"; }
- ListElement{ longitude: "87"; latitude: "67"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "69"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "70"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "71"; height: "132"; }
- ListElement{ longitude: "87"; latitude: "72"; height: "130"; }
- ListElement{ longitude: "87"; latitude: "73"; height: "127"; }
- ListElement{ longitude: "87"; latitude: "74"; height: "126"; }
- ListElement{ longitude: "87"; latitude: "75"; height: "125"; }
- ListElement{ longitude: "87"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "87"; latitude: "77"; height: "126"; }
- ListElement{ longitude: "87"; latitude: "78"; height: "125"; }
- ListElement{ longitude: "87"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "87"; latitude: "80"; height: "133"; }
- ListElement{ longitude: "87"; latitude: "81"; height: "140"; }
- ListElement{ longitude: "87"; latitude: "82"; height: "147"; }
- ListElement{ longitude: "87"; latitude: "83"; height: "151"; }
- ListElement{ longitude: "87"; latitude: "84"; height: "153"; }
- ListElement{ longitude: "87"; latitude: "85"; height: "152"; }
- ListElement{ longitude: "87"; latitude: "86"; height: "151"; }
- ListElement{ longitude: "87"; latitude: "87"; height: "149"; }
- ListElement{ longitude: "87"; latitude: "88"; height: "147"; }
- ListElement{ longitude: "87"; latitude: "89"; height: "143"; }
- ListElement{ longitude: "87"; latitude: "90"; height: "136"; }
- ListElement{ longitude: "87"; latitude: "91"; height: "128"; }
- ListElement{ longitude: "87"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "87"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "87"; latitude: "94"; height: "113"; }
- ListElement{ longitude: "87"; latitude: "95"; height: "113"; }
- ListElement{ longitude: "87"; latitude: "96"; height: "116"; }
- ListElement{ longitude: "87"; latitude: "97"; height: "118"; }
- ListElement{ longitude: "87"; latitude: "98"; height: "122"; }
- ListElement{ longitude: "87"; latitude: "99"; height: "117"; }
- ListElement{ longitude: "88"; latitude: "0"; height: "108"; }
- ListElement{ longitude: "88"; latitude: "1"; height: "105"; }
- ListElement{ longitude: "88"; latitude: "2"; height: "101"; }
- ListElement{ longitude: "88"; latitude: "3"; height: "101"; }
- ListElement{ longitude: "88"; latitude: "4"; height: "103"; }
- ListElement{ longitude: "88"; latitude: "5"; height: "107"; }
- ListElement{ longitude: "88"; latitude: "6"; height: "107"; }
- ListElement{ longitude: "88"; latitude: "7"; height: "112"; }
- ListElement{ longitude: "88"; latitude: "8"; height: "105"; }
- ListElement{ longitude: "88"; latitude: "9"; height: "113"; }
- ListElement{ longitude: "88"; latitude: "10"; height: "109"; }
- ListElement{ longitude: "88"; latitude: "11"; height: "106"; }
- ListElement{ longitude: "88"; latitude: "12"; height: "110"; }
- ListElement{ longitude: "88"; latitude: "13"; height: "105"; }
- ListElement{ longitude: "88"; latitude: "14"; height: "103"; }
- ListElement{ longitude: "88"; latitude: "15"; height: "102"; }
- ListElement{ longitude: "88"; latitude: "16"; height: "101"; }
- ListElement{ longitude: "88"; latitude: "17"; height: "102"; }
- ListElement{ longitude: "88"; latitude: "18"; height: "106"; }
- ListElement{ longitude: "88"; latitude: "19"; height: "112"; }
- ListElement{ longitude: "88"; latitude: "20"; height: "117"; }
- ListElement{ longitude: "88"; latitude: "21"; height: "126"; }
- ListElement{ longitude: "88"; latitude: "22"; height: "134"; }
- ListElement{ longitude: "88"; latitude: "23"; height: "139"; }
- ListElement{ longitude: "88"; latitude: "24"; height: "137"; }
- ListElement{ longitude: "88"; latitude: "25"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "26"; height: "129"; }
- ListElement{ longitude: "88"; latitude: "27"; height: "128"; }
- ListElement{ longitude: "88"; latitude: "28"; height: "119"; }
- ListElement{ longitude: "88"; latitude: "29"; height: "123"; }
- ListElement{ longitude: "88"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "88"; latitude: "31"; height: "116"; }
- ListElement{ longitude: "88"; latitude: "32"; height: "114"; }
- ListElement{ longitude: "88"; latitude: "33"; height: "110"; }
- ListElement{ longitude: "88"; latitude: "34"; height: "108"; }
- ListElement{ longitude: "88"; latitude: "35"; height: "109"; }
- ListElement{ longitude: "88"; latitude: "36"; height: "111"; }
- ListElement{ longitude: "88"; latitude: "37"; height: "116"; }
- ListElement{ longitude: "88"; latitude: "38"; height: "120"; }
- ListElement{ longitude: "88"; latitude: "39"; height: "123"; }
- ListElement{ longitude: "88"; latitude: "40"; height: "126"; }
- ListElement{ longitude: "88"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "88"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "88"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "88"; latitude: "44"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "45"; height: "135"; }
- ListElement{ longitude: "88"; latitude: "46"; height: "137"; }
- ListElement{ longitude: "88"; latitude: "47"; height: "137"; }
- ListElement{ longitude: "88"; latitude: "48"; height: "134"; }
- ListElement{ longitude: "88"; latitude: "49"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "50"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "51"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "52"; height: "136"; }
- ListElement{ longitude: "88"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "88"; latitude: "54"; height: "140"; }
- ListElement{ longitude: "88"; latitude: "55"; height: "139"; }
- ListElement{ longitude: "88"; latitude: "56"; height: "139"; }
- ListElement{ longitude: "88"; latitude: "57"; height: "139"; }
- ListElement{ longitude: "88"; latitude: "58"; height: "138"; }
- ListElement{ longitude: "88"; latitude: "59"; height: "135"; }
- ListElement{ longitude: "88"; latitude: "60"; height: "134"; }
- ListElement{ longitude: "88"; latitude: "61"; height: "137"; }
- ListElement{ longitude: "88"; latitude: "62"; height: "138"; }
- ListElement{ longitude: "88"; latitude: "63"; height: "130"; }
- ListElement{ longitude: "88"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "88"; latitude: "65"; height: "126"; }
- ListElement{ longitude: "88"; latitude: "66"; height: "136"; }
- ListElement{ longitude: "88"; latitude: "67"; height: "132"; }
- ListElement{ longitude: "88"; latitude: "68"; height: "136"; }
- ListElement{ longitude: "88"; latitude: "69"; height: "135"; }
- ListElement{ longitude: "88"; latitude: "70"; height: "136"; }
- ListElement{ longitude: "88"; latitude: "71"; height: "133"; }
- ListElement{ longitude: "88"; latitude: "72"; height: "130"; }
- ListElement{ longitude: "88"; latitude: "73"; height: "128"; }
- ListElement{ longitude: "88"; latitude: "74"; height: "128"; }
- ListElement{ longitude: "88"; latitude: "75"; height: "125"; }
- ListElement{ longitude: "88"; latitude: "76"; height: "125"; }
- ListElement{ longitude: "88"; latitude: "77"; height: "125"; }
- ListElement{ longitude: "88"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "88"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "88"; latitude: "80"; height: "131"; }
- ListElement{ longitude: "88"; latitude: "81"; height: "136"; }
- ListElement{ longitude: "88"; latitude: "82"; height: "142"; }
- ListElement{ longitude: "88"; latitude: "83"; height: "146"; }
- ListElement{ longitude: "88"; latitude: "84"; height: "150"; }
- ListElement{ longitude: "88"; latitude: "85"; height: "149"; }
- ListElement{ longitude: "88"; latitude: "86"; height: "149"; }
- ListElement{ longitude: "88"; latitude: "87"; height: "150"; }
- ListElement{ longitude: "88"; latitude: "88"; height: "148"; }
- ListElement{ longitude: "88"; latitude: "89"; height: "147"; }
- ListElement{ longitude: "88"; latitude: "90"; height: "140"; }
- ListElement{ longitude: "88"; latitude: "91"; height: "130"; }
- ListElement{ longitude: "88"; latitude: "92"; height: "124"; }
- ListElement{ longitude: "88"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "88"; latitude: "94"; height: "116"; }
- ListElement{ longitude: "88"; latitude: "95"; height: "117"; }
- ListElement{ longitude: "88"; latitude: "96"; height: "119"; }
- ListElement{ longitude: "88"; latitude: "97"; height: "119"; }
- ListElement{ longitude: "88"; latitude: "98"; height: "125"; }
- ListElement{ longitude: "88"; latitude: "99"; height: "113"; }
- ListElement{ longitude: "89"; latitude: "0"; height: "106"; }
- ListElement{ longitude: "89"; latitude: "1"; height: "101"; }
- ListElement{ longitude: "89"; latitude: "2"; height: "97"; }
- ListElement{ longitude: "89"; latitude: "3"; height: "99"; }
- ListElement{ longitude: "89"; latitude: "4"; height: "101"; }
- ListElement{ longitude: "89"; latitude: "5"; height: "104"; }
- ListElement{ longitude: "89"; latitude: "6"; height: "104"; }
- ListElement{ longitude: "89"; latitude: "7"; height: "108"; }
- ListElement{ longitude: "89"; latitude: "8"; height: "101"; }
- ListElement{ longitude: "89"; latitude: "9"; height: "108"; }
- ListElement{ longitude: "89"; latitude: "10"; height: "108"; }
- ListElement{ longitude: "89"; latitude: "11"; height: "107"; }
- ListElement{ longitude: "89"; latitude: "12"; height: "105"; }
- ListElement{ longitude: "89"; latitude: "13"; height: "106"; }
- ListElement{ longitude: "89"; latitude: "14"; height: "106"; }
- ListElement{ longitude: "89"; latitude: "15"; height: "103"; }
- ListElement{ longitude: "89"; latitude: "16"; height: "103"; }
- ListElement{ longitude: "89"; latitude: "17"; height: "105"; }
- ListElement{ longitude: "89"; latitude: "18"; height: "108"; }
- ListElement{ longitude: "89"; latitude: "19"; height: "113"; }
- ListElement{ longitude: "89"; latitude: "20"; height: "123"; }
- ListElement{ longitude: "89"; latitude: "21"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "22"; height: "137"; }
- ListElement{ longitude: "89"; latitude: "23"; height: "140"; }
- ListElement{ longitude: "89"; latitude: "24"; height: "139"; }
- ListElement{ longitude: "89"; latitude: "25"; height: "137"; }
- ListElement{ longitude: "89"; latitude: "26"; height: "131"; }
- ListElement{ longitude: "89"; latitude: "27"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "28"; height: "123"; }
- ListElement{ longitude: "89"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "89"; latitude: "30"; height: "125"; }
- ListElement{ longitude: "89"; latitude: "31"; height: "119"; }
- ListElement{ longitude: "89"; latitude: "32"; height: "115"; }
- ListElement{ longitude: "89"; latitude: "33"; height: "112"; }
- ListElement{ longitude: "89"; latitude: "34"; height: "111"; }
- ListElement{ longitude: "89"; latitude: "35"; height: "112"; }
- ListElement{ longitude: "89"; latitude: "36"; height: "114"; }
- ListElement{ longitude: "89"; latitude: "37"; height: "117"; }
- ListElement{ longitude: "89"; latitude: "38"; height: "119"; }
- ListElement{ longitude: "89"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "89"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "89"; latitude: "41"; height: "128"; }
- ListElement{ longitude: "89"; latitude: "42"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "43"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "44"; height: "134"; }
- ListElement{ longitude: "89"; latitude: "45"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "46"; height: "137"; }
- ListElement{ longitude: "89"; latitude: "47"; height: "138"; }
- ListElement{ longitude: "89"; latitude: "48"; height: "137"; }
- ListElement{ longitude: "89"; latitude: "49"; height: "135"; }
- ListElement{ longitude: "89"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "51"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "52"; height: "135"; }
- ListElement{ longitude: "89"; latitude: "53"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "54"; height: "138"; }
- ListElement{ longitude: "89"; latitude: "55"; height: "139"; }
- ListElement{ longitude: "89"; latitude: "56"; height: "139"; }
- ListElement{ longitude: "89"; latitude: "57"; height: "139"; }
- ListElement{ longitude: "89"; latitude: "58"; height: "138"; }
- ListElement{ longitude: "89"; latitude: "59"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "60"; height: "134"; }
- ListElement{ longitude: "89"; latitude: "61"; height: "133"; }
- ListElement{ longitude: "89"; latitude: "62"; height: "134"; }
- ListElement{ longitude: "89"; latitude: "63"; height: "131"; }
- ListElement{ longitude: "89"; latitude: "64"; height: "127"; }
- ListElement{ longitude: "89"; latitude: "65"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "66"; height: "133"; }
- ListElement{ longitude: "89"; latitude: "67"; height: "132"; }
- ListElement{ longitude: "89"; latitude: "68"; height: "135"; }
- ListElement{ longitude: "89"; latitude: "69"; height: "134"; }
- ListElement{ longitude: "89"; latitude: "70"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "71"; height: "136"; }
- ListElement{ longitude: "89"; latitude: "72"; height: "133"; }
- ListElement{ longitude: "89"; latitude: "73"; height: "131"; }
- ListElement{ longitude: "89"; latitude: "74"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "75"; height: "126"; }
- ListElement{ longitude: "89"; latitude: "76"; height: "125"; }
- ListElement{ longitude: "89"; latitude: "77"; height: "125"; }
- ListElement{ longitude: "89"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "89"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "89"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "89"; latitude: "81"; height: "133"; }
- ListElement{ longitude: "89"; latitude: "82"; height: "137"; }
- ListElement{ longitude: "89"; latitude: "83"; height: "140"; }
- ListElement{ longitude: "89"; latitude: "84"; height: "143"; }
- ListElement{ longitude: "89"; latitude: "85"; height: "146"; }
- ListElement{ longitude: "89"; latitude: "86"; height: "146"; }
- ListElement{ longitude: "89"; latitude: "87"; height: "146"; }
- ListElement{ longitude: "89"; latitude: "88"; height: "147"; }
- ListElement{ longitude: "89"; latitude: "89"; height: "145"; }
- ListElement{ longitude: "89"; latitude: "90"; height: "140"; }
- ListElement{ longitude: "89"; latitude: "91"; height: "133"; }
- ListElement{ longitude: "89"; latitude: "92"; height: "128"; }
- ListElement{ longitude: "89"; latitude: "93"; height: "123"; }
- ListElement{ longitude: "89"; latitude: "94"; height: "123"; }
- ListElement{ longitude: "89"; latitude: "95"; height: "114"; }
- ListElement{ longitude: "89"; latitude: "96"; height: "120"; }
- ListElement{ longitude: "89"; latitude: "97"; height: "117"; }
- ListElement{ longitude: "89"; latitude: "98"; height: "119"; }
- ListElement{ longitude: "89"; latitude: "99"; height: "107"; }
- ListElement{ longitude: "90"; latitude: "0"; height: "102"; }
- ListElement{ longitude: "90"; latitude: "1"; height: "99"; }
- ListElement{ longitude: "90"; latitude: "2"; height: "98"; }
- ListElement{ longitude: "90"; latitude: "3"; height: "99"; }
- ListElement{ longitude: "90"; latitude: "4"; height: "102"; }
- ListElement{ longitude: "90"; latitude: "5"; height: "101"; }
- ListElement{ longitude: "90"; latitude: "6"; height: "101"; }
- ListElement{ longitude: "90"; latitude: "7"; height: "103"; }
- ListElement{ longitude: "90"; latitude: "8"; height: "106"; }
- ListElement{ longitude: "90"; latitude: "9"; height: "105"; }
- ListElement{ longitude: "90"; latitude: "10"; height: "103"; }
- ListElement{ longitude: "90"; latitude: "11"; height: "103"; }
- ListElement{ longitude: "90"; latitude: "12"; height: "103"; }
- ListElement{ longitude: "90"; latitude: "13"; height: "104"; }
- ListElement{ longitude: "90"; latitude: "14"; height: "108"; }
- ListElement{ longitude: "90"; latitude: "15"; height: "107"; }
- ListElement{ longitude: "90"; latitude: "16"; height: "108"; }
- ListElement{ longitude: "90"; latitude: "17"; height: "109"; }
- ListElement{ longitude: "90"; latitude: "18"; height: "112"; }
- ListElement{ longitude: "90"; latitude: "19"; height: "119"; }
- ListElement{ longitude: "90"; latitude: "20"; height: "122"; }
- ListElement{ longitude: "90"; latitude: "21"; height: "127"; }
- ListElement{ longitude: "90"; latitude: "22"; height: "133"; }
- ListElement{ longitude: "90"; latitude: "23"; height: "136"; }
- ListElement{ longitude: "90"; latitude: "24"; height: "136"; }
- ListElement{ longitude: "90"; latitude: "25"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "26"; height: "134"; }
- ListElement{ longitude: "90"; latitude: "27"; height: "130"; }
- ListElement{ longitude: "90"; latitude: "28"; height: "131"; }
- ListElement{ longitude: "90"; latitude: "29"; height: "127"; }
- ListElement{ longitude: "90"; latitude: "30"; height: "123"; }
- ListElement{ longitude: "90"; latitude: "31"; height: "117"; }
- ListElement{ longitude: "90"; latitude: "32"; height: "113"; }
- ListElement{ longitude: "90"; latitude: "33"; height: "110"; }
- ListElement{ longitude: "90"; latitude: "34"; height: "110"; }
- ListElement{ longitude: "90"; latitude: "35"; height: "111"; }
- ListElement{ longitude: "90"; latitude: "36"; height: "113"; }
- ListElement{ longitude: "90"; latitude: "37"; height: "116"; }
- ListElement{ longitude: "90"; latitude: "38"; height: "117"; }
- ListElement{ longitude: "90"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "90"; latitude: "40"; height: "122"; }
- ListElement{ longitude: "90"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "90"; latitude: "42"; height: "129"; }
- ListElement{ longitude: "90"; latitude: "43"; height: "131"; }
- ListElement{ longitude: "90"; latitude: "44"; height: "133"; }
- ListElement{ longitude: "90"; latitude: "45"; height: "136"; }
- ListElement{ longitude: "90"; latitude: "46"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "47"; height: "139"; }
- ListElement{ longitude: "90"; latitude: "48"; height: "139"; }
- ListElement{ longitude: "90"; latitude: "49"; height: "138"; }
- ListElement{ longitude: "90"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "90"; latitude: "51"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "52"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "54"; height: "136"; }
- ListElement{ longitude: "90"; latitude: "55"; height: "138"; }
- ListElement{ longitude: "90"; latitude: "56"; height: "139"; }
- ListElement{ longitude: "90"; latitude: "57"; height: "139"; }
- ListElement{ longitude: "90"; latitude: "58"; height: "138"; }
- ListElement{ longitude: "90"; latitude: "59"; height: "134"; }
- ListElement{ longitude: "90"; latitude: "60"; height: "130"; }
- ListElement{ longitude: "90"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "90"; latitude: "62"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "64"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "65"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "66"; height: "129"; }
- ListElement{ longitude: "90"; latitude: "67"; height: "129"; }
- ListElement{ longitude: "90"; latitude: "68"; height: "130"; }
- ListElement{ longitude: "90"; latitude: "69"; height: "131"; }
- ListElement{ longitude: "90"; latitude: "70"; height: "133"; }
- ListElement{ longitude: "90"; latitude: "71"; height: "135"; }
- ListElement{ longitude: "90"; latitude: "72"; height: "135"; }
- ListElement{ longitude: "90"; latitude: "73"; height: "132"; }
- ListElement{ longitude: "90"; latitude: "74"; height: "130"; }
- ListElement{ longitude: "90"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "76"; height: "125"; }
- ListElement{ longitude: "90"; latitude: "77"; height: "127"; }
- ListElement{ longitude: "90"; latitude: "78"; height: "126"; }
- ListElement{ longitude: "90"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "90"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "90"; latitude: "81"; height: "132"; }
- ListElement{ longitude: "90"; latitude: "82"; height: "135"; }
- ListElement{ longitude: "90"; latitude: "83"; height: "138"; }
- ListElement{ longitude: "90"; latitude: "84"; height: "140"; }
- ListElement{ longitude: "90"; latitude: "85"; height: "141"; }
- ListElement{ longitude: "90"; latitude: "86"; height: "143"; }
- ListElement{ longitude: "90"; latitude: "87"; height: "143"; }
- ListElement{ longitude: "90"; latitude: "88"; height: "142"; }
- ListElement{ longitude: "90"; latitude: "89"; height: "140"; }
- ListElement{ longitude: "90"; latitude: "90"; height: "137"; }
- ListElement{ longitude: "90"; latitude: "91"; height: "131"; }
- ListElement{ longitude: "90"; latitude: "92"; height: "127"; }
- ListElement{ longitude: "90"; latitude: "93"; height: "129"; }
- ListElement{ longitude: "90"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "90"; latitude: "95"; height: "86"; }
- ListElement{ longitude: "90"; latitude: "96"; height: "103"; }
- ListElement{ longitude: "90"; latitude: "97"; height: "110"; }
- ListElement{ longitude: "90"; latitude: "98"; height: "108"; }
- ListElement{ longitude: "90"; latitude: "99"; height: "99"; }
- ListElement{ longitude: "91"; latitude: "0"; height: "97"; }
- ListElement{ longitude: "91"; latitude: "1"; height: "97"; }
- ListElement{ longitude: "91"; latitude: "2"; height: "100"; }
- ListElement{ longitude: "91"; latitude: "3"; height: "101"; }
- ListElement{ longitude: "91"; latitude: "4"; height: "102"; }
- ListElement{ longitude: "91"; latitude: "5"; height: "101"; }
- ListElement{ longitude: "91"; latitude: "6"; height: "99"; }
- ListElement{ longitude: "91"; latitude: "7"; height: "99"; }
- ListElement{ longitude: "91"; latitude: "8"; height: "99"; }
- ListElement{ longitude: "91"; latitude: "9"; height: "101"; }
- ListElement{ longitude: "91"; latitude: "10"; height: "100"; }
- ListElement{ longitude: "91"; latitude: "11"; height: "102"; }
- ListElement{ longitude: "91"; latitude: "12"; height: "101"; }
- ListElement{ longitude: "91"; latitude: "13"; height: "104"; }
- ListElement{ longitude: "91"; latitude: "14"; height: "106"; }
- ListElement{ longitude: "91"; latitude: "15"; height: "109"; }
- ListElement{ longitude: "91"; latitude: "16"; height: "109"; }
- ListElement{ longitude: "91"; latitude: "17"; height: "112"; }
- ListElement{ longitude: "91"; latitude: "18"; height: "111"; }
- ListElement{ longitude: "91"; latitude: "19"; height: "116"; }
- ListElement{ longitude: "91"; latitude: "20"; height: "120"; }
- ListElement{ longitude: "91"; latitude: "21"; height: "122"; }
- ListElement{ longitude: "91"; latitude: "22"; height: "127"; }
- ListElement{ longitude: "91"; latitude: "23"; height: "130"; }
- ListElement{ longitude: "91"; latitude: "24"; height: "133"; }
- ListElement{ longitude: "91"; latitude: "25"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "26"; height: "134"; }
- ListElement{ longitude: "91"; latitude: "27"; height: "133"; }
- ListElement{ longitude: "91"; latitude: "28"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "29"; height: "129"; }
- ListElement{ longitude: "91"; latitude: "30"; height: "122"; }
- ListElement{ longitude: "91"; latitude: "31"; height: "116"; }
- ListElement{ longitude: "91"; latitude: "32"; height: "112"; }
- ListElement{ longitude: "91"; latitude: "33"; height: "110"; }
- ListElement{ longitude: "91"; latitude: "34"; height: "109"; }
- ListElement{ longitude: "91"; latitude: "35"; height: "112"; }
- ListElement{ longitude: "91"; latitude: "36"; height: "113"; }
- ListElement{ longitude: "91"; latitude: "37"; height: "114"; }
- ListElement{ longitude: "91"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "91"; latitude: "39"; height: "118"; }
- ListElement{ longitude: "91"; latitude: "40"; height: "121"; }
- ListElement{ longitude: "91"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "91"; latitude: "42"; height: "128"; }
- ListElement{ longitude: "91"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "91"; latitude: "44"; height: "130"; }
- ListElement{ longitude: "91"; latitude: "45"; height: "134"; }
- ListElement{ longitude: "91"; latitude: "46"; height: "138"; }
- ListElement{ longitude: "91"; latitude: "47"; height: "140"; }
- ListElement{ longitude: "91"; latitude: "48"; height: "141"; }
- ListElement{ longitude: "91"; latitude: "49"; height: "141"; }
- ListElement{ longitude: "91"; latitude: "50"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "51"; height: "138"; }
- ListElement{ longitude: "91"; latitude: "52"; height: "136"; }
- ListElement{ longitude: "91"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "54"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "55"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "56"; height: "133"; }
- ListElement{ longitude: "91"; latitude: "57"; height: "125"; }
- ListElement{ longitude: "91"; latitude: "58"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "59"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "60"; height: "129"; }
- ListElement{ longitude: "91"; latitude: "61"; height: "129"; }
- ListElement{ longitude: "91"; latitude: "62"; height: "127"; }
- ListElement{ longitude: "91"; latitude: "63"; height: "125"; }
- ListElement{ longitude: "91"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "91"; latitude: "65"; height: "122"; }
- ListElement{ longitude: "91"; latitude: "66"; height: "123"; }
- ListElement{ longitude: "91"; latitude: "67"; height: "124"; }
- ListElement{ longitude: "91"; latitude: "68"; height: "125"; }
- ListElement{ longitude: "91"; latitude: "69"; height: "126"; }
- ListElement{ longitude: "91"; latitude: "70"; height: "129"; }
- ListElement{ longitude: "91"; latitude: "71"; height: "129"; }
- ListElement{ longitude: "91"; latitude: "72"; height: "131"; }
- ListElement{ longitude: "91"; latitude: "73"; height: "131"; }
- ListElement{ longitude: "91"; latitude: "74"; height: "130"; }
- ListElement{ longitude: "91"; latitude: "75"; height: "128"; }
- ListElement{ longitude: "91"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "91"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "91"; latitude: "78"; height: "127"; }
- ListElement{ longitude: "91"; latitude: "79"; height: "128"; }
- ListElement{ longitude: "91"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "91"; latitude: "81"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "82"; height: "136"; }
- ListElement{ longitude: "91"; latitude: "83"; height: "138"; }
- ListElement{ longitude: "91"; latitude: "84"; height: "139"; }
- ListElement{ longitude: "91"; latitude: "85"; height: "140"; }
- ListElement{ longitude: "91"; latitude: "86"; height: "141"; }
- ListElement{ longitude: "91"; latitude: "87"; height: "138"; }
- ListElement{ longitude: "91"; latitude: "88"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "89"; height: "137"; }
- ListElement{ longitude: "91"; latitude: "90"; height: "134"; }
- ListElement{ longitude: "91"; latitude: "91"; height: "132"; }
- ListElement{ longitude: "91"; latitude: "92"; height: "130"; }
- ListElement{ longitude: "91"; latitude: "93"; height: "131"; }
- ListElement{ longitude: "91"; latitude: "94"; height: "120"; }
- ListElement{ longitude: "91"; latitude: "95"; height: "95"; }
- ListElement{ longitude: "91"; latitude: "96"; height: "105"; }
- ListElement{ longitude: "91"; latitude: "97"; height: "106"; }
- ListElement{ longitude: "91"; latitude: "98"; height: "97"; }
- ListElement{ longitude: "91"; latitude: "99"; height: "91"; }
- ListElement{ longitude: "92"; latitude: "0"; height: "96"; }
- ListElement{ longitude: "92"; latitude: "1"; height: "97"; }
- ListElement{ longitude: "92"; latitude: "2"; height: "101"; }
- ListElement{ longitude: "92"; latitude: "3"; height: "102"; }
- ListElement{ longitude: "92"; latitude: "4"; height: "102"; }
- ListElement{ longitude: "92"; latitude: "5"; height: "99"; }
- ListElement{ longitude: "92"; latitude: "6"; height: "95"; }
- ListElement{ longitude: "92"; latitude: "7"; height: "98"; }
- ListElement{ longitude: "92"; latitude: "8"; height: "96"; }
- ListElement{ longitude: "92"; latitude: "9"; height: "98"; }
- ListElement{ longitude: "92"; latitude: "10"; height: "97"; }
- ListElement{ longitude: "92"; latitude: "11"; height: "99"; }
- ListElement{ longitude: "92"; latitude: "12"; height: "99"; }
- ListElement{ longitude: "92"; latitude: "13"; height: "102"; }
- ListElement{ longitude: "92"; latitude: "14"; height: "102"; }
- ListElement{ longitude: "92"; latitude: "15"; height: "105"; }
- ListElement{ longitude: "92"; latitude: "16"; height: "107"; }
- ListElement{ longitude: "92"; latitude: "17"; height: "108"; }
- ListElement{ longitude: "92"; latitude: "18"; height: "109"; }
- ListElement{ longitude: "92"; latitude: "19"; height: "112"; }
- ListElement{ longitude: "92"; latitude: "20"; height: "115"; }
- ListElement{ longitude: "92"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "92"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "23"; height: "126"; }
- ListElement{ longitude: "92"; latitude: "24"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "25"; height: "131"; }
- ListElement{ longitude: "92"; latitude: "26"; height: "133"; }
- ListElement{ longitude: "92"; latitude: "27"; height: "134"; }
- ListElement{ longitude: "92"; latitude: "28"; height: "130"; }
- ListElement{ longitude: "92"; latitude: "29"; height: "126"; }
- ListElement{ longitude: "92"; latitude: "30"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "31"; height: "113"; }
- ListElement{ longitude: "92"; latitude: "32"; height: "110"; }
- ListElement{ longitude: "92"; latitude: "33"; height: "113"; }
- ListElement{ longitude: "92"; latitude: "34"; height: "112"; }
- ListElement{ longitude: "92"; latitude: "35"; height: "115"; }
- ListElement{ longitude: "92"; latitude: "36"; height: "116"; }
- ListElement{ longitude: "92"; latitude: "37"; height: "115"; }
- ListElement{ longitude: "92"; latitude: "38"; height: "116"; }
- ListElement{ longitude: "92"; latitude: "39"; height: "118"; }
- ListElement{ longitude: "92"; latitude: "40"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "41"; height: "126"; }
- ListElement{ longitude: "92"; latitude: "42"; height: "127"; }
- ListElement{ longitude: "92"; latitude: "43"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "44"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "45"; height: "131"; }
- ListElement{ longitude: "92"; latitude: "46"; height: "135"; }
- ListElement{ longitude: "92"; latitude: "47"; height: "130"; }
- ListElement{ longitude: "92"; latitude: "48"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "49"; height: "141"; }
- ListElement{ longitude: "92"; latitude: "50"; height: "140"; }
- ListElement{ longitude: "92"; latitude: "51"; height: "139"; }
- ListElement{ longitude: "92"; latitude: "52"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "53"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "54"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "55"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "56"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "58"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "59"; height: "131"; }
- ListElement{ longitude: "92"; latitude: "60"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "61"; height: "127"; }
- ListElement{ longitude: "92"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "92"; latitude: "63"; height: "119"; }
- ListElement{ longitude: "92"; latitude: "64"; height: "117"; }
- ListElement{ longitude: "92"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "92"; latitude: "66"; height: "118"; }
- ListElement{ longitude: "92"; latitude: "67"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "68"; height: "122"; }
- ListElement{ longitude: "92"; latitude: "69"; height: "121"; }
- ListElement{ longitude: "92"; latitude: "70"; height: "124"; }
- ListElement{ longitude: "92"; latitude: "71"; height: "125"; }
- ListElement{ longitude: "92"; latitude: "72"; height: "130"; }
- ListElement{ longitude: "92"; latitude: "73"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "74"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "75"; height: "125"; }
- ListElement{ longitude: "92"; latitude: "76"; height: "125"; }
- ListElement{ longitude: "92"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "78"; height: "128"; }
- ListElement{ longitude: "92"; latitude: "79"; height: "131"; }
- ListElement{ longitude: "92"; latitude: "80"; height: "130"; }
- ListElement{ longitude: "92"; latitude: "81"; height: "132"; }
- ListElement{ longitude: "92"; latitude: "82"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "83"; height: "134"; }
- ListElement{ longitude: "92"; latitude: "84"; height: "131"; }
- ListElement{ longitude: "92"; latitude: "85"; height: "137"; }
- ListElement{ longitude: "92"; latitude: "86"; height: "142"; }
- ListElement{ longitude: "92"; latitude: "87"; height: "137"; }
- ListElement{ longitude: "92"; latitude: "88"; height: "136"; }
- ListElement{ longitude: "92"; latitude: "89"; height: "133"; }
- ListElement{ longitude: "92"; latitude: "90"; height: "129"; }
- ListElement{ longitude: "92"; latitude: "91"; height: "130"; }
- ListElement{ longitude: "92"; latitude: "92"; height: "132"; }
- ListElement{ longitude: "92"; latitude: "93"; height: "124"; }
- ListElement{ longitude: "92"; latitude: "94"; height: "119"; }
- ListElement{ longitude: "92"; latitude: "95"; height: "114"; }
- ListElement{ longitude: "92"; latitude: "96"; height: "109"; }
- ListElement{ longitude: "92"; latitude: "97"; height: "109"; }
- ListElement{ longitude: "92"; latitude: "98"; height: "96"; }
- ListElement{ longitude: "92"; latitude: "99"; height: "87"; }
- ListElement{ longitude: "93"; latitude: "0"; height: "96"; }
- ListElement{ longitude: "93"; latitude: "1"; height: "100"; }
- ListElement{ longitude: "93"; latitude: "2"; height: "103"; }
- ListElement{ longitude: "93"; latitude: "3"; height: "105"; }
- ListElement{ longitude: "93"; latitude: "4"; height: "105"; }
- ListElement{ longitude: "93"; latitude: "5"; height: "96"; }
- ListElement{ longitude: "93"; latitude: "6"; height: "97"; }
- ListElement{ longitude: "93"; latitude: "7"; height: "97"; }
- ListElement{ longitude: "93"; latitude: "8"; height: "93"; }
- ListElement{ longitude: "93"; latitude: "9"; height: "94"; }
- ListElement{ longitude: "93"; latitude: "10"; height: "94"; }
- ListElement{ longitude: "93"; latitude: "11"; height: "95"; }
- ListElement{ longitude: "93"; latitude: "12"; height: "98"; }
- ListElement{ longitude: "93"; latitude: "13"; height: "99"; }
- ListElement{ longitude: "93"; latitude: "14"; height: "99"; }
- ListElement{ longitude: "93"; latitude: "15"; height: "102"; }
- ListElement{ longitude: "93"; latitude: "16"; height: "100"; }
- ListElement{ longitude: "93"; latitude: "17"; height: "104"; }
- ListElement{ longitude: "93"; latitude: "18"; height: "107"; }
- ListElement{ longitude: "93"; latitude: "19"; height: "110"; }
- ListElement{ longitude: "93"; latitude: "20"; height: "113"; }
- ListElement{ longitude: "93"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "93"; latitude: "22"; height: "119"; }
- ListElement{ longitude: "93"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "93"; latitude: "24"; height: "124"; }
- ListElement{ longitude: "93"; latitude: "25"; height: "129"; }
- ListElement{ longitude: "93"; latitude: "26"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "27"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "28"; height: "128"; }
- ListElement{ longitude: "93"; latitude: "29"; height: "125"; }
- ListElement{ longitude: "93"; latitude: "30"; height: "120"; }
- ListElement{ longitude: "93"; latitude: "31"; height: "113"; }
- ListElement{ longitude: "93"; latitude: "32"; height: "111"; }
- ListElement{ longitude: "93"; latitude: "33"; height: "114"; }
- ListElement{ longitude: "93"; latitude: "34"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "35"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "36"; height: "118"; }
- ListElement{ longitude: "93"; latitude: "37"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "38"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "39"; height: "119"; }
- ListElement{ longitude: "93"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "93"; latitude: "41"; height: "125"; }
- ListElement{ longitude: "93"; latitude: "42"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "43"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "44"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "45"; height: "129"; }
- ListElement{ longitude: "93"; latitude: "46"; height: "134"; }
- ListElement{ longitude: "93"; latitude: "47"; height: "129"; }
- ListElement{ longitude: "93"; latitude: "48"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "49"; height: "142"; }
- ListElement{ longitude: "93"; latitude: "50"; height: "140"; }
- ListElement{ longitude: "93"; latitude: "51"; height: "137"; }
- ListElement{ longitude: "93"; latitude: "52"; height: "138"; }
- ListElement{ longitude: "93"; latitude: "53"; height: "137"; }
- ListElement{ longitude: "93"; latitude: "54"; height: "138"; }
- ListElement{ longitude: "93"; latitude: "55"; height: "138"; }
- ListElement{ longitude: "93"; latitude: "56"; height: "137"; }
- ListElement{ longitude: "93"; latitude: "57"; height: "131"; }
- ListElement{ longitude: "93"; latitude: "58"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "59"; height: "129"; }
- ListElement{ longitude: "93"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "93"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "93"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "93"; latitude: "63"; height: "119"; }
- ListElement{ longitude: "93"; latitude: "64"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "65"; height: "117"; }
- ListElement{ longitude: "93"; latitude: "66"; height: "120"; }
- ListElement{ longitude: "93"; latitude: "67"; height: "123"; }
- ListElement{ longitude: "93"; latitude: "68"; height: "122"; }
- ListElement{ longitude: "93"; latitude: "69"; height: "122"; }
- ListElement{ longitude: "93"; latitude: "70"; height: "122"; }
- ListElement{ longitude: "93"; latitude: "71"; height: "123"; }
- ListElement{ longitude: "93"; latitude: "72"; height: "124"; }
- ListElement{ longitude: "93"; latitude: "73"; height: "124"; }
- ListElement{ longitude: "93"; latitude: "74"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "75"; height: "124"; }
- ListElement{ longitude: "93"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "93"; latitude: "78"; height: "130"; }
- ListElement{ longitude: "93"; latitude: "79"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "80"; height: "133"; }
- ListElement{ longitude: "93"; latitude: "81"; height: "133"; }
- ListElement{ longitude: "93"; latitude: "82"; height: "138"; }
- ListElement{ longitude: "93"; latitude: "83"; height: "135"; }
- ListElement{ longitude: "93"; latitude: "84"; height: "130"; }
- ListElement{ longitude: "93"; latitude: "85"; height: "136"; }
- ListElement{ longitude: "93"; latitude: "86"; height: "144"; }
- ListElement{ longitude: "93"; latitude: "87"; height: "139"; }
- ListElement{ longitude: "93"; latitude: "88"; height: "132"; }
- ListElement{ longitude: "93"; latitude: "89"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "90"; height: "126"; }
- ListElement{ longitude: "93"; latitude: "91"; height: "128"; }
- ListElement{ longitude: "93"; latitude: "92"; height: "128"; }
- ListElement{ longitude: "93"; latitude: "93"; height: "118"; }
- ListElement{ longitude: "93"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "93"; latitude: "95"; height: "111"; }
- ListElement{ longitude: "93"; latitude: "96"; height: "110"; }
- ListElement{ longitude: "93"; latitude: "97"; height: "109"; }
- ListElement{ longitude: "93"; latitude: "98"; height: "98"; }
- ListElement{ longitude: "93"; latitude: "99"; height: "85"; }
- ListElement{ longitude: "94"; latitude: "0"; height: "91"; }
- ListElement{ longitude: "94"; latitude: "1"; height: "93"; }
- ListElement{ longitude: "94"; latitude: "2"; height: "98"; }
- ListElement{ longitude: "94"; latitude: "3"; height: "101"; }
- ListElement{ longitude: "94"; latitude: "4"; height: "106"; }
- ListElement{ longitude: "94"; latitude: "5"; height: "106"; }
- ListElement{ longitude: "94"; latitude: "6"; height: "89"; }
- ListElement{ longitude: "94"; latitude: "7"; height: "98"; }
- ListElement{ longitude: "94"; latitude: "8"; height: "95"; }
- ListElement{ longitude: "94"; latitude: "9"; height: "91"; }
- ListElement{ longitude: "94"; latitude: "10"; height: "90"; }
- ListElement{ longitude: "94"; latitude: "11"; height: "92"; }
- ListElement{ longitude: "94"; latitude: "12"; height: "94"; }
- ListElement{ longitude: "94"; latitude: "13"; height: "95"; }
- ListElement{ longitude: "94"; latitude: "14"; height: "98"; }
- ListElement{ longitude: "94"; latitude: "15"; height: "99"; }
- ListElement{ longitude: "94"; latitude: "16"; height: "97"; }
- ListElement{ longitude: "94"; latitude: "17"; height: "101"; }
- ListElement{ longitude: "94"; latitude: "18"; height: "105"; }
- ListElement{ longitude: "94"; latitude: "19"; height: "109"; }
- ListElement{ longitude: "94"; latitude: "20"; height: "113"; }
- ListElement{ longitude: "94"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "94"; latitude: "22"; height: "120"; }
- ListElement{ longitude: "94"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "94"; latitude: "24"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "25"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "26"; height: "128"; }
- ListElement{ longitude: "94"; latitude: "27"; height: "128"; }
- ListElement{ longitude: "94"; latitude: "28"; height: "128"; }
- ListElement{ longitude: "94"; latitude: "29"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "30"; height: "119"; }
- ListElement{ longitude: "94"; latitude: "31"; height: "116"; }
- ListElement{ longitude: "94"; latitude: "32"; height: "114"; }
- ListElement{ longitude: "94"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "94"; latitude: "34"; height: "110"; }
- ListElement{ longitude: "94"; latitude: "35"; height: "113"; }
- ListElement{ longitude: "94"; latitude: "36"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "37"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "38"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "39"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "94"; latitude: "41"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "43"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "44"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "45"; height: "130"; }
- ListElement{ longitude: "94"; latitude: "46"; height: "136"; }
- ListElement{ longitude: "94"; latitude: "47"; height: "141"; }
- ListElement{ longitude: "94"; latitude: "48"; height: "145"; }
- ListElement{ longitude: "94"; latitude: "49"; height: "145"; }
- ListElement{ longitude: "94"; latitude: "50"; height: "136"; }
- ListElement{ longitude: "94"; latitude: "51"; height: "129"; }
- ListElement{ longitude: "94"; latitude: "52"; height: "138"; }
- ListElement{ longitude: "94"; latitude: "53"; height: "140"; }
- ListElement{ longitude: "94"; latitude: "54"; height: "138"; }
- ListElement{ longitude: "94"; latitude: "55"; height: "139"; }
- ListElement{ longitude: "94"; latitude: "56"; height: "131"; }
- ListElement{ longitude: "94"; latitude: "57"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "58"; height: "129"; }
- ListElement{ longitude: "94"; latitude: "59"; height: "125"; }
- ListElement{ longitude: "94"; latitude: "60"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "61"; height: "125"; }
- ListElement{ longitude: "94"; latitude: "62"; height: "126"; }
- ListElement{ longitude: "94"; latitude: "63"; height: "123"; }
- ListElement{ longitude: "94"; latitude: "64"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "65"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "66"; height: "123"; }
- ListElement{ longitude: "94"; latitude: "67"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "68"; height: "125"; }
- ListElement{ longitude: "94"; latitude: "69"; height: "123"; }
- ListElement{ longitude: "94"; latitude: "70"; height: "123"; }
- ListElement{ longitude: "94"; latitude: "71"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "73"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "75"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "76"; height: "120"; }
- ListElement{ longitude: "94"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "94"; latitude: "78"; height: "129"; }
- ListElement{ longitude: "94"; latitude: "79"; height: "133"; }
- ListElement{ longitude: "94"; latitude: "80"; height: "134"; }
- ListElement{ longitude: "94"; latitude: "81"; height: "133"; }
- ListElement{ longitude: "94"; latitude: "82"; height: "137"; }
- ListElement{ longitude: "94"; latitude: "83"; height: "137"; }
- ListElement{ longitude: "94"; latitude: "84"; height: "142"; }
- ListElement{ longitude: "94"; latitude: "85"; height: "148"; }
- ListElement{ longitude: "94"; latitude: "86"; height: "146"; }
- ListElement{ longitude: "94"; latitude: "87"; height: "137"; }
- ListElement{ longitude: "94"; latitude: "88"; height: "124"; }
- ListElement{ longitude: "94"; latitude: "89"; height: "117"; }
- ListElement{ longitude: "94"; latitude: "90"; height: "120"; }
- ListElement{ longitude: "94"; latitude: "91"; height: "121"; }
- ListElement{ longitude: "94"; latitude: "92"; height: "122"; }
- ListElement{ longitude: "94"; latitude: "93"; height: "115"; }
- ListElement{ longitude: "94"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "94"; latitude: "95"; height: "115"; }
- ListElement{ longitude: "94"; latitude: "96"; height: "111"; }
- ListElement{ longitude: "94"; latitude: "97"; height: "106"; }
- ListElement{ longitude: "94"; latitude: "98"; height: "94"; }
- ListElement{ longitude: "94"; latitude: "99"; height: "84"; }
- ListElement{ longitude: "95"; latitude: "0"; height: "87"; }
- ListElement{ longitude: "95"; latitude: "1"; height: "89"; }
- ListElement{ longitude: "95"; latitude: "2"; height: "92"; }
- ListElement{ longitude: "95"; latitude: "3"; height: "96"; }
- ListElement{ longitude: "95"; latitude: "4"; height: "100"; }
- ListElement{ longitude: "95"; latitude: "5"; height: "107"; }
- ListElement{ longitude: "95"; latitude: "6"; height: "101"; }
- ListElement{ longitude: "95"; latitude: "7"; height: "102"; }
- ListElement{ longitude: "95"; latitude: "8"; height: "96"; }
- ListElement{ longitude: "95"; latitude: "9"; height: "93"; }
- ListElement{ longitude: "95"; latitude: "10"; height: "91"; }
- ListElement{ longitude: "95"; latitude: "11"; height: "91"; }
- ListElement{ longitude: "95"; latitude: "12"; height: "92"; }
- ListElement{ longitude: "95"; latitude: "13"; height: "93"; }
- ListElement{ longitude: "95"; latitude: "14"; height: "94"; }
- ListElement{ longitude: "95"; latitude: "15"; height: "95"; }
- ListElement{ longitude: "95"; latitude: "16"; height: "99"; }
- ListElement{ longitude: "95"; latitude: "17"; height: "99"; }
- ListElement{ longitude: "95"; latitude: "18"; height: "103"; }
- ListElement{ longitude: "95"; latitude: "19"; height: "111"; }
- ListElement{ longitude: "95"; latitude: "20"; height: "115"; }
- ListElement{ longitude: "95"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "95"; latitude: "22"; height: "122"; }
- ListElement{ longitude: "95"; latitude: "23"; height: "121"; }
- ListElement{ longitude: "95"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "95"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "95"; latitude: "26"; height: "125"; }
- ListElement{ longitude: "95"; latitude: "27"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "28"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "29"; height: "119"; }
- ListElement{ longitude: "95"; latitude: "30"; height: "116"; }
- ListElement{ longitude: "95"; latitude: "31"; height: "111"; }
- ListElement{ longitude: "95"; latitude: "32"; height: "113"; }
- ListElement{ longitude: "95"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "95"; latitude: "34"; height: "110"; }
- ListElement{ longitude: "95"; latitude: "35"; height: "112"; }
- ListElement{ longitude: "95"; latitude: "36"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "37"; height: "125"; }
- ListElement{ longitude: "95"; latitude: "38"; height: "123"; }
- ListElement{ longitude: "95"; latitude: "39"; height: "121"; }
- ListElement{ longitude: "95"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "95"; latitude: "41"; height: "119"; }
- ListElement{ longitude: "95"; latitude: "42"; height: "120"; }
- ListElement{ longitude: "95"; latitude: "43"; height: "120"; }
- ListElement{ longitude: "95"; latitude: "44"; height: "122"; }
- ListElement{ longitude: "95"; latitude: "45"; height: "128"; }
- ListElement{ longitude: "95"; latitude: "46"; height: "132"; }
- ListElement{ longitude: "95"; latitude: "47"; height: "141"; }
- ListElement{ longitude: "95"; latitude: "48"; height: "139"; }
- ListElement{ longitude: "95"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "95"; latitude: "50"; height: "143"; }
- ListElement{ longitude: "95"; latitude: "51"; height: "138"; }
- ListElement{ longitude: "95"; latitude: "52"; height: "145"; }
- ListElement{ longitude: "95"; latitude: "53"; height: "143"; }
- ListElement{ longitude: "95"; latitude: "54"; height: "140"; }
- ListElement{ longitude: "95"; latitude: "55"; height: "140"; }
- ListElement{ longitude: "95"; latitude: "56"; height: "125"; }
- ListElement{ longitude: "95"; latitude: "57"; height: "120"; }
- ListElement{ longitude: "95"; latitude: "58"; height: "128"; }
- ListElement{ longitude: "95"; latitude: "59"; height: "128"; }
- ListElement{ longitude: "95"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "95"; latitude: "61"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "62"; height: "129"; }
- ListElement{ longitude: "95"; latitude: "63"; height: "129"; }
- ListElement{ longitude: "95"; latitude: "64"; height: "129"; }
- ListElement{ longitude: "95"; latitude: "65"; height: "130"; }
- ListElement{ longitude: "95"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "95"; latitude: "67"; height: "127"; }
- ListElement{ longitude: "95"; latitude: "68"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "69"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "70"; height: "129"; }
- ListElement{ longitude: "95"; latitude: "71"; height: "126"; }
- ListElement{ longitude: "95"; latitude: "72"; height: "121"; }
- ListElement{ longitude: "95"; latitude: "73"; height: "122"; }
- ListElement{ longitude: "95"; latitude: "74"; height: "120"; }
- ListElement{ longitude: "95"; latitude: "75"; height: "122"; }
- ListElement{ longitude: "95"; latitude: "76"; height: "124"; }
- ListElement{ longitude: "95"; latitude: "77"; height: "128"; }
- ListElement{ longitude: "95"; latitude: "78"; height: "129"; }
- ListElement{ longitude: "95"; latitude: "79"; height: "133"; }
- ListElement{ longitude: "95"; latitude: "80"; height: "134"; }
- ListElement{ longitude: "95"; latitude: "81"; height: "133"; }
- ListElement{ longitude: "95"; latitude: "82"; height: "137"; }
- ListElement{ longitude: "95"; latitude: "83"; height: "139"; }
- ListElement{ longitude: "95"; latitude: "84"; height: "146"; }
- ListElement{ longitude: "95"; latitude: "85"; height: "146"; }
- ListElement{ longitude: "95"; latitude: "86"; height: "139"; }
- ListElement{ longitude: "95"; latitude: "87"; height: "124"; }
- ListElement{ longitude: "95"; latitude: "88"; height: "112"; }
- ListElement{ longitude: "95"; latitude: "89"; height: "105"; }
- ListElement{ longitude: "95"; latitude: "90"; height: "110"; }
- ListElement{ longitude: "95"; latitude: "91"; height: "116"; }
- ListElement{ longitude: "95"; latitude: "92"; height: "116"; }
- ListElement{ longitude: "95"; latitude: "93"; height: "114"; }
- ListElement{ longitude: "95"; latitude: "94"; height: "112"; }
- ListElement{ longitude: "95"; latitude: "95"; height: "107"; }
- ListElement{ longitude: "95"; latitude: "96"; height: "103"; }
- ListElement{ longitude: "95"; latitude: "97"; height: "101"; }
- ListElement{ longitude: "95"; latitude: "98"; height: "91"; }
- ListElement{ longitude: "95"; latitude: "99"; height: "83"; }
- ListElement{ longitude: "96"; latitude: "0"; height: "87"; }
- ListElement{ longitude: "96"; latitude: "1"; height: "84"; }
- ListElement{ longitude: "96"; latitude: "2"; height: "87"; }
- ListElement{ longitude: "96"; latitude: "3"; height: "91"; }
- ListElement{ longitude: "96"; latitude: "4"; height: "91"; }
- ListElement{ longitude: "96"; latitude: "5"; height: "102"; }
- ListElement{ longitude: "96"; latitude: "6"; height: "107"; }
- ListElement{ longitude: "96"; latitude: "7"; height: "107"; }
- ListElement{ longitude: "96"; latitude: "8"; height: "101"; }
- ListElement{ longitude: "96"; latitude: "9"; height: "95"; }
- ListElement{ longitude: "96"; latitude: "10"; height: "91"; }
- ListElement{ longitude: "96"; latitude: "11"; height: "91"; }
- ListElement{ longitude: "96"; latitude: "12"; height: "92"; }
- ListElement{ longitude: "96"; latitude: "13"; height: "92"; }
- ListElement{ longitude: "96"; latitude: "14"; height: "93"; }
- ListElement{ longitude: "96"; latitude: "15"; height: "96"; }
- ListElement{ longitude: "96"; latitude: "16"; height: "97"; }
- ListElement{ longitude: "96"; latitude: "17"; height: "97"; }
- ListElement{ longitude: "96"; latitude: "18"; height: "93"; }
- ListElement{ longitude: "96"; latitude: "19"; height: "109"; }
- ListElement{ longitude: "96"; latitude: "20"; height: "114"; }
- ListElement{ longitude: "96"; latitude: "21"; height: "119"; }
- ListElement{ longitude: "96"; latitude: "22"; height: "121"; }
- ListElement{ longitude: "96"; latitude: "23"; height: "120"; }
- ListElement{ longitude: "96"; latitude: "24"; height: "120"; }
- ListElement{ longitude: "96"; latitude: "25"; height: "121"; }
- ListElement{ longitude: "96"; latitude: "26"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "27"; height: "125"; }
- ListElement{ longitude: "96"; latitude: "28"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "29"; height: "119"; }
- ListElement{ longitude: "96"; latitude: "30"; height: "117"; }
- ListElement{ longitude: "96"; latitude: "31"; height: "115"; }
- ListElement{ longitude: "96"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "96"; latitude: "33"; height: "123"; }
- ListElement{ longitude: "96"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "96"; latitude: "35"; height: "128"; }
- ListElement{ longitude: "96"; latitude: "36"; height: "128"; }
- ListElement{ longitude: "96"; latitude: "37"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "38"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "39"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "40"; height: "125"; }
- ListElement{ longitude: "96"; latitude: "41"; height: "123"; }
- ListElement{ longitude: "96"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "96"; latitude: "43"; height: "122"; }
- ListElement{ longitude: "96"; latitude: "44"; height: "120"; }
- ListElement{ longitude: "96"; latitude: "45"; height: "125"; }
- ListElement{ longitude: "96"; latitude: "46"; height: "133"; }
- ListElement{ longitude: "96"; latitude: "47"; height: "139"; }
- ListElement{ longitude: "96"; latitude: "48"; height: "134"; }
- ListElement{ longitude: "96"; latitude: "49"; height: "136"; }
- ListElement{ longitude: "96"; latitude: "50"; height: "147"; }
- ListElement{ longitude: "96"; latitude: "51"; height: "149"; }
- ListElement{ longitude: "96"; latitude: "52"; height: "148"; }
- ListElement{ longitude: "96"; latitude: "53"; height: "149"; }
- ListElement{ longitude: "96"; latitude: "54"; height: "146"; }
- ListElement{ longitude: "96"; latitude: "55"; height: "144"; }
- ListElement{ longitude: "96"; latitude: "56"; height: "137"; }
- ListElement{ longitude: "96"; latitude: "57"; height: "133"; }
- ListElement{ longitude: "96"; latitude: "58"; height: "133"; }
- ListElement{ longitude: "96"; latitude: "59"; height: "128"; }
- ListElement{ longitude: "96"; latitude: "60"; height: "128"; }
- ListElement{ longitude: "96"; latitude: "61"; height: "130"; }
- ListElement{ longitude: "96"; latitude: "62"; height: "132"; }
- ListElement{ longitude: "96"; latitude: "63"; height: "132"; }
- ListElement{ longitude: "96"; latitude: "64"; height: "133"; }
- ListElement{ longitude: "96"; latitude: "65"; height: "134"; }
- ListElement{ longitude: "96"; latitude: "66"; height: "136"; }
- ListElement{ longitude: "96"; latitude: "67"; height: "131"; }
- ListElement{ longitude: "96"; latitude: "68"; height: "129"; }
- ListElement{ longitude: "96"; latitude: "69"; height: "130"; }
- ListElement{ longitude: "96"; latitude: "70"; height: "130"; }
- ListElement{ longitude: "96"; latitude: "71"; height: "130"; }
- ListElement{ longitude: "96"; latitude: "72"; height: "123"; }
- ListElement{ longitude: "96"; latitude: "73"; height: "127"; }
- ListElement{ longitude: "96"; latitude: "74"; height: "122"; }
- ListElement{ longitude: "96"; latitude: "75"; height: "124"; }
- ListElement{ longitude: "96"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "96"; latitude: "77"; height: "130"; }
- ListElement{ longitude: "96"; latitude: "78"; height: "132"; }
- ListElement{ longitude: "96"; latitude: "79"; height: "135"; }
- ListElement{ longitude: "96"; latitude: "80"; height: "135"; }
- ListElement{ longitude: "96"; latitude: "81"; height: "132"; }
- ListElement{ longitude: "96"; latitude: "82"; height: "136"; }
- ListElement{ longitude: "96"; latitude: "83"; height: "138"; }
- ListElement{ longitude: "96"; latitude: "84"; height: "144"; }
- ListElement{ longitude: "96"; latitude: "85"; height: "143"; }
- ListElement{ longitude: "96"; latitude: "86"; height: "135"; }
- ListElement{ longitude: "96"; latitude: "87"; height: "122"; }
- ListElement{ longitude: "96"; latitude: "88"; height: "113"; }
- ListElement{ longitude: "96"; latitude: "89"; height: "107"; }
- ListElement{ longitude: "96"; latitude: "90"; height: "106"; }
- ListElement{ longitude: "96"; latitude: "91"; height: "112"; }
- ListElement{ longitude: "96"; latitude: "92"; height: "119"; }
- ListElement{ longitude: "96"; latitude: "93"; height: "117"; }
- ListElement{ longitude: "96"; latitude: "94"; height: "106"; }
- ListElement{ longitude: "96"; latitude: "95"; height: "95"; }
- ListElement{ longitude: "96"; latitude: "96"; height: "87"; }
- ListElement{ longitude: "96"; latitude: "97"; height: "85"; }
- ListElement{ longitude: "96"; latitude: "98"; height: "81"; }
- ListElement{ longitude: "96"; latitude: "99"; height: "75"; }
- ListElement{ longitude: "97"; latitude: "0"; height: "92"; }
- ListElement{ longitude: "97"; latitude: "1"; height: "92"; }
- ListElement{ longitude: "97"; latitude: "2"; height: "90"; }
- ListElement{ longitude: "97"; latitude: "3"; height: "86"; }
- ListElement{ longitude: "97"; latitude: "4"; height: "78"; }
- ListElement{ longitude: "97"; latitude: "5"; height: "86"; }
- ListElement{ longitude: "97"; latitude: "6"; height: "94"; }
- ListElement{ longitude: "97"; latitude: "7"; height: "93"; }
- ListElement{ longitude: "97"; latitude: "8"; height: "92"; }
- ListElement{ longitude: "97"; latitude: "9"; height: "90"; }
- ListElement{ longitude: "97"; latitude: "10"; height: "86"; }
- ListElement{ longitude: "97"; latitude: "11"; height: "86"; }
- ListElement{ longitude: "97"; latitude: "12"; height: "90"; }
- ListElement{ longitude: "97"; latitude: "13"; height: "94"; }
- ListElement{ longitude: "97"; latitude: "14"; height: "95"; }
- ListElement{ longitude: "97"; latitude: "15"; height: "94"; }
- ListElement{ longitude: "97"; latitude: "16"; height: "95"; }
- ListElement{ longitude: "97"; latitude: "17"; height: "99"; }
- ListElement{ longitude: "97"; latitude: "18"; height: "104"; }
- ListElement{ longitude: "97"; latitude: "19"; height: "108"; }
- ListElement{ longitude: "97"; latitude: "20"; height: "115"; }
- ListElement{ longitude: "97"; latitude: "21"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "22"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "23"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "24"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "25"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "26"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "27"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "28"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "29"; height: "116"; }
- ListElement{ longitude: "97"; latitude: "30"; height: "116"; }
- ListElement{ longitude: "97"; latitude: "31"; height: "118"; }
- ListElement{ longitude: "97"; latitude: "32"; height: "122"; }
- ListElement{ longitude: "97"; latitude: "33"; height: "124"; }
- ListElement{ longitude: "97"; latitude: "34"; height: "126"; }
- ListElement{ longitude: "97"; latitude: "35"; height: "125"; }
- ListElement{ longitude: "97"; latitude: "36"; height: "119"; }
- ListElement{ longitude: "97"; latitude: "37"; height: "115"; }
- ListElement{ longitude: "97"; latitude: "38"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "39"; height: "116"; }
- ListElement{ longitude: "97"; latitude: "40"; height: "116"; }
- ListElement{ longitude: "97"; latitude: "41"; height: "114"; }
- ListElement{ longitude: "97"; latitude: "42"; height: "114"; }
- ListElement{ longitude: "97"; latitude: "43"; height: "114"; }
- ListElement{ longitude: "97"; latitude: "44"; height: "114"; }
- ListElement{ longitude: "97"; latitude: "45"; height: "119"; }
- ListElement{ longitude: "97"; latitude: "46"; height: "126"; }
- ListElement{ longitude: "97"; latitude: "47"; height: "132"; }
- ListElement{ longitude: "97"; latitude: "48"; height: "134"; }
- ListElement{ longitude: "97"; latitude: "49"; height: "137"; }
- ListElement{ longitude: "97"; latitude: "50"; height: "141"; }
- ListElement{ longitude: "97"; latitude: "51"; height: "143"; }
- ListElement{ longitude: "97"; latitude: "52"; height: "143"; }
- ListElement{ longitude: "97"; latitude: "53"; height: "143"; }
- ListElement{ longitude: "97"; latitude: "54"; height: "139"; }
- ListElement{ longitude: "97"; latitude: "55"; height: "136"; }
- ListElement{ longitude: "97"; latitude: "56"; height: "132"; }
- ListElement{ longitude: "97"; latitude: "57"; height: "127"; }
- ListElement{ longitude: "97"; latitude: "58"; height: "122"; }
- ListElement{ longitude: "97"; latitude: "59"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "60"; height: "117"; }
- ListElement{ longitude: "97"; latitude: "61"; height: "124"; }
- ListElement{ longitude: "97"; latitude: "62"; height: "130"; }
- ListElement{ longitude: "97"; latitude: "63"; height: "134"; }
- ListElement{ longitude: "97"; latitude: "64"; height: "137"; }
- ListElement{ longitude: "97"; latitude: "65"; height: "139"; }
- ListElement{ longitude: "97"; latitude: "66"; height: "139"; }
- ListElement{ longitude: "97"; latitude: "67"; height: "137"; }
- ListElement{ longitude: "97"; latitude: "68"; height: "133"; }
- ListElement{ longitude: "97"; latitude: "69"; height: "136"; }
- ListElement{ longitude: "97"; latitude: "70"; height: "131"; }
- ListElement{ longitude: "97"; latitude: "71"; height: "130"; }
- ListElement{ longitude: "97"; latitude: "72"; height: "129"; }
- ListElement{ longitude: "97"; latitude: "73"; height: "129"; }
- ListElement{ longitude: "97"; latitude: "74"; height: "126"; }
- ListElement{ longitude: "97"; latitude: "75"; height: "123"; }
- ListElement{ longitude: "97"; latitude: "76"; height: "126"; }
- ListElement{ longitude: "97"; latitude: "77"; height: "127"; }
- ListElement{ longitude: "97"; latitude: "78"; height: "128"; }
- ListElement{ longitude: "97"; latitude: "79"; height: "123"; }
- ListElement{ longitude: "97"; latitude: "80"; height: "123"; }
- ListElement{ longitude: "97"; latitude: "81"; height: "126"; }
- ListElement{ longitude: "97"; latitude: "82"; height: "129"; }
- ListElement{ longitude: "97"; latitude: "83"; height: "137"; }
- ListElement{ longitude: "97"; latitude: "84"; height: "140"; }
- ListElement{ longitude: "97"; latitude: "85"; height: "138"; }
- ListElement{ longitude: "97"; latitude: "86"; height: "132"; }
- ListElement{ longitude: "97"; latitude: "87"; height: "124"; }
- ListElement{ longitude: "97"; latitude: "88"; height: "111"; }
- ListElement{ longitude: "97"; latitude: "89"; height: "102"; }
- ListElement{ longitude: "97"; latitude: "90"; height: "99"; }
- ListElement{ longitude: "97"; latitude: "91"; height: "109"; }
- ListElement{ longitude: "97"; latitude: "92"; height: "110"; }
- ListElement{ longitude: "97"; latitude: "93"; height: "96"; }
- ListElement{ longitude: "97"; latitude: "94"; height: "76"; }
- ListElement{ longitude: "97"; latitude: "95"; height: "68"; }
- ListElement{ longitude: "97"; latitude: "96"; height: "68"; }
- ListElement{ longitude: "97"; latitude: "97"; height: "72"; }
- ListElement{ longitude: "97"; latitude: "98"; height: "70"; }
- ListElement{ longitude: "97"; latitude: "99"; height: "65"; }
- ListElement{ longitude: "98"; latitude: "0"; height: "93"; }
- ListElement{ longitude: "98"; latitude: "1"; height: "90"; }
- ListElement{ longitude: "98"; latitude: "2"; height: "85"; }
- ListElement{ longitude: "98"; latitude: "3"; height: "78"; }
- ListElement{ longitude: "98"; latitude: "4"; height: "74"; }
- ListElement{ longitude: "98"; latitude: "5"; height: "71"; }
- ListElement{ longitude: "98"; latitude: "6"; height: "80"; }
- ListElement{ longitude: "98"; latitude: "7"; height: "78"; }
- ListElement{ longitude: "98"; latitude: "8"; height: "83"; }
- ListElement{ longitude: "98"; latitude: "9"; height: "85"; }
- ListElement{ longitude: "98"; latitude: "10"; height: "81"; }
- ListElement{ longitude: "98"; latitude: "11"; height: "82"; }
- ListElement{ longitude: "98"; latitude: "12"; height: "87"; }
- ListElement{ longitude: "98"; latitude: "13"; height: "90"; }
- ListElement{ longitude: "98"; latitude: "14"; height: "91"; }
- ListElement{ longitude: "98"; latitude: "15"; height: "86"; }
- ListElement{ longitude: "98"; latitude: "16"; height: "88"; }
- ListElement{ longitude: "98"; latitude: "17"; height: "91"; }
- ListElement{ longitude: "98"; latitude: "18"; height: "94"; }
- ListElement{ longitude: "98"; latitude: "19"; height: "97"; }
- ListElement{ longitude: "98"; latitude: "20"; height: "108"; }
- ListElement{ longitude: "98"; latitude: "21"; height: "111"; }
- ListElement{ longitude: "98"; latitude: "22"; height: "108"; }
- ListElement{ longitude: "98"; latitude: "23"; height: "108"; }
- ListElement{ longitude: "98"; latitude: "24"; height: "107"; }
- ListElement{ longitude: "98"; latitude: "25"; height: "104"; }
- ListElement{ longitude: "98"; latitude: "26"; height: "110"; }
- ListElement{ longitude: "98"; latitude: "27"; height: "111"; }
- ListElement{ longitude: "98"; latitude: "28"; height: "109"; }
- ListElement{ longitude: "98"; latitude: "29"; height: "106"; }
- ListElement{ longitude: "98"; latitude: "30"; height: "110"; }
- ListElement{ longitude: "98"; latitude: "31"; height: "115"; }
- ListElement{ longitude: "98"; latitude: "32"; height: "119"; }
- ListElement{ longitude: "98"; latitude: "33"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "34"; height: "117"; }
- ListElement{ longitude: "98"; latitude: "35"; height: "114"; }
- ListElement{ longitude: "98"; latitude: "36"; height: "109"; }
- ListElement{ longitude: "98"; latitude: "37"; height: "105"; }
- ListElement{ longitude: "98"; latitude: "38"; height: "106"; }
- ListElement{ longitude: "98"; latitude: "39"; height: "111"; }
- ListElement{ longitude: "98"; latitude: "40"; height: "112"; }
- ListElement{ longitude: "98"; latitude: "41"; height: "110"; }
- ListElement{ longitude: "98"; latitude: "42"; height: "114"; }
- ListElement{ longitude: "98"; latitude: "43"; height: "114"; }
- ListElement{ longitude: "98"; latitude: "44"; height: "111"; }
- ListElement{ longitude: "98"; latitude: "45"; height: "112"; }
- ListElement{ longitude: "98"; latitude: "46"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "47"; height: "121"; }
- ListElement{ longitude: "98"; latitude: "48"; height: "124"; }
- ListElement{ longitude: "98"; latitude: "49"; height: "125"; }
- ListElement{ longitude: "98"; latitude: "50"; height: "125"; }
- ListElement{ longitude: "98"; latitude: "51"; height: "127"; }
- ListElement{ longitude: "98"; latitude: "52"; height: "126"; }
- ListElement{ longitude: "98"; latitude: "53"; height: "127"; }
- ListElement{ longitude: "98"; latitude: "54"; height: "126"; }
- ListElement{ longitude: "98"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "98"; latitude: "56"; height: "121"; }
- ListElement{ longitude: "98"; latitude: "57"; height: "119"; }
- ListElement{ longitude: "98"; latitude: "58"; height: "114"; }
- ListElement{ longitude: "98"; latitude: "59"; height: "111"; }
- ListElement{ longitude: "98"; latitude: "60"; height: "110"; }
- ListElement{ longitude: "98"; latitude: "61"; height: "115"; }
- ListElement{ longitude: "98"; latitude: "62"; height: "123"; }
- ListElement{ longitude: "98"; latitude: "63"; height: "131"; }
- ListElement{ longitude: "98"; latitude: "64"; height: "138"; }
- ListElement{ longitude: "98"; latitude: "65"; height: "140"; }
- ListElement{ longitude: "98"; latitude: "66"; height: "139"; }
- ListElement{ longitude: "98"; latitude: "67"; height: "136"; }
- ListElement{ longitude: "98"; latitude: "68"; height: "134"; }
- ListElement{ longitude: "98"; latitude: "69"; height: "133"; }
- ListElement{ longitude: "98"; latitude: "70"; height: "129"; }
- ListElement{ longitude: "98"; latitude: "71"; height: "127"; }
- ListElement{ longitude: "98"; latitude: "72"; height: "122"; }
- ListElement{ longitude: "98"; latitude: "73"; height: "119"; }
- ListElement{ longitude: "98"; latitude: "74"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "75"; height: "115"; }
- ListElement{ longitude: "98"; latitude: "76"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "77"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "78"; height: "117"; }
- ListElement{ longitude: "98"; latitude: "79"; height: "114"; }
- ListElement{ longitude: "98"; latitude: "80"; height: "113"; }
- ListElement{ longitude: "98"; latitude: "81"; height: "115"; }
- ListElement{ longitude: "98"; latitude: "82"; height: "119"; }
- ListElement{ longitude: "98"; latitude: "83"; height: "127"; }
- ListElement{ longitude: "98"; latitude: "84"; height: "130"; }
- ListElement{ longitude: "98"; latitude: "85"; height: "125"; }
- ListElement{ longitude: "98"; latitude: "86"; height: "116"; }
- ListElement{ longitude: "98"; latitude: "87"; height: "103"; }
- ListElement{ longitude: "98"; latitude: "88"; height: "89"; }
- ListElement{ longitude: "98"; latitude: "89"; height: "81"; }
- ListElement{ longitude: "98"; latitude: "90"; height: "79"; }
- ListElement{ longitude: "98"; latitude: "91"; height: "84"; }
- ListElement{ longitude: "98"; latitude: "92"; height: "86"; }
- ListElement{ longitude: "98"; latitude: "93"; height: "79"; }
- ListElement{ longitude: "98"; latitude: "94"; height: "69"; }
- ListElement{ longitude: "98"; latitude: "95"; height: "66"; }
- ListElement{ longitude: "98"; latitude: "96"; height: "73"; }
- ListElement{ longitude: "98"; latitude: "97"; height: "80"; }
- ListElement{ longitude: "98"; latitude: "98"; height: "71"; }
- ListElement{ longitude: "98"; latitude: "99"; height: "64"; }
- ListElement{ longitude: "99"; latitude: "0"; height: "93"; }
- ListElement{ longitude: "99"; latitude: "1"; height: "90"; }
- ListElement{ longitude: "99"; latitude: "2"; height: "86"; }
- ListElement{ longitude: "99"; latitude: "3"; height: "80"; }
- ListElement{ longitude: "99"; latitude: "4"; height: "74"; }
- ListElement{ longitude: "99"; latitude: "5"; height: "74"; }
- ListElement{ longitude: "99"; latitude: "6"; height: "80"; }
- ListElement{ longitude: "99"; latitude: "7"; height: "85"; }
- ListElement{ longitude: "99"; latitude: "8"; height: "85"; }
- ListElement{ longitude: "99"; latitude: "9"; height: "84"; }
- ListElement{ longitude: "99"; latitude: "10"; height: "83"; }
- ListElement{ longitude: "99"; latitude: "11"; height: "79"; }
- ListElement{ longitude: "99"; latitude: "12"; height: "77"; }
- ListElement{ longitude: "99"; latitude: "13"; height: "80"; }
- ListElement{ longitude: "99"; latitude: "14"; height: "86"; }
- ListElement{ longitude: "99"; latitude: "15"; height: "86"; }
- ListElement{ longitude: "99"; latitude: "16"; height: "84"; }
- ListElement{ longitude: "99"; latitude: "17"; height: "85"; }
- ListElement{ longitude: "99"; latitude: "18"; height: "90"; }
- ListElement{ longitude: "99"; latitude: "19"; height: "95"; }
- ListElement{ longitude: "99"; latitude: "20"; height: "99"; }
- ListElement{ longitude: "99"; latitude: "21"; height: "101"; }
- ListElement{ longitude: "99"; latitude: "22"; height: "102"; }
- ListElement{ longitude: "99"; latitude: "23"; height: "103"; }
- ListElement{ longitude: "99"; latitude: "24"; height: "106"; }
- ListElement{ longitude: "99"; latitude: "25"; height: "110"; }
- ListElement{ longitude: "99"; latitude: "26"; height: "113"; }
- ListElement{ longitude: "99"; latitude: "27"; height: "115"; }
- ListElement{ longitude: "99"; latitude: "28"; height: "115"; }
- ListElement{ longitude: "99"; latitude: "29"; height: "113"; }
- ListElement{ longitude: "99"; latitude: "30"; height: "112"; }
- ListElement{ longitude: "99"; latitude: "31"; height: "115"; }
- ListElement{ longitude: "99"; latitude: "32"; height: "117"; }
- ListElement{ longitude: "99"; latitude: "33"; height: "118"; }
- ListElement{ longitude: "99"; latitude: "34"; height: "117"; }
- ListElement{ longitude: "99"; latitude: "35"; height: "115"; }
- ListElement{ longitude: "99"; latitude: "36"; height: "112"; }
- ListElement{ longitude: "99"; latitude: "37"; height: "110"; }
- ListElement{ longitude: "99"; latitude: "38"; height: "114"; }
- ListElement{ longitude: "99"; latitude: "39"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "40"; height: "123"; }
- ListElement{ longitude: "99"; latitude: "41"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "42"; height: "122"; }
- ListElement{ longitude: "99"; latitude: "43"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "44"; height: "118"; }
- ListElement{ longitude: "99"; latitude: "45"; height: "117"; }
- ListElement{ longitude: "99"; latitude: "46"; height: "119"; }
- ListElement{ longitude: "99"; latitude: "47"; height: "123"; }
- ListElement{ longitude: "99"; latitude: "48"; height: "125"; }
- ListElement{ longitude: "99"; latitude: "49"; height: "125"; }
- ListElement{ longitude: "99"; latitude: "50"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "51"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "52"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "53"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "54"; height: "124"; }
- ListElement{ longitude: "99"; latitude: "55"; height: "122"; }
- ListElement{ longitude: "99"; latitude: "56"; height: "122"; }
- ListElement{ longitude: "99"; latitude: "57"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "58"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "59"; height: "116"; }
- ListElement{ longitude: "99"; latitude: "60"; height: "112"; }
- ListElement{ longitude: "99"; latitude: "61"; height: "113"; }
- ListElement{ longitude: "99"; latitude: "62"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "63"; height: "128"; }
- ListElement{ longitude: "99"; latitude: "64"; height: "132"; }
- ListElement{ longitude: "99"; latitude: "65"; height: "130"; }
- ListElement{ longitude: "99"; latitude: "66"; height: "130"; }
- ListElement{ longitude: "99"; latitude: "67"; height: "128"; }
- ListElement{ longitude: "99"; latitude: "68"; height: "126"; }
- ListElement{ longitude: "99"; latitude: "69"; height: "127"; }
- ListElement{ longitude: "99"; latitude: "70"; height: "126"; }
- ListElement{ longitude: "99"; latitude: "71"; height: "122"; }
- ListElement{ longitude: "99"; latitude: "72"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "73"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "74"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "75"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "76"; height: "121"; }
- ListElement{ longitude: "99"; latitude: "77"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "78"; height: "120"; }
- ListElement{ longitude: "99"; latitude: "79"; height: "119"; }
- ListElement{ longitude: "99"; latitude: "80"; height: "116"; }
- ListElement{ longitude: "99"; latitude: "81"; height: "113"; }
- ListElement{ longitude: "99"; latitude: "82"; height: "111"; }
- ListElement{ longitude: "99"; latitude: "83"; height: "107"; }
- ListElement{ longitude: "99"; latitude: "84"; height: "109"; }
- ListElement{ longitude: "99"; latitude: "85"; height: "107"; }
- ListElement{ longitude: "99"; latitude: "86"; height: "98"; }
- ListElement{ longitude: "99"; latitude: "87"; height: "87"; }
- ListElement{ longitude: "99"; latitude: "88"; height: "75"; }
- ListElement{ longitude: "99"; latitude: "89"; height: "68"; }
- ListElement{ longitude: "99"; latitude: "90"; height: "70"; }
- ListElement{ longitude: "99"; latitude: "91"; height: "81"; }
- ListElement{ longitude: "99"; latitude: "92"; height: "88"; }
- ListElement{ longitude: "99"; latitude: "93"; height: "89"; }
- ListElement{ longitude: "99"; latitude: "94"; height: "87"; }
- ListElement{ longitude: "99"; latitude: "95"; height: "87"; }
- ListElement{ longitude: "99"; latitude: "96"; height: "88"; }
- ListElement{ longitude: "99"; latitude: "97"; height: "84"; }
- ListElement{ longitude: "99"; latitude: "98"; height: "75"; }
- ListElement{ longitude: "99"; latitude: "99"; height: "67"; }
- }
-}
diff --git a/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml
deleted file mode 100644
index 19309cca..00000000
--- a/examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight + 10
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml
deleted file mode 100644
index 8a0802cb..00000000
--- a/examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml
+++ /dev/null
@@ -1,263 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtDataVisualization 1.0
-import "."
-
-Rectangle {
- id: mainview
- width: 1024
- height: 768
- color: surfacePlot.theme.windowColor
-
- Data {
- id: surfaceData
- }
-
- Item {
- id: surfaceView
- width: mainview.width
- height: mainview.height
- anchors.top: mainview.top
- anchors.left: mainview.left
-
- //! [0]
- ColorGradient {
- id: surfaceGradient
- ColorGradientStop { position: 0.0; color: "darkslategray" }
- ColorGradientStop { id: middleGradient; position: 0.25; color: "peru" }
- ColorGradientStop { position: 1.0; color: "red" }
- }
- //! [0]
-
- Surface3D {
- id: surfacePlot
- width: surfaceView.width
- height: surfaceView.height
- //! [7]
- theme: Theme3D {
- type: Theme3D.ThemeStoneMoss
- font.family: "STCaiyun"
- font.pointSize: 35
- colorStyle: Theme3D.ColorStyleRangeGradient
- baseGradients: [surfaceGradient]
- }
- //! [7]
- shadowQuality: AbstractGraph3D.ShadowQualityMedium
- selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft
- axisY.min: 0.0
- axisY.max: 500.0
- axisX.segmentCount: 10
- axisX.subSegmentCount: 2
- axisX.labelFormat: "%i"
- axisZ.segmentCount: 10
- axisZ.subSegmentCount: 2
- axisZ.labelFormat: "%i"
- axisY.segmentCount: 5
- axisY.subSegmentCount: 2
- axisY.labelFormat: "%i"
- axisY.title: "Height"
- axisX.title: "Latitude"
- axisZ.title: "Longitude"
-
- //! [5]
- Surface3DSeries {
- id: surfaceSeries
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
-
- ItemModelSurfaceDataProxy {
- //! [5]
- //! [6]
- itemModel: surfaceData.model
- rowRole: "longitude"
- columnRole: "latitude"
- yPosRole: "height"
- }
- //! [6]
- onDrawModeChanged: checkState()
- }
- //! [4]
- Surface3DSeries {
- id: heightSeries
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
- visible: false
-
- HeightMapSurfaceDataProxy {
- heightMapFile: ":/heightmaps/image"
- // We don't want the default data values set by heightmap proxy.
- minZValue: 30
- maxZValue: 60
- minXValue: 67
- maxXValue: 97
- }
-
- onDrawModeChanged: checkState()
- }
- //! [4]
- }
- }
-
- RowLayout {
- id: buttonLayout
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.right: parent.right
- opacity: 0.5
-
- NewButton {
- id: surfaceGridToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Show Surface Grid"
- //! [1]
- onClicked: {
- if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
- surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
- heightSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
- } else {
- surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
- heightSeries.drawMode |= Surface3DSeries.DrawWireframe;
- }
- }
- //! [1]
- }
-
- NewButton {
- id: surfaceToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Hide Surface"
- //! [8]
- onClicked: {
- if (surfaceSeries.drawMode & Surface3DSeries.DrawSurface) {
- surfaceSeries.drawMode &= ~Surface3DSeries.DrawSurface;
- heightSeries.drawMode &= ~Surface3DSeries.DrawSurface;
- } else {
- surfaceSeries.drawMode |= Surface3DSeries.DrawSurface;
- heightSeries.drawMode |= Surface3DSeries.DrawSurface;
- }
- }
- //! [8]
- }
-
- NewButton {
- id: flatShadingToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: surfaceSeries.flatShadingSupported ? "Show Flat" : "Flat not supported"
- enabled: surfaceSeries.flatShadingSupported
- //! [2]
- onClicked: {
- if (surfaceSeries.flatShadingEnabled === true) {
- surfaceSeries.flatShadingEnabled = false;
- heightSeries.flatShadingEnabled = false;
- text = "Show Flat"
- } else {
- surfaceSeries.flatShadingEnabled = true;
- heightSeries.flatShadingEnabled = true;
- text = "Show Smooth"
- }
- }
- //! [2]
- }
-
- NewButton {
- id: backgroundToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Hide Background"
- onClicked: {
- if (surfacePlot.theme.backgroundEnabled === true) {
- surfacePlot.theme.backgroundEnabled = false;
- text = "Show Background"
- } else {
- surfacePlot.theme.backgroundEnabled = true;
- text = "Hide Background"
- }
- }
- }
-
- NewButton {
- id: gridToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Hide Grid"
- onClicked: {
- if (surfacePlot.theme.gridEnabled === true) {
- surfacePlot.theme.gridEnabled = false;
- text = "Show Grid"
- } else {
- surfacePlot.theme.gridEnabled = true;
- text = "Hide Grid"
- }
- }
- }
-
- NewButton {
- id: seriesToggle
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: "Switch to Height Map Series"
- //! [3]
- onClicked: {
- if (surfaceSeries.visible === false) {
- surfacePlot.axisY.max = 500.0
- surfaceSeries.visible = true
- heightSeries.visible = false
- middleGradient.position = 0.25
- text = "Switch to Height Map Series"
- } else {
- surfacePlot.axisY.max = 250.0
- surfaceSeries.visible = false
- heightSeries.visible = true
- middleGradient.position = 0.50
- text = "Switch to Item Model Series"
- }
- }
- //! [3]
- }
- }
-
- function checkState() {
- if (surfaceSeries.drawMode & Surface3DSeries.DrawSurface)
- surfaceToggle.text = "Hide Surface"
- else
- surfaceToggle.text = "Show Surface"
-
- if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe)
- surfaceGridToggle.text = "Hide Surface Grid"
- else
- surfaceGridToggle.text = "Show Surface Grid"
- }
-}
diff --git a/examples/datavisualization/qmlsurface/qmlsurface.pro b/examples/datavisualization/qmlsurface/qmlsurface.pro
deleted file mode 100644
index 401d59a7..00000000
--- a/examples/datavisualization/qmlsurface/qmlsurface.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmlsurface.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlsurface/*
diff --git a/examples/datavisualization/qmlsurface/qmlsurface.qrc b/examples/datavisualization/qmlsurface/qmlsurface.qrc
deleted file mode 100644
index c27f2d56..00000000
--- a/examples/datavisualization/qmlsurface/qmlsurface.qrc
+++ /dev/null
@@ -1,10 +0,0 @@
-<RCC>
- <qresource prefix="/qml">
- <file>qml/qmlsurface/main.qml</file>
- <file>qml/qmlsurface/Data.qml</file>
- <file>qml/qmlsurface/NewButton.qml</file>
- </qresource>
- <qresource prefix="/heightmaps">
- <file alias="image">heightmap.png</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/qmlsurfacegallery/CMakeLists.txt b/examples/datavisualization/qmlsurfacegallery/CMakeLists.txt
new file mode 100644
index 00000000..ab4dd77d
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/CMakeLists.txt
@@ -0,0 +1,60 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(qmlsurfacegallery LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Qml)
+find_package(Qt6 COMPONENTS Quick)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(qmlsurfacegallery
+ main.cpp
+)
+set_target_properties(qmlsurfacegallery PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_link_libraries(qmlsurfacegallery PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Qml
+ Qt::Quick
+ Qt::DataVisualization
+)
+
+qt6_add_qml_module(qmlsurfacegallery
+ URI SurfaceGallery
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ SOURCES
+ datasource.cpp datasource.h
+ QML_FILES
+ qml/qmlsurfacegallery/main.qml
+ qml/qmlsurfacegallery/SpectrogramData.qml
+ qml/qmlsurfacegallery/SurfaceHeightMap.qml
+ qml/qmlsurfacegallery/SurfaceOscilloscope.qml
+ qml/qmlsurfacegallery/SurfaceSpectrogram.qml
+ RESOURCES
+ qml/qmlsurfacegallery/heightmap.png
+)
+
+install(TARGETS qmlsurfacegallery
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmlsurfacegallery/datasource.cpp
index 19580e03..7aeea178 100644
--- a/examples/datavisualization/qmloscilloscope/datasource.cpp
+++ b/examples/datavisualization/qmlsurfacegallery/datasource.cpp
@@ -1,50 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "datasource.h"
#include <QtCore/qmath.h>
#include <QtCore/qrandom.h>
-using namespace QtDataVisualization;
-
-//! [3]
-Q_DECLARE_METATYPE(QSurface3DSeries *)
-//! [3]
+#include <algorithm>
DataSource::DataSource(QObject *parent) :
- QObject(parent),
- m_index(-1),
- m_resetArray(nullptr)
+ QObject(parent)
{
- //! [4]
+ //! [3]
qRegisterMetaType<QSurface3DSeries *>();
- //! [4]
+ //! [3]
}
DataSource::~DataSource()
@@ -52,21 +20,22 @@ DataSource::~DataSource()
clearData();
}
-//! [0]
void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
- float xMin, float xMax, float yMin, float yMax,
+ float xMin, float xMax,
+ float yMin, float yMax,
float zMin, float zMax)
{
if (!cacheCount || !rowCount || !columnCount)
return;
clearData();
+
// Re-create the cache array
m_data.resize(cacheCount);
- for (int i(0); i < cacheCount; i++) {
+ for (int i = 0; i < cacheCount; ++i) {
QSurfaceDataArray &array = m_data[i];
array.reserve(rowCount);
- for (int j(0); j < rowCount; j++)
+ for (int j = 0; j < rowCount; ++j)
array.append(new QSurfaceDataRow(columnCount));
}
@@ -76,12 +45,14 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
int cacheIndexStep = columnCount / cacheCount;
float cacheStep = float(cacheIndexStep) * xRange / float(columnCount);
+ //! [0]
// Populate caches
- for (int i(0); i < cacheCount; i++) {
+ auto *generator = QRandomGenerator::global();
+ for (int i = 0; i < cacheCount; ++i) {
QSurfaceDataArray &cache = m_data[i];
float cacheXAdjustment = cacheStep * i;
float cacheIndexAdjustment = cacheIndexStep * i;
- for (int j(0); j < rowCount; j++) {
+ for (int j = 0; j < rowCount; ++j) {
QSurfaceDataRow &row = *(cache[j]);
float rowMod = (float(j)) / float(rowCount);
float yRangeMod = yRange * rowMod;
@@ -89,14 +60,14 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
float z = zRangeMod + zMin;
qreal rowColWaveAngleMul = M_PI * M_PI * rowMod;
float rowColWaveMul = yRangeMod * 0.2f;
- for (int k(0); k < columnCount; k++) {
+ for (int k = 0; k < columnCount; k++) {
float colMod = (float(k)) / float(columnCount);
float xRangeMod = xRange * colMod;
float x = xRangeMod + xMin + cacheXAdjustment;
float colWave = float(qSin((2.0 * M_PI * colMod) - (1.0 / 2.0 * M_PI)) + 1.0);
float y = (colWave * ((float(qSin(rowColWaveAngleMul * colMod) + 1.0))))
* rowColWaveMul
- + QRandomGenerator::global()->bounded(0.15f) * yRangeMod;
+ + generator->bounded(0.15f) * yRangeMod;
int index = k + cacheIndexAdjustment;
if (index >= columnCount) {
@@ -108,19 +79,18 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
}
}
}
+ //! [0]
}
-//! [0]
-//! [1]
void DataSource::update(QSurface3DSeries *series)
{
- if (series && m_data.size()) {
+ if (series && !m_data.isEmpty()) {
+ //! [1]
// Each iteration uses data from a different cached array
- m_index++;
- if (m_index > m_data.count() - 1)
+ if (++m_index >= m_data.size())
m_index = 0;
- QSurfaceDataArray array = m_data.at(m_index);
+ const QSurfaceDataArray &array = m_data.at(m_index);
int newRowCount = array.size();
int newColumnCount = array.at(0)->size();
@@ -130,30 +100,26 @@ void DataSource::update(QSurface3DSeries *series)
|| series->dataProxy()->columnCount() != newColumnCount) {
m_resetArray = new QSurfaceDataArray();
m_resetArray->reserve(newRowCount);
- for (int i(0); i < newRowCount; i++)
+ for (int i = 0; i < newRowCount; ++i)
m_resetArray->append(new QSurfaceDataRow(newColumnCount));
}
// Copy items from our cache to the reset array
- for (int i(0); i < newRowCount; i++) {
+ for (int i = 0; i < newRowCount; ++i) {
const QSurfaceDataRow &sourceRow = *(array.at(i));
QSurfaceDataRow &row = *(*m_resetArray)[i];
- for (int j(0); j < newColumnCount; j++)
- row[j].setPosition(sourceRow.at(j).position());
+ std::copy(sourceRow.cbegin(), sourceRow.cend(), row.begin());
}
// Notify the proxy that data has changed
series->dataProxy()->resetArray(m_resetArray);
+ //! [1]
}
}
-//! [1]
void DataSource::clearData()
{
- for (int i(0); i < m_data.size(); i++) {
- QSurfaceDataArray &array = m_data[i];
- for (int j(0); j < array.size(); j++)
- delete array[j];
- array.clear();
- }
+ for (auto &array : std::as_const(m_data))
+ qDeleteAll(array);
+ m_data.clear();
}
diff --git a/examples/datavisualization/qmlsurfacegallery/datasource.h b/examples/datavisualization/qmlsurfacegallery/datasource.h
new file mode 100644
index 00000000..bac5eeb2
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/datasource.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef DATASOURCE_H
+#define DATASOURCE_H
+
+#include <QtDataVisualization/qsurface3dseries.h>
+#include <QtQml/qqmlregistration.h>
+
+//! [0]
+//! [2]
+class DataSource : public QObject
+{
+ Q_OBJECT
+ //! [0]
+ QML_ELEMENT
+ //! [2]
+public:
+ explicit DataSource(QObject *parent = nullptr);
+ virtual ~DataSource();
+
+ //! [1]
+ Q_INVOKABLE void generateData(int cacheCount, int rowCount, int columnCount,
+ float xMin, float xMax,
+ float yMin, float yMax,
+ float zMin, float zMax);
+
+ Q_INVOKABLE void update(QSurface3DSeries *series);
+ //! [1]
+private:
+ void clearData();
+
+ QList<QSurfaceDataArray> m_data;
+ int m_index = -1;
+ QSurfaceDataArray *m_resetArray = nullptr;
+};
+
+#endif
diff --git a/examples/datavisualization/qmlsurfacegallery/doc/images/qmlsurfacegallery-example.png b/examples/datavisualization/qmlsurfacegallery/doc/images/qmlsurfacegallery-example.png
new file mode 100644
index 00000000..c7023160
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/doc/images/qmlsurfacegallery-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacegallery/doc/src/qmlsurfacegallery.qdoc b/examples/datavisualization/qmlsurfacegallery/doc/src/qmlsurfacegallery.qdoc
new file mode 100644
index 00000000..3b33177c
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/doc/src/qmlsurfacegallery.qdoc
@@ -0,0 +1,238 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \example qmlsurfacegallery
+ \meta tags {DataVisualization, Surface3D, Dynamic Data, Surface Graph, Height Map, Polar Graph}
+ \title Surface Graph Gallery
+ \ingroup qtdatavisualization_qmlexamples
+ \brief Gallery with three different ways to use a Surface3D graph.
+
+ \e {Surface Graph Gallery} demonstrates three different custom features with Surface3D graphs.
+ The features have their own tabs in the application.
+
+ The following sections concentrate on those features only and skip explaining the basic
+ functionality - for more detailed QML example documentation, see \l{Simple Scatter Graph}.
+
+ \image qmlsurfacegallery-example.png
+
+ \include examples-run.qdocinc
+
+ \section1 Height Map
+
+ In the \uicontrol {Height Map} tab, generate a surface graph from height data. The data used is
+ a height map of Mount Ruapehu and Mount Ngauruhoe in New Zealand.
+
+ \section2 Adding Data to the Graph
+
+ The data is set using HeightMapSurfaceDataProxy, which reads height information from a height
+ map image. The proxy itself is contained in a Surface3DSeries. Inside the
+ HeightMapSurfaceDataProxy the \c heightMapFile property specifies the image file containing the
+ height data. The value properties in the proxy define the minimum and maximum values for surface
+ area width, depth, and height. The \c z and \c x values are in latitude and longitude,
+ approximately at the real-world position, and the \c y is in meters.
+ \note The aspect ratio of the graph is not set to real-life scale, but the height is exaggerated
+ instead.
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 0
+
+ \section2 Displaying the Data
+
+ In \c main.qml, set up the Surface3D element to display the data.
+
+ First, define the custom gradient to be used for the surface. Set the colors from position
+ 0.0 to 1.0 with ColorGradient, with two extra stops to make the graph more vivid:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 1
+
+ Set this element into the \c baseGradients property in the \c theme used in Surface3D:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 2
+
+ Use the buttons to control other Surface3D features.
+
+ The first button toggles on and off the surface grid. The draw mode cannot
+ be cleared completely, so unless the surface itself is visible, the surface grid cannot be
+ hidden:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 3
+
+ The second one sets the surface grid color:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 4
+
+ The third one toggles the surface on or off in the surface draw mode. The draw mode cannot
+ be cleared completely, so unless the surface grid is visible, the surface itself cannot be
+ hidden:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 5
+
+ The fourth sets the for shading mode. If you are running the example on OpenGL ES system, flat
+ shading is not available:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml 6
+
+ The remaining buttons control the graph background features.
+
+ \section1 Spectrogram
+
+ In the \uicontrol {Spectrogram} tab, display polar and cartesian spectrograms and use
+ orthographic projection to show them in 2D.
+
+ A spectrogram is a surface graph with a range gradient used to emphasize the different
+ values. Typically, spectrograms are shown with two-dimensional surfaces, which is simulated
+ with a top-down orthographic view of the graph. To enforce the 2D effect, disable the
+ graph rotation via mouse or touch when in the orthographic mode.
+
+ \section2 Creating a Spectrogram
+
+ To create a 2D spectrogram, define a Surface3D item with the data given in the Surface3DSeries
+ with an ItemModelSurfaceDataProxy:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 0
+
+ The key properties for enabling the 2D effect are
+ \l{AbstractGraph3D::orthoProjection}{orthoProjection} and
+ \l{Camera3D::cameraPreset}{scene.activeCamera.cameraPreset}. Remove the perspective by
+ enabling orthographic projection for the graph, and the Y-dimension by viewing the graph
+ directly from above:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 1
+
+ Since this viewpoint causes the horizontal axis grid to be mostly obscured by the surface,
+ flip the horizontal grid to be drawn on top of the graph:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 2
+
+ \section2 Polar Spectrogram
+
+ Depending on the data, it is sometimes more natural to use a polar graph instead of a cartesian
+ one. This is supported via the \l{AbstractGraph3D::polar}{polar} property.
+
+ Add a button to switch between polar and cartesian modes:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 3
+
+ In the polar mode, X-axis is converted into the angular polar axis, and Z-axis is converted into
+ a radial polar axis. The surface points are recalculated according to the new axes.
+
+ The radial axis labels are drawn outside the graph by default. To draw them right next to the 0
+ degree angular axis inside the graph, define only a small offset for them:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 4
+
+ To enforce the 2D effect, disable graph rotation in orthographic mode by overriding the default
+ input handler with a custom one, which automatically toggles the
+ \l{InputHandler3D::rotationEnabled}{rotationEnabled} property based on the projection mode:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml 5
+
+ \section1 Oscilloscope
+
+ In the \uicontrol {Oscilloscope} tab, combine C++ and QML in an application, and show data that
+ dynamically changes.
+
+ \section2 Data Source in C++
+
+ The item model based proxies are good for simple or static graphs, but use basic proxies to
+ achieve the best performance when displaying data changing in realtime.
+ These are not supported in QML, as the data items they store do not inherit \l{QObject} and
+ cannot therefore be directly manipulated from QML code.
+ To overcome this limitation, implement a simple \c DataSource class in C++ to populate the
+ data proxy of the series.
+
+ Create a \c DataSource class to provide two methods that can be invoked from QML:
+
+ \snippet qmlsurfacegallery/datasource.h 0
+ \dots 4
+ \snippet qmlsurfacegallery/datasource.h 1
+
+ The first method, \c generateData(), creates a cache of simulated oscilloscope data to display.
+ The data is cached in a format that QSurfaceDataProxy accepts:
+
+ \snippet qmlsurfacegallery/datasource.cpp 0
+
+ The second method, \c update(), copies one set of the cached data into another array, which is
+ set to the data proxy of the series by calling QSurfaceDataProxy::resetArray().
+ To minimize overhead, reuse the same array if the array dimensions have not changed:
+
+ \snippet qmlsurfacegallery/datasource.cpp 1
+
+ Even though we are operating on the array pointer previously set to the proxy,
+ QSurfaceDataProxy::resetArray() still needs to be called after changing the data in it to prompt
+ the graph to render the data.
+
+ To be able to access the \c DataSource methods from QML, expose the data source by
+ making the DataSource a QML_ELEMENT:
+
+ \snippet qmlsurfacegallery/datasource.h 2
+
+ Further, declare it as a QML module in the CMakeLists.txt:
+
+ \badcode
+ qt6_add_qml_module(qmlsurfacegallery
+ URI SurfaceGallery
+ VERSION 1.0
+ NO_RESOURCE_TARGET_PATH
+ SOURCES
+ datasource.cpp datasource.h
+ ...
+ )
+ \endcode
+
+ To use QSurface3DSeries pointers as parameters for the \c DataSource class methods on all
+ environments and builds, make sure the meta type is registered:
+
+ \snippet qmlsurfacegallery/datasource.cpp 3
+
+ \section2 QML Application
+
+ To use the \c{DataSource}, import the QML module and create an instance of \c DataSource to be
+ used:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 0
+ \dots 0
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 1
+
+ Define a Surface3D graph and give it a Surface3DSeries:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 2
+
+ Don't specify a proxy for the Surface3DSeries that you attach to the graph. This makes the
+ series utilize the default QSurfaceDataProxy.
+
+ Hide the item label with \l{Abstract3DSeries::itemLabelVisible}{itemLabelVisible}. With dynamic,
+ fast-changing data, a floating selection label would be distracting and difficult to read.
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 3
+
+ You can display the selected item information in a \c Text element instead of the default
+ floating label above the selection pointer:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 4
+
+ Initialize the \c DataSource cache when the graph is complete by calling a helper function
+ \c generateData(), which calls the method with the same name in \c DataSource:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 5
+ \dots 0
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 6
+
+ To trigger the updates in data, define a \c{Timer}, which calls the \c update() method in
+ \c DataSource at requested intervals:
+
+ \snippet qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml 7
+
+ \section2 Enabling Direct Rendering
+
+ Since this application potentially deals with a lot of rapidly changing data, it uses direct
+ rendering mode for performance. To enable antialiasing in this mode, change the surface format
+ of the application window. The default format used by QQuickView doesn't support antialiasing.
+ Use the utility function provided to change the surface format in \c main.cpp:
+
+ \snippet qmlsurfacegallery/main.cpp 0
+ \dots 0
+ \snippet qmlsurfacegallery/main.cpp 1
+
+ \section1 Example Contents
+*/
diff --git a/examples/datavisualization/qmlsurfacegallery/main.cpp b/examples/datavisualization/qmlsurfacegallery/main.cpp
new file mode 100644
index 00000000..cbd831b6
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/main.cpp
@@ -0,0 +1,52 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+//! [0]
+#include <QtDataVisualization/qutils.h>
+//! [0]
+
+#include <QtGui/qguiapplication.h>
+#include <QtQuick/qquickview.h>
+#include <QtQml/qqmlengine.h>
+
+#ifdef QMAKE_BUILD
+#include "datasource.h"
+#endif
+
+using namespace Qt::StringLiterals;
+
+int main(int argc, char *argv[])
+{
+ qputenv("QSG_RHI_BACKEND", "opengl");
+ QGuiApplication app(argc, argv);
+
+#ifdef QMAKE_BUILD
+ qmlRegisterType<DataSource>("SurfaceGallery", 1, 0, "DataSource");
+#endif
+
+ QQuickView viewer;
+
+ //! [1]
+ // Enable antialiasing in direct rendering mode
+ viewer.setFormat(qDefaultSurfaceFormat(true));
+ //! [1]
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(u"%1/../../../../%2"_s);
+#else
+ QString extraImportPath(u"%1/../../../%2"_s);
+#endif
+ viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ u"qml"_s));
+ QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
+ viewer.setTitle(u"Surface Graph Gallery"_s);
+
+ viewer.setSource(QUrl(u"qrc:/qml/qmlsurfacegallery/main.qml"_s));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/Data.qml b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SpectrogramData.qml
index ed9913b3..6e1b5722 100644
--- a/examples/datavisualization/qmlspectrogram/qml/qmlspectrogram/Data.qml
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SpectrogramData.qml
@@ -1,33 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-import QtQuick 2.1
+import QtQuick
Item {
property alias model: dataModel
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml
new file mode 100644
index 00000000..6f65e17c
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceHeightMap.qml
@@ -0,0 +1,227 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
+
+Rectangle {
+ id: heightMapView
+ color: surfacePlot.theme.windowColor
+
+ required property bool portraitMode
+
+ property real buttonWidth: heightMapView.portraitMode ? (heightMapView.width - 35) / 2
+ : (heightMapView.width - 40) / 3
+
+ Item {
+ id: surfaceView
+ anchors.top: buttons.bottom
+ anchors.bottom: heightMapView.bottom
+ anchors.left: heightMapView.left
+ anchors.right: heightMapView.right
+
+ //! [1]
+ ColorGradient {
+ id: surfaceGradient
+ ColorGradientStop { position: 0.0; color: "darkgreen"}
+ ColorGradientStop { position: 0.15; color: "darkslategray" }
+ ColorGradientStop { position: 0.7; color: "peru" }
+ ColorGradientStop { position: 1.0; color: "white" }
+ }
+ //! [1]
+
+ Surface3D {
+ id: surfacePlot
+ width: surfaceView.width
+ height: surfaceView.height
+ aspectRatio: 3.0
+ //! [2]
+ theme: Theme3D {
+ type: Theme3D.ThemeStoneMoss
+ font.family: "STCaiyun"
+ font.pointSize: 35
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ baseGradients: [surfaceGradient] // Use the custom gradient
+ }
+ //! [2]
+ shadowQuality: AbstractGraph3D.ShadowQualityMedium
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft
+ axisX.segmentCount: 3
+ axisX.subSegmentCount: 3
+ axisX.labelFormat: "%i"
+ axisZ.segmentCount: 3
+ axisZ.subSegmentCount: 3
+ axisZ.labelFormat: "%i"
+ axisY.segmentCount: 2
+ axisY.subSegmentCount: 2
+ axisY.labelFormat: "%i"
+ axisY.title: "Height (m)"
+ axisX.title: "Longitude 175.x\"E"
+ axisZ.title: "Latitude -39.x\"N"
+ axisY.titleVisible: true
+ axisX.titleVisible: true
+ axisZ.titleVisible: true
+
+ //! [0]
+ Surface3DSeries {
+ id: heightSeries
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+
+ HeightMapSurfaceDataProxy {
+ heightMapFile: "://qml/qmlsurfacegallery/heightmap.png"
+ // We don't want the default data values set by heightmap proxy, but use
+ // actual coordinate and height values instead
+ autoScaleY: true
+ minYValue: 740
+ maxYValue: 2787
+ minZValue: -374 // ~ -39.374411"N
+ maxZValue: -116 // ~ -39.115971"N
+ minXValue: 472 // ~ 175.471767"E
+ maxXValue: 781 // ~ 175.780758"E
+ }
+
+ onDrawModeChanged: heightMapView.checkState()
+ }
+ //! [0]
+ }
+ }
+
+ Item {
+ id: buttons
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 10
+ height: heightMapView.portraitMode ? surfaceGridToggle.implicitHeight * 3 + 20
+ : surfaceGridToggle.implicitHeight * 2 + 15
+ opacity: 0.5
+
+ Button {
+ id: surfaceGridToggle
+ anchors.margins: 5
+ anchors.left: parent.left
+ anchors.top: parent.top
+ width: heightMapView.buttonWidth // Calculated elsewhere based on screen orientation
+ text: "Show Surface\nGrid"
+ //! [3]
+ onClicked: {
+ if (heightSeries.drawMode & Surface3DSeries.DrawWireframe)
+ heightSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ else
+ heightSeries.drawMode |= Surface3DSeries.DrawWireframe;
+ }
+ //! [3]
+ }
+
+ Button {
+ id: surfaceGridColor
+ anchors.margins: 5
+ anchors.left: surfaceGridToggle.right
+ anchors.top: parent.top
+ width: heightMapView.buttonWidth
+ text: "Red surface\ngrid color"
+ //! [4]
+ onClicked: {
+ if (Qt.colorEqual(heightSeries.wireframeColor, "#000000")) {
+ heightSeries.wireframeColor = "red";
+ text = "Black surface\ngrid color";
+ } else {
+ heightSeries.wireframeColor = "black";
+ text = "Red surface\ngrid color";
+ }
+ }
+ //! [4]
+ }
+
+ Button {
+ id: surfaceToggle
+ anchors.margins: 5
+ anchors.left: heightMapView.portraitMode ? parent.left : surfaceGridColor.right
+ anchors.top: heightMapView.portraitMode ? surfaceGridColor.bottom : parent.top
+ width: heightMapView.buttonWidth
+ text: "Hide\nSurface"
+ //! [5]
+ onClicked: {
+ if (heightSeries.drawMode & Surface3DSeries.DrawSurface)
+ heightSeries.drawMode &= ~Surface3DSeries.DrawSurface;
+ else
+ heightSeries.drawMode |= Surface3DSeries.DrawSurface;
+ }
+ //! [5]
+ }
+
+ Button {
+ id: flatShadingToggle
+ anchors.margins: 5
+ anchors.left: heightMapView.portraitMode ? surfaceToggle.right : parent.left
+ anchors.top: heightMapView.portraitMode ? surfaceGridColor.bottom : surfaceToggle.bottom
+ width: heightMapView.buttonWidth
+ text: heightSeries.flatShadingSupported ? "Show\nFlat" : "Flat not\nsupported"
+ enabled: heightSeries.flatShadingSupported
+ //! [6]
+ onClicked: {
+ if (heightSeries.flatShadingEnabled) {
+ heightSeries.flatShadingEnabled = false;
+ text = "Show\nFlat"
+ } else {
+ heightSeries.flatShadingEnabled = true;
+ text = "Show\nSmooth"
+ }
+ }
+ //! [6]
+ }
+
+ Button {
+ id: backgroundToggle
+ anchors.margins: 5
+ anchors.left: heightMapView.portraitMode ? parent.left : flatShadingToggle.right
+ anchors.top: heightMapView.portraitMode ? flatShadingToggle.bottom
+ : surfaceToggle.bottom
+ width: heightMapView.buttonWidth
+ text: "Hide\nBackground"
+ onClicked: {
+ if (surfacePlot.theme.backgroundEnabled) {
+ surfacePlot.theme.backgroundEnabled = false;
+ text = "Show\nBackground";
+ } else {
+ surfacePlot.theme.backgroundEnabled = true;
+ text = "Hide\nBackground";
+ }
+ }
+ }
+
+ Button {
+ id: gridToggle
+ anchors.margins: 5
+ anchors.left: backgroundToggle.right
+ anchors.top: heightMapView.portraitMode ? flatShadingToggle.bottom
+ : surfaceToggle.bottom
+ width: heightMapView.buttonWidth
+ text: "Hide\nGrid"
+ onClicked: {
+ if (surfacePlot.theme.gridEnabled) {
+ surfacePlot.theme.gridEnabled = false;
+ text = "Show\nGrid";
+ } else {
+ surfacePlot.theme.gridEnabled = true;
+ text = "Hide\nGrid";
+ }
+ }
+ }
+ }
+
+ function checkState() {
+ if (heightSeries.drawMode & Surface3DSeries.DrawSurface)
+ surfaceToggle.text = "Hide\nSurface";
+ else
+ surfaceToggle.text = "Show\nSurface";
+
+ if (heightSeries.drawMode & Surface3DSeries.DrawWireframe)
+ surfaceGridToggle.text = "Hide Surface\nGrid";
+ else
+ surfaceGridToggle.text = "Show Surface\nGrid";
+ }
+}
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml
new file mode 100644
index 00000000..a5ff8acd
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceOscilloscope.qml
@@ -0,0 +1,430 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
+//! [0]
+import SurfaceGallery
+//! [0]
+
+Item {
+ id: oscilloscopeView
+
+ property int sampleColumns: sampleSlider.value
+ property int sampleRows: sampleColumns / 2
+ property int sampleCache: 24
+
+ required property bool portraitMode
+
+ property real controlWidth: oscilloscopeView.portraitMode ? oscilloscopeView.width - 10
+ : oscilloscopeView.width / 4 - 6.66
+
+ property real buttonWidth: oscilloscopeView.portraitMode ? oscilloscopeView.width - 10
+ : oscilloscopeView.width / 3 - 7.5
+
+ onSampleRowsChanged: {
+ surfaceSeries.selectedPoint = surfaceSeries.invalidSelectionPosition
+ generateData()
+ }
+
+ //![1]
+ DataSource {
+ id: dataSource
+ }
+ //![1]
+
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ width: parent.width
+ height: parent.height - controlArea.height
+
+ //! [2]
+ Surface3D {
+ id: surfaceGraph
+ anchors.fill: parent
+
+ Surface3DSeries {
+ id: surfaceSeries
+ drawMode: Surface3DSeries.DrawSurfaceAndWireframe
+ itemLabelFormat: "@xLabel, @zLabel: @yLabel"
+ //! [2]
+ //! [3]
+ itemLabelVisible: false
+ //! [3]
+
+ //! [4]
+ onItemLabelChanged: {
+ if (surfaceSeries.selectedPoint == surfaceSeries.invalidSelectionPosition)
+ selectionText.text = "No selection";
+ else
+ selectionText.text = surfaceSeries.itemLabel;
+ }
+ //! [4]
+ }
+
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndColumn
+ theme: Theme3D {
+ type: Theme3D.ThemeIsabelle
+ backgroundEnabled: false
+ }
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetFrontHigh
+
+ axisX.labelFormat: "%d ms"
+ axisY.labelFormat: "%d W"
+ axisZ.labelFormat: "%d mV"
+ axisX.min: 0
+ axisY.min: 0
+ axisZ.min: 0
+ axisX.max: 1000
+ axisY.max: 100
+ axisZ.max: 800
+ axisX.segmentCount: 4
+ axisY.segmentCount: 4
+ axisZ.segmentCount: 4
+ measureFps: true
+ renderingMode: AbstractGraph3D.RenderDirectToBackground
+
+ onCurrentFpsChanged: (fps)=> {
+ if (fps > 10)
+ fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps);
+ else
+ fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps * 10.0) / 10.0;
+ }
+
+ //! [5]
+ Component.onCompleted: oscilloscopeView.generateData();
+ //! [5]
+ }
+ }
+
+ //! [7]
+ Timer {
+ id: refreshTimer
+ interval: 1000 / frequencySlider.value
+ running: true
+ repeat: true
+ onTriggered: dataSource.update(surfaceSeries);
+ }
+ //! [7]
+
+ Rectangle {
+ id: controlArea
+ height: oscilloscopeView.portraitMode ? flatShadingToggle.implicitHeight * 7
+ : flatShadingToggle.implicitHeight * 2
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.right: parent.right
+ color: surfaceGraph.theme.backgroundColor
+
+ // Samples
+ Rectangle {
+ id: samples
+ width: oscilloscopeView.controlWidth
+ height: flatShadingToggle.implicitHeight
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.margins: 5
+
+ color: surfaceGraph.theme.windowColor
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 4
+
+ Row {
+ anchors.centerIn: parent
+ spacing: 10
+ padding: 5
+
+ Slider {
+ id: sampleSlider
+ from: oscilloscopeView.sampleCache * 2
+ to: from * 10
+ stepSize: oscilloscopeView.sampleCache
+
+ background: Rectangle {
+ x: sampleSlider.leftPadding
+ y: sampleSlider.topPadding + sampleSlider.availableHeight / 2
+ - height / 2
+ implicitWidth: 200
+ implicitHeight: 4
+ width: sampleSlider.availableWidth
+ height: implicitHeight
+ radius: 2
+ color: surfaceGraph.theme.gridLineColor
+
+ Rectangle {
+ width: sampleSlider.visualPosition * parent.width
+ height: parent.height
+ color: surfaceGraph.theme.labelTextColor
+ radius: 2
+ }
+ }
+
+ handle: Rectangle {
+ x: sampleSlider.leftPadding + sampleSlider.visualPosition
+ * (sampleSlider.availableWidth - width)
+ y: sampleSlider.topPadding + sampleSlider.availableHeight / 2
+ - height / 2
+ implicitWidth: 20
+ implicitHeight: 20
+ radius: 10
+ color: sampleSlider.pressed ? surfaceGraph.theme.gridLineColor
+ : surfaceGraph.theme.windowColor
+ border.color: sampleSlider.pressed ? surfaceGraph.theme.labelTextColor
+ : surfaceGraph.theme.gridLineColor
+ }
+
+ Component.onCompleted: value = from;
+ }
+
+ Text {
+ id: samplesText
+ text: "Samples: " + (oscilloscopeView.sampleRows * oscilloscopeView.sampleColumns)
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ color: surfaceGraph.theme.labelTextColor
+ }
+ }
+ }
+
+ // Frequency
+ Rectangle {
+ id: frequency
+ width: oscilloscopeView.controlWidth
+ height: flatShadingToggle.implicitHeight
+ anchors.left: oscilloscopeView.portraitMode ? parent.left : samples.right
+ anchors.top: oscilloscopeView.portraitMode ? samples.bottom : parent.top
+ anchors.margins: 5
+
+ color: surfaceGraph.theme.windowColor
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 4
+
+ Row {
+ anchors.centerIn: parent
+ spacing: 10
+ padding: 5
+
+ Slider {
+ id: frequencySlider
+ from: 2
+ to: 60
+ stepSize: 2
+ value: 30
+
+ background: Rectangle {
+ x: frequencySlider.leftPadding
+ y: frequencySlider.topPadding + frequencySlider.availableHeight / 2
+ - height / 2
+ implicitWidth: 200
+ implicitHeight: 4
+ width: frequencySlider.availableWidth
+ height: implicitHeight
+ radius: 2
+ color: surfaceGraph.theme.gridLineColor
+
+ Rectangle {
+ width: frequencySlider.visualPosition * parent.width
+ height: parent.height
+ color: surfaceGraph.theme.labelTextColor
+ radius: 2
+ }
+ }
+
+ handle: Rectangle {
+ x: frequencySlider.leftPadding + frequencySlider.visualPosition
+ * (frequencySlider.availableWidth - width)
+ y: frequencySlider.topPadding + frequencySlider.availableHeight / 2
+ - height / 2
+ implicitWidth: 20
+ implicitHeight: 20
+ radius: 10
+ color: frequencySlider.pressed ? surfaceGraph.theme.gridLineColor
+ : surfaceGraph.theme.windowColor
+ border.color: frequencySlider.pressed ? surfaceGraph.theme.labelTextColor
+ : surfaceGraph.theme.gridLineColor
+ }
+ }
+
+ Text {
+ id: frequencyText
+ text: "Freq: " + frequencySlider.value + " Hz"
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ color: surfaceGraph.theme.labelTextColor
+ }
+ }
+ }
+
+ // FPS
+ Rectangle {
+ id: fpsindicator
+ width: oscilloscopeView.controlWidth
+ height: flatShadingToggle.implicitHeight
+ anchors.left: oscilloscopeView.portraitMode ? parent.left : frequency.right
+ anchors.top: oscilloscopeView.portraitMode ? frequency.bottom : parent.top
+ anchors.margins: 5
+
+ color: surfaceGraph.theme.windowColor
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 4
+
+ Text {
+ id: fpsText
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ color: surfaceGraph.theme.labelTextColor
+ }
+ }
+
+ // Selection
+ Rectangle {
+ id: selection
+ width: oscilloscopeView.controlWidth
+ height: flatShadingToggle.implicitHeight
+ anchors.left: oscilloscopeView.portraitMode ? parent.left : fpsindicator.right
+ anchors.top: oscilloscopeView.portraitMode ? fpsindicator.bottom : parent.top
+ anchors.margins: 5
+
+ color: surfaceGraph.theme.windowColor
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 4
+
+ Text {
+ id: selectionText
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: "No selection"
+ color: surfaceGraph.theme.labelTextColor
+ }
+ }
+
+ // Flat shading
+ Button {
+ id: flatShadingToggle
+ width: oscilloscopeView.buttonWidth
+ anchors.left: parent.left
+ anchors.top: selection.bottom
+ anchors.margins: 5
+
+ text: surfaceSeries.flatShadingSupported ? "Show\nSmooth" : "Flat\nnot supported"
+ enabled: surfaceSeries.flatShadingSupported
+
+ onClicked: {
+ if (surfaceSeries.flatShadingEnabled) {
+ surfaceSeries.flatShadingEnabled = false;
+ text = "Show\nFlat"
+ } else {
+ surfaceSeries.flatShadingEnabled = true;
+ text = "Show\nSmooth"
+ }
+ }
+
+ contentItem: Text {
+ text: flatShadingToggle.text
+ opacity: flatShadingToggle.enabled ? 1.0 : 0.3
+ color: surfaceGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ opacity: flatShadingToggle.enabled ? 1 : 0.3
+ color: flatShadingToggle.down ? surfaceGraph.theme.gridLineColor
+ : surfaceGraph.theme.windowColor
+ border.color: flatShadingToggle.down ? surfaceGraph.theme.labelTextColor
+ : surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
+ }
+
+ // Surface grid
+ Button {
+ id: surfaceGridToggle
+ width: oscilloscopeView.buttonWidth
+ anchors.left: oscilloscopeView.portraitMode ? parent.left : flatShadingToggle.right
+ anchors.top: oscilloscopeView.portraitMode ? flatShadingToggle.bottom : selection.bottom
+ anchors.margins: 5
+
+ text: "Hide\nSurface Grid"
+
+ onClicked: {
+ if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ text = "Show\nSurface Grid";
+ } else {
+ surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
+ text = "Hid\nSurface Grid";
+ }
+ }
+
+ contentItem: Text {
+ text: surfaceGridToggle.text
+ color: surfaceGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ color: surfaceGridToggle.down ? surfaceGraph.theme.gridLineColor
+ : surfaceGraph.theme.windowColor
+ border.color: surfaceGridToggle.down ? surfaceGraph.theme.labelTextColor
+ : surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
+ }
+
+ // Exit
+ Button {
+ id: exitButton
+ width: oscilloscopeView.buttonWidth
+ height: surfaceGridToggle.height
+ anchors.left: oscilloscopeView.portraitMode ? parent.left : surfaceGridToggle.right
+ anchors.top: oscilloscopeView.portraitMode ? surfaceGridToggle.bottom : selection.bottom
+ anchors.margins: 5
+
+ text: "Quit"
+
+ onClicked: Qt.quit();
+
+ contentItem: Text {
+ text: exitButton.text
+ color: surfaceGraph.theme.labelTextColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ }
+
+ background: Rectangle {
+ color: exitButton.down ? surfaceGraph.theme.gridLineColor
+ : surfaceGraph.theme.windowColor
+ border.color: exitButton.down ? surfaceGraph.theme.labelTextColor
+ : surfaceGraph.theme.gridLineColor
+ border.width: 1
+ radius: 2
+ }
+ }
+ }
+
+ //! [6]
+ function generateData() {
+ dataSource.generateData(oscilloscopeView.sampleCache, oscilloscopeView.sampleRows,
+ oscilloscopeView.sampleColumns,
+ surfaceGraph.axisX.min, surfaceGraph.axisX.max,
+ surfaceGraph.axisY.min, surfaceGraph.axisY.max,
+ surfaceGraph.axisZ.min, surfaceGraph.axisZ.max);
+ }
+ //! [6]
+}
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml
new file mode 100644
index 00000000..cedb9850
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/SurfaceSpectrogram.qml
@@ -0,0 +1,272 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtDataVisualization
+
+Rectangle {
+ id: spectrogramView
+ color: surfaceGraph.theme.windowColor
+
+ required property bool portraitMode
+
+ property real buttonWidth: spectrogramView.portraitMode ? (spectrogramView.width - 35) / 2
+ : (spectrogramView.width - 50) / 5
+
+ SpectrogramData {
+ id: surfaceData
+ }
+
+ Item {
+ id: surfaceView
+ anchors.top: buttons.bottom
+ anchors.left: parent.left
+ anchors.right: legend.left
+ anchors.bottom: parent.bottom
+
+ ColorGradient {
+ id: surfaceGradient
+ ColorGradientStop { position: 0.0; color: "black" }
+ ColorGradientStop { position: 0.2; color: "red" }
+ ColorGradientStop { position: 0.5; color: "blue" }
+ ColorGradientStop { position: 0.8; color: "yellow" }
+ ColorGradientStop { position: 1.0; color: "white" }
+ }
+
+ ValueAxis3D {
+ id: xAxis
+ segmentCount: 8
+ labelFormat: "%i\u00B0"
+ title: "Angle"
+ titleVisible: true
+ titleFixed: false
+ }
+
+ ValueAxis3D {
+ id: yAxis
+ segmentCount: 8
+ labelFormat: "%i \%"
+ title: "Value"
+ titleVisible: true
+ labelAutoRotation: 0
+ titleFixed: false
+ }
+
+ ValueAxis3D {
+ id: zAxis
+ segmentCount: 5
+ labelFormat: "%i nm"
+ title: "Radius"
+ titleVisible: true
+ titleFixed: false
+ }
+
+ Theme3D {
+ id: customTheme
+ type: Theme3D.ThemeQt
+ // Don't show specular spotlight as we don't want it to distort the colors
+ lightStrength: 0.0
+ ambientLightStrength: 1.0
+ backgroundEnabled: false
+ gridLineColor: "#AAAAAA"
+ windowColor: "#EEEEEE"
+ }
+
+ //! [0]
+ Surface3D {
+ id: surfaceGraph
+ anchors.fill: parent
+
+ Surface3DSeries {
+ id: surfaceSeries
+ flatShadingEnabled: false
+ drawMode: Surface3DSeries.DrawSurface
+ baseGradient: surfaceGradient
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ itemLabelFormat: "(@xLabel, @zLabel): @yLabel"
+
+ ItemModelSurfaceDataProxy {
+ itemModel: surfaceData.model
+ rowRole: "radius"
+ columnRole: "angle"
+ yPosRole: "value"
+ }
+ }
+ //! [0]
+
+ //! [1]
+ // Remove the perspective and view the graph from top down to achieve 2D effect
+ orthoProjection: true
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetDirectlyAbove
+ //! [1]
+
+ //! [2]
+ flipHorizontalGrid: true
+ //! [2]
+
+ //! [4]
+ radialLabelOffset: 0.01
+ //! [4]
+
+ //! [5]
+ inputHandler: TouchInputHandler3D {
+ rotationEnabled: !surfaceGraph.orthoProjection
+ }
+ //! [5]
+
+ theme: customTheme
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndColumn
+ axisX: xAxis
+ axisY: yAxis
+ axisZ: zAxis
+
+ aspectRatio: 1.0
+ horizontalAspectRatio: 1.0
+ scene.activeCamera.zoomLevel: 140
+ }
+ }
+
+ Item {
+ id: buttons
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: spectrogramView.portraitMode ? (polarToggle.height + 10) * 3
+ : polarToggle.height + 30
+ anchors.margins: 10
+
+ //! [3]
+ Button {
+ id: polarToggle
+ anchors.margins: 5
+ anchors.left: parent.left
+ anchors.top: parent.top
+ width: spectrogramView.buttonWidth // Calculated elsewhere based on screen orientation
+ text: "Switch to\n" + (surfaceGraph.polar ? "cartesian" : "polar")
+ onClicked: surfaceGraph.polar = !surfaceGraph.polar;
+ }
+ //! [3]
+
+ Button {
+ id: orthoToggle
+ anchors.margins: 5
+ anchors.left: polarToggle.right
+ anchors.top: parent.top
+ width: spectrogramView.buttonWidth
+ text: "Switch to\n" + (surfaceGraph.orthoProjection ? "perspective" : "orthographic")
+ onClicked: {
+ if (surfaceGraph.orthoProjection) {
+ surfaceGraph.orthoProjection = false;
+ xAxis.labelAutoRotation = 30;
+ yAxis.labelAutoRotation = 30;
+ zAxis.labelAutoRotation = 30;
+ } else {
+ surfaceGraph.orthoProjection = true;
+ surfaceGraph.scene.activeCamera.cameraPreset
+ = Camera3D.CameraPresetDirectlyAbove;
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ xAxis.labelAutoRotation = 0;
+ yAxis.labelAutoRotation = 0;
+ zAxis.labelAutoRotation = 0;
+ }
+ }
+ }
+
+ Button {
+ id: flipGridToggle
+ anchors.margins: 5
+ anchors.left: spectrogramView.portraitMode ? parent.left : orthoToggle.right
+ anchors.top: spectrogramView.portraitMode ? orthoToggle.bottom : parent.top
+ width: spectrogramView.buttonWidth
+ text: "Toggle axis\ngrid on top"
+ onClicked: surfaceGraph.flipHorizontalGrid = !surfaceGraph.flipHorizontalGrid;
+ }
+
+ Button {
+ id: labelOffsetToggle
+ anchors.margins: 5
+ anchors.left: flipGridToggle.right
+ anchors.top: spectrogramView.portraitMode ? orthoToggle.bottom : parent.top
+ width: spectrogramView.buttonWidth
+ text: "Toggle radial\nlabel position"
+ visible: surfaceGraph.polar
+ onClicked: {
+ if (surfaceGraph.radialLabelOffset >= 1.0)
+ surfaceGraph.radialLabelOffset = 0.01;
+ else
+ surfaceGraph.radialLabelOffset = 1.0;
+ }
+ }
+
+ Button {
+ id: surfaceGridToggle
+ anchors.margins: 5
+ anchors.left: spectrogramView.portraitMode ? (labelOffsetToggle.visible ? parent.left
+ : flipGridToggle.right)
+ : (labelOffsetToggle.visible ? labelOffsetToggle.right
+ : flipGridToggle.right)
+ anchors.top: spectrogramView.portraitMode ? (labelOffsetToggle.visible ? labelOffsetToggle.bottom
+ : orthoToggle.bottom)
+ : parent.top
+ width: spectrogramView.buttonWidth
+ text: "Toggle\nsurface grid"
+ visible: !surfaceGraph.orthoProjection
+ onClicked: {
+ if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe)
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ else
+ surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
+ }
+ }
+ }
+
+ Item {
+ id: legend
+ anchors.bottom: parent.bottom
+ anchors.top: buttons.bottom
+ anchors.right: parent.right
+ width: spectrogramView.portraitMode ? 100 : 125
+
+ Rectangle {
+ id: gradient
+ anchors.margins: 20
+ anchors.bottom: legend.bottom
+ anchors.top: legend.top
+ anchors.right: legend.right
+ border.color: "black"
+ border.width: 1
+ width: spectrogramView.portraitMode ? 25 : 50
+ rotation: 180
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "black" }
+ GradientStop { position: 0.2; color: "red" }
+ GradientStop { position: 0.5; color: "blue" }
+ GradientStop { position: 0.8; color: "yellow" }
+ GradientStop { position: 1.0; color: "white" }
+ }
+ }
+
+ Text {
+ anchors.verticalCenter: gradient.bottom
+ anchors.right: gradient.left
+ anchors.margins: 2
+ text: surfaceGraph.axisY.min + "%"
+ }
+
+ Text {
+ anchors.verticalCenter: gradient.verticalCenter
+ anchors.right: gradient.left
+ anchors.margins: 2
+ text: (surfaceGraph.axisY.max + surfaceGraph.axisY.min) / 2 + "%"
+ }
+
+ Text {
+ anchors.verticalCenter: gradient.top
+ anchors.right: gradient.left
+ anchors.margins: 2
+ text: surfaceGraph.axisY.max + "%"
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.png b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.png
new file mode 100644
index 00000000..02f41230
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.readme b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.readme
new file mode 100644
index 00000000..505fee85
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/heightmap.readme
@@ -0,0 +1,25 @@
+Heightmap of Mt Ruapehu & Mt Ngauruhoe
+
+Authored on: 22 July 2018
+Source: University of Otago (https://koordinates.com/layer/3736-09-taumarunui-15m-dem-nzsosdem-v10/)
+
+Creative Commons Attribution - CC BY-SA 4.0
+https://creativecommons.org/licenses/by-sa/4.0/
+
+You are free to:
+
+ Share — copy and redistribute the material in any medium or format
+ Adapt — remix, transform, and build upon the material for any purpose, even commercially.
+
+This license is acceptable for Free Cultural Works.
+
+ The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+Under the following terms:
+
+ Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+
+ ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+
+ No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
diff --git a/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/main.qml b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/main.qml
new file mode 100644
index 00000000..2d0b82db
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qml/qmlsurfacegallery/main.qml
@@ -0,0 +1,57 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+
+Item {
+ id: mainView
+ width: 1280
+ height: 1024
+ visible: true
+
+ property bool portraitMode: width < height
+
+ TabBar {
+ id: tabBar
+ width: parent.width
+
+ TabButton {
+ text: "Height Map"
+ }
+
+ TabButton {
+ text: "Spectrogram"
+ }
+
+ TabButton {
+ text: "Oscilloscope"
+ }
+ }
+
+ StackLayout {
+ anchors.top: tabBar.bottom
+ anchors.bottom: parent.bottom
+ width: parent.width
+ currentIndex: tabBar.currentIndex
+
+ SurfaceHeightMap {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ portraitMode: mainView.portraitMode
+ }
+
+ SurfaceSpectrogram {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ portraitMode: mainView.portraitMode
+ }
+
+ SurfaceOscilloscope {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ portraitMode: mainView.portraitMode
+ }
+ }
+}
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro b/examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.pro
index 89023cc0..c79366ba 100644
--- a/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro
+++ b/examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.pro
@@ -2,15 +2,16 @@
error( "Couldn't find the examples.pri file!" )
}
+DEFINES += QMAKE_BUILD
+
QT += datavisualization
-# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp \
datasource.cpp
HEADERS += datasource.h
-RESOURCES += qmloscilloscope.qrc
+RESOURCES += qmlsurfacegallery.qrc
OTHER_FILES += doc/src/* \
doc/images/* \
- qml/qmloscilloscope/*
+ qml/qmlsurfacegallery/*
diff --git a/examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.qrc b/examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.qrc
new file mode 100644
index 00000000..191c5cc4
--- /dev/null
+++ b/examples/datavisualization/qmlsurfacegallery/qmlsurfacegallery.qrc
@@ -0,0 +1,10 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlsurfacegallery/heightmap.png</file>
+ <file>qml/qmlsurfacegallery/main.qml</file>
+ <file>qml/qmlsurfacegallery/SpectrogramData.qml</file>
+ <file>qml/qmlsurfacegallery/SurfaceHeightMap.qml</file>
+ <file>qml/qmlsurfacegallery/SurfaceOscilloscope.qml</file>
+ <file>qml/qmlsurfacegallery/SurfaceSpectrogram.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png b/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png
deleted file mode 100644
index c5a48fcb..00000000
--- a/examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc b/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc
deleted file mode 100644
index f2cbd2c9..00000000
--- a/examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example qmlsurfacelayers
- \title Qt Quick 2 Surface Multiseries Example
- \ingroup qtdatavisualization_examples
- \brief Using multiple series with Surface3D in a QML application.
-
- The Qt Quick 2 surface example shows how to make a 3D surface plot displaying 3 layers using
- Surface3D with Qt Quick 2.
-
- \image qmlsurfacelayers-example.png
-
- The focus in this example is on generating a multiseries surface plot from 3 different height
- map images, so in this section we skip explaining the application creation. For a more detailed
- QML example documentation, see \l{Qt Quick 2 Scatter Example}.
-
- \include examples-run.qdocinc
-
- \section1 Adding Data to the Graph
-
- This example shows how to add several surface series to one graph using using
- HeightMapSurfaceDataProxies and how to control their visibilities individually.
-
- Let's start by creating a specific gradient for each layer:
-
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 0
-
- Then we'll create the series themselves. It happens simply by adding 3 separate Surface3DSeries
- to the Surface3D graph as children:
-
- \dots 0
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 1
- \dots 0
-
- You'll notice we added the created gradients to the \c baseGradient properties of the series.
- We could have added them to the \c baseGradients property of the Theme3D in Surface3D instead,
- but doing it this way ensures each gradient is applied to a correct series:
-
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 2
- \dots
-
- \section1 Controlling the Graph
-
- Let's add some checkboxes to control the visibility of layers:
-
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 3
-
- We don't need to do anything on the \c onCheckedChanged as we bound the \c checked state to
- the \c visible property of the series directly:
-
- \dots 0
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 4
- \dots 0
-
- Let's add some more checkboxes to control how the layers are displayed, when visible:
-
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 5
-
- In addition to these we have three buttons, one of which is of special interest to us. It is
- used to control whether we want to slice into only one layer, or all of them:
-
- \snippet qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 6
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/qmlsurfacelayers/layer_1.png b/examples/datavisualization/qmlsurfacelayers/layer_1.png
deleted file mode 100644
index 9138c710..00000000
--- a/examples/datavisualization/qmlsurfacelayers/layer_1.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/layer_2.png b/examples/datavisualization/qmlsurfacelayers/layer_2.png
deleted file mode 100644
index 3af154e2..00000000
--- a/examples/datavisualization/qmlsurfacelayers/layer_2.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/layer_3.png b/examples/datavisualization/qmlsurfacelayers/layer_3.png
deleted file mode 100644
index 796df64d..00000000
--- a/examples/datavisualization/qmlsurfacelayers/layer_3.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/qmlsurfacelayers/main.cpp b/examples/datavisualization/qmlsurfacelayers/main.cpp
deleted file mode 100644
index d54cb447..00000000
--- a/examples/datavisualization/qmlsurfacelayers/main.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtDataVisualization/qutils.h>
-
-#include <QtGui/QGuiApplication>
-#include <QtCore/QDir>
-#include <QtQuick/QQuickView>
-#include <QtQml/QQmlEngine>
-
-int main(int argc, char *argv[])
-{
- QGuiApplication app(argc, argv);
-
- QQuickView viewer;
-
- // Enable antialiasing in direct rendering mode
- viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
-
- // The following are needed to make examples run without having to install the module
- // in desktop environments.
-#ifdef Q_OS_WIN
- QString extraImportPath(QStringLiteral("%1/../../../../%2"));
-#else
- QString extraImportPath(QStringLiteral("%1/../../../%2"));
-#endif
- viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
- QString::fromLatin1("qml")));
-
- viewer.setSource(QUrl("qrc:/qml/qmlsurfacelayers/main.qml"));
-
- viewer.setTitle(QStringLiteral("3-layered Terrain"));
- viewer.setResizeMode(QQuickView::SizeRootObjectToView);
- viewer.show();
-
- return app.exec();
-}
diff --git a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml
deleted file mode 100644
index 4b1dd5a3..00000000
--- a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-
-Item {
- id: newbutton
-
- property alias text: buttonText.text
- property real fontSize: 12
-
- signal clicked
-
- implicitWidth: buttonText.implicitWidth + 5
- implicitHeight: buttonText.implicitHeight * 2
-
- Button {
- id: buttonText
- width: parent.width
- height: parent.height
-
- style: ButtonStyle {
- label: Component {
- Text {
- text: buttonText.text
- font.pointSize: fontSize
- clip: true
- wrapMode: Text.WordWrap
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- anchors.fill: parent
- }
- }
- }
- onClicked: newbutton.clicked()
- }
-}
diff --git a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml b/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml
deleted file mode 100644
index e5c48562..00000000
--- a/examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml
+++ /dev/null
@@ -1,343 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.1
-import QtQuick.Layouts 1.0
-import QtQuick.Controls 1.0
-import QtQuick.Controls.Styles 1.0
-import QtDataVisualization 1.0
-import "."
-
-Item {
- id: mainview
- width: 1280
- height: 720
-
- property real fontSize: 12
-
- Item {
- id: surfaceView
- width: mainview.width - buttonLayout.width
- height: mainview.height
- anchors.right: mainview.right;
-
- //! [0]
- ColorGradient {
- id: layerOneGradient
- ColorGradientStop { position: 0.0; color: "black" }
- ColorGradientStop { position: 0.31; color: "tan" }
- ColorGradientStop { position: 0.32; color: "green" }
- ColorGradientStop { position: 0.40; color: "darkslategray" }
- ColorGradientStop { position: 1.0; color: "white" }
- }
-
- ColorGradient {
- id: layerTwoGradient
- ColorGradientStop { position: 0.315; color: "blue" }
- ColorGradientStop { position: 0.33; color: "white" }
- }
-
- ColorGradient {
- id: layerThreeGradient
- ColorGradientStop { position: 0.0; color: "red" }
- ColorGradientStop { position: 0.15; color: "black" }
- }
- //! [0]
-
- Surface3D {
- id: surfaceLayers
- width: surfaceView.width
- height: surfaceView.height
- theme: Theme3D {
- type: Theme3D.ThemeEbony
- font.pointSize: 35
- colorStyle: Theme3D.ColorStyleRangeGradient
- }
- shadowQuality: AbstractGraph3D.ShadowQualityNone
- selectionMode: AbstractGraph3D.SelectionRow | AbstractGraph3D.SelectionSlice
- scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft
- axisY.min: 20
- axisY.max: 200
- axisX.segmentCount: 5
- axisX.subSegmentCount: 2
- axisX.labelFormat: "%i"
- axisZ.segmentCount: 5
- axisZ.subSegmentCount: 2
- axisZ.labelFormat: "%i"
- axisY.segmentCount: 5
- axisY.subSegmentCount: 2
- axisY.labelFormat: "%i"
-
- //! [1]
- //! [2]
- Surface3DSeries {
- id: layerOneSeries
- baseGradient: layerOneGradient
- //! [2]
- HeightMapSurfaceDataProxy {
- heightMapFile: ":/heightmaps/layer_1.png"
- }
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
- //! [4]
- visible: layerOneToggle.checked // bind to checkbox state
- //! [4]
- }
-
- Surface3DSeries {
- id: layerTwoSeries
- baseGradient: layerTwoGradient
- HeightMapSurfaceDataProxy {
- heightMapFile: ":/heightmaps/layer_2.png"
- }
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
- visible: layerTwoToggle.checked // bind to checkbox state
- }
-
- Surface3DSeries {
- id: layerThreeSeries
- baseGradient: layerThreeGradient
- HeightMapSurfaceDataProxy {
- heightMapFile: ":/heightmaps/layer_3.png"
- }
- flatShadingEnabled: false
- drawMode: Surface3DSeries.DrawSurface
- visible: layerThreeToggle.checked // bind to checkbox state
- }
- //! [1]
- }
- }
-
- ColumnLayout {
- id: buttonLayout
- anchors.top: parent.top
- anchors.left: parent.left
- spacing: 0
-
- //! [3]
- GroupBox {
- flat: true
- Layout.fillWidth: true
- Column {
- spacing: 10
-
- Label {
- font.pointSize: fontSize
- font.bold: true
- text: "Layer Selection"
- }
-
- CheckBox {
- id: layerOneToggle
- checked: true
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Ground Layer"
- }
- }
- }
-
- CheckBox {
- id: layerTwoToggle
- checked: true
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Sea Layer"
- }
- }
- }
-
- CheckBox {
- id: layerThreeToggle
- checked: true
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Tectonic Layer"
- }
- }
- }
- }
- }
- //! [3]
-
- //! [5]
- GroupBox {
- flat: true
- Layout.fillWidth: true
- Column {
- spacing: 10
-
- Label {
- font.pointSize: fontSize
- font.bold: true
- text: "Layer Style"
- }
-
- CheckBox {
- id: layerOneGrid
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Ground as Grid"
- }
- }
- onCheckedChanged: {
- if (checked)
- layerOneSeries.drawMode = Surface3DSeries.DrawWireframe
- else
- layerOneSeries.drawMode = Surface3DSeries.DrawSurface
- }
- }
-
- CheckBox {
- id: layerTwoGrid
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Sea as Grid"
- }
- }
- onCheckedChanged: {
- if (checked)
- layerTwoSeries.drawMode = Surface3DSeries.DrawWireframe
- else
- layerTwoSeries.drawMode = Surface3DSeries.DrawSurface
- }
- }
-
- CheckBox {
- id: layerThreeGrid
- style: CheckBoxStyle {
- label: Label {
- font.pointSize: fontSize
- text: "Show Tectonic as Grid"
- }
- }
- onCheckedChanged: {
- if (checked)
- layerThreeSeries.drawMode = Surface3DSeries.DrawWireframe
- else
- layerThreeSeries.drawMode = Surface3DSeries.DrawSurface
- }
- }
- }
- }
- //! [5]
-
- //! [6]
- NewButton {
- id: sliceButton
- text: "Slice All Layers"
- fontSize: fontSize
- Layout.fillWidth: true
- Layout.minimumHeight: 40
- onClicked: {
- if (surfaceLayers.selectionMode & AbstractGraph3D.SelectionMultiSeries) {
- surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow
- | AbstractGraph3D.SelectionSlice
- text = "Slice All Layers"
- } else {
- surfaceLayers.selectionMode = AbstractGraph3D.SelectionRow
- | AbstractGraph3D.SelectionSlice
- | AbstractGraph3D.SelectionMultiSeries
- text = "Slice One Layer"
- }
- }
- }
- //! [6]
-
- NewButton {
- id: shadowButton
- fontSize: fontSize
- Layout.fillWidth: true
- Layout.minimumHeight: 40
- text: surfaceLayers.shadowsSupported ? "Show Shadows" : "Shadows not supported"
- enabled: surfaceLayers.shadowsSupported
- onClicked: {
- if (surfaceLayers.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
- surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityLow
- text = "Hide Shadows"
- } else {
- surfaceLayers.shadowQuality = AbstractGraph3D.ShadowQualityNone
- text = "Show Shadows"
- }
- }
- }
-
- NewButton {
- id: renderModeButton
- fontSize: fontSize
- text: "Switch Render Mode"
- Layout.fillWidth: true
- Layout.minimumHeight: 40
- onClicked: {
- var modeText = "Indirect "
- var aaText
- if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
- surfaceLayers.msaaSamples === 0) {
- surfaceLayers.renderingMode = AbstractGraph3D.RenderDirectToBackground
- modeText = "BackGround "
- } else if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
- surfaceLayers.msaaSamples === 4) {
- surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
- surfaceLayers.msaaSamples = 0
- } else if (surfaceLayers.renderingMode === AbstractGraph3D.RenderIndirect &&
- surfaceLayers.msaaSamples === 8) {
- surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
- surfaceLayers.msaaSamples = 4
- } else {
- surfaceLayers.renderingMode = AbstractGraph3D.RenderIndirect
- surfaceLayers.msaaSamples = 8
- }
-
- if (surfaceLayers.msaaSamples <= 0) {
- aaText = "No AA"
- } else {
- aaText = surfaceLayers.msaaSamples + "xMSAA"
- }
-
- renderLabel.text = modeText + aaText
- }
- }
-
- TextField {
- id: renderLabel
- font.pointSize: fontSize
- Layout.fillWidth: true
- Layout.minimumHeight: 40
- enabled: false
- horizontalAlignment: TextInput.AlignHCenter
- text: "Indirect, " + surfaceLayers.msaaSamples + "xMSAA"
- }
- }
-}
diff --git a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro
deleted file mode 100644
index 2bfa904d..00000000
--- a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
-
-RESOURCES += qmlsurfacelayers.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/* \
- qml/qmlsurfacelayers/*
diff --git a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc b/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc
deleted file mode 100644
index 028a91db..00000000
--- a/examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc
+++ /dev/null
@@ -1,11 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>qml/qmlsurfacelayers/main.qml</file>
- <file>qml/qmlsurfacelayers/NewButton.qml</file>
- </qresource>
- <qresource prefix="/heightmaps">
- <file>layer_1.png</file>
- <file>layer_2.png</file>
- <file>layer_3.png</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/rotations/doc/images/rotations-example.png b/examples/datavisualization/rotations/doc/images/rotations-example.png
deleted file mode 100644
index 74bebbf7..00000000
--- a/examples/datavisualization/rotations/doc/images/rotations-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/rotations/doc/src/rotations.qdoc b/examples/datavisualization/rotations/doc/src/rotations.qdoc
deleted file mode 100644
index 5f1b8887..00000000
--- a/examples/datavisualization/rotations/doc/src/rotations.qdoc
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example rotations
- \title Rotations Example
- \ingroup qtdatavisualization_examples
- \brief Using rotated scatter items.
-
- This example shows how to do the following:
-
- \list
- \li Use item rotations
- \li Use custom item meshes
- \li Use range gradient to color the series
- \endlist
-
- For more basic example about using Qt Data Visualization graphs, see \l{Bars Example}.
-
- \image rotations-example.png
-
- \include examples-run.qdocinc
-
- \section1 Using Rotations
-
- In this example we want to orient the arrow items tangentially to the origin. This requires
- rotating them, which can be achieved by specifying rotation quaternion to each item:
-
- \snippet rotations/scatterdatamodifier.cpp 0
- \snippet rotations/scatterdatamodifier.cpp 1
- \snippet rotations/scatterdatamodifier.cpp 2
-
- Since the items need to be rotated along two axes, we define two rotation quaternions, one
- for Y-axis and one for Z-axis, and then multiply these together to get the total rotation,
- which we set to the data item.
-
- \section1 Using Custom Item Meshes
-
- The narrow arrow mesh we use for magnetic field arrow items is not a standard mesh. Instead
- we supply our own \c{narrowarrow.obj} file which contains the object definition for the mesh
- in \c Wavefront obj format:
-
- \snippet rotations/scatterdatamodifier.cpp 3
-
- \section1 Using Range Gradient
-
- Setting the color style to range gradient in a series means that the item is colored according
- to its relative Y-value on the visible Y-coordinate range. We want the arrows on the bottom
- part of the graph to be darker and gradually get lighter higher they are, so we define a
- range gradient with black color at the position 0.0 and white color at the position 1.0:
-
- \snippet rotations/scatterdatamodifier.cpp 4
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/rotations/main.cpp b/examples/datavisualization/rotations/main.cpp
deleted file mode 100644
index 23ae94f8..00000000
--- a/examples/datavisualization/rotations/main.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QPushButton>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- Q3DScatter *graph = new Q3DScatter();
- QWidget *container = QWidget::createWindowContainer(graph);
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
-
- widget->setWindowTitle(QStringLiteral("Item rotations example - Magnetic field of the sun"));
-
- QPushButton *toggleRotationButton = new QPushButton(widget);
- toggleRotationButton->setText(QStringLiteral("Toggle animation"));
- QPushButton *toggleSunButton = new QPushButton(widget);
- toggleSunButton->setText(QStringLiteral("Toggle Sun"));
-
- QSlider *fieldLinesSlider = new QSlider(Qt::Horizontal, widget);
- fieldLinesSlider->setTickInterval(1);
- fieldLinesSlider->setMinimum(1);
- fieldLinesSlider->setValue(12);
- fieldLinesSlider->setMaximum(128);
-
- QSlider *arrowsSlider = new QSlider(Qt::Horizontal, widget);
- arrowsSlider->setTickInterval(1);
- arrowsSlider->setMinimum(8);
- arrowsSlider->setValue(16);
- arrowsSlider->setMaximum(32);
-
- vLayout->addWidget(toggleRotationButton);
- vLayout->addWidget(toggleSunButton);
- vLayout->addWidget(new QLabel(QStringLiteral("Field Lines (1 - 128):")));
- vLayout->addWidget(fieldLinesSlider);
- vLayout->addWidget(new QLabel(QStringLiteral("Arrows per line (8 - 32):")));
- vLayout->addWidget(arrowsSlider, 1, Qt::AlignTop);
-
- ScatterDataModifier *modifier = new ScatterDataModifier(graph);
-
- QObject::connect(toggleRotationButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::toggleRotation);
- QObject::connect(toggleSunButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::toggleSun);
- QObject::connect(fieldLinesSlider, &QSlider::valueChanged, modifier,
- &ScatterDataModifier::setFieldLines);
- QObject::connect(arrowsSlider, &QSlider::valueChanged, modifier,
- &ScatterDataModifier::setArrowsPerLine);
-
- widget->show();
- return app.exec();
-}
diff --git a/examples/datavisualization/rotations/mesh/largesphere.obj b/examples/datavisualization/rotations/mesh/largesphere.obj
deleted file mode 100644
index 63101413..00000000
--- a/examples/datavisualization/rotations/mesh/largesphere.obj
+++ /dev/null
@@ -1,1938 +0,0 @@
-# Blender v2.66 (sub 0) OBJ File: ''
-# www.blender.org
-o Sphere_Sphere.001
-v -1.251476 7.901507 0.000000
-v -2.472136 7.608452 0.000000
-v -3.631924 7.128052 0.000000
-v -4.702282 6.472136 0.000000
-v -5.656854 5.656854 0.000000
-v -6.472136 4.702282 0.000000
-v -7.128052 3.631924 0.000000
-v -7.608452 2.472136 0.000000
-v -7.901507 1.251475 0.000000
-v -8.000000 -0.000001 0.000000
-v -7.901506 -1.251477 0.000000
-v -7.608451 -2.472138 0.000000
-v -7.128051 -3.631927 0.000000
-v -6.472134 -4.702285 0.000000
-v -5.656851 -5.656857 0.000000
-v -4.702279 -6.472138 0.000000
-v -3.631920 -7.128055 0.000000
-v -2.472131 -7.608454 0.000000
-v -1.251470 -7.901508 0.000000
-v -1.190224 7.901506 -0.386729
-v -2.351141 7.608452 -0.763934
-v -3.454165 7.128052 -1.122328
-v -4.472136 6.472136 -1.453087
-v -5.379988 5.656855 -1.748066
-v -6.155366 4.702282 -2.000002
-v -6.779180 3.631924 -2.202692
-v -7.236068 2.472136 -2.351143
-v -7.514779 1.251475 -2.441702
-v -7.608452 -0.000001 -2.472138
-v -7.514779 -1.251477 -2.441702
-v -7.236067 -2.472138 -2.351143
-v -6.779179 -3.631927 -2.202691
-v -6.155365 -4.702285 -2.000002
-v -5.379985 -5.656857 -1.748065
-v -4.472132 -6.472138 -1.453086
-v -3.454160 -7.128055 -1.122327
-v -2.351136 -7.608454 -0.763933
-v -1.190218 -7.901508 -0.386727
-v 0.000006 -8.000000 0.000000
-v -1.012464 7.901506 -0.735603
-v -1.999999 7.608452 -1.453089
-v -2.938287 7.128052 -2.134795
-v -3.804224 6.472136 -2.763936
-v -4.576490 5.656855 -3.325019
-v -5.236066 4.702282 -3.804230
-v -5.766714 3.631924 -4.189768
-v -6.155365 2.472136 -4.472140
-v -6.392451 1.251475 -4.644393
-v -6.472135 -0.000001 -4.702287
-v -6.392451 -1.251477 -4.644393
-v -6.155365 -2.472138 -4.472139
-v -5.766713 -3.631927 -4.189767
-v -5.236064 -4.702285 -3.804229
-v -4.576487 -5.656857 -3.325018
-v -3.804221 -6.472138 -2.763934
-v -2.938283 -7.128055 -2.134793
-v -1.999994 -7.608454 -1.453086
-v -1.012459 -7.901508 -0.735599
-v -0.735596 7.901506 -1.012470
-v -1.453082 7.608452 -2.000005
-v -2.134788 7.128052 -2.938294
-v -2.763928 6.472136 -3.804231
-v -3.325012 5.656855 -4.576497
-v -3.804222 4.702282 -5.236073
-v -4.189760 3.631924 -5.766721
-v -4.472132 2.472136 -6.155373
-v -4.644385 1.251475 -6.392459
-v -4.702279 -0.000001 -6.472142
-v -4.644385 -1.251477 -6.392458
-v -4.472132 -2.472138 -6.155372
-v -4.189760 -3.631927 -5.766720
-v -3.804221 -4.702285 -5.236072
-v -3.325010 -5.656857 -4.576494
-v -2.763927 -6.472138 -3.804229
-v -2.134786 -7.128055 -2.938290
-v -1.453079 -7.608454 -2.000001
-v -0.735593 -7.901508 -1.012466
-v -0.386723 7.901506 -1.190230
-v -0.763927 7.608452 -2.351147
-v -1.122321 7.128052 -3.454171
-v -1.453079 6.472136 -4.472141
-v -1.748058 5.656855 -5.379994
-v -1.999994 4.702282 -6.155373
-v -2.202683 3.631924 -6.779186
-v -2.351135 2.472136 -7.236074
-v -2.441693 1.251475 -7.514785
-v -2.472130 -0.000001 -7.608459
-v -2.441693 -1.251477 -7.514784
-v -2.351135 -2.472138 -7.236073
-v -2.202683 -3.631927 -6.779185
-v -1.999993 -4.702285 -6.155371
-v -1.748057 -5.656857 -5.379991
-v -1.453079 -6.472138 -4.472138
-v -1.122320 -7.128055 -3.454167
-v -0.763926 -7.608454 -2.351142
-v -0.386721 -7.901508 -1.190225
-v 0.000007 7.901506 -1.251482
-v 0.000007 7.608452 -2.472142
-v 0.000007 7.128052 -3.631930
-v 0.000008 6.472136 -4.702287
-v 0.000008 5.656855 -5.656860
-v 0.000008 4.702282 -6.472141
-v 0.000008 3.631924 -7.128057
-v 0.000008 2.472136 -7.608458
-v 0.000009 1.251475 -7.901512
-v 0.000009 -0.000001 -8.000006
-v 0.000009 -1.251477 -7.901511
-v 0.000008 -2.472138 -7.608456
-v 0.000008 -3.631927 -7.128057
-v 0.000008 -4.702285 -6.472139
-v 0.000008 -5.656857 -5.656857
-v 0.000007 -6.472138 -4.702284
-v 0.000007 -7.128055 -3.631926
-v 0.000007 -7.608454 -2.472137
-v 0.000007 -7.901508 -1.251476
-v 0.386736 7.901506 -1.190230
-v 0.763941 7.608452 -2.351147
-v 1.122336 7.128052 -3.454170
-v 1.453094 6.472136 -4.472140
-v 1.748074 5.656855 -5.379993
-v 2.000010 4.702282 -6.155371
-v 2.202699 3.631924 -6.779185
-v 2.351151 2.472136 -7.236073
-v 2.441710 1.251475 -7.514783
-v 2.472147 -0.000001 -7.608457
-v 2.441710 -1.251477 -7.514783
-v 2.351151 -2.472138 -7.236071
-v 2.202699 -3.631927 -6.779184
-v 2.000009 -4.702285 -6.155369
-v 1.748073 -5.656857 -5.379990
-v 1.453093 -6.472138 -4.472137
-v 1.122334 -7.128055 -3.454166
-v 0.763939 -7.608454 -2.351141
-v 0.386734 -7.901508 -1.190225
-v 0.735610 7.901506 -1.012470
-v 1.453096 7.608452 -2.000005
-v 2.134803 7.128052 -2.938292
-v 2.763942 6.472136 -3.804229
-v 3.325027 5.656855 -4.576495
-v 3.804237 4.702282 -5.236070
-v 4.189775 3.631924 -5.766718
-v 4.472148 2.472136 -6.155370
-v 4.644401 1.251475 -6.392455
-v 4.702294 -0.000001 -6.472139
-v 4.644400 -1.251477 -6.392455
-v 4.472147 -2.472138 -6.155369
-v 4.189774 -3.631927 -5.766717
-v 3.804236 -4.702285 -5.236069
-v 3.325025 -5.656857 -4.576492
-v 2.763941 -6.472138 -3.804227
-v 2.134800 -7.128055 -2.938289
-v 1.453092 -7.608454 -2.000000
-v 0.735606 -7.901508 -1.012465
-v 1.012477 7.901506 -0.735602
-v 2.000012 7.608452 -1.453088
-v 2.938301 7.128052 -2.134794
-v 3.804237 6.472136 -2.763933
-v 4.576503 5.656855 -3.325017
-v 5.236080 4.702282 -3.804226
-v 5.766727 3.631924 -4.189765
-v 6.155380 2.472136 -4.472136
-v 6.392465 1.251475 -4.644389
-v 6.472148 -0.000001 -4.702283
-v 6.392465 -1.251477 -4.644389
-v 6.155378 -2.472138 -4.472136
-v 5.766726 -3.631927 -4.189764
-v 5.236078 -4.702285 -3.804225
-v 4.576500 -5.656857 -3.325016
-v 3.804235 -6.472138 -2.763932
-v 2.938297 -7.128055 -2.134791
-v 2.000007 -7.608454 -1.453085
-v 1.012472 -7.901508 -0.735599
-v 1.190237 7.901506 -0.386729
-v 2.351154 7.608452 -0.763933
-v 3.454178 7.128052 -1.122326
-v 4.472147 6.472136 -1.453085
-v 5.380000 5.656855 -1.748063
-v 6.155379 4.702282 -1.999998
-v 6.779192 3.631924 -2.202688
-v 7.236081 2.472136 -2.351139
-v 7.514791 1.251475 -2.441698
-v 7.608464 -0.000001 -2.472134
-v 7.514791 -1.251477 -2.441698
-v 7.236079 -2.472138 -2.351139
-v 6.779191 -3.631927 -2.202688
-v 6.155377 -4.702285 -1.999998
-v 5.379997 -5.656857 -1.748063
-v 4.472144 -6.472138 -1.453084
-v 3.454173 -7.128055 -1.122325
-v 2.351148 -7.608454 -0.763931
-v 1.190231 -7.901508 -0.386727
-v 1.251488 7.901506 0.000001
-v 2.472148 7.608452 0.000001
-v 3.631936 7.128052 0.000002
-v 4.702293 6.472136 0.000002
-v 5.656866 5.656855 0.000003
-v 6.472147 4.702282 0.000004
-v 7.128063 3.631924 0.000003
-v 7.608464 2.472136 0.000004
-v 7.901517 1.251475 0.000004
-v 8.000011 -0.000001 0.000004
-v 7.901517 -1.251477 0.000004
-v 7.608462 -2.472138 0.000004
-v 7.128062 -3.631927 0.000003
-v 6.472145 -4.702285 0.000004
-v 5.656862 -5.656857 0.000002
-v 4.702290 -6.472138 0.000002
-v 3.631932 -7.128055 0.000002
-v 2.472143 -7.608454 0.000001
-v 1.251483 -7.901508 0.000001
-v 1.190236 7.901506 0.386730
-v 2.351153 7.608452 0.763935
-v 3.454176 7.128052 1.122330
-v 4.472146 6.472136 1.453089
-v 5.379998 5.656855 1.748069
-v 6.155376 4.702282 2.000005
-v 6.779190 3.631924 2.202694
-v 7.236078 2.472136 2.351147
-v 7.514788 1.251475 2.441705
-v 7.608462 -0.000001 2.472141
-v 7.514788 -1.251477 2.441705
-v 7.236076 -2.472138 2.351146
-v 6.779189 -3.631927 2.202693
-v 6.155375 -4.702285 2.000004
-v 5.379995 -5.656857 1.748067
-v 4.472143 -6.472138 1.453088
-v 3.454172 -7.128055 1.122328
-v 2.351147 -7.608454 0.763933
-v 1.190231 -7.901508 0.386728
-v 1.012476 7.901506 0.735603
-v 2.000010 7.608452 1.453090
-v 2.938298 7.128052 2.134796
-v 3.804235 6.472136 2.763937
-v 4.576499 5.656855 3.325021
-v 5.236075 4.702282 3.804232
-v 5.766723 3.631924 4.189770
-v 6.155375 2.472136 4.472143
-v 6.392460 1.251475 4.644395
-v 6.472144 -0.000001 4.702289
-v 6.392460 -1.251477 4.644395
-v 6.155374 -2.472138 4.472141
-v 5.766722 -3.631927 4.189769
-v 5.236074 -4.702285 3.804231
-v 4.576497 -5.656857 3.325018
-v 3.804232 -6.472138 2.763935
-v 2.938295 -7.128055 2.134794
-v 2.000006 -7.608454 1.453086
-v 1.012471 -7.901508 0.735600
-v 0.735608 7.901506 1.012471
-v 1.453094 7.608452 2.000006
-v 2.134799 7.128052 2.938294
-v 2.763939 6.472136 3.804232
-v 3.325022 5.656855 4.576497
-v 3.804231 4.702282 5.236074
-v 4.189770 3.631924 5.766721
-v 4.472141 2.472136 6.155374
-v 4.644393 1.251475 6.392459
-v 4.702287 -0.000001 6.472143
-v 4.644393 -1.251477 6.392459
-v 4.472141 -2.472138 6.155372
-v 4.189768 -3.631927 5.766720
-v 3.804231 -4.702285 5.236073
-v 3.325021 -5.656857 4.576494
-v 2.763937 -6.472138 3.804228
-v 2.134797 -7.128055 2.938291
-v 1.453090 -7.608454 2.000001
-v 0.735605 -7.901508 1.012466
-v 0.386735 7.901506 1.190230
-v 0.763939 7.608452 2.351147
-v 1.122332 7.128052 3.454171
-v 1.453090 6.472136 4.472141
-v 1.748069 5.656855 5.379993
-v 2.000002 4.702282 6.155373
-v 2.202693 3.631924 6.779186
-v 2.351144 2.472136 7.236073
-v 2.441703 1.251475 7.514784
-v 2.472139 -0.000001 7.608459
-v 2.441703 -1.251477 7.514784
-v 2.351144 -2.472138 7.236072
-v 2.202692 -3.631927 6.779184
-v 2.000003 -4.702285 6.155371
-v 1.748068 -5.656857 5.379990
-v 1.453089 -6.472138 4.472137
-v 1.122331 -7.128055 3.454167
-v 0.763937 -7.608454 2.351141
-v 0.386733 -7.901508 1.190225
-v 0.000005 7.901506 1.251482
-v 0.000005 7.608452 2.472142
-v 0.000004 7.128052 3.631929
-v 0.000003 6.472136 4.702286
-v 0.000003 5.656855 5.656859
-v 0.000001 4.702282 6.472140
-v 0.000002 3.631924 7.128057
-v 0.000001 2.472136 7.608456
-v 0.000001 1.251475 7.901510
-v 0.000000 -0.000001 8.000005
-v 0.000001 -1.251477 7.901510
-v 0.000002 -2.472138 7.608455
-v 0.000001 -3.631927 7.128055
-v 0.000002 -4.702285 6.472138
-v 0.000003 -5.656857 5.656855
-v 0.000004 -6.472138 4.702283
-v 0.000004 -7.128055 3.631925
-v 0.000005 -7.608454 2.472136
-v 0.000006 -7.901508 1.251476
-v -0.386724 7.901506 1.190230
-v -0.763929 7.608452 2.351146
-v -1.122324 7.128052 3.454169
-v -1.453083 6.472136 4.472139
-v -1.748063 5.656855 5.379992
-v -2.000000 4.702282 6.155369
-v -2.202688 3.631924 6.779183
-v -2.351142 2.472136 7.236070
-v -2.441700 1.251475 7.514781
-v -2.472137 -0.000001 7.608455
-v -2.441700 -1.251477 7.514781
-v -2.351140 -2.472138 7.236069
-v -2.202689 -3.631927 6.779181
-v -1.999999 -4.702285 6.155367
-v -1.748061 -5.656857 5.379988
-v -1.453082 -6.472138 4.472136
-v -1.122323 -7.128055 3.454165
-v -0.763927 -7.608454 2.351140
-v -0.386722 -7.901508 1.190224
-v -0.735597 7.901506 1.012470
-v -1.453084 7.608452 2.000003
-v -2.134790 7.128052 2.938291
-v -2.763931 6.472136 3.804227
-v -3.325015 5.656855 4.576493
-v -3.804227 4.702282 5.236067
-v -4.189764 3.631924 5.766716
-v -4.472137 2.472136 6.155366
-v -4.644390 1.251475 6.392452
-v -4.702284 -0.000001 6.472136
-v -4.644390 -1.251477 6.392452
-v -4.472136 -2.472138 6.155365
-v -4.189764 -3.631927 5.766714
-v -3.804225 -4.702285 5.236066
-v -3.325012 -5.656857 4.576489
-v -2.763929 -6.472138 3.804224
-v -2.134788 -7.128055 2.938287
-v -1.453080 -7.608454 1.999999
-v -0.735594 -7.901508 1.012465
-v 0.000001 8.000000 0.000004
-v -1.012464 7.901506 0.735602
-v -1.999999 7.608452 1.453087
-v -2.938287 7.128052 2.134792
-v -3.804225 6.472136 2.763931
-v -4.576491 5.656855 3.325015
-v -5.236069 4.702282 3.804223
-v -5.766715 3.631924 4.189762
-v -6.155367 2.472136 4.472132
-v -6.392453 1.251475 4.644385
-v -6.472137 -0.000001 4.702279
-v -6.392453 -1.251477 4.644385
-v -6.155365 -2.472138 4.472132
-v -5.766714 -3.631927 4.189760
-v -5.236066 -4.702285 3.804223
-v -4.576488 -5.656857 3.325012
-v -3.804222 -6.472138 2.763929
-v -2.938284 -7.128055 2.134789
-v -1.999995 -7.608454 1.453083
-v -1.012460 -7.901508 0.735598
-v -1.190224 7.901506 0.386728
-v -2.351140 7.608452 0.763932
-v -3.454164 7.128052 1.122325
-v -4.472135 6.472136 1.453082
-v -5.379988 5.656855 1.748062
-v -6.155366 4.702282 1.999995
-v -6.779179 3.631924 2.202685
-v -7.236067 2.472136 2.351135
-v -7.514778 1.251475 2.441694
-v -7.608452 -0.000001 2.472130
-v -7.514778 -1.251477 2.441694
-v -7.236065 -2.472138 2.351135
-v -6.779178 -3.631927 2.202684
-v -6.155364 -4.702285 1.999995
-v -5.379983 -5.656857 1.748060
-v -4.472131 -6.472138 1.453082
-v -3.454160 -7.128055 1.122324
-v -2.351135 -7.608454 0.763930
-v -1.190218 -7.901508 0.386726
-vt 0.035483 0.289114
-vt 0.042491 0.337738
-vt 0.007397 0.296413
-vt 0.063422 0.533643
-vt 0.068439 0.582662
-vt 0.015908 0.545902
-vt 0.097669 0.776914
-vt 0.111929 0.824070
-vt 0.027296 0.795217
-vt 0.391159 0.929226
-vt 0.461397 0.895775
-vt 0.452242 0.950225
-vt 0.026572 0.240871
-vt 0.004734 0.246573
-vt 0.058567 0.484592
-vt 0.014398 0.495993
-vt 0.087726 0.728878
-vt 0.023823 0.745426
-vt 0.270350 0.936037
-vt 0.231553 0.980467
-vt 0.014254 0.193317
-vt 0.001048 0.196795
-vt 0.053639 0.435556
-vt 0.012882 0.446084
-vt 0.080129 0.680372
-vt 0.021272 0.695580
-vt 0.178869 0.909944
-vt 0.068145 0.942733
-vt 0.048386 0.386583
-vt 0.011281 0.396180
-vt 0.073887 0.631595
-vt 0.019234 0.645702
-vt 0.135028 0.869370
-vt 0.042415 0.894305
-vt 0.009500 0.346287
-vt 0.017489 0.595807
-vt 0.032618 0.844897
-vt 0.484179 0.902186
-vt 0.550590 0.948315
-vt 1.004734 0.246573
-vt 1.007397 0.296413
-vt 0.982704 0.246140
-vt 1.014398 0.495993
-vt 1.015908 0.545902
-vt 0.969883 0.495119
-vt 1.023823 0.745426
-vt 1.027296 0.795217
-vt 0.957447 0.744128
-vt 1.231553 0.980467
-vt 0.750122 0.974207
-vt 1.001048 0.196795
-vt 0.987598 0.196530
-vt 1.012882 0.446084
-vt 0.971892 0.445278
-vt 1.021272 0.695580
-vt 0.960802 0.694395
-vt 1.068145 0.942733
-vt 0.901563 0.939596
-vt 1.011281 0.396180
-vt 0.974014 0.395447
-vt 1.019234 0.645702
-vt 0.963490 0.644610
-vt 1.042415 0.894305
-vt 0.933349 0.892198
-vt 1.009500 0.346287
-vt 0.976377 0.345635
-vt 1.017489 0.595807
-vt 0.965794 0.594793
-vt 1.032618 0.844897
-vt 0.945957 0.843211
-vt 0.979169 0.295858
-vt 0.967884 0.544959
-vt 0.952893 0.793765
-vt 0.960930 0.239587
-vt 0.925822 0.482052
-vt 0.894284 0.725297
-vt 0.716363 0.929856
-vt 0.974473 0.192535
-vt 0.931207 0.433203
-vt 0.902436 0.677050
-vt 0.801451 0.904132
-vt 0.936960 0.384433
-vt 0.909171 0.628493
-vt 0.844888 0.864413
-vt 0.943427 0.335818
-vt 0.915075 0.579756
-vt 0.868695 0.819731
-vt 0.951128 0.287472
-vt 0.920529 0.530922
-vt 0.883697 0.773009
-vt 0.509882 0.901680
-vt 0.603672 0.925341
-vt 0.939868 0.227168
-vt 0.882765 0.457977
-vt 0.837646 0.692981
-vt 0.690972 0.886830
-vt 0.962264 0.185007
-vt 0.891191 0.410771
-vt 0.848554 0.646630
-vt 0.746350 0.860374
-vt 0.900372 0.363822
-vt 0.857974 0.599764
-vt 0.782623 0.823943
-vt 0.910879 0.317332
-vt 0.866529 0.552601
-vt 0.806908 0.782514
-vt 0.923572 0.271605
-vt 0.874667 0.505296
-vt 0.824298 0.738476
-vt 0.531785 0.894399
-vt 0.616896 0.895419
-vt 0.840708 0.424882
-vt 0.787319 0.652419
-vt 0.666434 0.846117
-vt 0.951650 0.174333
-vt 0.851788 0.379552
-vt 0.799275 0.607479
-vt 0.706276 0.816232
-vt 0.864196 0.334814
-vt 0.810089 0.562030
-vt 0.735147 0.779653
-vt 0.878757 0.291055
-vt 0.820304 0.516318
-vt 0.756661 0.739218
-vt 0.896714 0.248885
-vt 0.830369 0.470540
-vt 0.773481 0.696510
-vt 0.545835 0.882162
-vt 0.613251 0.864748
-vt 0.920019 0.209353
-vt 0.601814 0.835743
-vt 0.902011 0.186799
-vt 0.798974 0.385208
-vt 0.741339 0.608286
-vt 0.641659 0.808678
-vt 0.812374 0.341530
-vt 0.753261 0.563866
-vt 0.671741 0.774500
-vt 0.827915 0.298950
-vt 0.764518 0.519117
-vt 0.694750 0.736000
-vt 0.846764 0.258126
-vt 0.775586 0.474273
-vt 0.713019 0.694862
-vt 0.551827 0.867272
-vt 0.551336 0.851697
-vt 0.870653 0.220135
-vt 0.786910 0.429557
-vt 0.728181 0.652086
-vt 0.943465 0.161100
-vt 0.886800 0.160336
-vt 0.756203 0.341667
-vt 0.697515 0.564418
-vt 0.616262 0.775491
-vt 0.771631 0.298973
-vt 0.708699 0.519594
-vt 0.639253 0.736889
-vt 0.790354 0.258010
-vt 0.719689 0.474675
-vt 0.657473 0.695657
-vt 0.814109 0.219846
-vt 0.730930 0.429879
-vt 0.672573 0.652794
-vt 0.546100 0.836912
-vt 0.845356 0.186292
-vt 0.742904 0.385443
-vt 0.685664 0.608914
-vt 0.586129 0.809772
-vt 0.938802 0.146131
-vt 0.876174 0.131001
-vt 0.710309 0.297343
-vt 0.654008 0.524127
-vt 0.590087 0.747535
-vt 0.727302 0.254538
-vt 0.663845 0.478153
-vt 0.607276 0.704820
-vt 0.749262 0.214082
-vt 0.673880 0.432264
-vt 0.621259 0.660654
-vt 0.779077 0.177660
-vt 0.684564 0.386653
-vt 0.643951 0.570007
-vt 0.537514 0.823995
-vt 0.820645 0.148333
-vt 0.696450 0.341564
-vt 0.567816 0.787838
-vt 0.658464 0.256085
-vt 0.609517 0.490486
-vt 0.563122 0.725732
-vt 0.700288 0.169995
-vt 0.617324 0.442954
-vt 0.575103 0.679574
-vt 0.625569 0.395564
-vt 0.633223 0.615598
-vt 0.585045 0.632740
-vt 0.737701 0.133357
-vt 0.634697 0.348462
-vt 0.601779 0.538040
-vt 0.526630 0.813733
-vt 0.796084 0.107238
-vt 0.645335 0.301858
-vt 0.547763 0.770746
-vt 0.939113 0.130553
-vt 0.874144 0.100247
-vt 0.563421 0.466357
-vt 0.535483 0.710885
-vt 0.675759 0.211740
-vt 0.635028 0.130630
-vt 0.568439 0.417338
-vt 0.542491 0.662261
-vt 0.573887 0.368405
-vt 0.593757 0.585502
-vt 0.548386 0.613416
-vt 0.678869 0.090056
-vt 0.580129 0.319628
-vt 0.558567 0.515408
-vt 0.514254 0.806683
-vt 0.770350 0.063964
-vt 0.587726 0.271122
-vt 0.526572 0.759129
-vt 0.946160 0.115905
-vt 0.891158 0.070774
-vt 0.597669 0.223086
-vt 0.611929 0.175930
-vt 0.542415 0.105695
-vt 0.517489 0.404193
-vt 0.509500 0.653713
-vt 0.519234 0.354298
-vt 0.553639 0.564444
-vt 0.511281 0.603820
-vt 0.568145 0.057267
-vt 0.521272 0.304420
-vt 0.514398 0.504007
-vt 0.501048 0.803204
-vt 0.731552 0.019533
-vt 0.523822 0.254574
-vt 0.504734 0.753426
-vt 0.961397 0.104224
-vt 0.952242 0.049775
-vt 0.527296 0.204783
-vt 0.515908 0.454098
-vt 0.507397 0.703586
-vt 0.532618 0.155103
-vt 0.433350 0.107802
-vt 0.465794 0.405207
-vt 0.476377 0.654364
-vt 0.463490 0.355390
-vt 0.512882 0.553916
-vt 0.474014 0.604552
-vt 0.401564 0.060404
-vt 0.460802 0.305605
-vt 0.469884 0.504881
-vt 0.487599 0.803469
-vt 1.250123 0.025793
-vt 0.457447 0.255872
-vt 0.482704 0.753860
-vt 0.984179 0.097813
-vt 1.050589 0.051685
-vt 0.452893 0.206235
-vt 0.467885 0.455040
-vt 0.479169 0.704142
-vt 0.445957 0.156790
-vt 0.344888 0.135587
-vt 0.415075 0.420244
-vt 0.443428 0.664182
-vt 0.409171 0.371507
-vt 0.471892 0.554721
-vt 0.436960 0.615567
-vt 0.250123 0.025793
-vt 0.301452 0.095868
-vt 0.402437 0.322950
-vt 0.425822 0.517948
-vt 0.474473 0.807464
-vt 0.050589 0.051685
-vt 0.216363 0.070144
-vt 0.394284 0.274702
-vt 0.460930 0.760413
-vt 0.009882 0.098319
-vt 0.103671 0.074658
-vt 0.383698 0.226991
-vt 0.420529 0.469078
-vt 0.451128 0.712528
-vt 0.366529 0.447399
-vt 0.410880 0.682668
-vt 0.282623 0.176056
-vt 0.357975 0.400236
-vt 0.431207 0.566797
-vt 0.400372 0.636177
-vt 0.246351 0.139626
-vt 0.348554 0.353370
-vt 0.382765 0.542022
-vt 0.462264 0.814992
-vt 0.190972 0.113170
-vt 0.337646 0.307019
-vt 0.439868 0.772831
-vt 0.031785 0.105600
-vt 0.116896 0.104580
-vt 0.368695 0.180269
-vt 0.324298 0.261524
-vt 0.374667 0.494704
-vt 0.423573 0.728394
-vt 0.306908 0.217486
-vt 0.378757 0.708945
-vt 0.235147 0.220346
-vt 0.310089 0.437969
-vt 0.391191 0.589229
-vt 0.364196 0.665186
-vt 0.206276 0.183767
-vt 0.299275 0.392521
-vt 0.340709 0.575117
-vt 0.451650 0.825666
-vt 0.166434 0.153882
-vt 0.287319 0.347580
-vt 0.420019 0.790647
-vt 0.045835 0.117837
-vt 0.113250 0.135252
-vt 0.273481 0.303490
-vt 0.330370 0.529459
-vt 0.396715 0.751114
-vt 0.256661 0.260781
-vt 0.320304 0.483681
-vt 0.171741 0.225499
-vt 0.253261 0.436134
-vt 0.351788 0.620448
-vt 0.312374 0.658470
-vt 0.141659 0.191322
-vt 0.241339 0.391714
-vt 0.402011 0.813201
-vt 0.101814 0.164257
-vt 0.228181 0.347914
-vt 0.286910 0.570443
-vt 0.370653 0.779864
-vt 0.051826 0.132727
-vt 0.051336 0.148303
-vt 0.213019 0.305137
-vt 0.275586 0.525726
-vt 0.346765 0.741874
-vt 0.194750 0.264000
-vt 0.264518 0.480883
-vt 0.327915 0.701050
-vt 0.139253 0.263111
-vt 0.208699 0.480406
-vt 0.271631 0.701027
-vt 0.116262 0.224508
-vt 0.197515 0.435582
-vt 0.298975 0.614792
-vt 0.443465 0.838899
-vt 0.386800 0.839664
-vt 0.086129 0.190228
-vt 0.185664 0.391086
-vt 0.242904 0.614557
-vt 0.345357 0.813708
-vt 0.046099 0.163088
-vt 0.172573 0.347205
-vt 0.230930 0.570121
-vt 0.314109 0.780154
-vt 0.157473 0.304343
-vt 0.219689 0.525325
-vt 0.290354 0.741990
-vt 0.107276 0.295180
-vt 0.163845 0.521847
-vt 0.227302 0.745462
-vt 0.090087 0.252465
-vt 0.154008 0.475873
-vt 0.256203 0.658333
-vt 0.438803 0.853868
-vt 0.376175 0.868999
-vt 0.067816 0.212161
-vt 0.143951 0.429993
-vt 0.196450 0.658436
-vt 0.320646 0.851667
-vt 0.037514 0.176004
-vt 0.133223 0.384401
-vt 0.184564 0.613347
-vt 0.279077 0.822340
-vt 0.121259 0.339345
-vt 0.173881 0.567736
-vt 0.249262 0.785918
-vt 0.175759 0.788260
-vt 0.063122 0.274267
-vt 0.109517 0.509514
-vt 0.210309 0.702657
-vt 0.439113 0.869447
-vt 0.374144 0.899752
-vt 0.047763 0.229253
-vt 0.101779 0.461959
-vt 0.145335 0.698142
-vt 0.296085 0.892762
-vt 0.026630 0.186267
-vt 0.093757 0.414497
-vt 0.134697 0.651538
-vt 0.237701 0.866643
-vt 0.085045 0.367260
-vt 0.125569 0.604436
-vt 0.200288 0.830006
-vt 0.075103 0.320425
-vt 0.117324 0.557046
-vt 0.995265 0.147143
-vt 1.014254 0.193317
-vt 0.495265 0.852856
-vt 1.009882 0.098319
-vt 1.031785 0.105600
-vt 1.045835 0.117837
-vt 1.051826 0.132727
-vt 1.051336 0.148303
-vt 1.046099 0.163088
-vt 1.037514 0.176004
-vt 0.446160 0.884095
-vt 1.026630 0.186267
-vt 0.158464 0.743915
-vn -0.460158 -0.887814 0.000000
-vn -0.592853 -0.805292 0.000000
-vn -0.437635 -0.887814 -0.142186
-vn -0.951781 -0.306742 0.000000
-vn -0.987854 -0.155217 0.000000
-vn -0.905179 -0.306742 -0.294107
-vn -0.892575 0.450850 0.000000
-vn -0.811670 0.584063 0.000000
-vn -0.848903 0.450850 -0.275826
-vn -0.316050 0.948729 0.000000
-vn -0.164068 0.986419 0.000000
-vn -0.300577 0.948729 -0.097659
-vn -0.316050 -0.948729 0.000000
-vn -0.300577 -0.948729 -0.097659
-vn -0.892575 -0.450850 0.000000
-vn -0.848903 -0.450850 -0.275826
-vn -0.951781 0.306742 0.000000
-vn -0.905179 0.306742 -0.294107
-vn -0.460158 0.887814 0.000000
-vn -0.437635 0.887814 -0.142186
-vn -0.164068 -0.986419 0.000000
-vn -0.156011 -0.986419 -0.050691
-vn -0.811670 -0.584063 0.000000
-vn -0.771935 -0.584063 -0.250801
-vn -0.987854 0.155217 0.000000
-vn -0.939512 0.155217 -0.305246
-vn -0.592853 0.805292 0.000000
-vn -0.563829 0.805292 -0.183203
-vn -0.710959 -0.703207 0.000000
-vn -0.676168 -0.703207 -0.219703
-vn -1.000000 0.000000 0.000000
-vn -0.951048 0.000000 -0.309000
-vn -0.710959 0.703207 0.000000
-vn -0.676168 0.703207 -0.219703
-vn -0.563829 -0.805292 -0.183203
-vn -0.939512 -0.155217 -0.305246
-vn -0.771935 0.584063 -0.250801
-vn -0.156011 0.986419 -0.050691
-vn -0.255684 0.948729 -0.185766
-vn -0.255684 -0.948729 -0.185766
-vn -0.722098 -0.450850 -0.524644
-vn -0.770012 0.306742 -0.559435
-vn -0.372265 0.887814 -0.270455
-vn -0.132725 -0.986419 -0.096408
-vn -0.656667 -0.584063 -0.477096
-vn -0.799188 0.155217 -0.580645
-vn -0.479629 0.805292 -0.348460
-vn -0.575182 -0.703207 -0.417890
-vn -0.809015 0.000000 -0.587756
-vn -0.575182 0.703207 -0.417890
-vn -0.479629 -0.805292 -0.348460
-vn -0.799188 -0.155217 -0.580645
-vn -0.656667 0.584063 -0.477096
-vn -0.372265 -0.887814 -0.270455
-vn -0.770012 -0.306742 -0.559435
-vn -0.722098 0.450850 -0.524644
-vn -0.185766 -0.948729 -0.255684
-vn -0.524644 -0.450850 -0.722098
-vn -0.559435 0.306742 -0.770012
-vn -0.270455 0.887814 -0.372265
-vn -0.096408 -0.986419 -0.132725
-vn -0.477096 -0.584063 -0.656667
-vn -0.580645 0.155217 -0.799188
-vn -0.348460 0.805292 -0.479629
-vn -0.417890 -0.703207 -0.575182
-vn -0.587756 0.000000 -0.809015
-vn -0.417890 0.703207 -0.575182
-vn -0.348460 -0.805292 -0.479629
-vn -0.580645 -0.155217 -0.799188
-vn -0.477096 0.584063 -0.656667
-vn -0.270455 -0.887814 -0.372265
-vn -0.559435 -0.306742 -0.770012
-vn -0.524644 0.450850 -0.722098
-vn -0.132725 0.986419 -0.096408
-vn -0.185766 0.948729 -0.255684
-vn -0.097659 -0.948729 -0.300577
-vn -0.275826 -0.450850 -0.848903
-vn -0.294107 0.306742 -0.905179
-vn -0.142186 0.887814 -0.437635
-vn -0.050691 -0.986419 -0.156011
-vn -0.250801 -0.584063 -0.771935
-vn -0.305246 0.155217 -0.939512
-vn -0.183203 0.805292 -0.563829
-vn -0.219703 -0.703207 -0.676168
-vn -0.309000 0.000000 -0.951048
-vn -0.219703 0.703207 -0.676168
-vn -0.183203 -0.805292 -0.563829
-vn -0.305246 -0.155217 -0.939512
-vn -0.250801 0.584063 -0.771935
-vn -0.142186 -0.887814 -0.437635
-vn -0.294107 -0.306742 -0.905179
-vn -0.275826 0.450850 -0.848903
-vn -0.096408 0.986419 -0.132725
-vn -0.097659 0.948729 -0.300577
-vn 0.000000 -0.450850 -0.892575
-vn 0.000000 0.306742 -0.951781
-vn 0.000000 0.887814 -0.460158
-vn 0.000000 -0.986419 -0.164068
-vn 0.000000 -0.584063 -0.811670
-vn 0.000000 0.155217 -0.987854
-vn 0.000000 0.805292 -0.592853
-vn 0.000000 -0.703207 -0.710959
-vn 0.000000 0.000000 -1.000000
-vn 0.000000 0.703207 -0.710959
-vn 0.000000 -0.805292 -0.592853
-vn 0.000000 -0.155217 -0.987854
-vn 0.000000 0.584063 -0.811670
-vn 0.000000 -0.887814 -0.460158
-vn 0.000000 -0.306742 -0.951781
-vn 0.000000 0.450850 -0.892575
-vn -0.050691 0.986419 -0.156011
-vn 0.000000 0.948729 -0.316050
-vn 0.000000 -0.948729 -0.316050
-vn 0.097659 0.948729 -0.300577
-vn 0.097659 -0.948729 -0.300577
-vn 0.275826 -0.450850 -0.848903
-vn 0.294107 0.306742 -0.905179
-vn 0.142186 0.887814 -0.437635
-vn 0.250801 -0.584063 -0.771935
-vn 0.305246 0.155217 -0.939512
-vn 0.183203 0.805292 -0.563829
-vn 0.219703 -0.703207 -0.676168
-vn 0.309000 0.000000 -0.951048
-vn 0.219703 0.703207 -0.676168
-vn 0.183203 -0.805292 -0.563829
-vn 0.305246 -0.155217 -0.939512
-vn 0.250801 0.584063 -0.771935
-vn 0.000000 0.986419 -0.164068
-vn 0.050691 0.986419 -0.156011
-vn 0.142186 -0.887814 -0.437635
-vn 0.294107 -0.306742 -0.905179
-vn 0.275826 0.450850 -0.848903
-vn 0.050691 -0.986419 -0.156011
-vn 0.185766 -0.948729 -0.255684
-vn 0.524644 -0.450850 -0.722098
-vn 0.559435 0.306742 -0.770012
-vn 0.270455 0.887814 -0.372265
-vn 0.477096 -0.584063 -0.656667
-vn 0.580645 0.155217 -0.799188
-vn 0.348460 0.805292 -0.479629
-vn 0.417890 -0.703207 -0.575182
-vn 0.587756 0.000000 -0.809015
-vn 0.417890 0.703207 -0.575182
-vn 0.348460 -0.805292 -0.479629
-vn 0.580645 -0.155217 -0.799188
-vn 0.477096 0.584063 -0.656667
-vn 0.096408 0.986419 -0.132725
-vn 0.270455 -0.887814 -0.372265
-vn 0.559435 -0.306742 -0.770012
-vn 0.524644 0.450850 -0.722098
-vn 0.185766 0.948729 -0.255684
-vn 0.096408 -0.986419 -0.132725
-vn 0.255684 -0.948729 -0.185766
-vn 0.722098 -0.450850 -0.524644
-vn 0.770012 0.306742 -0.559435
-vn 0.372265 0.887814 -0.270455
-vn 0.656667 -0.584063 -0.477096
-vn 0.799188 0.155217 -0.580645
-vn 0.479629 0.805292 -0.348460
-vn 0.575182 -0.703207 -0.417890
-vn 0.809015 0.000000 -0.587756
-vn 0.575182 0.703207 -0.417890
-vn 0.479629 -0.805292 -0.348460
-vn 0.799188 -0.155217 -0.580645
-vn 0.722098 0.450850 -0.524644
-vn 0.132725 0.986419 -0.096408
-vn 0.372265 -0.887814 -0.270455
-vn 0.770012 -0.306742 -0.559435
-vn 0.255684 0.948729 -0.185766
-vn 0.848903 -0.450850 -0.275826
-vn 0.905179 0.306742 -0.294107
-vn 0.437635 0.887814 -0.142186
-vn 0.676168 -0.703207 -0.219703
-vn 0.939512 0.155217 -0.305246
-vn 0.563829 0.805292 -0.183203
-vn 0.951048 0.000000 -0.309000
-vn 0.656667 0.584063 -0.477096
-vn 0.676168 0.703207 -0.219703
-vn 0.563829 -0.805292 -0.183203
-vn 0.939512 -0.155217 -0.305246
-vn 0.848903 0.450850 -0.275826
-vn 0.156011 0.986419 -0.050691
-vn 0.437635 -0.887814 -0.142186
-vn 0.905179 -0.306742 -0.294107
-vn 0.300577 0.948729 -0.097659
-vn 0.132725 -0.986419 -0.096408
-vn 0.300577 -0.948729 -0.097659
-vn 0.951781 0.306742 0.000000
-vn 0.460158 0.887814 0.000000
-vn 0.771935 -0.584063 -0.250801
-vn 0.710959 -0.703207 0.000000
-vn 0.987854 0.155217 0.000000
-vn 0.592853 0.805292 0.000000
-vn 1.000000 0.000000 0.000000
-vn 0.771935 0.584063 -0.250801
-vn 0.710959 0.703207 0.000000
-vn 0.592853 -0.805292 0.000000
-vn 0.987854 -0.155217 0.000000
-vn 0.892575 0.450850 0.000000
-vn 0.164068 0.986419 0.000000
-vn 0.460158 -0.887814 0.000000
-vn 0.951781 -0.306742 0.000000
-vn 0.316050 0.948729 0.000000
-vn 0.156011 -0.986419 -0.050691
-vn 0.316050 -0.948729 0.000000
-vn 0.892575 -0.450850 0.000000
-vn 0.811670 -0.584063 0.000000
-vn 0.676168 -0.703207 0.219703
-vn 0.939512 0.155217 0.305246
-vn 0.563829 0.805292 0.183203
-vn 0.951048 0.000000 0.309000
-vn 0.811670 0.584063 0.000000
-vn 0.676168 0.703207 0.219703
-vn 0.563829 -0.805292 0.183203
-vn 0.939512 -0.155217 0.305246
-vn 0.848903 0.450850 0.275826
-vn 0.156011 0.986419 0.050691
-vn 0.437635 -0.887814 0.142186
-vn 0.905179 -0.306742 0.294107
-vn 0.300577 0.948729 0.097659
-vn 0.164068 -0.986419 0.000000
-vn 0.300577 -0.948729 0.097659
-vn 0.848903 -0.450850 0.275826
-vn 0.905179 0.306742 0.294107
-vn 0.437635 0.887814 0.142186
-vn 0.771935 -0.584063 0.250801
-vn 0.575182 -0.703207 0.417890
-vn 0.799188 0.155217 0.580645
-vn 0.479629 0.805292 0.348460
-vn 0.809015 0.000000 0.587756
-vn 0.771935 0.584063 0.250801
-vn 0.575182 0.703207 0.417890
-vn 0.479629 -0.805292 0.348460
-vn 0.799188 -0.155217 0.580645
-vn 0.722098 0.450850 0.524644
-vn 0.132725 0.986419 0.096408
-vn 0.372265 -0.887814 0.270455
-vn 0.770012 -0.306742 0.559435
-vn 0.255684 0.948729 0.185766
-vn 0.156011 -0.986419 0.050691
-vn 0.255684 -0.948729 0.185766
-vn 0.722098 -0.450850 0.524644
-vn 0.770012 0.306742 0.559435
-vn 0.372265 0.887814 0.270455
-vn 0.656667 -0.584063 0.477096
-vn 0.417890 -0.703207 0.575182
-vn 0.580645 0.155217 0.799188
-vn 0.348460 0.805292 0.479629
-vn 0.587756 0.000000 0.809015
-vn 0.656667 0.584063 0.477096
-vn 0.417890 0.703207 0.575182
-vn 0.348460 -0.805292 0.479629
-vn 0.580645 -0.155217 0.799188
-vn 0.524644 0.450850 0.722098
-vn 0.096408 0.986419 0.132725
-vn 0.270455 -0.887814 0.372265
-vn 0.559435 -0.306742 0.770012
-vn 0.185766 0.948729 0.255684
-vn 0.132725 -0.986419 0.096408
-vn 0.185766 -0.948729 0.255684
-vn 0.524644 -0.450850 0.722098
-vn 0.559435 0.306742 0.770012
-vn 0.270455 0.887814 0.372265
-vn 0.305246 0.155217 0.939512
-vn 0.183203 0.805292 0.563829
-vn 0.219703 -0.703207 0.676168
-vn 0.309000 0.000000 0.951048
-vn 0.477096 0.584063 0.656667
-vn 0.219703 0.703207 0.676168
-vn 0.183203 -0.805292 0.563829
-vn 0.305246 -0.155217 0.939512
-vn 0.275826 0.450850 0.848903
-vn 0.050691 0.986419 0.156011
-vn 0.142186 -0.887814 0.437635
-vn 0.294107 -0.306742 0.905179
-vn 0.097659 0.948729 0.300577
-vn 0.096408 -0.986419 0.132725
-vn 0.097659 -0.948729 0.300577
-vn 0.477096 -0.584063 0.656667
-vn 0.275826 -0.450850 0.848903
-vn 0.294107 0.306742 0.905179
-vn 0.142186 0.887814 0.437635
-vn 0.250801 -0.584063 0.771935
-vn 0.000000 0.805292 0.592853
-vn 0.000000 -0.703207 0.710959
-vn 0.000000 0.000000 1.000000
-vn 0.250801 0.584063 0.771935
-vn 0.000000 0.703207 0.710959
-vn 0.000000 -0.805292 0.592853
-vn 0.000000 -0.155217 0.987854
-vn 0.000000 0.450850 0.892575
-vn 0.000000 0.986419 0.164068
-vn 0.000000 -0.887814 0.460158
-vn 0.000000 -0.306742 0.951781
-vn 0.000000 0.948729 0.316050
-vn 0.050691 -0.986419 0.156011
-vn 0.000000 -0.948729 0.316050
-vn 0.000000 -0.450850 0.892575
-vn 0.000000 0.306742 0.951781
-vn 0.000000 0.887814 0.460158
-vn 0.000000 -0.584063 0.811670
-vn 0.000000 0.155217 0.987854
-vn -0.183203 -0.805292 0.563829
-vn -0.305246 -0.155217 0.939512
-vn 0.000000 0.584063 0.811670
-vn -0.250801 0.584063 0.771935
-vn -0.142186 -0.887814 0.437635
-vn -0.294107 -0.306742 0.905179
-vn -0.097659 0.948729 0.300577
-vn -0.097659 -0.948729 0.300577
-vn -0.275826 -0.450850 0.848903
-vn -0.294107 0.306742 0.905179
-vn -0.142186 0.887814 0.437635
-vn 0.000000 -0.986419 0.164068
-vn -0.050691 -0.986419 0.156011
-vn -0.250801 -0.584063 0.771935
-vn -0.305246 0.155217 0.939512
-vn -0.183203 0.805292 0.563829
-vn -0.219703 -0.703207 0.676168
-vn -0.309000 0.000000 0.951048
-vn -0.219703 0.703207 0.676168
-vn -0.348460 -0.805292 0.479629
-vn -0.580645 -0.155217 0.799188
-vn -0.477096 0.584063 0.656667
-vn -0.270455 -0.887814 0.372265
-vn -0.559435 -0.306742 0.770012
-vn -0.275826 0.450850 0.848903
-vn -0.050691 0.986419 0.156011
-vn -0.185766 0.948729 0.255684
-vn -0.185766 -0.948729 0.255684
-vn -0.524644 -0.450850 0.722098
-vn -0.559435 0.306742 0.770012
-vn -0.270455 0.887814 0.372265
-vn -0.096408 -0.986419 0.132725
-vn -0.477096 -0.584063 0.656667
-vn -0.580645 0.155217 0.799188
-vn -0.348460 0.805292 0.479629
-vn -0.417890 -0.703207 0.575182
-vn -0.587756 0.000000 0.809015
-vn -0.417890 0.703207 0.575182
-vn -0.479629 -0.805292 0.348460
-vn -0.799188 -0.155217 0.580645
-vn -0.656667 0.584063 0.477096
-vn -0.372265 -0.887814 0.270455
-vn -0.770012 -0.306742 0.559435
-vn -0.524644 0.450850 0.722098
-vn -0.096408 0.986419 0.132725
-vn -0.255684 0.948729 0.185766
-vn -0.255684 -0.948729 0.185766
-vn -0.722098 -0.450850 0.524644
-vn -0.770012 0.306742 0.559435
-vn -0.372265 0.887814 0.270455
-vn -0.132725 -0.986419 0.096408
-vn -0.656667 -0.584063 0.477096
-vn -0.799188 0.155217 0.580645
-vn -0.479629 0.805292 0.348460
-vn -0.575182 -0.703207 0.417890
-vn -0.809015 0.000000 0.587756
-vn -0.575182 0.703207 0.417890
-vn -0.771935 0.584063 0.250801
-vn -0.437635 -0.887814 0.142186
-vn -0.905179 -0.306742 0.294107
-vn -0.722098 0.450850 0.524644
-vn -0.132725 0.986419 0.096408
-vn -0.300577 0.948729 0.097659
-vn -0.300577 -0.948729 0.097659
-vn -0.848903 -0.450850 0.275826
-vn -0.905179 0.306742 0.294107
-vn -0.437635 0.887814 0.142186
-vn -0.156011 -0.986419 0.050691
-vn -0.771935 -0.584063 0.250801
-vn -0.939512 0.155217 0.305246
-vn -0.563829 0.805292 0.183203
-vn -0.676168 -0.703207 0.219703
-vn -0.951048 0.000000 0.309000
-vn -0.676168 0.703207 0.219703
-vn -0.563829 -0.805292 0.183203
-vn -0.939512 -0.155217 0.305246
-vn 0.000000 -0.999969 0.000000
-vn 0.000000 1.000000 0.000000
-vn -0.156011 0.986419 0.050691
-vn -0.848903 0.450850 0.275826
-s 1
-f 17/1/1 16/2/2 36/3/3
-f 12/4/4 11/5/5 31/6/6
-f 7/7/7 6/8/8 26/9/9
-f 2/10/10 1/11/11 21/12/12
-f 18/13/13 17/1/1 37/14/14
-f 13/15/15 12/4/4 32/16/16
-f 8/17/17 7/7/7 27/18/18
-f 3/19/19 2/10/10 22/20/20
-f 19/21/21 18/13/13 38/22/22
-f 14/23/23 13/15/15 33/24/24
-f 9/25/25 8/17/17 28/26/26
-f 4/27/27 3/19/19 23/28/28
-f 15/29/29 14/23/23 34/30/30
-f 10/31/31 9/25/25 29/32/32
-f 5/33/33 4/27/27 24/34/34
-f 16/2/2 15/29/29 35/35/35
-f 11/5/5 10/31/31 30/36/36
-f 6/8/8 5/33/33 25/37/37
-f 21/12/12 20/38/38 41/39/39
-f 37/40/14 36/41/3 57/42/40
-f 32/43/16 31/44/6 52/45/41
-f 27/46/18 26/47/9 47/48/42
-f 22/49/20 21/12/12 42/50/43
-f 38/51/22 37/40/14 58/52/44
-f 33/53/24 32/43/16 53/54/45
-f 28/55/26 27/46/18 48/56/46
-f 23/57/28 22/49/20 43/58/47
-f 34/59/30 33/53/24 54/60/48
-f 29/61/32 28/55/26 49/62/49
-f 24/63/34 23/57/28 44/64/50
-f 35/65/35 34/59/30 55/66/51
-f 30/67/36 29/61/32 50/68/52
-f 25/69/37 24/63/34 45/70/53
-f 36/41/3 35/65/35 56/71/54
-f 31/44/6 30/67/36 51/72/55
-f 26/47/9 25/69/37 46/73/56
-f 57/42/40 56/71/54 76/74/57
-f 52/45/41 51/72/55 71/75/58
-f 47/48/42 46/73/56 66/76/59
-f 42/50/43 41/39/39 61/77/60
-f 58/52/44 57/42/40 77/78/61
-f 53/54/45 52/45/41 72/79/62
-f 48/56/46 47/48/42 67/80/63
-f 43/58/47 42/50/43 62/81/64
-f 54/60/48 53/54/45 73/82/65
-f 49/62/49 48/56/46 68/83/66
-f 44/64/50 43/58/47 63/84/67
-f 55/66/51 54/60/48 74/85/68
-f 50/68/52 49/62/49 69/86/69
-f 45/70/53 44/64/50 64/87/70
-f 56/71/54 55/66/51 75/88/71
-f 51/72/55 50/68/52 70/89/72
-f 46/73/56 45/70/53 65/90/73
-f 41/39/39 40/91/74 60/92/75
-f 76/74/57 75/88/71 95/93/76
-f 71/75/58 70/89/72 90/94/77
-f 66/76/59 65/90/73 85/95/78
-f 61/77/60 60/92/75 80/96/79
-f 77/78/61 76/74/57 96/97/80
-f 72/79/62 71/75/58 91/98/81
-f 67/80/63 66/76/59 86/99/82
-f 62/81/64 61/77/60 81/100/83
-f 73/82/65 72/79/62 92/101/84
-f 68/83/66 67/80/63 87/102/85
-f 63/84/67 62/81/64 82/103/86
-f 74/85/68 73/82/65 93/104/87
-f 69/86/69 68/83/66 88/105/88
-f 64/87/70 63/84/67 83/106/89
-f 75/88/71 74/85/68 94/107/90
-f 70/89/72 69/86/69 89/108/91
-f 65/90/73 64/87/70 84/109/92
-f 60/92/75 59/110/93 79/111/94
-f 90/94/77 89/108/91 109/112/95
-f 85/95/78 84/109/92 104/113/96
-f 80/96/79 79/111/94 99/114/97
-f 96/97/80 95/93/76 115/115/98
-f 91/98/81 90/94/77 110/116/99
-f 86/99/82 85/95/78 105/117/100
-f 81/100/83 80/96/79 100/118/101
-f 92/101/84 91/98/81 111/119/102
-f 87/102/85 86/99/82 106/120/103
-f 82/103/86 81/100/83 101/121/104
-f 93/104/87 92/101/84 112/122/105
-f 88/105/88 87/102/85 107/123/106
-f 83/106/89 82/103/86 102/124/107
-f 94/107/90 93/104/87 113/125/108
-f 89/108/91 88/105/88 108/126/109
-f 84/109/92 83/106/89 103/127/110
-f 79/111/94 78/128/111 98/129/112
-f 95/93/76 94/107/90 114/130/113
-f 99/114/97 98/129/112 117/131/114
-f 115/115/98 114/130/113 133/132/115
-f 110/116/99 109/112/95 128/133/116
-f 105/117/100 104/113/96 123/134/117
-f 100/118/101 99/114/97 118/135/118
-f 111/119/102 110/116/99 129/136/119
-f 106/120/103 105/117/100 124/137/120
-f 101/121/104 100/118/101 119/138/121
-f 112/122/105 111/119/102 130/139/122
-f 107/123/106 106/120/103 125/140/123
-f 102/124/107 101/121/104 120/141/124
-f 113/125/108 112/122/105 131/142/125
-f 108/126/109 107/123/106 126/143/126
-f 103/127/110 102/124/107 121/144/127
-f 98/129/112 97/145/128 116/146/129
-f 114/130/113 113/125/108 132/147/130
-f 109/112/95 108/126/109 127/148/131
-f 104/113/96 103/127/110 122/149/132
-f 134/150/133 133/132/115 152/151/134
-f 129/136/119 128/133/116 147/152/135
-f 124/137/120 123/134/117 142/153/136
-f 119/138/121 118/135/118 137/154/137
-f 130/139/122 129/136/119 148/155/138
-f 125/140/123 124/137/120 143/156/139
-f 120/141/124 119/138/121 138/157/140
-f 131/142/125 130/139/122 149/158/141
-f 126/143/126 125/140/123 144/159/142
-f 121/144/127 120/141/124 139/160/143
-f 132/147/130 131/142/125 150/161/144
-f 127/148/131 126/143/126 145/162/145
-f 122/149/132 121/144/127 140/163/146
-f 117/131/114 116/146/129 135/164/147
-f 133/132/115 132/147/130 151/165/148
-f 128/133/116 127/148/131 146/166/149
-f 123/134/117 122/149/132 141/167/150
-f 118/135/118 117/131/114 136/168/151
-f 153/169/152 152/151/134 171/170/153
-f 148/155/138 147/152/135 166/171/154
-f 143/156/139 142/153/136 161/172/155
-f 138/157/140 137/154/137 156/173/156
-f 149/158/141 148/155/138 167/174/157
-f 144/159/142 143/156/139 162/175/158
-f 139/160/143 138/157/140 157/176/159
-f 150/161/144 149/158/141 168/177/160
-f 145/162/145 144/159/142 163/178/161
-f 140/163/146 139/160/143 158/179/162
-f 151/165/148 150/161/144 169/180/163
-f 146/166/149 145/162/145 164/181/164
-f 141/167/150 140/163/146 160/182/165
-f 136/168/151 135/164/147 154/183/166
-f 152/151/134 151/165/148 170/184/167
-f 147/152/135 146/166/149 165/185/168
-f 142/153/136 141/167/150 160/182/165
-f 137/154/137 136/168/151 155/186/169
-f 167/174/157 166/171/154 185/187/170
-f 162/175/158 161/172/155 180/188/171
-f 157/176/159 156/173/156 175/189/172
-f 168/177/160 167/174/157 187/190/173
-f 163/178/161 162/175/158 181/191/174
-f 158/179/162 157/176/159 176/192/175
-f 169/180/163 168/177/160 187/190/173
-f 164/181/164 163/178/161 182/193/176
-f 159/194/177 158/179/162 177/195/178
-f 170/184/167 169/180/163 188/196/179
-f 165/185/168 164/181/164 183/197/180
-f 160/182/165 159/194/177 179/198/181
-f 155/186/169 154/183/166 173/199/182
-f 171/170/153 170/184/167 189/200/183
-f 166/171/154 165/185/168 184/201/184
-f 161/172/155 160/182/165 179/198/181
-f 156/173/156 155/186/169 174/202/185
-f 172/203/186 171/170/153 190/204/187
-f 181/191/174 180/188/171 199/205/188
-f 176/192/175 175/189/172 194/206/189
-f 187/190/173 186/207/190 206/208/191
-f 182/193/176 181/191/174 200/209/192
-f 177/195/178 176/192/175 195/210/193
-f 188/196/179 187/190/173 206/208/191
-f 183/197/180 182/193/176 201/211/194
-f 178/212/195 177/195/178 196/213/196
-f 189/200/183 188/196/179 207/214/197
-f 184/201/184 183/197/180 202/215/198
-f 179/198/181 178/212/195 198/216/199
-f 174/202/185 173/199/182 192/217/200
-f 190/204/187 189/200/183 208/218/201
-f 185/187/170 184/201/184 203/219/202
-f 180/188/171 179/198/181 198/216/199
-f 175/189/172 174/202/185 193/220/203
-f 191/221/204 190/204/187 209/222/205
-f 186/207/190 185/187/170 204/223/206
-f 206/208/191 205/224/207 225/225/208
-f 201/211/194 200/209/192 219/226/209
-f 196/213/196 195/210/193 214/227/210
-f 207/214/197 206/208/191 225/225/208
-f 202/215/198 201/211/194 220/228/211
-f 197/229/212 196/213/196 215/230/213
-f 208/218/201 207/214/197 226/231/214
-f 203/219/202 202/215/198 221/232/215
-f 198/216/199 197/229/212 217/233/216
-f 193/220/203 192/217/200 211/234/217
-f 209/222/205 208/218/201 227/235/218
-f 204/223/206 203/219/202 222/236/219
-f 199/205/188 198/216/199 217/233/216
-f 194/206/189 193/220/203 212/237/220
-f 210/238/221 209/222/205 228/239/222
-f 205/224/207 204/223/206 223/240/223
-f 200/209/192 199/205/188 218/241/224
-f 195/210/193 194/206/189 213/242/225
-f 225/225/208 224/243/226 244/244/227
-f 220/228/211 219/226/209 238/245/228
-f 215/230/213 214/227/210 233/246/229
-f 226/231/214 225/225/208 244/244/227
-f 221/232/215 220/228/211 239/247/230
-f 216/248/231 215/230/213 234/249/232
-f 227/235/218 226/231/214 245/250/233
-f 222/236/219 221/232/215 240/251/234
-f 217/233/216 216/248/231 236/252/235
-f 212/237/220 211/234/217 230/253/236
-f 228/239/222 227/235/218 246/254/237
-f 223/240/223 222/236/219 241/255/238
-f 218/241/224 217/233/216 236/252/235
-f 213/242/225 212/237/220 231/256/239
-f 229/257/240 228/239/222 247/258/241
-f 224/243/226 223/240/223 242/259/242
-f 219/226/209 218/241/224 237/260/243
-f 214/227/210 213/242/225 232/261/244
-f 244/244/227 243/262/245 263/263/246
-f 239/247/230 238/245/228 257/264/247
-f 234/249/232 233/246/229 252/265/248
-f 245/250/233 244/244/227 263/263/246
-f 240/251/234 239/247/230 258/266/249
-f 235/267/250 234/249/232 253/268/251
-f 246/269/237 245/250/233 264/270/252
-f 241/255/238 240/251/234 259/271/253
-f 236/252/235 235/267/250 255/272/254
-f 231/256/239 230/253/236 249/273/255
-f 247/274/241 246/269/237 265/275/256
-f 242/259/242 241/255/238 260/276/257
-f 237/260/243 236/252/235 255/272/254
-f 232/261/244 231/256/239 250/277/258
-f 248/278/259 247/274/241 266/279/260
-f 243/262/245 242/259/242 261/280/261
-f 238/245/228 237/260/243 256/281/262
-f 233/246/229 232/261/244 251/282/263
-f 258/266/249 257/264/247 276/283/264
-f 253/268/251 252/265/248 271/284/265
-f 264/270/252 263/263/246 282/285/266
-f 259/271/253 258/266/249 277/286/267
-f 254/287/268 253/268/251 272/288/269
-f 265/275/256 264/270/252 283/289/270
-f 260/276/257 259/271/253 278/290/271
-f 255/272/254 254/287/268 274/291/272
-f 250/277/258 249/273/255 268/292/273
-f 266/279/260 265/275/256 284/293/274
-f 261/280/261 260/276/257 279/294/275
-f 256/281/262 255/272/254 274/291/272
-f 251/282/263 250/277/258 269/295/276
-f 267/296/277 266/279/260 285/297/278
-f 262/298/279 261/280/261 280/299/280
-f 257/264/247 256/281/262 275/300/281
-f 252/265/248 251/282/263 270/301/282
-f 263/263/246 262/298/279 281/302/283
-f 272/288/269 271/284/265 290/303/284
-f 283/289/270 282/285/266 301/304/285
-f 278/290/271 277/286/267 296/305/286
-f 273/306/287 272/288/269 291/307/288
-f 284/293/274 283/289/270 302/308/289
-f 279/294/275 278/290/271 297/309/290
-f 274/291/272 273/306/287 293/310/291
-f 269/295/276 268/292/273 287/311/292
-f 285/297/278 284/293/274 303/312/293
-f 280/299/280 279/294/275 298/313/294
-f 275/300/281 274/291/272 293/310/291
-f 270/301/282 269/295/276 288/314/295
-f 286/315/296 285/297/278 304/316/297
-f 281/302/283 280/299/280 299/317/298
-f 276/283/264 275/300/281 294/318/299
-f 271/284/265 270/301/282 289/319/300
-f 282/285/266 281/302/283 300/320/301
-f 277/286/267 276/283/264 295/321/302
-f 302/308/289 301/304/285 321/322/303
-f 297/309/290 296/305/286 316/323/304
-f 292/324/305 291/307/288 311/325/306
-f 303/312/293 302/308/289 322/326/307
-f 298/313/294 297/309/290 317/327/308
-f 293/310/291 292/324/305 311/325/306
-f 288/314/295 287/311/292 307/328/309
-f 304/316/297 303/312/293 323/329/310
-f 299/317/298 298/313/294 318/330/311
-f 294/318/299 293/310/291 313/331/312
-f 289/319/300 288/314/295 308/332/313
-f 305/333/314 304/316/297 324/334/315
-f 300/320/301 299/317/298 319/335/316
-f 295/321/302 294/318/299 314/336/317
-f 290/303/284 289/319/300 309/337/318
-f 301/304/285 300/320/301 320/338/319
-f 296/305/286 295/321/302 315/339/320
-f 291/307/288 290/303/284 310/340/321
-f 321/322/303 320/338/319 340/341/322
-f 316/323/304 315/339/320 335/342/323
-f 311/325/306 310/340/321 330/343/324
-f 322/326/307 321/322/303 341/344/325
-f 317/327/308 316/323/304 336/345/326
-f 312/346/327 311/325/306 330/343/324
-f 307/328/309 306/347/328 326/348/329
-f 323/329/310 322/326/307 342/349/330
-f 318/330/311 317/327/308 337/350/331
-f 313/331/312 312/346/327 332/351/332
-f 308/332/313 307/328/309 327/352/333
-f 324/334/315 323/329/310 343/353/334
-f 319/335/316 318/330/311 338/354/335
-f 314/336/317 313/331/312 333/355/336
-f 309/337/318 308/332/313 328/356/337
-f 320/338/319 319/335/316 339/357/338
-f 315/339/320 314/336/317 334/358/339
-f 310/340/321 309/337/318 329/359/340
-f 340/341/322 339/357/338 360/360/341
-f 335/342/323 334/358/339 355/361/342
-f 330/343/324 329/359/340 350/362/343
-f 341/344/325 340/341/322 361/363/344
-f 336/345/326 335/342/323 356/364/345
-f 331/365/346 330/343/324 350/362/343
-f 326/348/329 325/366/347 346/367/348
-f 342/349/330 341/344/325 362/368/349
-f 337/350/331 336/345/326 357/369/350
-f 332/351/332 331/365/346 352/370/351
-f 327/352/333 326/348/329 347/371/352
-f 343/353/334 342/349/330 363/372/353
-f 338/354/335 337/350/331 358/373/354
-f 333/355/336 332/351/332 353/374/355
-f 328/356/337 327/352/333 348/375/356
-f 339/357/338 338/354/335 359/376/357
-f 334/358/339 333/355/336 354/377/358
-f 329/359/340 328/356/337 349/378/359
-f 350/362/343 349/378/359 369/379/360
-f 361/363/344 360/360/341 380/380/361
-f 356/364/345 355/361/342 375/381/362
-f 351/382/363 350/362/343 369/379/360
-f 346/367/348 345/383/364 365/384/365
-f 362/368/349 361/363/344 381/385/366
-f 357/369/350 356/364/345 376/386/367
-f 352/370/351 351/382/363 371/387/368
-f 347/371/352 346/367/348 366/388/369
-f 363/372/353 362/368/349 382/389/370
-f 358/373/354 357/369/350 377/390/371
-f 353/374/355 352/370/351 372/391/372
-f 348/375/356 347/371/352 367/392/373
-f 359/376/357 358/373/354 378/393/374
-f 354/377/358 353/374/355 373/394/375
-f 349/378/359 348/375/356 368/395/376
-f 360/360/341 359/376/357 379/396/377
-f 355/361/342 354/377/358 374/397/378
-f 39/398/379 19/399/21 38/51/22
-f 1/11/11 344/400/380 20/38/38
-f 39/398/379 38/51/22 58/52/44
-f 20/38/38 344/400/380 40/91/74
-f 39/398/379 58/52/44 77/78/61
-f 40/91/74 344/400/380 59/110/93
-f 39/398/379 77/78/61 96/97/80
-f 59/110/93 344/400/380 78/128/111
-f 39/398/379 96/97/80 115/115/98
-f 78/128/111 344/400/380 97/145/128
-f 39/398/379 115/115/98 134/150/133
-f 97/145/128 344/400/380 116/146/129
-f 39/398/379 134/150/133 153/169/152
-f 116/146/129 344/400/380 135/164/147
-f 39/398/379 153/169/152 172/203/186
-f 135/164/147 344/400/380 154/183/166
-f 39/398/379 172/203/186 191/221/204
-f 154/183/166 344/400/380 173/199/182
-f 39/398/379 191/221/204 210/238/221
-f 173/199/182 344/400/380 192/217/200
-f 39/398/379 210/238/221 229/257/240
-f 192/217/200 344/400/380 211/234/217
-f 39/398/379 229/257/240 248/401/259
-f 211/234/217 344/400/380 230/253/236
-f 39/398/379 248/401/259 267/402/277
-f 230/253/236 344/400/380 249/273/255
-f 249/273/255 344/400/380 268/292/273
-f 39/398/379 267/402/277 286/403/296
-f 268/292/273 344/400/380 287/311/292
-f 39/398/379 286/403/296 305/404/314
-f 287/311/292 344/400/380 306/347/328
-f 39/398/379 305/404/314 324/405/315
-f 306/347/328 344/400/380 325/366/347
-f 39/398/379 324/405/315 343/406/334
-f 325/366/347 344/400/380 345/383/364
-f 39/398/379 343/406/334 363/407/353
-f 345/383/364 344/400/380 364/408/381
-f 39/398/379 363/407/353 382/409/370
-f 364/408/381 344/400/380 1/11/11
-f 380/380/361 379/396/377 16/2/2
-f 375/381/362 374/397/378 12/4/4
-f 370/410/382 369/379/360 7/7/7
-f 365/384/365 364/408/381 2/10/10
-f 381/385/366 380/380/361 17/1/1
-f 376/386/367 375/381/362 13/15/15
-f 371/387/368 370/410/382 8/17/17
-f 366/388/369 365/384/365 3/19/19
-f 382/389/370 381/385/366 18/13/13
-f 377/390/371 376/386/367 13/15/15
-f 372/391/372 371/387/368 9/25/25
-f 367/392/373 366/388/369 4/27/27
-f 39/398/379 382/409/370 19/399/21
-f 378/393/374 377/390/371 14/23/23
-f 373/394/375 372/391/372 10/31/31
-f 368/395/376 367/392/373 5/33/33
-f 379/396/377 378/393/374 15/29/29
-f 374/397/378 373/394/375 11/5/5
-f 369/379/360 368/395/376 6/8/8
-f 16/2/2 35/35/35 36/3/3
-f 11/5/5 30/36/36 31/6/6
-f 6/8/8 25/37/37 26/9/9
-f 1/11/11 20/38/38 21/12/12
-f 17/1/1 36/3/3 37/14/14
-f 12/4/4 31/6/6 32/16/16
-f 7/7/7 26/9/9 27/18/18
-f 2/10/10 21/12/12 22/20/20
-f 18/13/13 37/14/14 38/22/22
-f 13/15/15 32/16/16 33/24/24
-f 8/17/17 27/18/18 28/26/26
-f 3/19/19 22/20/20 23/28/28
-f 14/23/23 33/24/24 34/30/30
-f 9/25/25 28/26/26 29/32/32
-f 4/27/27 23/28/28 24/34/34
-f 15/29/29 34/30/30 35/35/35
-f 10/31/31 29/32/32 30/36/36
-f 5/33/33 24/34/34 25/37/37
-f 20/38/38 40/91/74 41/39/39
-f 36/41/3 56/71/54 57/42/40
-f 31/44/6 51/72/55 52/45/41
-f 26/47/9 46/73/56 47/48/42
-f 21/12/12 41/39/39 42/50/43
-f 37/40/14 57/42/40 58/52/44
-f 32/43/16 52/45/41 53/54/45
-f 27/46/18 47/48/42 48/56/46
-f 22/49/20 42/50/43 43/58/47
-f 33/53/24 53/54/45 54/60/48
-f 28/55/26 48/56/46 49/62/49
-f 23/57/28 43/58/47 44/64/50
-f 34/59/30 54/60/48 55/66/51
-f 29/61/32 49/62/49 50/68/52
-f 24/63/34 44/64/50 45/70/53
-f 35/65/35 55/66/51 56/71/54
-f 30/67/36 50/68/52 51/72/55
-f 25/69/37 45/70/53 46/73/56
-f 56/71/54 75/88/71 76/74/57
-f 51/72/55 70/89/72 71/75/58
-f 46/73/56 65/90/73 66/76/59
-f 41/39/39 60/92/75 61/77/60
-f 57/42/40 76/74/57 77/78/61
-f 52/45/41 71/75/58 72/79/62
-f 47/48/42 66/76/59 67/80/63
-f 42/50/43 61/77/60 62/81/64
-f 53/54/45 72/79/62 73/82/65
-f 48/56/46 67/80/63 68/83/66
-f 43/58/47 62/81/64 63/84/67
-f 54/60/48 73/82/65 74/85/68
-f 49/62/49 68/83/66 69/86/69
-f 44/64/50 63/84/67 64/87/70
-f 55/66/51 74/85/68 75/88/71
-f 50/68/52 69/86/69 70/89/72
-f 45/70/53 64/87/70 65/90/73
-f 40/91/74 59/110/93 60/92/75
-f 75/88/71 94/107/90 95/93/76
-f 70/89/72 89/108/91 90/94/77
-f 65/90/73 84/109/92 85/95/78
-f 60/92/75 79/111/94 80/96/79
-f 76/74/57 95/93/76 96/97/80
-f 71/75/58 90/94/77 91/98/81
-f 66/76/59 85/95/78 86/99/82
-f 61/77/60 80/96/79 81/100/83
-f 72/79/62 91/98/81 92/101/84
-f 67/80/63 86/99/82 87/102/85
-f 62/81/64 81/100/83 82/103/86
-f 73/82/65 92/101/84 93/104/87
-f 68/83/66 87/102/85 88/105/88
-f 63/84/67 82/103/86 83/106/89
-f 74/85/68 93/104/87 94/107/90
-f 69/86/69 88/105/88 89/108/91
-f 64/87/70 83/106/89 84/109/92
-f 59/110/93 78/128/111 79/111/94
-f 89/108/91 108/126/109 109/112/95
-f 84/109/92 103/127/110 104/113/96
-f 79/111/94 98/129/112 99/114/97
-f 95/93/76 114/130/113 115/115/98
-f 90/94/77 109/112/95 110/116/99
-f 85/95/78 104/113/96 105/117/100
-f 80/96/79 99/114/97 100/118/101
-f 91/98/81 110/116/99 111/119/102
-f 86/99/82 105/117/100 106/120/103
-f 81/100/83 100/118/101 101/121/104
-f 92/101/84 111/119/102 112/122/105
-f 87/102/85 106/120/103 107/123/106
-f 82/103/86 101/121/104 102/124/107
-f 93/104/87 112/122/105 113/125/108
-f 88/105/88 107/123/106 108/126/109
-f 83/106/89 102/124/107 103/127/110
-f 78/128/111 97/145/128 98/129/112
-f 94/107/90 113/125/108 114/130/113
-f 118/135/118 99/114/97 117/131/114
-f 134/150/133 115/115/98 133/132/115
-f 129/136/119 110/116/99 128/133/116
-f 124/137/120 105/117/100 123/134/117
-f 119/138/121 100/118/101 118/135/118
-f 130/139/122 111/119/102 129/136/119
-f 125/140/123 106/120/103 124/137/120
-f 120/141/124 101/121/104 119/138/121
-f 131/142/125 112/122/105 130/139/122
-f 126/143/126 107/123/106 125/140/123
-f 121/144/127 102/124/107 120/141/124
-f 132/147/130 113/125/108 131/142/125
-f 127/148/131 108/126/109 126/143/126
-f 122/149/132 103/127/110 121/144/127
-f 117/131/114 98/129/112 116/146/129
-f 133/132/115 114/130/113 132/147/130
-f 128/133/116 109/112/95 127/148/131
-f 123/134/117 104/113/96 122/149/132
-f 153/169/152 134/150/133 152/151/134
-f 148/155/138 129/136/119 147/152/135
-f 143/156/139 124/137/120 142/153/136
-f 138/157/140 119/138/121 137/154/137
-f 149/158/141 130/139/122 148/155/138
-f 144/159/142 125/140/123 143/156/139
-f 139/160/143 120/141/124 138/157/140
-f 150/161/144 131/142/125 149/158/141
-f 145/162/145 126/143/126 144/159/142
-f 140/163/146 121/144/127 139/160/143
-f 151/165/148 132/147/130 150/161/144
-f 146/166/149 127/148/131 145/162/145
-f 141/167/150 122/149/132 140/163/146
-f 136/168/151 117/131/114 135/164/147
-f 152/151/134 133/132/115 151/165/148
-f 147/152/135 128/133/116 146/166/149
-f 142/153/136 123/134/117 141/167/150
-f 137/154/137 118/135/118 136/168/151
-f 172/203/186 153/169/152 171/170/153
-f 167/174/157 148/155/138 166/171/154
-f 162/175/158 143/156/139 161/172/155
-f 157/176/159 138/157/140 156/173/156
-f 168/177/160 149/158/141 167/174/157
-f 163/178/161 144/159/142 162/175/158
-f 158/179/162 139/160/143 157/176/159
-f 169/180/163 150/161/144 168/177/160
-f 164/181/164 145/162/145 163/178/161
-f 159/194/177 140/163/146 158/179/162
-f 170/184/167 151/165/148 169/180/163
-f 165/185/168 146/166/149 164/181/164
-f 140/163/146 159/194/177 160/182/165
-f 155/186/169 136/168/151 154/183/166
-f 171/170/153 152/151/134 170/184/167
-f 166/171/154 147/152/135 165/185/168
-f 161/172/155 142/153/136 160/182/165
-f 156/173/156 137/154/137 155/186/169
-f 186/207/190 167/174/157 185/187/170
-f 181/191/174 162/175/158 180/188/171
-f 176/192/175 157/176/159 175/189/172
-f 167/174/157 186/207/190 187/190/173
-f 182/193/176 163/178/161 181/191/174
-f 177/195/178 158/179/162 176/192/175
-f 188/196/179 169/180/163 187/190/173
-f 183/197/180 164/181/164 182/193/176
-f 178/212/195 159/194/177 177/195/178
-f 189/200/183 170/184/167 188/196/179
-f 184/201/184 165/185/168 183/197/180
-f 159/194/177 178/212/195 179/198/181
-f 174/202/185 155/186/169 173/199/182
-f 190/204/187 171/170/153 189/200/183
-f 185/187/170 166/171/154 184/201/184
-f 180/188/171 161/172/155 179/198/181
-f 175/189/172 156/173/156 174/202/185
-f 191/221/204 172/203/186 190/204/187
-f 200/209/192 181/191/174 199/205/188
-f 195/210/193 176/192/175 194/206/189
-f 186/207/190 205/224/207 206/208/191
-f 201/211/194 182/193/176 200/209/192
-f 196/213/196 177/195/178 195/210/193
-f 207/214/197 188/196/179 206/208/191
-f 202/215/198 183/197/180 201/211/194
-f 197/229/212 178/212/195 196/213/196
-f 208/218/201 189/200/183 207/214/197
-f 203/219/202 184/201/184 202/215/198
-f 178/212/195 197/229/212 198/216/199
-f 193/220/203 174/202/185 192/217/200
-f 209/222/205 190/204/187 208/218/201
-f 204/223/206 185/187/170 203/219/202
-f 199/205/188 180/188/171 198/216/199
-f 194/206/189 175/189/172 193/220/203
-f 210/238/221 191/221/204 209/222/205
-f 205/224/207 186/207/190 204/223/206
-f 205/224/207 224/243/226 225/225/208
-f 220/228/211 201/211/194 219/226/209
-f 215/230/213 196/213/196 214/227/210
-f 226/231/214 207/214/197 225/225/208
-f 221/232/215 202/215/198 220/228/211
-f 216/248/231 197/229/212 215/230/213
-f 227/235/218 208/218/201 226/231/214
-f 222/236/219 203/219/202 221/232/215
-f 197/229/212 216/248/231 217/233/216
-f 212/237/220 193/220/203 211/234/217
-f 228/239/222 209/222/205 227/235/218
-f 223/240/223 204/223/206 222/236/219
-f 218/241/224 199/205/188 217/233/216
-f 213/242/225 194/206/189 212/237/220
-f 229/257/240 210/238/221 228/239/222
-f 224/243/226 205/224/207 223/240/223
-f 219/226/209 200/209/192 218/241/224
-f 214/227/210 195/210/193 213/242/225
-f 224/243/226 243/262/245 244/244/227
-f 239/247/230 220/228/211 238/245/228
-f 234/249/232 215/230/213 233/246/229
-f 245/250/233 226/231/214 244/244/227
-f 240/251/234 221/232/215 239/247/230
-f 235/267/250 216/248/231 234/249/232
-f 246/269/237 227/235/218 245/250/233
-f 241/255/238 222/236/219 240/251/234
-f 216/248/231 235/267/250 236/252/235
-f 231/256/239 212/237/220 230/253/236
-f 247/258/241 228/239/222 246/254/237
-f 242/259/242 223/240/223 241/255/238
-f 237/260/243 218/241/224 236/252/235
-f 232/261/244 213/242/225 231/256/239
-f 248/401/259 229/257/240 247/258/241
-f 243/262/245 224/243/226 242/259/242
-f 238/245/228 219/226/209 237/260/243
-f 233/246/229 214/227/210 232/261/244
-f 243/262/245 262/298/279 263/263/246
-f 258/266/249 239/247/230 257/264/247
-f 253/268/251 234/249/232 252/265/248
-f 264/270/252 245/250/233 263/263/246
-f 259/271/253 240/251/234 258/266/249
-f 254/287/268 235/267/250 253/268/251
-f 265/275/256 246/269/237 264/270/252
-f 260/276/257 241/255/238 259/271/253
-f 235/267/250 254/287/268 255/272/254
-f 250/277/258 231/256/239 249/273/255
-f 266/279/260 247/274/241 265/275/256
-f 261/280/261 242/259/242 260/276/257
-f 256/281/262 237/260/243 255/272/254
-f 251/282/263 232/261/244 250/277/258
-f 267/296/277 248/278/259 266/279/260
-f 262/298/279 243/262/245 261/280/261
-f 257/264/247 238/245/228 256/281/262
-f 252/265/248 233/246/229 251/282/263
-f 277/286/267 258/266/249 276/283/264
-f 272/288/269 253/268/251 271/284/265
-f 283/289/270 264/270/252 282/285/266
-f 278/290/271 259/271/253 277/286/267
-f 273/306/287 254/287/268 272/288/269
-f 284/293/274 265/275/256 283/289/270
-f 279/294/275 260/276/257 278/290/271
-f 254/287/268 273/306/287 274/291/272
-f 269/295/276 250/277/258 268/292/273
-f 285/297/278 266/279/260 284/293/274
-f 280/299/280 261/280/261 279/294/275
-f 275/300/281 256/281/262 274/291/272
-f 270/301/282 251/282/263 269/295/276
-f 286/315/296 267/296/277 285/297/278
-f 281/302/283 262/298/279 280/299/280
-f 276/283/264 257/264/247 275/300/281
-f 271/284/265 252/265/248 270/301/282
-f 282/285/266 263/263/246 281/302/283
-f 291/307/288 272/288/269 290/303/284
-f 302/308/289 283/289/270 301/304/285
-f 297/309/290 278/290/271 296/305/286
-f 292/324/305 273/306/287 291/307/288
-f 303/312/293 284/293/274 302/308/289
-f 298/313/294 279/294/275 297/309/290
-f 273/306/287 292/324/305 293/310/291
-f 288/314/295 269/295/276 287/311/292
-f 304/316/297 285/297/278 303/312/293
-f 299/317/298 280/299/280 298/313/294
-f 294/318/299 275/300/281 293/310/291
-f 289/319/300 270/301/282 288/314/295
-f 305/333/314 286/315/296 304/316/297
-f 300/320/301 281/302/283 299/317/298
-f 295/321/302 276/283/264 294/318/299
-f 290/303/284 271/284/265 289/319/300
-f 301/304/285 282/285/266 300/320/301
-f 296/305/286 277/286/267 295/321/302
-f 301/304/285 320/338/319 321/322/303
-f 296/305/286 315/339/320 316/323/304
-f 291/307/288 310/340/321 311/325/306
-f 302/308/289 321/322/303 322/326/307
-f 297/309/290 316/323/304 317/327/308
-f 312/346/327 293/310/291 311/325/306
-f 287/311/292 306/347/328 307/328/309
-f 303/312/293 322/326/307 323/329/310
-f 298/313/294 317/327/308 318/330/311
-f 293/310/291 312/346/327 313/331/312
-f 288/314/295 307/328/309 308/332/313
-f 304/316/297 323/329/310 324/334/315
-f 299/317/298 318/330/311 319/335/316
-f 294/318/299 313/331/312 314/336/317
-f 289/319/300 308/332/313 309/337/318
-f 300/320/301 319/335/316 320/338/319
-f 295/321/302 314/336/317 315/339/320
-f 290/303/284 309/337/318 310/340/321
-f 320/338/319 339/357/338 340/341/322
-f 315/339/320 334/358/339 335/342/323
-f 310/340/321 329/359/340 330/343/324
-f 321/322/303 340/341/322 341/344/325
-f 316/323/304 335/342/323 336/345/326
-f 331/365/346 312/346/327 330/343/324
-f 306/347/328 325/366/347 326/348/329
-f 322/326/307 341/344/325 342/349/330
-f 317/327/308 336/345/326 337/350/331
-f 312/346/327 331/365/346 332/351/332
-f 307/328/309 326/348/329 327/352/333
-f 323/329/310 342/349/330 343/353/334
-f 318/330/311 337/350/331 338/354/335
-f 313/331/312 332/351/332 333/355/336
-f 308/332/313 327/352/333 328/356/337
-f 319/335/316 338/354/335 339/357/338
-f 314/336/317 333/355/336 334/358/339
-f 309/337/318 328/356/337 329/359/340
-f 339/357/338 359/376/357 360/360/341
-f 334/358/339 354/377/358 355/361/342
-f 329/359/340 349/378/359 350/362/343
-f 340/341/322 360/360/341 361/363/344
-f 335/342/323 355/361/342 356/364/345
-f 351/382/363 331/365/346 350/362/343
-f 325/366/347 345/383/364 346/367/348
-f 341/344/325 361/363/344 362/368/349
-f 336/345/326 356/364/345 357/369/350
-f 331/365/346 351/382/363 352/370/351
-f 326/348/329 346/367/348 347/371/352
-f 342/349/330 362/368/349 363/372/353
-f 337/350/331 357/369/350 358/373/354
-f 332/351/332 352/370/351 353/374/355
-f 327/352/333 347/371/352 348/375/356
-f 338/354/335 358/373/354 359/376/357
-f 333/355/336 353/374/355 354/377/358
-f 328/356/337 348/375/356 349/378/359
-f 349/378/359 368/395/376 369/379/360
-f 360/360/341 379/396/377 380/380/361
-f 355/361/342 374/397/378 375/381/362
-f 370/410/382 351/382/363 369/379/360
-f 345/383/364 364/408/381 365/384/365
-f 361/363/344 380/380/361 381/385/366
-f 356/364/345 375/381/362 376/386/367
-f 351/382/363 370/410/382 371/387/368
-f 346/367/348 365/384/365 366/388/369
-f 362/368/349 381/385/366 382/389/370
-f 357/369/350 376/386/367 377/390/371
-f 352/370/351 371/387/368 372/391/372
-f 347/371/352 366/388/369 367/392/373
-f 358/373/354 377/390/371 378/393/374
-f 353/374/355 372/391/372 373/394/375
-f 348/375/356 367/392/373 368/395/376
-f 359/376/357 378/393/374 379/396/377
-f 354/377/358 373/394/375 374/397/378
-f 17/1/1 380/380/361 16/2/2
-f 374/397/378 11/5/5 12/4/4
-f 369/379/360 6/8/8 7/7/7
-f 364/408/381 1/11/11 2/10/10
-f 18/13/13 381/385/366 17/1/1
-f 375/381/362 12/4/4 13/15/15
-f 370/410/382 7/7/7 8/17/17
-f 365/384/365 2/10/10 3/19/19
-f 19/21/21 382/389/370 18/13/13
-f 14/23/23 377/390/371 13/15/15
-f 371/387/368 8/17/17 9/25/25
-f 366/388/369 3/19/19 4/27/27
-f 15/29/29 378/393/374 14/23/23
-f 372/391/372 9/25/25 10/31/31
-f 367/392/373 4/27/27 5/33/33
-f 16/2/2 379/396/377 15/29/29
-f 373/394/375 10/31/31 11/5/5
-f 368/395/376 5/33/33 6/8/8
diff --git a/examples/datavisualization/rotations/mesh/narrowarrow.obj b/examples/datavisualization/rotations/mesh/narrowarrow.obj
deleted file mode 100644
index 481fc1d1..00000000
--- a/examples/datavisualization/rotations/mesh/narrowarrow.obj
+++ /dev/null
@@ -1,413 +0,0 @@
-# Blender v2.69 (sub 0) OBJ File: ''
-# www.blender.org
-v 0.000000 0.986570 0.000000
-v 0.000000 0.500000 -0.218399
-v -0.042608 0.500000 -0.214202
-v -0.083578 0.500000 -0.201774
-v -0.121336 0.500000 -0.181592
-v -0.154431 0.500000 -0.154431
-v -0.181592 0.500000 -0.121336
-v -0.201774 0.500000 -0.083578
-v -0.214202 0.500000 -0.042608
-v -0.218399 0.500000 -0.000000
-v -0.214202 0.500000 0.042607
-v -0.201774 0.500000 0.083578
-v -0.181592 0.500000 0.121336
-v -0.154431 0.500000 0.154431
-v -0.121336 0.500000 0.181592
-v -0.083578 0.500000 0.201774
-v -0.042607 0.500000 0.214202
-v 0.000000 0.500000 0.218399
-v 0.042608 0.500000 0.214202
-v 0.083578 0.500000 0.201774
-v 0.121336 0.500000 0.181592
-v 0.154431 0.500000 0.154431
-v 0.181592 0.500000 0.121336
-v 0.201774 0.500000 0.083577
-v 0.214202 0.500000 0.042607
-v 0.218399 0.500000 -0.000000
-v 0.214202 0.500000 -0.042608
-v 0.201774 0.500000 -0.083578
-v 0.181592 0.500000 -0.121336
-v 0.154431 0.500000 -0.154432
-v 0.121336 0.500000 -0.181592
-v 0.083577 0.500000 -0.201774
-v 0.042607 0.500000 -0.214202
-v 0.000000 0.000000 0.000000
-v 0.000000 0.000000 0.000000
-v -0.000000 0.500000 -0.126422
-v -0.024664 0.500000 -0.123993
-v -0.048380 0.500000 -0.116799
-v -0.070236 0.500000 -0.105116
-v -0.089394 0.500000 -0.089394
-v -0.105116 0.500000 -0.070236
-v -0.116799 0.500000 -0.048380
-v -0.123993 0.500000 -0.024664
-v -0.126422 0.500000 -0.000000
-v -0.123993 0.500000 0.024664
-v -0.116799 0.500000 0.048380
-v -0.105116 0.500000 0.070236
-v -0.089394 0.500000 0.089394
-v -0.070236 0.500000 0.105116
-v -0.048380 0.500000 0.116799
-v -0.024664 0.500000 0.123993
-v 0.000000 0.500000 0.126422
-v 0.024664 0.500000 0.123993
-v 0.048380 0.500000 0.116799
-v 0.070236 0.500000 0.105116
-v 0.089394 0.500000 0.089394
-v 0.105116 0.500000 0.070236
-v 0.116799 0.500000 0.048380
-v 0.123993 0.500000 0.024664
-v 0.126422 0.500000 -0.000000
-v 0.123993 0.500000 -0.024664
-v 0.116799 0.500000 -0.048380
-v 0.105116 0.500000 -0.070237
-v 0.089394 0.500000 -0.089394
-v 0.070236 0.500000 -0.105116
-v 0.048380 0.500000 -0.116799
-v 0.024664 0.500000 -0.123993
-v 0.126422 -0.983070 -0.000000
-v 0.123993 -0.983070 0.024664
-v -0.048380 -0.983070 -0.116799
-v -0.024664 -0.983070 -0.123993
-v -0.070236 -0.983070 0.105116
-v -0.089394 -0.983070 0.089394
-v 0.116799 -0.983070 0.048380
-v 0.105116 -0.983070 0.070236
-v -0.105116 -0.983070 0.070236
-v -0.116799 -0.983070 0.048380
-v 0.024664 -0.983070 -0.123993
-v 0.048380 -0.983070 -0.116799
-v 0.089394 -0.983070 0.089394
-v 0.070236 -0.983070 0.105116
-v -0.123993 -0.983070 0.024664
-v -0.126422 -0.983070 -0.000000
-v 0.070236 -0.983070 -0.105116
-v 0.089394 -0.983070 -0.089394
-v 0.048380 -0.983070 0.116799
-v 0.024664 -0.983070 0.123993
-v -0.123993 -0.983070 -0.024664
-v -0.116799 -0.983070 -0.048380
-v 0.105116 -0.983070 -0.070237
-v 0.116799 -0.983070 -0.048380
-v -0.105116 -0.983070 -0.070236
-v -0.089394 -0.983070 -0.089394
-v 0.000000 -0.983070 0.126422
-v -0.024664 -0.983070 0.123993
-v 0.123993 -0.983070 -0.024664
-v -0.070236 -0.983070 -0.105116
-v -0.048380 -0.983070 0.116799
-v -0.000000 -0.983070 -0.126422
-vt 0.000000 0.000000
-vt 1.000000 0.000000
-vt 1.000000 1.000000
-vt 0.000000 1.000000
-vt 0.500000 1.000000
-vt 0.597545 0.990393
-vt 0.402456 0.990393
-vt 0.691342 0.961940
-vt 0.777785 0.915735
-vt 0.853553 0.853553
-vt 0.915735 0.777785
-vt 0.961940 0.691342
-vt 0.990393 0.597545
-vt 1.000000 0.500000
-vt 0.990393 0.402455
-vt 0.961940 0.308658
-vt 0.915735 0.222215
-vt 0.853553 0.146447
-vt 0.777785 0.084265
-vt 0.691342 0.038060
-vt 0.597545 0.009607
-vt 0.308659 0.961940
-vt 0.222215 0.915735
-vt 0.146447 0.853554
-vt 0.308658 0.038060
-vt 0.500000 0.000000
-vt 0.402455 0.009607
-vt 0.222215 0.084265
-vt 0.146446 0.146447
-vt 0.084265 0.222215
-vt 0.009607 0.402455
-vt 0.038060 0.308659
-vt 0.009607 0.597546
-vt 0.000000 0.500000
-vt 0.038060 0.691342
-vt 0.084266 0.777786
-vn -0.089495 0.407852 -0.908651
-vn -0.265044 0.407852 -0.873733
-vn -0.430408 0.407852 -0.805236
-vn -0.579231 0.407852 -0.705796
-vn -0.705796 0.407852 -0.579232
-vn -0.805237 0.407852 -0.430408
-vn -0.873733 0.407852 -0.265043
-vn -0.908651 0.407852 -0.089495
-vn -0.908652 0.407852 0.089494
-vn -0.873732 0.407852 0.265044
-vn -0.805237 0.407852 0.430407
-vn -0.705796 0.407852 0.579232
-vn -0.579231 0.407852 0.705796
-vn -0.430408 0.407852 0.805237
-vn -0.265044 0.407852 0.873733
-vn -0.089494 0.407852 0.908652
-vn 0.089495 0.407852 0.908651
-vn 0.265044 0.407852 0.873732
-vn 0.430408 0.407852 0.805237
-vn 0.579232 0.407852 0.705796
-vn 0.705796 0.407852 0.579231
-vn 0.805237 0.407852 0.430406
-vn 0.873733 0.407852 0.265044
-vn 0.908652 0.407852 0.089493
-vn 0.908651 0.407852 -0.089496
-vn 0.873732 0.407852 -0.265045
-vn 0.805236 0.407852 -0.430409
-vn 0.705795 0.407852 -0.579232
-vn 0.579231 0.407852 -0.705796
-vn 0.430407 0.407852 -0.805237
-vn 0.265042 0.407852 -0.873733
-vn 0.089494 0.407852 -0.908652
-vn 0.000000 -1.000000 0.000000
-vn 0.000000 -1.000000 0.000062
-vn -0.290284 0.000000 0.956940
-vn -0.098017 0.000000 0.995185
-vn -0.634393 0.000000 -0.773010
-vn -0.773010 0.000000 -0.634393
-vn 0.956940 0.000000 -0.290286
-vn 0.881921 0.000000 -0.471398
-vn -0.881922 0.000000 -0.471396
-vn -0.956940 0.000000 -0.290285
-vn 0.098017 0.000000 0.995185
-vn 0.290285 0.000000 0.956940
-vn 0.773010 0.000000 -0.634394
-vn 0.634392 0.000000 -0.773011
-vn -0.995185 0.000000 -0.098017
-vn -0.995185 0.000000 0.098017
-vn 0.471397 0.000000 0.881921
-vn 0.634394 0.000000 0.773010
-vn 0.471395 0.000000 -0.881922
-vn 0.290283 0.000000 -0.956941
-vn 0.098016 0.000000 -0.995185
-vn -0.956940 0.000000 0.290285
-vn -0.881922 0.000000 0.471396
-vn 0.773011 0.000000 0.634393
-vn 0.881922 0.000000 0.471396
-vn -0.773010 0.000000 0.634393
-vn -0.634394 0.000000 0.773010
-vn -0.471397 0.000000 0.881921
-vn -0.098016 0.000000 -0.995185
-vn -0.290284 0.000000 -0.956940
-vn -0.471397 0.000000 -0.881921
-vn 0.956941 0.000000 0.290284
-vn 0.995185 0.000000 0.098016
-vn 0.995185 0.000000 -0.098018
-vn 0.000000 -1.000000 0.000001
-vn 0.000000 -1.000000 0.000018
-vn 0.000000 -1.000000 -0.000013
-vn 0.000000 -1.000000 0.000011
-vn 0.000000 -1.000000 0.000002
-vn 0.000000 -1.000000 -0.000031
-vn 0.000000 -1.000000 0.000031
-vn 0.000000 -1.000000 -0.000021
-vn 0.000000 -1.000000 -0.000016
-vn 0.000000 -1.000000 -0.000005
-vn 0.000000 -1.000000 0.000003
-vn -0.098015 0.000000 0.995185
-vn -0.773011 0.000000 -0.634393
-vn -0.881921 0.000000 -0.471396
-vn 0.773009 0.000000 -0.634394
-vn 0.098017 0.000000 -0.995185
-vn -0.634393 0.000000 0.773011
-vn -0.098018 0.000000 -0.995185
-vn -0.290285 0.000000 -0.956940
-s off
-f 1/1/1 2/2/1 3/3/1
-f 1/1/2 3/2/2 4/3/2
-f 1/1/3 4/2/3 5/3/3
-f 1/1/4 5/2/4 6/3/4
-f 1/1/5 6/2/5 7/3/5
-f 1/1/6 7/2/6 8/3/6
-f 1/1/7 8/2/7 9/3/7
-f 1/1/8 9/2/8 10/3/8
-f 1/1/9 10/2/9 11/3/9
-f 1/1/10 11/2/10 12/3/10
-f 1/1/11 12/2/11 13/3/11
-f 1/1/12 13/2/12 14/3/12
-f 1/1/13 14/2/13 15/3/13
-f 1/1/14 15/2/14 16/3/14
-f 1/1/15 16/2/15 17/3/15
-f 1/1/16 17/2/16 18/3/16
-f 1/1/17 18/2/17 19/3/17
-f 1/1/18 19/2/18 20/3/18
-f 1/1/19 20/2/19 21/3/19
-f 1/1/20 21/2/20 22/3/20
-f 1/1/21 22/2/21 23/3/21
-f 1/1/22 23/2/22 24/3/22
-f 1/1/23 24/2/23 25/3/23
-f 1/1/24 25/2/24 26/3/24
-f 1/1/25 26/2/25 27/3/25
-f 1/1/26 27/2/26 28/3/26
-f 1/1/27 28/2/27 29/3/27
-f 1/1/28 29/2/28 30/3/28
-f 1/1/29 30/2/29 31/3/29
-f 1/1/30 31/2/30 32/3/30
-f 1/1/31 32/2/31 33/3/31
-f 1/1/32 33/2/32 2/3/32
-f 24/1/33 23/2/33 58/4/33
-f 13/1/33 12/2/33 47/4/33
-f 2/1/33 33/2/33 36/4/33
-f 23/1/33 22/2/33 57/4/33
-f 12/1/33 11/2/33 46/4/33
-f 33/1/33 32/2/33 67/4/33
-f 22/1/33 21/2/33 56/4/33
-f 11/1/33 10/2/33 45/4/33
-f 32/1/33 31/2/33 66/4/33
-f 21/1/33 20/2/33 55/4/33
-f 10/1/33 9/2/33 44/4/33
-f 31/1/33 30/2/33 65/4/33
-f 20/1/33 19/2/33 54/4/33
-f 9/1/33 8/2/33 43/4/33
-f 30/1/33 29/2/33 64/4/33
-f 19/1/33 18/2/33 53/4/33
-f 3/1/33 2/2/33 37/4/33
-f 8/1/33 7/2/33 42/4/33
-f 29/1/33 28/2/33 63/4/33
-f 7/1/33 6/2/33 41/4/33
-f 18/1/33 17/2/33 52/4/33
-f 28/1/33 27/2/33 62/4/33
-f 6/1/33 5/2/33 40/4/33
-f 17/1/33 16/2/33 51/4/33
-f 27/1/33 26/2/33 61/4/33
-f 5/1/33 4/2/33 39/4/33
-f 16/1/33 15/2/33 50/4/33
-f 26/1/33 25/2/33 60/4/33
-f 4/1/33 3/2/33 38/4/33
-f 15/1/33 14/2/33 49/4/33
-f 25/1/33 24/2/33 59/4/33
-f 14/1/33 13/2/33 48/4/33
-f 81/5/34 86/6/34 80/7/34
-f 51/1/35 50/2/35 95/4/35
-f 52/1/36 51/2/36 94/4/36
-f 40/1/37 39/2/37 93/4/37
-f 41/1/38 40/2/38 92/4/38
-f 62/1/39 61/2/39 91/4/39
-f 63/1/40 62/2/40 90/4/40
-f 42/1/41 41/2/41 89/4/41
-f 43/1/42 42/2/42 88/4/42
-f 53/1/43 52/2/43 87/4/43
-f 54/1/44 53/2/44 86/4/44
-f 64/1/45 63/2/45 85/4/45
-f 65/1/46 64/2/46 84/4/46
-f 44/1/47 43/2/47 83/4/47
-f 45/1/48 44/2/48 82/4/48
-f 55/1/49 54/2/49 81/4/49
-f 56/1/50 55/2/50 80/4/50
-f 66/1/51 65/2/51 79/4/51
-f 67/1/52 66/2/52 78/4/52
-f 36/1/53 67/2/53 99/4/53
-f 46/1/54 45/2/54 77/4/54
-f 47/1/55 46/2/55 76/4/55
-f 57/1/56 56/2/56 75/4/56
-f 58/1/57 57/2/57 74/4/57
-f 48/1/58 47/2/58 73/4/58
-f 49/1/59 48/2/59 72/4/59
-f 50/1/60 49/2/60 98/4/60
-f 37/1/61 36/2/61 71/4/61
-f 38/1/62 37/2/62 70/4/62
-f 39/1/63 38/2/63 97/4/63
-f 59/1/64 58/2/64 69/4/64
-f 60/1/65 59/2/65 68/4/65
-f 61/1/66 60/2/66 96/4/66
-f 23/2/33 57/3/33 58/4/33
-f 12/2/33 46/3/33 47/4/33
-f 33/2/33 67/3/33 36/4/33
-f 22/2/33 56/3/33 57/4/33
-f 11/2/33 45/3/33 46/4/33
-f 32/2/67 66/3/67 67/4/67
-f 21/2/33 55/3/33 56/4/33
-f 10/2/33 44/3/33 45/4/33
-f 31/2/33 65/3/33 66/4/33
-f 20/2/33 54/3/33 55/4/33
-f 9/2/33 43/3/33 44/4/33
-f 30/2/33 64/3/33 65/4/33
-f 19/2/33 53/3/33 54/4/33
-f 8/2/33 42/3/33 43/4/33
-f 29/2/33 63/3/33 64/4/33
-f 18/2/33 52/3/33 53/4/33
-f 2/2/33 36/3/33 37/4/33
-f 7/2/33 41/3/33 42/4/33
-f 28/2/33 62/3/33 63/4/33
-f 6/2/33 40/3/33 41/4/33
-f 17/2/33 51/3/33 52/4/33
-f 27/2/33 61/3/33 62/4/33
-f 5/2/33 39/3/33 40/4/33
-f 16/2/67 50/3/67 51/4/67
-f 26/2/33 60/3/33 61/4/33
-f 4/2/33 38/3/33 39/4/33
-f 15/2/33 49/3/33 50/4/33
-f 25/2/33 59/3/33 60/4/33
-f 3/2/33 37/3/33 38/4/33
-f 14/2/33 48/3/33 49/4/33
-f 24/2/33 58/3/33 59/4/33
-f 13/2/33 47/3/33 48/4/33
-f 86/6/33 87/8/33 80/7/33
-f 87/8/33 94/9/33 80/7/33
-f 94/9/33 95/10/33 80/7/33
-f 95/10/68 98/11/68 80/7/68
-f 98/11/69 72/12/69 80/7/69
-f 72/12/70 73/13/70 80/7/70
-f 73/13/33 76/14/33 80/7/33
-f 76/14/33 77/15/33 80/7/33
-f 77/15/33 82/16/33 80/7/33
-f 82/16/33 83/17/33 80/7/33
-f 83/17/33 88/18/33 80/7/33
-f 88/18/33 89/19/33 80/7/33
-f 89/19/33 92/20/33 93/21/33
-f 80/7/71 89/19/71 93/21/71
-f 75/22/33 80/7/33 93/21/33
-f 74/23/33 75/22/33 93/21/33
-f 69/24/33 74/23/33 93/21/33
-f 71/25/72 97/26/72 70/27/72
-f 71/25/73 93/21/73 97/26/73
-f 99/28/74 93/21/74 71/25/74
-f 78/29/33 93/21/33 99/28/33
-f 79/30/33 93/21/33 78/29/33
-f 85/31/73 79/30/73 84/32/73
-f 85/31/33 93/21/33 79/30/33
-f 91/33/75 85/31/75 90/34/75
-f 91/33/33 93/21/33 85/31/33
-f 96/35/33 68/36/33 91/33/33
-f 68/36/76 69/24/76 93/21/76
-f 91/33/77 68/36/77 93/21/77
-f 50/2/35 98/3/35 95/4/35
-f 51/2/78 95/3/78 94/4/78
-f 39/2/37 97/3/37 93/4/37
-f 40/2/79 93/3/79 92/4/79
-f 61/2/39 96/3/39 91/4/39
-f 62/2/40 91/3/40 90/4/40
-f 41/2/80 92/3/80 89/4/80
-f 42/2/42 89/3/42 88/4/42
-f 52/2/43 94/3/43 87/4/43
-f 53/2/44 87/3/44 86/4/44
-f 63/2/81 90/3/81 85/4/81
-f 64/2/46 85/3/46 84/4/46
-f 43/2/47 88/3/47 83/4/47
-f 44/2/48 83/3/48 82/4/48
-f 54/2/49 86/3/49 81/4/49
-f 55/2/50 81/3/50 80/4/50
-f 65/2/51 84/3/51 79/4/51
-f 66/2/52 79/3/52 78/4/52
-f 67/2/82 78/3/82 99/4/82
-f 45/2/54 82/3/54 77/4/54
-f 46/2/55 77/3/55 76/4/55
-f 56/2/56 80/3/56 75/4/56
-f 57/2/57 75/3/57 74/4/57
-f 47/2/58 76/3/58 73/4/58
-f 48/2/83 73/3/83 72/4/83
-f 49/2/60 72/3/60 98/4/60
-f 36/2/84 99/3/84 71/4/84
-f 37/2/85 71/3/85 70/4/85
-f 38/2/63 70/3/63 97/4/63
-f 58/2/64 74/3/64 69/4/64
-f 59/2/65 69/3/65 68/4/65
-f 60/2/66 68/3/66 96/4/66
diff --git a/examples/datavisualization/rotations/rotations.pro b/examples/datavisualization/rotations/rotations.pro
deleted file mode 100644
index faabc5aa..00000000
--- a/examples/datavisualization/rotations/rotations.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp scatterdatamodifier.cpp
-HEADERS += scatterdatamodifier.h
-
-QT += widgets
-
-RESOURCES += rotations.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/rotations/rotations.qrc b/examples/datavisualization/rotations/rotations.qrc
deleted file mode 100644
index bf66ebeb..00000000
--- a/examples/datavisualization/rotations/rotations.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>mesh/narrowarrow.obj</file>
- <file>mesh/largesphere.obj</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/rotations/scatterdatamodifier.cpp b/examples/datavisualization/rotations/scatterdatamodifier.cpp
deleted file mode 100644
index d3c383b6..00000000
--- a/examples/datavisualization/rotations/scatterdatamodifier.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-#include <QtDataVisualization/qscatterdataproxy.h>
-#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/qscatter3dseries.h>
-#include <QtDataVisualization/q3dtheme.h>
-#include <QtDataVisualization/QCustom3DItem>
-#include <QtCore/qmath.h>
-
-using namespace QtDataVisualization;
-
-static const float verticalRange = 8.0f;
-static const float horizontalRange = verticalRange;
-static const float ellipse_a = horizontalRange / 3.0f;
-static const float ellipse_b = verticalRange;
-static const float doublePi = float(M_PI) * 2.0f;
-static const float radiansToDegrees = 360.0f / doublePi;
-static const float animationFrames = 30.0f;
-
-ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
- : m_graph(scatter),
- m_fieldLines(12),
- m_arrowsPerLine(16),
- m_magneticField(new QScatter3DSeries),
- m_sun(new QCustom3DItem),
- m_magneticFieldArray(0),
- m_angleOffset(0.0f),
- m_angleStep(doublePi / m_arrowsPerLine / animationFrames)
-{
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
-
- // Magnetic field lines use custom narrow arrow
- m_magneticField->setItemSize(0.2f);
- //! [3]
- m_magneticField->setMesh(QAbstract3DSeries::MeshUserDefined);
- m_magneticField->setUserDefinedMesh(QStringLiteral(":/mesh/narrowarrow.obj"));
- //! [3]
- //! [4]
- QLinearGradient fieldGradient(0, 0, 16, 1024);
- fieldGradient.setColorAt(0.0, Qt::black);
- fieldGradient.setColorAt(1.0, Qt::white);
- m_magneticField->setBaseGradient(fieldGradient);
- m_magneticField->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
- //! [4]
-
- // For 'sun' we use a custom large sphere
- m_sun->setScaling(QVector3D(0.07f, 0.07f, 0.07f));
- m_sun->setMeshFile(QStringLiteral(":/mesh/largesphere.obj"));
- QImage sunColor = QImage(2, 2, QImage::Format_RGB32);
- sunColor.fill(QColor(0xff, 0xbb, 0x00));
- m_sun->setTextureImage(sunColor);
-
- m_graph->addSeries(m_magneticField);
- m_graph->addCustomItem(m_sun);
-
- // Configure the axes according to the data
- m_graph->axisX()->setRange(-horizontalRange, horizontalRange);
- m_graph->axisY()->setRange(-verticalRange, verticalRange);
- m_graph->axisZ()->setRange(-horizontalRange, horizontalRange);
- m_graph->axisX()->setSegmentCount(int(horizontalRange));
- m_graph->axisZ()->setSegmentCount(int(horizontalRange));
-
- QObject::connect(&m_rotationTimer, &QTimer::timeout, this,
- &ScatterDataModifier::triggerRotation);
-
- toggleRotation();
- generateData();
-}
-
-ScatterDataModifier::~ScatterDataModifier()
-{
- delete m_graph;
-}
-
-void ScatterDataModifier::generateData()
-{
- // Reusing existing array is computationally cheaper than always generating new array, even if
- // all data items change in the array, if the array size doesn't change.
- if (!m_magneticFieldArray)
- m_magneticFieldArray = new QScatterDataArray;
-
- int arraySize = m_fieldLines * m_arrowsPerLine;
- if (arraySize != m_magneticFieldArray->size())
- m_magneticFieldArray->resize(arraySize);
-
- QScatterDataItem *ptrToDataArray = &m_magneticFieldArray->first();
-
- for (float i = 0; i < m_fieldLines; i++) {
- float horizontalAngle = (doublePi * i) / m_fieldLines;
- float xCenter = ellipse_a * qCos(horizontalAngle);
- float zCenter = ellipse_a * qSin(horizontalAngle);
-
- // Rotate - arrow always tangential to origin
- //! [0]
- QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, horizontalAngle * radiansToDegrees);
- //! [0]
-
- for (float j = 0; j < m_arrowsPerLine; j++) {
- // Calculate point on ellipse centered on origin and parallel to x-axis
- float verticalAngle = ((doublePi * j) / m_arrowsPerLine) + m_angleOffset;
- float xUnrotated = ellipse_a * qCos(verticalAngle);
- float y = ellipse_b * qSin(verticalAngle);
-
- // Rotate the ellipse around y-axis
- float xRotated = xUnrotated * qCos(horizontalAngle);
- float zRotated = xUnrotated * qSin(horizontalAngle);
-
- // Add offset
- float x = xCenter + xRotated;
- float z = zCenter + zRotated;
-
- //! [1]
- QQuaternion zRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, verticalAngle * radiansToDegrees);
- QQuaternion totalRotation = yRotation * zRotation;
- //! [1]
-
- ptrToDataArray->setPosition(QVector3D(x, y, z));
- //! [2]
- ptrToDataArray->setRotation(totalRotation);
- //! [2]
- ptrToDataArray++;
- }
- }
-
- if (m_graph->selectedSeries() == m_magneticField)
- m_graph->clearSelection();
-
- m_magneticField->dataProxy()->resetArray(m_magneticFieldArray);
-}
-
-void ScatterDataModifier::setFieldLines(int lines)
-{
- m_fieldLines = lines;
- generateData();
-}
-
-void ScatterDataModifier::setArrowsPerLine(int arrows)
-{
- m_angleOffset = 0.0f;
- m_angleStep = doublePi / m_arrowsPerLine / animationFrames;
- m_arrowsPerLine = arrows;
- generateData();
-}
-
-void ScatterDataModifier::triggerRotation()
-{
- m_angleOffset += m_angleStep;
- generateData();
-}
-
-void ScatterDataModifier::toggleSun()
-{
- m_sun->setVisible(!m_sun->isVisible());
-}
-
-void ScatterDataModifier::toggleRotation()
-{
- if (m_rotationTimer.isActive())
- m_rotationTimer.stop();
- else
- m_rotationTimer.start(15);
-}
diff --git a/examples/datavisualization/rotations/scatterdatamodifier.h b/examples/datavisualization/rotations/scatterdatamodifier.h
deleted file mode 100644
index 42472b48..00000000
--- a/examples/datavisualization/rotations/scatterdatamodifier.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef SCATTERDATAMODIFIER_H
-#define SCATTERDATAMODIFIER_H
-
-#include <QtDataVisualization/q3dscatter.h>
-#include <QtDataVisualization/qscatterdataproxy.h>
-#include <QtCore/QTimer>
-
-using namespace QtDataVisualization;
-
-class ScatterDataModifier : public QObject
-{
- Q_OBJECT
-public:
- explicit ScatterDataModifier(Q3DScatter *scatter);
- ~ScatterDataModifier();
-
- void generateData();
-
-public Q_SLOTS:
- void setFieldLines(int lines);
- void setArrowsPerLine(int arrows);
- void toggleRotation();
- void triggerRotation();
- void toggleSun();
-
-private:
- Q3DScatter *m_graph;
- QTimer m_rotationTimer;
- int m_fieldLines;
- int m_arrowsPerLine;
- QScatter3DSeries *m_magneticField;
- QCustom3DItem *m_sun;
- QScatterDataArray *m_magneticFieldArray;
- float m_angleOffset;
- float m_angleStep;
-};
-
-#endif
diff --git a/examples/datavisualization/scatter/doc/images/scatter-example.png b/examples/datavisualization/scatter/doc/images/scatter-example.png
deleted file mode 100644
index 82c13855..00000000
--- a/examples/datavisualization/scatter/doc/images/scatter-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/scatter/doc/src/scatter.qdoc b/examples/datavisualization/scatter/doc/src/scatter.qdoc
deleted file mode 100644
index 36887592..00000000
--- a/examples/datavisualization/scatter/doc/src/scatter.qdoc
+++ /dev/null
@@ -1,157 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example scatter
- \title Scatter Example
- \ingroup qtdatavisualization_examples
- \brief Using Q3DScatter in a widget application.
-
- The scatter example shows how to make a simple 3D scatter graph using Q3DScatter and
- combining the use of widgets for adjusting several adjustable qualities. The example shows
- how to:
-
- \list
- \li Create an application with Q3DScatter and some widgets
- \li Use QScatterDataProxy to set data to the graph
- \li Adjust some graph properties using widget controls
- \endlist
-
- For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
-
- \image scatter-example.png
-
- \include examples-run.qdocinc
-
- \section1 Creating the Application
-
- First, in main.cpp, we create a QApplication, instantiate Q3DScatter, and a window container
- for it:
-
- \snippet scatter/main.cpp 0
-
- The call to QWidget::createWindowContainer is required, as all data visualization graph classes
- (Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
- as a widget any other way.
-
- Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical
- layout into the horizontal one:
-
- \snippet scatter/main.cpp 1
-
- We're not using the vertical layout for anything yet, but we'll get back to it in
- \l {Using widgets to control the graph}
-
- Next, let's create another class to handle the data addition and other interaction with the
- graph. Let's call it \c ScatterDataModifier (See \l {Setting up the graph} and
- \l {Adding data to the graph} for details):
-
- \snippet scatter/main.cpp 2
-
- The application main is done. We can show the graph and start the event loop:
-
- \snippet scatter/main.cpp 3
-
- \section1 Setting up the Graph
-
- Let's set up some visual qualities for the graph in the constructor of the \c ScatterDataModifier
- class we instantiated in the application main:
-
- \snippet scatter/scatterdatamodifier.cpp 0
-
- None of these are required, but are used to override graph defaults. You can try how it looks
- with the preset defaults by commenting the block above out.
-
- Finally we create a QScatterDataProxy and the associated QScatter3DSeries. We set custom label format
- and mesh smoothing for the series and add it to the graph:
-
- \snippet scatter/scatterdatamodifier.cpp 2
-
- That concludes setting up the graph.
-
- \section1 Adding Data to the Graph
-
- The last thing we do in the \c ScatterDataModifier constructor is to add data to the graph:
-
- \snippet scatter/scatterdatamodifier.cpp 3
-
- The actual data addition is done in \c addData() method. First we configure the axes:
-
- \snippet scatter/scatterdatamodifier.cpp 4
-
- This could have been done in the constructor of \c {ScatterDataModifier}, but we added it here
- to keep the constructor simpler and the axes configuration near the data.
-
- Next we create a data array:
-
- \snippet scatter/scatterdatamodifier.cpp 5
-
- and populate it:
-
- \snippet scatter/scatterdatamodifier.cpp 6
-
- Finally we tell the proxy to start using the data we gave it:
-
- \snippet scatter/scatterdatamodifier.cpp 7
-
- Now our graph has the data and is ready to be used. There isn't much interaction yet, though,
- so let's continue by adding some widgets to play with.
-
- \section1 Using Widgets to Control the Graph
-
- First, back in the application main, we'll create some widgets:
-
- \snippet scatter/main.cpp 4
-
- And add them to the vertical layout we created earlier:
-
- \snippet scatter/main.cpp 5
-
- Now, let's connect them to methods in ScatterDataModifier:
-
- \snippet scatter/main.cpp 6
-
- Here are the methods in ScatterDataModifier the signals were connected to:
-
- \snippet scatter/scatterdatamodifier.cpp 8
-
- And so we have an application in which we can control:
-
- \list
- \li Label style
- \li Camera preset
- \li Background visibility
- \li Grid visibility
- \li Dot shading smoothness
- \li Dot style
- \li Theme
- \li Shadow quality
- \li Label font
- \endlist
-
- \section1 Example Contents
-*/
diff --git a/examples/datavisualization/scatter/main.cpp b/examples/datavisualization/scatter/main.cpp
deleted file mode 100644
index f31eca9e..00000000
--- a/examples/datavisualization/scatter/main.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QPushButton>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QFontComboBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
-#include <QtGui/QFontDatabase>
-
-int main(int argc, char **argv)
-{
- //! [0]
- QApplication app(argc, argv);
- Q3DScatter *graph = new Q3DScatter();
- QWidget *container = QWidget::createWindowContainer(graph);
- //! [0]
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- //! [1]
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
- //! [1]
-
- widget->setWindowTitle(QStringLiteral("A Cosine Wave"));
-
- //! [4]
- QComboBox *themeList = new QComboBox(widget);
- themeList->addItem(QStringLiteral("Qt"));
- themeList->addItem(QStringLiteral("Primary Colors"));
- themeList->addItem(QStringLiteral("Digia"));
- themeList->addItem(QStringLiteral("Stone Moss"));
- themeList->addItem(QStringLiteral("Army Blue"));
- themeList->addItem(QStringLiteral("Retro"));
- themeList->addItem(QStringLiteral("Ebony"));
- themeList->addItem(QStringLiteral("Isabelle"));
- themeList->setCurrentIndex(6);
-
- QPushButton *labelButton = new QPushButton(widget);
- labelButton->setText(QStringLiteral("Change label style"));
-
- QCheckBox *smoothCheckBox = new QCheckBox(widget);
- smoothCheckBox->setText(QStringLiteral("Smooth dots"));
- smoothCheckBox->setChecked(true);
-
- QComboBox *itemStyleList = new QComboBox(widget);
- itemStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere));
- itemStyleList->addItem(QStringLiteral("Cube"), int(QAbstract3DSeries::MeshCube));
- itemStyleList->addItem(QStringLiteral("Minimal"), int(QAbstract3DSeries::MeshMinimal));
- itemStyleList->addItem(QStringLiteral("Point"), int(QAbstract3DSeries::MeshPoint));
- itemStyleList->setCurrentIndex(0);
-
- QPushButton *cameraButton = new QPushButton(widget);
- cameraButton->setText(QStringLiteral("Change camera preset"));
-
- QPushButton *itemCountButton = new QPushButton(widget);
- itemCountButton->setText(QStringLiteral("Toggle item count"));
-
- QCheckBox *backgroundCheckBox = new QCheckBox(widget);
- backgroundCheckBox->setText(QStringLiteral("Show background"));
- backgroundCheckBox->setChecked(true);
-
- QCheckBox *gridCheckBox = new QCheckBox(widget);
- gridCheckBox->setText(QStringLiteral("Show grid"));
- gridCheckBox->setChecked(true);
-
- QComboBox *shadowQuality = new QComboBox(widget);
- shadowQuality->addItem(QStringLiteral("None"));
- shadowQuality->addItem(QStringLiteral("Low"));
- shadowQuality->addItem(QStringLiteral("Medium"));
- shadowQuality->addItem(QStringLiteral("High"));
- shadowQuality->addItem(QStringLiteral("Low Soft"));
- shadowQuality->addItem(QStringLiteral("Medium Soft"));
- shadowQuality->addItem(QStringLiteral("High Soft"));
- shadowQuality->setCurrentIndex(4);
-
- QFontComboBox *fontList = new QFontComboBox(widget);
- fontList->setCurrentFont(QFont("Arial"));
- //! [4]
-
- //! [5]
- vLayout->addWidget(labelButton, 0, Qt::AlignTop);
- vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
- vLayout->addWidget(itemCountButton, 0, Qt::AlignTop);
- vLayout->addWidget(backgroundCheckBox);
- vLayout->addWidget(gridCheckBox);
- vLayout->addWidget(smoothCheckBox, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Change dot style")));
- vLayout->addWidget(itemStyleList);
- vLayout->addWidget(new QLabel(QStringLiteral("Change theme")));
- vLayout->addWidget(themeList);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
- vLayout->addWidget(shadowQuality);
- vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
- vLayout->addWidget(fontList, 1, Qt::AlignTop);
- //! [5]
-
- //! [2]
- ScatterDataModifier *modifier = new ScatterDataModifier(graph);
- //! [2]
-
- //! [6]
- QObject::connect(cameraButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::changePresetCamera);
- QObject::connect(labelButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::changeLabelStyle);
- QObject::connect(itemCountButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::toggleItemCount);
-
- QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
- &ScatterDataModifier::setBackgroundEnabled);
- QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
- &ScatterDataModifier::setGridEnabled);
- QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
- &ScatterDataModifier::setSmoothDots);
-
- QObject::connect(modifier, &ScatterDataModifier::backgroundEnabledChanged,
- backgroundCheckBox, &QCheckBox::setChecked);
- QObject::connect(modifier, &ScatterDataModifier::gridEnabledChanged,
- gridCheckBox, &QCheckBox::setChecked);
- QObject::connect(itemStyleList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeStyle(int)));
-
- QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeTheme(int)));
-
- QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
- SLOT(changeShadowQuality(int)));
-
- QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality,
- &QComboBox::setCurrentIndex);
- QObject::connect(graph, &Q3DScatter::shadowQualityChanged, modifier,
- &ScatterDataModifier::shadowQualityUpdatedByVisual);
-
- QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
- &ScatterDataModifier::changeFont);
-
- QObject::connect(modifier, &ScatterDataModifier::fontChanged, fontList,
- &QFontComboBox::setCurrentFont);
- //! [6]
-
- //! [3]
- widget->show();
- return app.exec();
- //! [3]
-}
diff --git a/examples/datavisualization/scatter/scatter.pro b/examples/datavisualization/scatter/scatter.pro
deleted file mode 100644
index b9f29f9c..00000000
--- a/examples/datavisualization/scatter/scatter.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp scatterdatamodifier.cpp
-HEADERS += scatterdatamodifier.h
-
-QT += widgets
-requires(qtConfig(combobox))
-requires(qtConfig(fontcombobox))
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/scatter/scatterdatamodifier.cpp b/examples/datavisualization/scatter/scatterdatamodifier.cpp
deleted file mode 100644
index 504645da..00000000
--- a/examples/datavisualization/scatter/scatterdatamodifier.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "scatterdatamodifier.h"
-#include <QtDataVisualization/qscatterdataproxy.h>
-#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/qscatter3dseries.h>
-#include <QtDataVisualization/q3dtheme.h>
-#include <QtCore/qmath.h>
-#include <QtCore/qrandom.h>
-#include <QtWidgets/QComboBox>
-
-using namespace QtDataVisualization;
-
-//#define RANDOM_SCATTER // Uncomment this to switch to random scatter
-
-const int numberOfItems = 3600;
-const float curveDivider = 3.0f;
-const int lowerNumberOfItems = 900;
-const float lowerCurveDivider = 0.75f;
-
-ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
- : m_graph(scatter),
- m_fontSize(40.0f),
- m_style(QAbstract3DSeries::MeshSphere),
- m_smooth(true),
- m_itemCount(lowerNumberOfItems),
- m_curveDivider(lowerCurveDivider)
-{
- //! [0]
- m_graph->activeTheme()->setType(Q3DTheme::ThemeEbony);
- QFont font = m_graph->activeTheme()->font();
- font.setPointSize(m_fontSize);
- m_graph->activeTheme()->setFont(font);
- m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftLow);
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
- //! [0]
-
- //! [2]
- QScatterDataProxy *proxy = new QScatterDataProxy;
- QScatter3DSeries *series = new QScatter3DSeries(proxy);
- series->setItemLabelFormat(QStringLiteral("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"));
- series->setMeshSmooth(m_smooth);
- m_graph->addSeries(series);
- //! [2]
-
- //! [3]
- addData();
- //! [3]
-}
-
-ScatterDataModifier::~ScatterDataModifier()
-{
- delete m_graph;
-}
-
-void ScatterDataModifier::addData()
-{
- // Configure the axes according to the data
- //! [4]
- m_graph->axisX()->setTitle("X");
- m_graph->axisY()->setTitle("Y");
- m_graph->axisZ()->setTitle("Z");
- //! [4]
-
- //! [5]
- QScatterDataArray *dataArray = new QScatterDataArray;
- dataArray->resize(m_itemCount);
- QScatterDataItem *ptrToDataArray = &dataArray->first();
- //! [5]
-
-#ifdef RANDOM_SCATTER
- for (int i = 0; i < m_itemCount; i++) {
- ptrToDataArray->setPosition(randVector());
- ptrToDataArray++;
- }
-#else
- //! [6]
- float limit = qSqrt(m_itemCount) / 2.0f;
- for (float i = -limit; i < limit; i++) {
- for (float j = -limit; j < limit; j++) {
- ptrToDataArray->setPosition(QVector3D(i + 0.5f,
- qCos(qDegreesToRadians((i * j) / m_curveDivider)),
- j + 0.5f));
- ptrToDataArray++;
- }
- }
- //! [6]
-#endif
-
- //! [7]
- m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);
- //! [7]
-}
-
-//! [8]
-void ScatterDataModifier::changeStyle(int style)
-{
- QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
- if (comboBox) {
- m_style = QAbstract3DSeries::Mesh(comboBox->itemData(style).toInt());
- if (m_graph->seriesList().size())
- m_graph->seriesList().at(0)->setMesh(m_style);
- }
-}
-
-void ScatterDataModifier::setSmoothDots(int smooth)
-{
- m_smooth = bool(smooth);
- QScatter3DSeries *series = m_graph->seriesList().at(0);
- series->setMeshSmooth(m_smooth);
-}
-
-void ScatterDataModifier::changeTheme(int theme)
-{
- Q3DTheme *currentTheme = m_graph->activeTheme();
- currentTheme->setType(Q3DTheme::Theme(theme));
- emit backgroundEnabledChanged(currentTheme->isBackgroundEnabled());
- emit gridEnabledChanged(currentTheme->isGridEnabled());
- emit fontChanged(currentTheme->font());
-}
-
-void ScatterDataModifier::changePresetCamera()
-{
- static int preset = Q3DCamera::CameraPresetFrontLow;
-
- m_graph->scene()->activeCamera()->setCameraPreset((Q3DCamera::CameraPreset)preset);
-
- if (++preset > Q3DCamera::CameraPresetDirectlyBelow)
- preset = Q3DCamera::CameraPresetFrontLow;
-}
-
-void ScatterDataModifier::changeLabelStyle()
-{
- m_graph->activeTheme()->setLabelBackgroundEnabled(!m_graph->activeTheme()->isLabelBackgroundEnabled());
-}
-
-void ScatterDataModifier::changeFont(const QFont &font)
-{
- QFont newFont = font;
- newFont.setPointSizeF(m_fontSize);
- m_graph->activeTheme()->setFont(newFont);
-}
-
-void ScatterDataModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality sq)
-{
- int quality = int(sq);
- emit shadowQualityChanged(quality); // connected to a checkbox in main.cpp
-}
-
-void ScatterDataModifier::changeShadowQuality(int quality)
-{
- QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality);
- m_graph->setShadowQuality(sq);
-}
-
-void ScatterDataModifier::setBackgroundEnabled(int enabled)
-{
- m_graph->activeTheme()->setBackgroundEnabled((bool)enabled);
-}
-
-void ScatterDataModifier::setGridEnabled(int enabled)
-{
- m_graph->activeTheme()->setGridEnabled((bool)enabled);
-}
-//! [8]
-
-void ScatterDataModifier::toggleItemCount()
-{
- if (m_itemCount == numberOfItems) {
- m_itemCount = lowerNumberOfItems;
- m_curveDivider = lowerCurveDivider;
- } else {
- m_itemCount = numberOfItems;
- m_curveDivider = curveDivider;
- }
- m_graph->seriesList().at(0)->dataProxy()->resetArray(0);
- addData();
-}
-
-QVector3D ScatterDataModifier::randVector()
-{
- return QVector3D(
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f,
- (float)(QRandomGenerator::global()->bounded(100)) / 100.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 100.0f,
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f -
- (float)(QRandomGenerator::global()->bounded(100)) / 2.0f);
-}
diff --git a/examples/datavisualization/scatter/scatterdatamodifier.h b/examples/datavisualization/scatter/scatterdatamodifier.h
deleted file mode 100644
index 8b777bc8..00000000
--- a/examples/datavisualization/scatter/scatterdatamodifier.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef SCATTERDATAMODIFIER_H
-#define SCATTERDATAMODIFIER_H
-
-#include <QtDataVisualization/q3dscatter.h>
-#include <QtDataVisualization/qabstract3dseries.h>
-#include <QtGui/QFont>
-
-using namespace QtDataVisualization;
-
-class ScatterDataModifier : public QObject
-{
- Q_OBJECT
-public:
- explicit ScatterDataModifier(Q3DScatter *scatter);
- ~ScatterDataModifier();
-
- void addData();
- void changeStyle();
- void changePresetCamera();
- void changeLabelStyle();
- void changeFont(const QFont &font);
- void changeFontSize(int fontsize);
- void setBackgroundEnabled(int enabled);
- void setGridEnabled(int enabled);
- void setSmoothDots(int smooth);
- void toggleItemCount();
- void start();
-
-public Q_SLOTS:
- void changeStyle(int style);
- void changeTheme(int theme);
- void changeShadowQuality(int quality);
- void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
-
-Q_SIGNALS:
- void backgroundEnabledChanged(bool enabled);
- void gridEnabledChanged(bool enabled);
- void shadowQualityChanged(int quality);
- void fontChanged(QFont font);
-
-private:
- QVector3D randVector();
- Q3DScatter *m_graph;
- int m_fontSize;
- QAbstract3DSeries::Mesh m_style;
- bool m_smooth;
- int m_itemCount;
- float m_curveDivider;
-};
-
-#endif
diff --git a/examples/datavisualization/surface/doc/images/surface-example.png b/examples/datavisualization/surface/doc/images/surface-example.png
deleted file mode 100644
index c323df78..00000000
--- a/examples/datavisualization/surface/doc/images/surface-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/surface/doc/src/surface.qdoc b/examples/datavisualization/surface/doc/src/surface.qdoc
deleted file mode 100644
index a81b760a..00000000
--- a/examples/datavisualization/surface/doc/src/surface.qdoc
+++ /dev/null
@@ -1,147 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example surface
- \title Surface Example
- \ingroup qtdatavisualization_examples
- \brief Using Q3DSurface in a widget application.
-
- The surface example shows how to make a simple 3D surface graph using Q3DSurface and
- combining the use of widgets for adjusting several adjustable qualities. This example
- demonstrates the following features:
-
- \list
- \li How to set up a basic QSurfaceDataProxy and set data for it.
- \li How to use QHeightMapSurfaceDataProxy for showing 3D height maps.
- \li Three different selection modes for studying the graph.
- \li Axis range usage for displaying selected portions of the graph.
- \li Changing theme.
- \li How to set a custom surface gradient.
- \endlist
-
- For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
-
- \image surface-example.png
-
- \include examples-run.qdocinc
-
- \section1 Creating the Application
-
- First, in \c main.cpp, we create a QApplication, instantiate Q3DSurface, and a window container
- for it:
-
- \snippet surface/main.cpp 0
-
- The call to QWidget::createWindowContainer is required, as all data visualization graph classes
- (Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
- as a widget any other way.
-
- Then we'll create horizontal and vertical layouts. We'll add the graph with the container and
- the vertical layout into the horizontal one:
-
- \snippet surface/main.cpp 1
-
- The rest of the code in \c main.cpp is creating control widgets for features in Q3DSurface. We
- have separated code for changing these features into \c surfacegraph.cpp and only connect
- signals from widgets into methods in \c surfacegraph.cpp. Next chapter explains more
- about using Q3DSurface.
-
- \section1 Setting up Proxies and Data
-
- First we instantiate a new QSurfaceDataProxy and attach it to a new QSurface3DSeries:
-
- \snippet surface/surfacegraph.cpp 0
-
- Then we fill the proxy with a simple square root and sine wave data. This is done by
- creating a new \c QSurfaceDataArray instance and adding \c QSurfaceDataRow elements to it.
- The created \c QSurfaceDataArray is set to be the data array for the QSurfaceDataProxy.
-
- \snippet surface/surfacegraph.cpp 1
-
- The height map is created by instantiating a QHeightMapSurfaceDataProxy with
- a QImage containing the height data. The method QHeightMapSurfaceDataProxy::setValueRanges() is
- used to define the value range of the map. In our example the map is from imaginary position of
- 34.0\unicode 0x00B0 N - 40.0\unicode 0x00B0 N and 18.0\unicode 0x00B0 E - 24.0\unicode 0x00B0 E.
- These values are used to show and position the map to the axis.
-
- \snippet surface/surfacegraph.cpp 2
-
- For demonstrating different proxies this example has two radio buttons which
- the user can use to switch between the series. When the user selects the
- \c {Sqrt & Sin} radio button, the selected series is activated with the following
- code. First we set the decorative issues like enable the grid for the surface and
- select the flat shading mode. Next lines define the axis label format and value
- ranges. Automatic label rotation is set to improve label readability at low camera angles.
- Finally we make sure the correct series is added to the graph:
-
- \snippet surface/surfacegraph.cpp 3
-
- When the \c{Height Map} radio button is activated, the following code sets the correct series active.
- The axis label format is set to show N and E letters and ranges are set to the imaginary coordinates.
- Auto adjusting Y-axis range is fine for our height map surface, so we ensure it is set.
-
- \snippet surface/surfacegraph.cpp 4
-
- \section1 Selection Modes
-
- Q3Dsurface supports three different selection modes. These are demonstrated in the
- example with radio buttons, which the user can use to activate a suitable selection mode.
- The following inline methods are connected to radio buttons to activate the selected mode.
-
- \snippet surface/surfacegraph.h 0
-
- \section1 Axis Ranges for Studying the Graph
-
- The example has four slider controls for adjusting the min and max values for X and Z
- axis. When selecting the proxy these sliders are adjusted so that one step on the slider
- moves the range by one segment step:
-
- \snippet surface/surfacegraph.cpp 8
-
- The ranges are set for the axes like this:
-
- \snippet surface/surfacegraph.cpp 5
-
- \section1 Themes
-
- Q3DSurface supports all the themes Qt Data Visualization has. The example has a pull
- down menu for selecting the theme. The following method is connected to the
- menu to activate the selected theme. The theme type is changed to another predefined theme,
- which overwrites all theme properties to predefined values:
-
- \snippet surface/surfacegraph.cpp 6
-
- \section1 Custom Surface Gradients
-
- The example demonstrates the custom surface gradients with two push buttons. The gradient
- can be defined with QLinearGradient where the desired colors are set to positions. The following
- code shows how to create an example gradient and set it to the series. Note that you also need
- to change the color style to Q3DTheme::ColorStyleRangeGradient to actually use the gradient.
-
- \snippet surface/surfacegraph.cpp 7
-*/
diff --git a/examples/datavisualization/surface/main.cpp b/examples/datavisualization/surface/main.cpp
deleted file mode 100644
index 0cc48b42..00000000
--- a/examples/datavisualization/surface/main.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "surfacegraph.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QPushButton>
-#include <QtWidgets/QRadioButton>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QGroupBox>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QPainter>
-#include <QtGui/QScreen>
-
-int main(int argc, char **argv)
-{
- //! [0]
- QApplication app(argc, argv);
- Q3DSurface *graph = new Q3DSurface();
- QWidget *container = QWidget::createWindowContainer(graph);
- //! [0]
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.6));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- //! [1]
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
- vLayout->setAlignment(Qt::AlignTop);
- //! [1]
-
- widget->setWindowTitle(QStringLiteral("Surface example"));
-
- QGroupBox *modelGroupBox = new QGroupBox(QStringLiteral("Model"));
-
- QRadioButton *sqrtSinModelRB = new QRadioButton(widget);
- sqrtSinModelRB->setText(QStringLiteral("Sqrt && Sin"));
- sqrtSinModelRB->setChecked(false);
-
- QRadioButton *heightMapModelRB = new QRadioButton(widget);
- heightMapModelRB->setText(QStringLiteral("Height Map"));
- heightMapModelRB->setChecked(false);
-
- QVBoxLayout *modelVBox = new QVBoxLayout;
- modelVBox->addWidget(sqrtSinModelRB);
- modelVBox->addWidget(heightMapModelRB);
- modelGroupBox->setLayout(modelVBox);
-
- QGroupBox *selectionGroupBox = new QGroupBox(QStringLiteral("Selection Mode"));
-
- QRadioButton *modeNoneRB = new QRadioButton(widget);
- modeNoneRB->setText(QStringLiteral("No selection"));
- modeNoneRB->setChecked(false);
-
- QRadioButton *modeItemRB = new QRadioButton(widget);
- modeItemRB->setText(QStringLiteral("Item"));
- modeItemRB->setChecked(false);
-
- QRadioButton *modeSliceRowRB = new QRadioButton(widget);
- modeSliceRowRB->setText(QStringLiteral("Row Slice"));
- modeSliceRowRB->setChecked(false);
-
- QRadioButton *modeSliceColumnRB = new QRadioButton(widget);
- modeSliceColumnRB->setText(QStringLiteral("Column Slice"));
- modeSliceColumnRB->setChecked(false);
-
- QVBoxLayout *selectionVBox = new QVBoxLayout;
- selectionVBox->addWidget(modeNoneRB);
- selectionVBox->addWidget(modeItemRB);
- selectionVBox->addWidget(modeSliceRowRB);
- selectionVBox->addWidget(modeSliceColumnRB);
- selectionGroupBox->setLayout(selectionVBox);
-
- QSlider *axisMinSliderX = new QSlider(Qt::Horizontal, widget);
- axisMinSliderX->setMinimum(0);
- axisMinSliderX->setTickInterval(1);
- axisMinSliderX->setEnabled(true);
- QSlider *axisMaxSliderX = new QSlider(Qt::Horizontal, widget);
- axisMaxSliderX->setMinimum(1);
- axisMaxSliderX->setTickInterval(1);
- axisMaxSliderX->setEnabled(true);
- QSlider *axisMinSliderZ = new QSlider(Qt::Horizontal, widget);
- axisMinSliderZ->setMinimum(0);
- axisMinSliderZ->setTickInterval(1);
- axisMinSliderZ->setEnabled(true);
- QSlider *axisMaxSliderZ = new QSlider(Qt::Horizontal, widget);
- axisMaxSliderZ->setMinimum(1);
- axisMaxSliderZ->setTickInterval(1);
- axisMaxSliderZ->setEnabled(true);
-
- QComboBox *themeList = new QComboBox(widget);
- themeList->addItem(QStringLiteral("Qt"));
- themeList->addItem(QStringLiteral("Primary Colors"));
- themeList->addItem(QStringLiteral("Digia"));
- themeList->addItem(QStringLiteral("Stone Moss"));
- themeList->addItem(QStringLiteral("Army Blue"));
- themeList->addItem(QStringLiteral("Retro"));
- themeList->addItem(QStringLiteral("Ebony"));
- themeList->addItem(QStringLiteral("Isabelle"));
-
- QGroupBox *colorGroupBox = new QGroupBox(QStringLiteral("Custom gradient"));
-
- QLinearGradient grBtoY(0, 0, 1, 100);
- grBtoY.setColorAt(1.0, Qt::black);
- grBtoY.setColorAt(0.67, Qt::blue);
- grBtoY.setColorAt(0.33, Qt::red);
- grBtoY.setColorAt(0.0, Qt::yellow);
- QPixmap pm(24, 100);
- QPainter pmp(&pm);
- pmp.setBrush(QBrush(grBtoY));
- pmp.setPen(Qt::NoPen);
- pmp.drawRect(0, 0, 24, 100);
- QPushButton *gradientBtoYPB = new QPushButton(widget);
- gradientBtoYPB->setIcon(QIcon(pm));
- gradientBtoYPB->setIconSize(QSize(24, 100));
-
- QLinearGradient grGtoR(0, 0, 1, 100);
- grGtoR.setColorAt(1.0, Qt::darkGreen);
- grGtoR.setColorAt(0.5, Qt::yellow);
- grGtoR.setColorAt(0.2, Qt::red);
- grGtoR.setColorAt(0.0, Qt::darkRed);
- pmp.setBrush(QBrush(grGtoR));
- pmp.drawRect(0, 0, 24, 100);
- QPushButton *gradientGtoRPB = new QPushButton(widget);
- gradientGtoRPB->setIcon(QIcon(pm));
- gradientGtoRPB->setIconSize(QSize(24, 100));
-
- QHBoxLayout *colorHBox = new QHBoxLayout;
- colorHBox->addWidget(gradientBtoYPB);
- colorHBox->addWidget(gradientGtoRPB);
- colorGroupBox->setLayout(colorHBox);
-
- vLayout->addWidget(modelGroupBox);
- vLayout->addWidget(selectionGroupBox);
- vLayout->addWidget(new QLabel(QStringLiteral("Column range")));
- vLayout->addWidget(axisMinSliderX);
- vLayout->addWidget(axisMaxSliderX);
- vLayout->addWidget(new QLabel(QStringLiteral("Row range")));
- vLayout->addWidget(axisMinSliderZ);
- vLayout->addWidget(axisMaxSliderZ);
- vLayout->addWidget(new QLabel(QStringLiteral("Theme")));
- vLayout->addWidget(themeList);
- vLayout->addWidget(colorGroupBox);
-
- widget->show();
-
- SurfaceGraph *modifier = new SurfaceGraph(graph);
-
- QObject::connect(heightMapModelRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::enableHeightMapModel);
- QObject::connect(sqrtSinModelRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::enableSqrtSinModel);
- QObject::connect(modeNoneRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::toggleModeNone);
- QObject::connect(modeItemRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::toggleModeItem);
- QObject::connect(modeSliceRowRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::toggleModeSliceRow);
- QObject::connect(modeSliceColumnRB, &QRadioButton::toggled,
- modifier, &SurfaceGraph::toggleModeSliceColumn);
- QObject::connect(axisMinSliderX, &QSlider::valueChanged,
- modifier, &SurfaceGraph::adjustXMin);
- QObject::connect(axisMaxSliderX, &QSlider::valueChanged,
- modifier, &SurfaceGraph::adjustXMax);
- QObject::connect(axisMinSliderZ, &QSlider::valueChanged,
- modifier, &SurfaceGraph::adjustZMin);
- QObject::connect(axisMaxSliderZ, &QSlider::valueChanged,
- modifier, &SurfaceGraph::adjustZMax);
- QObject::connect(themeList, SIGNAL(currentIndexChanged(int)),
- modifier, SLOT(changeTheme(int)));
- QObject::connect(gradientBtoYPB, &QPushButton::pressed,
- modifier, &SurfaceGraph::setBlackToYellowGradient);
- QObject::connect(gradientGtoRPB, &QPushButton::pressed,
- modifier, &SurfaceGraph::setGreenToRedGradient);
-
- modifier->setAxisMinSliderX(axisMinSliderX);
- modifier->setAxisMaxSliderX(axisMaxSliderX);
- modifier->setAxisMinSliderZ(axisMinSliderZ);
- modifier->setAxisMaxSliderZ(axisMaxSliderZ);
-
- sqrtSinModelRB->setChecked(true);
- modeItemRB->setChecked(true);
- themeList->setCurrentIndex(2);
-
- return app.exec();
-}
diff --git a/examples/datavisualization/surface/mountain.png b/examples/datavisualization/surface/mountain.png
deleted file mode 100644
index 9138c710..00000000
--- a/examples/datavisualization/surface/mountain.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/surface/surface.pro b/examples/datavisualization/surface/surface.pro
deleted file mode 100644
index a49fa468..00000000
--- a/examples/datavisualization/surface/surface.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp \
- surfacegraph.cpp
-
-HEADERS += surfacegraph.h
-
-QT += widgets
-requires(qtConfig(combobox))
-
-RESOURCES += surface.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/surface/surface.qrc b/examples/datavisualization/surface/surface.qrc
deleted file mode 100644
index e4a7c38b..00000000
--- a/examples/datavisualization/surface/surface.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/maps">
- <file alias="mountain">mountain.png</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/surface/surfacegraph.cpp b/examples/datavisualization/surface/surfacegraph.cpp
deleted file mode 100644
index a8c5731c..00000000
--- a/examples/datavisualization/surface/surfacegraph.cpp
+++ /dev/null
@@ -1,279 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "surfacegraph.h"
-
-#include <QtDataVisualization/QValue3DAxis>
-#include <QtDataVisualization/Q3DTheme>
-#include <QtGui/QImage>
-#include <QtCore/qmath.h>
-
-using namespace QtDataVisualization;
-
-const int sampleCountX = 50;
-const int sampleCountZ = 50;
-const int heightMapGridStepX = 6;
-const int heightMapGridStepZ = 6;
-const float sampleMin = -8.0f;
-const float sampleMax = 8.0f;
-
-SurfaceGraph::SurfaceGraph(Q3DSurface *surface)
- : m_graph(surface)
-{
- m_graph->setAxisX(new QValue3DAxis);
- m_graph->setAxisY(new QValue3DAxis);
- m_graph->setAxisZ(new QValue3DAxis);
-
- //! [0]
- m_sqrtSinProxy = new QSurfaceDataProxy();
- m_sqrtSinSeries = new QSurface3DSeries(m_sqrtSinProxy);
- //! [0]
- fillSqrtSinProxy();
-
- //! [2]
- QImage heightMapImage(":/maps/mountain");
- m_heightMapProxy = new QHeightMapSurfaceDataProxy(heightMapImage);
- m_heightMapSeries = new QSurface3DSeries(m_heightMapProxy);
- m_heightMapSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
- m_heightMapProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
- //! [2]
- m_heightMapWidth = heightMapImage.width();
- m_heightMapHeight = heightMapImage.height();
-}
-
-SurfaceGraph::~SurfaceGraph()
-{
- delete m_graph;
-}
-
-//! [1]
-void SurfaceGraph::fillSqrtSinProxy()
-{
- float stepX = (sampleMax - sampleMin) / float(sampleCountX - 1);
- float stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1);
-
- QSurfaceDataArray *dataArray = new QSurfaceDataArray;
- dataArray->reserve(sampleCountZ);
- for (int i = 0 ; i < sampleCountZ ; i++) {
- QSurfaceDataRow *newRow = new QSurfaceDataRow(sampleCountX);
- // Keep values within range bounds, since just adding step can cause minor drift due
- // to the rounding errors.
- float z = qMin(sampleMax, (i * stepZ + sampleMin));
- int index = 0;
- for (int j = 0; j < sampleCountX; j++) {
- float x = qMin(sampleMax, (j * stepX + sampleMin));
- float R = qSqrt(z * z + x * x) + 0.01f;
- float y = (qSin(R) / R + 0.24f) * 1.61f;
- (*newRow)[index++].setPosition(QVector3D(x, y, z));
- }
- *dataArray << newRow;
- }
-
- m_sqrtSinProxy->resetArray(dataArray);
-}
-//! [1]
-
-void SurfaceGraph::enableSqrtSinModel(bool enable)
-{
- if (enable) {
- //! [3]
- m_sqrtSinSeries->setDrawMode(QSurface3DSeries::DrawSurfaceAndWireframe);
- m_sqrtSinSeries->setFlatShadingEnabled(true);
-
- m_graph->axisX()->setLabelFormat("%.2f");
- m_graph->axisZ()->setLabelFormat("%.2f");
- m_graph->axisX()->setRange(sampleMin, sampleMax);
- m_graph->axisY()->setRange(0.0f, 2.0f);
- m_graph->axisZ()->setRange(sampleMin, sampleMax);
- m_graph->axisX()->setLabelAutoRotation(30);
- m_graph->axisY()->setLabelAutoRotation(90);
- m_graph->axisZ()->setLabelAutoRotation(30);
-
- m_graph->removeSeries(m_heightMapSeries);
- m_graph->addSeries(m_sqrtSinSeries);
- //! [3]
-
- //! [8]
- // Reset range sliders for Sqrt&Sin
- m_rangeMinX = sampleMin;
- m_rangeMinZ = sampleMin;
- m_stepX = (sampleMax - sampleMin) / float(sampleCountX - 1);
- m_stepZ = (sampleMax - sampleMin) / float(sampleCountZ - 1);
- m_axisMinSliderX->setMaximum(sampleCountX - 2);
- m_axisMinSliderX->setValue(0);
- m_axisMaxSliderX->setMaximum(sampleCountX - 1);
- m_axisMaxSliderX->setValue(sampleCountX - 1);
- m_axisMinSliderZ->setMaximum(sampleCountZ - 2);
- m_axisMinSliderZ->setValue(0);
- m_axisMaxSliderZ->setMaximum(sampleCountZ - 1);
- m_axisMaxSliderZ->setValue(sampleCountZ - 1);
- //! [8]
- }
-}
-
-void SurfaceGraph::enableHeightMapModel(bool enable)
-{
- if (enable) {
- //! [4]
- m_heightMapSeries->setDrawMode(QSurface3DSeries::DrawSurface);
- m_heightMapSeries->setFlatShadingEnabled(false);
-
- m_graph->axisX()->setLabelFormat("%.1f N");
- m_graph->axisZ()->setLabelFormat("%.1f E");
- m_graph->axisX()->setRange(34.0f, 40.0f);
- m_graph->axisY()->setAutoAdjustRange(true);
- m_graph->axisZ()->setRange(18.0f, 24.0f);
-
- m_graph->axisX()->setTitle(QStringLiteral("Latitude"));
- m_graph->axisY()->setTitle(QStringLiteral("Height"));
- m_graph->axisZ()->setTitle(QStringLiteral("Longitude"));
-
- m_graph->removeSeries(m_sqrtSinSeries);
- m_graph->addSeries(m_heightMapSeries);
- //! [4]
-
- // Reset range sliders for height map
- int mapGridCountX = m_heightMapWidth / heightMapGridStepX;
- int mapGridCountZ = m_heightMapHeight / heightMapGridStepZ;
- m_rangeMinX = 34.0f;
- m_rangeMinZ = 18.0f;
- m_stepX = 6.0f / float(mapGridCountX - 1);
- m_stepZ = 6.0f / float(mapGridCountZ - 1);
- m_axisMinSliderX->setMaximum(mapGridCountX - 2);
- m_axisMinSliderX->setValue(0);
- m_axisMaxSliderX->setMaximum(mapGridCountX - 1);
- m_axisMaxSliderX->setValue(mapGridCountX - 1);
- m_axisMinSliderZ->setMaximum(mapGridCountZ - 2);
- m_axisMinSliderZ->setValue(0);
- m_axisMaxSliderZ->setMaximum(mapGridCountZ - 1);
- m_axisMaxSliderZ->setValue(mapGridCountZ - 1);
- }
-}
-
-void SurfaceGraph::adjustXMin(int min)
-{
- float minX = m_stepX * float(min) + m_rangeMinX;
-
- int max = m_axisMaxSliderX->value();
- if (min >= max) {
- max = min + 1;
- m_axisMaxSliderX->setValue(max);
- }
- float maxX = m_stepX * max + m_rangeMinX;
-
- setAxisXRange(minX, maxX);
-}
-
-void SurfaceGraph::adjustXMax(int max)
-{
- float maxX = m_stepX * float(max) + m_rangeMinX;
-
- int min = m_axisMinSliderX->value();
- if (max <= min) {
- min = max - 1;
- m_axisMinSliderX->setValue(min);
- }
- float minX = m_stepX * min + m_rangeMinX;
-
- setAxisXRange(minX, maxX);
-}
-
-void SurfaceGraph::adjustZMin(int min)
-{
- float minZ = m_stepZ * float(min) + m_rangeMinZ;
-
- int max = m_axisMaxSliderZ->value();
- if (min >= max) {
- max = min + 1;
- m_axisMaxSliderZ->setValue(max);
- }
- float maxZ = m_stepZ * max + m_rangeMinZ;
-
- setAxisZRange(minZ, maxZ);
-}
-
-void SurfaceGraph::adjustZMax(int max)
-{
- float maxX = m_stepZ * float(max) + m_rangeMinZ;
-
- int min = m_axisMinSliderZ->value();
- if (max <= min) {
- min = max - 1;
- m_axisMinSliderZ->setValue(min);
- }
- float minX = m_stepZ * min + m_rangeMinZ;
-
- setAxisZRange(minX, maxX);
-}
-
-//! [5]
-void SurfaceGraph::setAxisXRange(float min, float max)
-{
- m_graph->axisX()->setRange(min, max);
-}
-
-void SurfaceGraph::setAxisZRange(float min, float max)
-{
- m_graph->axisZ()->setRange(min, max);
-}
-//! [5]
-
-//! [6]
-void SurfaceGraph::changeTheme(int theme)
-{
- m_graph->activeTheme()->setType(Q3DTheme::Theme(theme));
-}
-//! [6]
-
-void SurfaceGraph::setBlackToYellowGradient()
-{
- //! [7]
- QLinearGradient gr;
- gr.setColorAt(0.0, Qt::black);
- gr.setColorAt(0.33, Qt::blue);
- gr.setColorAt(0.67, Qt::red);
- gr.setColorAt(1.0, Qt::yellow);
-
- m_graph->seriesList().at(0)->setBaseGradient(gr);
- m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
- //! [7]
-}
-
-void SurfaceGraph::setGreenToRedGradient()
-{
- QLinearGradient gr;
- gr.setColorAt(0.0, Qt::darkGreen);
- gr.setColorAt(0.5, Qt::yellow);
- gr.setColorAt(0.8, Qt::red);
- gr.setColorAt(1.0, Qt::darkRed);
-
- m_graph->seriesList().at(0)->setBaseGradient(gr);
- m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
-}
-
diff --git a/examples/datavisualization/surface/surfacegraph.h b/examples/datavisualization/surface/surfacegraph.h
deleted file mode 100644
index ad87d134..00000000
--- a/examples/datavisualization/surface/surfacegraph.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef SURFACEGRAPH_H
-#define SURFACEGRAPH_H
-
-#include <QtDataVisualization/Q3DSurface>
-#include <QtDataVisualization/QSurfaceDataProxy>
-#include <QtDataVisualization/QHeightMapSurfaceDataProxy>
-#include <QtDataVisualization/QSurface3DSeries>
-#include <QtWidgets/QSlider>
-
-using namespace QtDataVisualization;
-
-class SurfaceGraph : public QObject
-{
- Q_OBJECT
-public:
- explicit SurfaceGraph(Q3DSurface *surface);
- ~SurfaceGraph();
-
- void enableHeightMapModel(bool enable);
- void enableSqrtSinModel(bool enable);
-
- //! [0]
- void toggleModeNone() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionNone); }
- void toggleModeItem() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItem); }
- void toggleModeSliceRow() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndRow
- | QAbstract3DGraph::SelectionSlice); }
- void toggleModeSliceColumn() { m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndColumn
- | QAbstract3DGraph::SelectionSlice); }
- //! [0]
-
- void setBlackToYellowGradient();
- void setGreenToRedGradient();
-
- void setAxisMinSliderX(QSlider *slider) { m_axisMinSliderX = slider; }
- void setAxisMaxSliderX(QSlider *slider) { m_axisMaxSliderX = slider; }
- void setAxisMinSliderZ(QSlider *slider) { m_axisMinSliderZ = slider; }
- void setAxisMaxSliderZ(QSlider *slider) { m_axisMaxSliderZ = slider; }
-
- void adjustXMin(int min);
- void adjustXMax(int max);
- void adjustZMin(int min);
- void adjustZMax(int max);
-
-public Q_SLOTS:
- void changeTheme(int theme);
-
-private:
- Q3DSurface *m_graph;
- QHeightMapSurfaceDataProxy *m_heightMapProxy;
- QSurfaceDataProxy *m_sqrtSinProxy;
- QSurface3DSeries *m_heightMapSeries;
- QSurface3DSeries *m_sqrtSinSeries;
-
- QSlider *m_axisMinSliderX;
- QSlider *m_axisMaxSliderX;
- QSlider *m_axisMinSliderZ;
- QSlider *m_axisMaxSliderZ;
- float m_rangeMinX;
- float m_rangeMinZ;
- float m_stepX;
- float m_stepZ;
- int m_heightMapWidth;
- int m_heightMapHeight;
-
- void setAxisXRange(float min, float max);
- void setAxisZRange(float min, float max);
- void fillSqrtSinProxy();
-};
-
-#endif // SURFACEGRAPH_H
diff --git a/examples/datavisualization/texturesurface/custominputhandler.h b/examples/datavisualization/texturesurface/custominputhandler.h
deleted file mode 100644
index 52f6fced..00000000
--- a/examples/datavisualization/texturesurface/custominputhandler.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CUSTOMINPUTHANDLER_H
-#define CUSTOMINPUTHANDLER_H
-
-#include <QtDataVisualization/Q3DInputHandler>
-#include <QtDataVisualization/QAbstract3DGraph>
-#include <QtDataVisualization/QValue3DAxis>
-#include "highlightseries.h"
-
-using namespace QtDataVisualization;
-
-class CustomInputHandler : public Q3DInputHandler
-{
- Q_OBJECT
-
- enum InputState {
- StateNormal = 0,
- StateDraggingX,
- StateDraggingZ,
- StateDraggingY
- };
-
-public:
- explicit CustomInputHandler(QAbstract3DGraph *graph, QObject *parent = 0);
-
- inline void setLimits(float min, float max, float minRange) {
- m_areaMinValue = min;
- m_areaMaxValue = max;
- m_axisXMinValue = m_areaMinValue;
- m_axisXMaxValue = m_areaMaxValue;
- m_axisZMinValue = m_areaMinValue;
- m_axisZMaxValue = m_areaMaxValue;
- m_axisXMinRange = minRange;
- m_axisZMinRange = minRange;
- }
- inline void setAxes(QValue3DAxis *axisX, QValue3DAxis *axisY, QValue3DAxis *axisZ) {
- m_axisX = axisX;
- m_axisY = axisY;
- m_axisZ = axisZ;
- }
- inline void setAspectRatio(float ratio) { m_aspectRatio = ratio; }
- inline void setHighlightSeries(HighlightSeries *series) { m_highlight = series; }
- inline void setDragSpeedModifier(float modifier) { m_speedModifier = modifier; }
-
- virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos);
- virtual void wheelEvent(QWheelEvent *event);
-
-private:
- void handleElementSelected(QAbstract3DGraph::ElementType type);
- void handleAxisDragging();
- void checkConstraints();
-
-private:
- HighlightSeries *m_highlight;
- bool m_mousePressed;
- InputState m_state;
- QValue3DAxis *m_axisX;
- QValue3DAxis *m_axisY;
- QValue3DAxis *m_axisZ;
- float m_speedModifier;
- float m_aspectRatio;
- float m_axisXMinValue;
- float m_axisXMaxValue;
- float m_axisXMinRange;
- float m_axisZMinValue;
- float m_axisZMaxValue;
- float m_axisZMinRange;
- float m_areaMinValue;
- float m_areaMaxValue;
-};
-
-#endif
diff --git a/examples/datavisualization/texturesurface/doc/images/texturesurface-example.png b/examples/datavisualization/texturesurface/doc/images/texturesurface-example.png
deleted file mode 100644
index 76819607..00000000
--- a/examples/datavisualization/texturesurface/doc/images/texturesurface-example.png
+++ /dev/null
Binary files differ
diff --git a/examples/datavisualization/texturesurface/doc/src/texturesurface.qdoc b/examples/datavisualization/texturesurface/doc/src/texturesurface.qdoc
deleted file mode 100644
index c1cdc208..00000000
--- a/examples/datavisualization/texturesurface/doc/src/texturesurface.qdoc
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example texturesurface
- \title Textured Surface Example
- \ingroup qtdatavisualization_examples
- \brief Using texture with Q3DSurface.
- \since QtDataVisualization 1.2
-
- The textured surface example shows how to add an image as a texture for a surface. The example
- shows also how to:
-
- \list
- \li Create a surface series from an image
- \li Use custom input handler to enable zooming and panning
- \li Highlight an area of the surface
- \endlist
-
- \image texturesurface-example.png
-
- \include examples-run.qdocinc
-
- \section1 Texture to a Surface Series
-
- The image to be set as a texture to a surface can be set using QSurface3DSeries::setTextureFile().
- In this example we have added a check box to control if the texture is set or not. The
- following code extract is for reacting to the check box selections. The image in this
- example is read from the resource file where it is as a JPG file. Setting an empty file
- with the method clears the texture, and the surface uses the gradients or colors from the theme.
-
- \snippet texturesurface/surfacegraph.cpp 0
-
- \section1 Topographic Surface Series
-
- The topographic data for this example is obtained from National Land Survey of Finland. It
- provides a product called \c{Elevation Model 2 m}, which was suitable for our needs. We selected
- Levi fell to be shown. The accuracy of the data was well beyond our needs and therefore it
- is compressed and encoded into a PNG file. The height value from the original ASCII data is
- encoded into RGB format using a multiplier, which you will see later on a code extract.
- The multiplier is calculated simply by dividing the largest 24 bit value with the highest point
- in Finland.
-
- Qt Data Visualization has a special proxy for height map image files, but it converts
- only one byte values. So to utilize the bigger accuracy on the data from National Land
- Survey of Finland, we read the data from the PNG file and decode it into QSurface3DSeries.
- The following code samples show how this is done.
-
- First the encoding multiplier.
- \snippet texturesurface/topographicseries.cpp 0
-
- And then the actual decoding.
- \snippet texturesurface/topographicseries.cpp 1
-
- \section1 Use Custom Input Handler to Enable Zooming and Panning
-
- For the panning the implementation is similar to the \l{Axis Range Dragging With Labels Example}.
- The difference is that in this example we follow only dragging of X and Z axis and we don't
- allow dragging the surface outside the graph. The control for this is very simple and done as
- on the following example for the X axis.
-
- \snippet texturesurface/custominputhandler.cpp 0
-
- For the zooming we catch the \c wheelEvent and adjust the X and Y axis ranges according to delta
- value on QWheelEvent. The Y axis is also adjusted so that the aspect ratio between Y axis and
- XZ plane stays the same, and we don't get silly looking graph with height exaggerated too much.
-
- \snippet texturesurface/custominputhandler.cpp 1
-
- In this case we want to control the zoom level so that it won't get too near to or far from the
- surface. For instance, if the value for the X axis gets below the allowed, i.e. zooming gets too
- far, the value is set to the minimum allowed value. If the range is going to below the range
- minimum, both ends of the axis are adjusted so that the range stays at the limit.
-
- \snippet texturesurface/custominputhandler.cpp 2
-
- \section1 Highlight an Area of the Surface
-
- The main idea on creating a highlight on the surface is to create a copy of the series and add
- a bit of offset to the y value. On this example the class \c HighlightSeries implements the
- creation of the copy on its \c handlePositionChange method. Firstly the \c HighlightSeries
- needs to get the pointer to the original series and then it starts to listen the
- QSurface3DSeries::selectedPointChanged signal.
-
- \snippet texturesurface/highlightseries.cpp 0
-
- When the signal arrives, first thing is to check that the position is valid. Then the ranges
- for the copied area are calculated and checked that they stay within the bounds. Finally
- we simply fill the data array of the highlight series with the range from the data array of
- topography series.
-
- \snippet texturesurface/highlightseries.cpp 1
-
- \section1 A Gradient to the Highlight Series
-
- Since the \c HighlightSeries is QSurface3DSeries, we can use all the decoration methods series can
- have. In this example we added a gradient to emphasize the elevation. Because the suitable gradient
- style depends on the range of the Y axis and we change the range when zooming, we need to adjust
- the gradient color positions as the range change.
-
- For the gradient color positions we define proportional values.
-
- \snippet texturesurface/highlightseries.cpp 2
-
- The gradient modification is done on \c handleGradientChange method and we connect it to react to
- changes on Y axis.
-
- \snippet texturesurface/surfacegraph.cpp 1
-
- When a change on Y axis max value happens, we calculate the gradient color positions.
-
- \snippet texturesurface/highlightseries.cpp 3
-*/
diff --git a/examples/datavisualization/texturesurface/highlightseries.h b/examples/datavisualization/texturesurface/highlightseries.h
deleted file mode 100644
index 9fcfbe6d..00000000
--- a/examples/datavisualization/texturesurface/highlightseries.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef HIGHLIGHTSERIES_H
-#define HIGHLIGHTSERIES_H
-
-#include <QtDataVisualization/QSurface3DSeries>
-
-#include "topographicseries.h"
-
-using namespace QtDataVisualization;
-
-class HighlightSeries : public QSurface3DSeries
-{
- Q_OBJECT
-public:
- explicit HighlightSeries();
- ~HighlightSeries();
-
- void setTopographicSeries(TopographicSeries *series);
- inline void setMinHeight(float height) { m_minHeight = height; }
-
-public Q_SLOTS:
- void handlePositionChange(const QPoint &position);
- void handleGradientChange(float value);
-
-private:
- int m_width;
- int m_height;
- int m_srcWidth;
- int m_srcHeight;
- QPoint m_position;
- TopographicSeries *m_topographicSeries;
- float m_minHeight;
-};
-
-#endif // HIGHLIGHTSERIES_H
diff --git a/examples/datavisualization/texturesurface/main.cpp b/examples/datavisualization/texturesurface/main.cpp
deleted file mode 100644
index 86d03ac9..00000000
--- a/examples/datavisualization/texturesurface/main.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "surfacegraph.h"
-
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QGroupBox>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
-#include <QtGui/QPainter>
-
-int main(int argc, char **argv)
-{
- QApplication app(argc, argv);
- Q3DSurface *graph = new Q3DSurface();
- QWidget *container = QWidget::createWindowContainer(graph);
-
- if (!graph->hasContext()) {
- QMessageBox msgBox;
- msgBox.setText("Couldn't initialize the OpenGL context.");
- msgBox.exec();
- return -1;
- }
-
- QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.6));
- container->setMaximumSize(screenSize);
- container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- container->setFocusPolicy(Qt::StrongFocus);
-
- QWidget *widget = new QWidget;
- QHBoxLayout *hLayout = new QHBoxLayout(widget);
- QVBoxLayout *vLayout = new QVBoxLayout();
- hLayout->addWidget(container, 1);
- hLayout->addLayout(vLayout);
- vLayout->setAlignment(Qt::AlignTop);
-
- widget->setWindowTitle(QStringLiteral("Textured surface example"));
-
- QCheckBox *enableTexture = new QCheckBox(widget);
- enableTexture->setText(QStringLiteral("Surface texture"));
-
- int height = 400;
- int width = 100;
- int border = 10;
- QLinearGradient gr(0, 0, 1, height - 2 * border);
- gr.setColorAt(1.0f, Qt::black);
- gr.setColorAt(0.8f, Qt::darkGreen);
- gr.setColorAt(0.6f, Qt::green);
- gr.setColorAt(0.4f, Qt::yellow);
- gr.setColorAt(0.2f, Qt::red);
- gr.setColorAt(0.0f, Qt::darkRed);
-
- QPixmap pm(width, height);
- pm.fill(Qt::transparent);
- QPainter pmp(&pm);
- pmp.setBrush(QBrush(gr));
- pmp.setPen(Qt::NoPen);
- pmp.drawRect(border, border, 35, height - 2 * border);
- pmp.setPen(Qt::black);
- int step = (height - 2 * border) / 5;
- for (int i = 0; i < 6; i++) {
- int yPos = i * step + border;
- pmp.drawLine(border, yPos, 55, yPos);
- pmp.drawText(60, yPos + 2, QString("%1 m").arg(550 - (i * 110)));
- }
-
- QLabel *label = new QLabel(widget);
- label->setPixmap(pm);
-
- QGroupBox *heightMapGroupBox = new QGroupBox(QStringLiteral("Highlight color map"));
- QVBoxLayout *colorMapVBox = new QVBoxLayout;
- colorMapVBox->addWidget(label);
- heightMapGroupBox->setLayout(colorMapVBox);
-
- vLayout->addWidget(enableTexture);
- vLayout->addWidget(heightMapGroupBox);
-
- widget->show();
-
- SurfaceGraph *modifier = new SurfaceGraph(graph);
-
- QObject::connect(enableTexture, &QCheckBox::stateChanged,
- modifier, &SurfaceGraph::toggleSurfaceTexture);
-
- enableTexture->setChecked(true);
-
- return app.exec();
-}
diff --git a/examples/datavisualization/texturesurface/surfacegraph.cpp b/examples/datavisualization/texturesurface/surfacegraph.cpp
deleted file mode 100644
index c34214c6..00000000
--- a/examples/datavisualization/texturesurface/surfacegraph.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "surfacegraph.h"
-#include "topographicseries.h"
-
-#include <QtDataVisualization/QValue3DAxis>
-#include <QtDataVisualization/Q3DTheme>
-
-using namespace QtDataVisualization;
-
-const float areaWidth = 8000.0f;
-const float areaHeight = 8000.0f;
-const float aspectRatio = 0.1389f;
-const float minRange = areaWidth * 0.49f;
-
-SurfaceGraph::SurfaceGraph(Q3DSurface *surface)
- : m_graph(surface)
-{
- m_graph->setAxisX(new QValue3DAxis);
- m_graph->setAxisY(new QValue3DAxis);
- m_graph->setAxisZ(new QValue3DAxis);
- m_graph->axisX()->setLabelFormat("%i");
- m_graph->axisZ()->setLabelFormat("%i");
- m_graph->axisX()->setRange(0.0f, areaWidth);
- m_graph->axisY()->setRange(100.0f, areaWidth * aspectRatio);
- m_graph->axisZ()->setRange(0.0f, areaHeight);
- m_graph->axisX()->setLabelAutoRotation(30);
- m_graph->axisY()->setLabelAutoRotation(90);
- m_graph->axisZ()->setLabelAutoRotation(30);
- m_graph->activeTheme()->setType(Q3DTheme::ThemePrimaryColors);
-
- QFont font = m_graph->activeTheme()->font();
- font.setPointSize(20);
- m_graph->activeTheme()->setFont(font);
-
- m_topography = new TopographicSeries();
- m_topography->setTopographyFile(":/maps/topography", areaWidth, areaHeight);
- m_topography->setItemLabelFormat(QStringLiteral("@yLabel m"));
-
- m_highlight = new HighlightSeries();
- m_highlight->setTopographicSeries(m_topography);
- m_highlight->setMinHeight(minRange * aspectRatio);
- m_highlight->handleGradientChange(areaWidth * aspectRatio);
-//! [1]
- QObject::connect(m_graph->axisY(), &QValue3DAxis::maxChanged,
- m_highlight, &HighlightSeries::handleGradientChange);
-//! [1]
-
- m_graph->addSeries(m_topography);
- m_graph->addSeries(m_highlight);
-
- m_inputHandler = new CustomInputHandler(m_graph);
- m_inputHandler->setHighlightSeries(m_highlight);
- m_inputHandler->setAxes(m_graph->axisX(), m_graph->axisY(), m_graph->axisZ());
- m_inputHandler->setLimits(0.0f, areaWidth, minRange);
- m_inputHandler->setAspectRatio(aspectRatio);
-
- m_graph->setActiveInputHandler(m_inputHandler);
-}
-
-SurfaceGraph::~SurfaceGraph()
-{
- delete m_graph;
-}
-
-//! [0]
-void SurfaceGraph::toggleSurfaceTexture(bool enable)
-{
- if (enable)
- m_topography->setTextureFile(":/maps/maptexture");
- else
- m_topography->setTextureFile("");
-}
-//! [0]
diff --git a/examples/datavisualization/texturesurface/surfacegraph.h b/examples/datavisualization/texturesurface/surfacegraph.h
deleted file mode 100644
index 47eea71b..00000000
--- a/examples/datavisualization/texturesurface/surfacegraph.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef SURFACEGRAPH_H
-#define SURFACEGRAPH_H
-
-#include <QtDataVisualization/Q3DSurface>
-#include <QtDataVisualization/QSurface3DSeries>
-#include <QtWidgets/QSlider>
-#include "topographicseries.h"
-#include "highlightseries.h"
-
-#include "custominputhandler.h"
-
-using namespace QtDataVisualization;
-
-class SurfaceGraph : public QObject
-{
- Q_OBJECT
-public:
- explicit SurfaceGraph(Q3DSurface *surface);
- ~SurfaceGraph();
-
- void toggleSurfaceTexture(bool enable);
-
-private:
- Q3DSurface *m_graph;
-
- TopographicSeries *m_topography;
- HighlightSeries *m_highlight;
- int m_highlightWidth;
- int m_highlightHeight;
-
- CustomInputHandler *m_inputHandler;
-};
-
-#endif // SURFACEGRAPH_H
diff --git a/examples/datavisualization/texturesurface/texturedsurface.qrc b/examples/datavisualization/texturesurface/texturedsurface.qrc
deleted file mode 100644
index 94b96d24..00000000
--- a/examples/datavisualization/texturesurface/texturedsurface.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/maps">
- <file alias="topography">topography.png</file>
- <file alias="maptexture">maptexture.jpg</file>
- </qresource>
-</RCC>
diff --git a/examples/datavisualization/texturesurface/texturesurface.pro b/examples/datavisualization/texturesurface/texturesurface.pro
deleted file mode 100644
index efef1944..00000000
--- a/examples/datavisualization/texturesurface/texturesurface.pro
+++ /dev/null
@@ -1,25 +0,0 @@
-android|ios|winrt {
- error( "This example is not supported for android, ios, or winrt." )
-}
-
-!include( ../examples.pri ) {
- error( "Couldn't find the examples.pri file!" )
-}
-
-SOURCES += main.cpp \
- surfacegraph.cpp \
- topographicseries.cpp \
- highlightseries.cpp \
- custominputhandler.cpp
-
-HEADERS += surfacegraph.h \
- topographicseries.h \
- highlightseries.h \
- custominputhandler.h
-
-QT += widgets
-
-RESOURCES += texturedsurface.qrc
-
-OTHER_FILES += doc/src/* \
- doc/images/*
diff --git a/examples/datavisualization/texturesurface/topographicseries.cpp b/examples/datavisualization/texturesurface/topographicseries.cpp
deleted file mode 100644
index 0495756e..00000000
--- a/examples/datavisualization/texturesurface/topographicseries.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "topographicseries.h"
-
-using namespace QtDataVisualization;
-
-//! [0]
-// Value used to encode height data as RGB value on PNG file
-const float packingFactor = 11983.0f;
-//! [0]
-
-TopographicSeries::TopographicSeries()
-{
- setDrawMode(QSurface3DSeries::DrawSurface);
- setFlatShadingEnabled(true);
- setBaseColor(Qt::white);
-}
-
-TopographicSeries::~TopographicSeries()
-{
-}
-
-void TopographicSeries::setTopographyFile(const QString file, float width, float height)
-{
-//! [1]
- QImage heightMapImage(file);
- uchar *bits = heightMapImage.bits();
- int imageHeight = heightMapImage.height();
- int imageWidth = heightMapImage.width();
- int widthBits = imageWidth * 4;
- float stepX = width / float(imageWidth);
- float stepZ = height / float(imageHeight);
-
- QSurfaceDataArray *dataArray = new QSurfaceDataArray;
- dataArray->reserve(imageHeight);
- for (int i = 0; i < imageHeight; i++) {
- int p = i * widthBits;
- float z = height - float(i) * stepZ;
- QSurfaceDataRow *newRow = new QSurfaceDataRow(imageWidth);
- for (int j = 0; j < imageWidth; j++) {
- uchar aa = bits[p + 0];
- uchar rr = bits[p + 1];
- uchar gg = bits[p + 2];
- uint color = uint((gg << 16) + (rr << 8) + aa);
- float y = float(color) / packingFactor;
- (*newRow)[j].setPosition(QVector3D(float(j) * stepX, y, z));
- p = p + 4;
- }
- *dataArray << newRow;
- }
-
- dataProxy()->resetArray(dataArray);
-//! [1]
-
- m_sampleCountX = float(imageWidth);
- m_sampleCountZ = float(imageHeight);
-}
diff --git a/examples/datavisualization/texturesurface/topographicseries.h b/examples/datavisualization/texturesurface/topographicseries.h
deleted file mode 100644
index f794213a..00000000
--- a/examples/datavisualization/texturesurface/topographicseries.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef TOPOGRAPHICSERIES_H
-#define TOPOGRAPHICSERIES_H
-
-#include <QtDataVisualization/QSurface3DSeries>
-
-using namespace QtDataVisualization;
-
-class TopographicSeries : public QSurface3DSeries
-{
- Q_OBJECT
-public:
- explicit TopographicSeries();
- ~TopographicSeries();
-
- void setTopographyFile(const QString file, float width, float height);
-
- float sampleCountX() { return m_sampleCountX; }
- float sampleCountZ() { return m_sampleCountZ; }
-
-public Q_SLOTS:
-
-private:
- float m_sampleCountX;
- float m_sampleCountZ;
-};
-
-#endif // TOPOGRAPHICSERIES_H
diff --git a/examples/datavisualization/volumetric/CMakeLists.txt b/examples/datavisualization/volumetric/CMakeLists.txt
new file mode 100644
index 00000000..fcbf4e0f
--- /dev/null
+++ b/examples/datavisualization/volumetric/CMakeLists.txt
@@ -0,0 +1,56 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(volumetric LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+ set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Widgets)
+find_package(Qt6 COMPONENTS DataVisualization)
+
+qt_add_executable(volumetric
+ main.cpp
+ volumetric.cpp volumetric.h
+)
+set_target_properties(volumetric PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+target_link_libraries(volumetric PUBLIC
+ Qt::Core
+ Qt::Gui
+ Qt::Widgets
+ Qt::DataVisualization
+)
+
+set(volumetric_resource_files
+ "layer_ground.png"
+ "layer_magma.png"
+ "layer_water.png"
+)
+
+qt6_add_resources(volumetric "volumetric"
+ PREFIX
+ "/heightmaps"
+ FILES
+ ${volumetric_resource_files}
+)
+
+install(TARGETS volumetric
+ RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+ BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+ LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
diff --git a/examples/datavisualization/volumetric/doc/images/volumetric-example.png b/examples/datavisualization/volumetric/doc/images/volumetric-example.png
index 277d4fe4..6cc231d9 100644
--- a/examples/datavisualization/volumetric/doc/images/volumetric-example.png
+++ b/examples/datavisualization/volumetric/doc/images/volumetric-example.png
Binary files differ
diff --git a/examples/datavisualization/volumetric/doc/src/volumetric.qdoc b/examples/datavisualization/volumetric/doc/src/volumetric.qdoc
index b362fd59..54ac6b86 100644
--- a/examples/datavisualization/volumetric/doc/src/volumetric.qdoc
+++ b/examples/datavisualization/volumetric/doc/src/volumetric.qdoc
@@ -1,38 +1,15 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\example volumetric
- \title Volumetric rendering Example
+ \meta tags {DataVisualization, QCustom3DVolume, Custom Item}
+ \title Volumetric Rendering
\ingroup qtdatavisualization_examples
\brief Rendering volumetric objects.
\since QtDataVisualization 1.2
- This example shows how to use QCustom3DVolume items to display volumetric data.
+ \e {Volumetric Rendering} shows how to use QCustom3DVolume to display volumetric data.
\image volumetric-example.png
@@ -42,41 +19,41 @@
The QCustom3DVolume items are special custom items (see QCustom3DItem), which can be used
to display volumetric data. The volume items are only supported with orthographic projection,
- so first we make sure the graph is using it:
-
- \snippet volumetric/volumetric.cpp 6
-
- The following code shows how to create a volumetric item tied to the data ranges of the axes:
+ so first make sure the graph is using it:
\snippet volumetric/volumetric.cpp 0
- By setting the QCustom3DItem::scalingAbsolute property to \c{false}, we indicate that the
- scaling of the volume should follow the changes in the data ranges. Next we define the
- internal contents of the volume:
+ Create a volumetric item tied to the data ranges of the axes:
\snippet volumetric/volumetric.cpp 1
- We use eight bit indexed color for our texture, as it is compact and makes it easy to adjust the
- colors without needing to reset the whole texture. For the texture data we use the data we
- created earlier based on some height maps.
- Typically the data for volume items comes pregenerated in a form of a stack of images, so we are
- not going to explain the data generation in detail. Please refer to the example code if you
- are interested in the actual data generation process.
-
- Since we are using eight bit indexed colors, we need a color table to map the eight bit color
- indexes to actual colors. We use one we populated on our own, but in a typical use case you
- would get the color table from the source images:
+ Indicate that the scaling of the volume should follow the changes in the data ranges by setting
+ the QCustom3DItem::scalingAbsolute property to \c{false}. Next, define the internal contents of
+ the volume:
\snippet volumetric/volumetric.cpp 2
- We want to optionally show slice frames around the volume, so we initialize their properties.
+ Use eight bit indexed color for the texture, as it is compact and makes it easy to adjust the
+ colors without needing to reset the whole texture. For the texture data, use the data created
+ earlier based on height maps.
+ Typically, the data for volume items comes pregenerated in the form of a stack of images, so
+ the data generation details can be skipped. For more information about the actual data
+ generation process, see the example code.
+
+ Since eight bit indexed colors are used, a color table is needed to map the eight bit color
+ indexes to actual colors. In a typical use case, you would get the color table from the source
+ images instead of using one manually defined:
+
+ \snippet volumetric/volumetric.cpp 3
+
+ To have an option to show slice frames around the volume, initialize their properties.
Initially, the frames will be hidden:
- \snippet volumetric/volumetric.cpp 5
+ \snippet volumetric/volumetric.cpp 4
- Finally we add the volume as a custom item to the graph to display it:
+ Finally, add the volume as a custom item to the graph to display it:
- \snippet volumetric/volumetric.cpp 3
+ \snippet volumetric/volumetric.cpp 5
\section1 Slicing into the Volume
@@ -84,28 +61,27 @@
not very helpful. One way to inspect the internal structure of the volume is to view the slices
of the volume. QCustom3DVolume provides two ways to display the slices. The first is to show
the selected slices in place of the volume. For example, to specify a slice perpendicular to
- the X-axis, you can use the following method:
+ the X-axis, use the following method:
- \snippet volumetric/volumetric.cpp 7
+ \snippet volumetric/volumetric.cpp 6
- To actually draw the slice specified above, the QCustom3DVolume::drawSlices property must be
- also set:
+ To display the slice specified above, the QCustom3DVolume::drawSlices property must also be set:
- \snippet volumetric/volumetric.cpp 8
+ \snippet volumetric/volumetric.cpp 7
The second way to view slices is to use QCustom3DVolume::renderSlice() method, which produces
a QImage from the specified slice. This image can then be displayed on another widget, such
- as a QLabel here:
+ as a QLabel:
- \snippet volumetric/volumetric.cpp 9
+ \snippet volumetric/volumetric.cpp 8
\section1 Adjusting Volume Transparency
- Sometimes viewing just the slices doesn't give you a good understanding of the volume's internal
- structure. QCustom3DVolume provides two properties that can be used to adjust the volume
- transparency:
+ Sometimes, viewing just the slices doesn't give you a good understanding of the volume's
+ internal structure. QCustom3DVolume provides two properties that can be used to adjust the
+ volume transparency:
- \snippet volumetric/volumetric.cpp 11
+ \snippet volumetric/volumetric.cpp 9
\dots
\snippet volumetric/volumetric.cpp 10
@@ -115,26 +91,25 @@
doesn't affect colors that are fully opaque, unless the QCustom3DVolume::preserveOpacity
property is set to \c{false}.
- An alternative way to adjust the transparency of the volume is adjust the alpha values of the
- voxels directly. For eight bit indexed textures, this is done simply by modifying and
- resetting the color table:
+ An alternative way to adjust the transparency of the volume is to adjust the alpha values of the
+ voxels directly. For eight bit indexed textures, this is done simply by modifying and resetting
+ the color table:
- \snippet volumetric/volumetric.cpp 12
+ \snippet volumetric/volumetric.cpp 11
\section1 High Definition vs. Low Definition Shader
- By default the volume rendering uses the high definition shader. It accounts for each
- voxel of the volume with correct weight when ray-tracing the volume contents,
- providing an accurate representation of even the finer details of the volume.
+ By default, the volumetric rendering uses a high definition shader. It accounts for each
+ voxel of the volume with the correct weight when ray-tracing the volume contents, providing an
+ accurate representation of even the finer details of the volume.
However, this is computationally very expensive, so the frame rate suffers.
- If rendering speed is more important than pixel-perfect
- accuracy of the volume contents, you can take the much faster low definition shader into use
- by setting \c{false} for QCustom3DVolume::useHighDefShader property. The low definition shader
- achieves the speed by making compromises on the accuracy, so it doesn't guarantee each voxel
- of the volume will be sampled. This can lead to flickering and/or other rendering artifacts
- on the finer details of the volume.
-
- \snippet volumetric/volumetric.cpp 13
+ If rendering speed is more important than pixel-perfect accuracy of the volume contents, take
+ the much faster low definition shader into use by setting QCustom3DVolume::useHighDefShader
+ property \c{false}. The low definition shader achieves the speed by making compromises on
+ accuracy, so it doesn't guarantee that every voxel of the volume will be sampled. This can lead
+ to flickering or other rendering artifacts on the finer details of the volume.
+
+ \snippet volumetric/volumetric.cpp 12
\section1 Example Contents
*/
diff --git a/examples/datavisualization/volumetric/main.cpp b/examples/datavisualization/volumetric/main.cpp
index 751886a8..7bbf1d1d 100644
--- a/examples/datavisualization/volumetric/main.cpp
+++ b/examples/datavisualization/volumetric/main.cpp
@@ -1,48 +1,22 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "volumetric.h"
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QHBoxLayout>
-#include <QtWidgets/QVBoxLayout>
-#include <QtWidgets/QRadioButton>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QGroupBox>
-#include <QtWidgets/QMessageBox>
-#include <QtGui/QScreen>
+#include <QtWidgets/qapplication.h>
+#include <QtWidgets/qwidget.h>
+#include <QtWidgets/qboxlayout.h>
+#include <QtWidgets/qradiobutton.h>
+#include <QtWidgets/qslider.h>
+#include <QtWidgets/qcheckbox.h>
+#include <QtWidgets/qlabel.h>
+#include <QtWidgets/qgroupbox.h>
+#include <QtWidgets/qmessagebox.h>
+#include <QtGui/qscreen.h>
int main(int argc, char **argv)
{
+ qputenv("QSG_RHI_BACKEND", "opengl");
QApplication app(argc, argv);
Q3DScatter *graph = new Q3DScatter();
QWidget *container = QWidget::createWindowContainer(graph);
@@ -55,7 +29,7 @@ int main(int argc, char **argv)
}
QSize screenSize = graph->screen()->size();
- container->setMinimumSize(QSize(screenSize.width() / 3, screenSize.height() / 3));
+ container->setMinimumSize(QSize(screenSize.width() / 3, screenSize.height() / 2));
container->setMaximumSize(screenSize);
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
@@ -68,7 +42,7 @@ int main(int argc, char **argv)
hLayout->addLayout(vLayout);
hLayout->addLayout(vLayout2);
- widget->setWindowTitle(QStringLiteral("Volumetric object example - 3D terrain"));
+ widget->setWindowTitle(QStringLiteral("Volumetric Rendering - 3D Terrain"));
QCheckBox *sliceXCheckBox = new QCheckBox(widget);
sliceXCheckBox->setText(QStringLiteral("Slice volume on X axis"));
@@ -104,7 +78,7 @@ int main(int argc, char **argv)
QGroupBox *textureDetailGroupBox = new QGroupBox(QStringLiteral("Texture detail"));
QRadioButton *lowDetailRB = new QRadioButton(widget);
- lowDetailRB->setText(QStringLiteral("Low (128x64x128)"));
+ lowDetailRB->setText(QStringLiteral("Low (256x128x256)"));
lowDetailRB->setChecked(true);
QRadioButton *mediumDetailRB = new QRadioButton(widget);
diff --git a/examples/datavisualization/volumetric/volumetric.cpp b/examples/datavisualization/volumetric/volumetric.cpp
index 781081d1..3475c85b 100644
--- a/examples/datavisualization/volumetric/volumetric.cpp
+++ b/examples/datavisualization/volumetric/volumetric.cpp
@@ -1,52 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "volumetric.h"
#include <QtDataVisualization/qvalue3daxis.h>
-#include <QtDataVisualization/q3dscene.h>
-#include <QtDataVisualization/q3dcamera.h>
-#include <QtDataVisualization/q3dtheme.h>
#include <QtDataVisualization/qcustom3dlabel.h>
-#include <QtDataVisualization/q3dscatter.h>
#include <QtDataVisualization/q3dinputhandler.h>
#include <QtCore/qmath.h>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QRadioButton>
-#include <QtWidgets/QSlider>
-#include <QtCore/QDebug>
-#include <QtGui/QOpenGLContext>
+#include <QtGui/qopenglcontext.h>
-using namespace QtDataVisualization;
-
-const int lowDetailSize(128);
-const int mediumDetailSize(256);
-const int highDetailSize(512);
+const int lowDetailSize(256);
+const int mediumDetailSize(512);
+const int highDetailSize(1024);
const int colorTableSize(256);
const int layerDataSize(512);
const int mineShaftDiameter(1);
@@ -67,10 +31,8 @@ const int terrainTransparency(12);
static bool isOpenGLES()
{
-#if defined(QT_OPENGL_ES_2)
+#if QT_CONFIG(opengles2)
return true;
-#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
- return false;
#else
return QOpenGLContext::currentContext()->isOpenGLES();
#endif
@@ -78,36 +40,16 @@ static bool isOpenGLES()
VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
: m_graph(scatter),
- m_volumeItem(0),
m_sliceIndexX(lowDetailSize / 2),
m_sliceIndexY(lowDetailSize / 4),
- m_sliceIndexZ(lowDetailSize / 2),
- m_slicingX(false),
- m_slicingY(false),
- m_slicingZ(false),
- m_mediumDetailRB(0),
- m_highDetailRB(0),
- m_lowDetailData(0),
- m_mediumDetailData(0),
- m_highDetailData(0),
- m_mediumDetailIndex(0),
- m_highDetailIndex(0),
- m_mediumDetailShaftIndex(0),
- m_highDetailShaftIndex(0),
- m_sliceSliderX(0),
- m_sliceSliderY(0),
- m_sliceSliderZ(0),
- m_usingPrimaryTable(true),
- m_sliceLabelX(0),
- m_sliceLabelY(0),
- m_sliceLabelZ(0)
-{
- m_graph->activeTheme()->setType(Q3DTheme::ThemeQt);
+ m_sliceIndexZ(lowDetailSize / 2)
+{
+ m_graph->activeTheme()->setType(Q3DTheme::ThemePrimaryColors);
m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
- m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
- //! [6]
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricLeft);
+ //! [0]
m_graph->setOrthoProjection(true);
- //! [6]
+ //! [0]
m_graph->activeTheme()->setBackgroundEnabled(false);
// Only allow zooming at the center and limit the zoom to 200% to avoid clipping issues
@@ -117,10 +59,12 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
toggleAreaAll(true);
if (!isOpenGLES()) {
- m_lowDetailData = new QList<uchar>(lowDetailSize * lowDetailSize * lowDetailSize / 2);
- m_mediumDetailData =
- new QList<uchar>(mediumDetailSize * mediumDetailSize * mediumDetailSize / 2);
- m_highDetailData = new QList<uchar>(highDetailSize * highDetailSize * highDetailSize / 2);
+ m_lowDetailData
+ = new QList<uchar>(lowDetailSize * lowDetailSize * lowDetailSize / 2);
+ m_mediumDetailData
+ = new QList<uchar>(mediumDetailSize * mediumDetailSize * mediumDetailSize / 2);
+ m_highDetailData
+ = new QList<uchar>(highDetailSize * highDetailSize * highDetailSize / 2);
initHeightMap(QStringLiteral(":/heightmaps/layer_ground.png"), m_groundLayer);
initHeightMap(QStringLiteral(":/heightmaps/layer_water.png"), m_waterLayer);
@@ -131,7 +75,7 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
createVolume(lowDetailSize, 0, lowDetailSize, m_lowDetailData);
excavateMineShaft(lowDetailSize, 0, m_mineShaftArray.size(), m_lowDetailData);
- //! [0]
+ //! [1]
m_volumeItem = new QCustom3DVolume;
// Adjust water level to zero with a minor tweak to y-coordinate position and scaling
m_volumeItem->setScaling(
@@ -144,16 +88,16 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
(m_graph->axisY()->max() + m_graph->axisY()->min()) / 2.0f,
(m_graph->axisZ()->max() + m_graph->axisZ()->min()) / 2.0f));
m_volumeItem->setScalingAbsolute(false);
- //! [0]
//! [1]
+ //! [2]
m_volumeItem->setTextureWidth(lowDetailSize);
m_volumeItem->setTextureHeight(lowDetailSize / 2);
m_volumeItem->setTextureDepth(lowDetailSize);
m_volumeItem->setTextureFormat(QImage::Format_Indexed8);
m_volumeItem->setTextureData(new QList<uchar>(*m_lowDetailData));
- //! [1]
+ //! [2]
- // Generate color tables.
+ // Generate color tables
m_colorTable1.resize(colorTableSize);
m_colorTable2.resize(colorTableSize);
@@ -184,13 +128,17 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
if (i < magmaColorsMax) {
m_colorTable2[i] = qRgba(((i - aboveWaterGroundColorsMax) * 2),
((i - aboveWaterGroundColorsMax) * 2),
- ((i - aboveWaterGroundColorsMax) * 2), 255);
+ ((i - aboveWaterGroundColorsMax) * 2),
+ 255);
} else if (i < underWaterGroundColorsMax) {
m_colorTable2[i] = qRgba(((i - aboveWaterGroundColorsMax) * 2),
((i - aboveWaterGroundColorsMax) * 2),
- ((i - aboveWaterGroundColorsMax) * 2), terrainTransparency);
+ ((i - aboveWaterGroundColorsMax) * 2),
+ terrainTransparency);
} else if (i < waterColorsMax) {
- m_colorTable2[i] = qRgba(0, 0, ((i - underWaterGroundColorsMax) * 2) + 120,
+ m_colorTable2[i] = qRgba(0,
+ 0,
+ ((i - underWaterGroundColorsMax) * 2) + 120,
terrainTransparency);
} else {
m_colorTable2[i] = qRgba(0, 0, 0, 0); // Not used
@@ -199,21 +147,21 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
m_colorTable2[airColorIndex] = qRgba(0, 0, 0, 0);
m_colorTable2[mineShaftColorIndex] = qRgba(255, 255, 0, 255);
- //! [2]
+ //! [3]
m_volumeItem->setColorTable(m_colorTable1);
- //! [2]
+ //! [3]
- //! [5]
+ //! [4]
m_volumeItem->setSliceFrameGaps(QVector3D(0.01f, 0.02f, 0.01f));
m_volumeItem->setSliceFrameThicknesses(QVector3D(0.0025f, 0.005f, 0.0025f));
m_volumeItem->setSliceFrameWidths(QVector3D(0.0025f, 0.005f, 0.0025f));
m_volumeItem->setDrawSliceFrames(false);
- //! [5]
+ //! [4]
handleSlicingChanges();
- //! [3]
+ //! [5]
m_graph->addCustomItem(m_volumeItem);
- //! [3]
+ //! [5]
m_timer.start(0);
} else {
@@ -297,13 +245,13 @@ void VolumetricModifier::adjustSliceX(int value)
if (m_sliceIndexX == m_volumeItem->textureWidth())
m_sliceIndexX--;
if (m_volumeItem->sliceIndexX() != -1)
- //! [7]
+ //! [6]
m_volumeItem->setSliceIndexX(m_sliceIndexX);
- //! [7]
- //! [9]
+ //! [6]
+ //! [8]
m_sliceLabelX->setPixmap(
QPixmap::fromImage(m_volumeItem->renderSlice(Qt::XAxis, m_sliceIndexX)));
- //! [9]
+ //! [8]
}
}
@@ -459,7 +407,7 @@ void VolumetricModifier::setPreserveOpacity(bool enabled)
void VolumetricModifier::setTransparentGround(bool enabled)
{
if (m_volumeItem) {
- //! [12]
+ //! [11]
int newAlpha = enabled ? terrainTransparency : 255;
for (int i = aboveWaterGroundColorsMin; i < underWaterGroundColorsMax; i++) {
QRgb oldColor1 = m_colorTable1.at(i);
@@ -471,7 +419,7 @@ void VolumetricModifier::setTransparentGround(bool enabled)
m_volumeItem->setColorTable(m_colorTable1);
else
m_volumeItem->setColorTable(m_colorTable2);
- //! [12]
+ //! [11]
adjustSliceX(m_sliceSliderX->value());
adjustSliceY(m_sliceSliderY->value());
adjustSliceZ(m_sliceSliderZ->value());
@@ -481,9 +429,9 @@ void VolumetricModifier::setTransparentGround(bool enabled)
void VolumetricModifier::setUseHighDefShader(bool enabled)
{
if (m_volumeItem) {
- //! [13]
+ //! [12]
m_volumeItem->setUseHighDefShader(enabled);
- //! [13]
+ //! [12]
}
}
@@ -495,9 +443,9 @@ void VolumetricModifier::adjustAlphaMultiplier(int value)
mult = float(value - 99) / 2.0f;
else
mult = float(value) / float(500 - value * 4);
- //! [11]
+ //! [9]
m_volumeItem->setAlphaMultiplier(mult);
- //! [11]
+ //! [9]
QString labelFormat = QStringLiteral("Alpha multiplier: %1");
m_alphaMultiplierLabel->setText(labelFormat.arg(
QString::number(m_volumeItem->alphaMultiplier(), 'f', 3)));
@@ -652,8 +600,6 @@ int VolumetricModifier::excavateMineShaft(int textureSize, int startIndex, int c
dataIndex += (textureSize * textureSize / 2) * shaftSize;
}
}
-
-
}
return endIndex;
}
@@ -662,7 +608,7 @@ void VolumetricModifier::excavateMineBlock(int textureSize, int dataIndex, int s
QList<uchar> *textureData)
{
for (int k = 0; k < size; k++) {
- int curIndex = dataIndex + (k * textureSize * textureSize / 2);
+ int curIndex = 0;
for (int l = 0; l < size; l++) {
curIndex = dataIndex + (k * textureSize * textureSize / 2)
+ (l * textureSize);
@@ -671,7 +617,6 @@ void VolumetricModifier::excavateMineBlock(int textureSize, int dataIndex, int s
(*textureData)[curIndex] = mineShaftColorIndex;
curIndex++;
}
-
}
}
}
@@ -681,9 +626,9 @@ void VolumetricModifier::handleSlicingChanges()
if (m_volumeItem) {
if (m_slicingX || m_slicingY || m_slicingZ) {
// Only show slices of selected dimensions
- //! [8]
+ //! [7]
m_volumeItem->setDrawSlices(true);
- //! [8]
+ //! [7]
m_volumeItem->setSliceIndexX(m_slicingX ? m_sliceIndexX : -1);
m_volumeItem->setSliceIndexY(m_slicingY ? m_sliceIndexY : -1);
m_volumeItem->setSliceIndexZ(m_slicingZ ? m_sliceIndexZ : -1);
diff --git a/examples/datavisualization/volumetric/volumetric.h b/examples/datavisualization/volumetric/volumetric.h
index f76884d6..68bbb0dc 100644
--- a/examples/datavisualization/volumetric/volumetric.h
+++ b/examples/datavisualization/volumetric/volumetric.h
@@ -1,44 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Data Visualization module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef VOLUMETRICMODIFIER_H
#define VOLUMETRICMODIFIER_H
#include <QtDataVisualization/q3dscatter.h>
#include <QtDataVisualization/qcustom3dvolume.h>
-#include <QtCore/QTimer>
-#include <QtGui/QRgb>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QSlider>
-#include <QtWidgets/QRadioButton>
-
-using namespace QtDataVisualization;
+#include <QtCore/qtimer.h>
+#include <QtGui/qrgb.h>
+#include <QtWidgets/qlabel.h>
+#include <QtWidgets/qslider.h>
+#include <QtWidgets/qradiobutton.h>
class VolumetricModifier : public QObject
{
@@ -85,39 +57,39 @@ private:
void excavateMineBlock(int textureSize, int dataIndex, int size, QList<uchar> *textureData);
void handleSlicingChanges();
- Q3DScatter *m_graph;
- QCustom3DVolume *m_volumeItem;
- int m_sliceIndexX;
- int m_sliceIndexY;
- int m_sliceIndexZ;
- bool m_slicingX;
- bool m_slicingY;
- bool m_slicingZ;
- QLabel *m_fpsLabel;
- QRadioButton *m_mediumDetailRB;
- QRadioButton *m_highDetailRB;
- QList<uchar> *m_lowDetailData;
- QList<uchar> *m_mediumDetailData;
- QList<uchar> *m_highDetailData;
+ Q3DScatter *m_graph = nullptr;
+ QCustom3DVolume *m_volumeItem = nullptr;
+ int m_sliceIndexX = 0;
+ int m_sliceIndexY = 0;
+ int m_sliceIndexZ = 0;
+ bool m_slicingX = false;
+ bool m_slicingY = false;
+ bool m_slicingZ = false;
+ QLabel *m_fpsLabel = nullptr;
+ QRadioButton *m_mediumDetailRB = nullptr;
+ QRadioButton *m_highDetailRB = nullptr;
+ QList<uchar> *m_lowDetailData = nullptr;
+ QList<uchar> *m_mediumDetailData = nullptr;
+ QList<uchar> *m_highDetailData = nullptr;
+ int m_mediumDetailIndex = 0;
+ int m_highDetailIndex = 0;
+ int m_mediumDetailShaftIndex = 0;
+ int m_highDetailShaftIndex = 0;
+ QSlider *m_sliceSliderX = nullptr;
+ QSlider *m_sliceSliderY = nullptr;
+ QSlider *m_sliceSliderZ = nullptr;
+ QList<QRgb> m_colorTable1 = {};
+ QList<QRgb> m_colorTable2 = {};
+ bool m_usingPrimaryTable = true;
+ QLabel *m_sliceLabelX = nullptr;
+ QLabel *m_sliceLabelY = nullptr;
+ QLabel *m_sliceLabelZ = nullptr;
+ QLabel *m_alphaMultiplierLabel = nullptr;
+ QList<uchar> m_magmaLayer = {};
+ QList<uchar> m_waterLayer = {};
+ QList<uchar> m_groundLayer = {};
+ QList<QPair<QVector3D, QVector3D>> m_mineShaftArray = {};
QTimer m_timer;
- int m_mediumDetailIndex;
- int m_highDetailIndex;
- int m_mediumDetailShaftIndex;
- int m_highDetailShaftIndex;
- QSlider *m_sliceSliderX;
- QSlider *m_sliceSliderY;
- QSlider *m_sliceSliderZ;
- QList<QRgb> m_colorTable1;
- QList<QRgb> m_colorTable2;
- bool m_usingPrimaryTable;
- QLabel *m_sliceLabelX;
- QLabel *m_sliceLabelY;
- QLabel *m_sliceLabelZ;
- QLabel *m_alphaMultiplierLabel;
- QList<uchar> m_magmaLayer;
- QList<uchar> m_waterLayer;
- QList<uchar> m_groundLayer;
- QList<QPair<QVector3D, QVector3D>> m_mineShaftArray;
};
#endif