天天看點

Voronoi圖和Delaunay三角網

一、使用Delaunator生成點的Delaunay圖。

Voronoi圖和Delaunay三角網

圖1. 偏移,坐标設定不正确

二、利用D3.js生成Voronoi圖與Delaunay三角網

D3.js v4生成的Voronoi圖

2.1 定義projection

    使用d3.geoMercator()定義資料所對應的投影。

let projection = d3.geoMercator();
           

2.2 定義繪制path

    利用d3.geoPath定義繪制地理資料所需的path。

let path = d3.geoPath().projection(projection)
           

2.3 GeoJSON點集資料

    使用d3.json讀取點集資料,并根據資料的格式進行解析,取得GeoJSON中的features。并根據feature資料中的geometry,獲得其中的坐标資訊(coordinates),得到生成voronoi圖所需的點集資料(points)。

Voronoi圖和Delaunay三角網

圖2. 底圖,模拟的點集

2.4 生成voronoi圖

    使用前面所獲得的坐标點集資訊,利用d3.voronoi生成voronoi圖的各多邊形(polygons)。

voronoi(points).polygons
           
Voronoi圖和Delaunay三角網

圖3. 利用點集生成的Voronoi圖

2.5 生成Delaunay三角網

voronoi.links(points)
           
Voronoi圖和Delaunay三角網

圖4. 點集對應的Delaunay三角網

2.6 Voronoi圖與Delaunay三角網的疊加

Voronoi圖和Delaunay三角網

圖5. Voronoi圖和Delaunay三角網的疊加

Voronoi圖和Delaunay三角網

圖6. 結合OpenLayers,內建Voronoi圖

Voronoi圖和Delaunay三角網

圖7. 內建Voronoi和Delaunay圖,使用ImageCanvas繪制

三、裁剪,把限制範圍外的圖形裁剪掉

3.1 裁剪的方法

    使用空間裁剪算法:Greiner-Hormann;Cohen-Sutherland;Martinez-Rueda;Weiler-Atherton;Vatti

    使用繪制底層裁剪方法:Canvas clip;SVG clip

3.2 利用Canvas Clip進行裁剪的結果

    1)讀取裁剪區域的Geometry多邊形;

    2)循環讀取坐标對;

    3)利用projection,把坐标對從地理空間(Earth)投影到像素空間(Screen);

    4) 利用轉換的坐标對建構Canvas clip對象;

Voronoi圖和Delaunay三角網

圖8. 裁剪的結果

Voronoi圖和Delaunay三角網

圖9. 裁剪的結果

3.3 使用Canvas clip進行裁剪中存在的問題

    1)多個多邊形,如何裁剪?台灣及海南島的問題。

    2)沒有考慮邊界的Voronoi效應;隻是單純的裁剪。

四、性能測試

繼續閱讀