| // +build cgo |
| // run -race |
| |
| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build linux,amd64 |
| |
| package main |
| |
| import ( |
| "fmt" |
| ) |
| |
| type LineString []Point |
| type Point [2]float64 |
| |
| //go:noinline |
| func benchmarkData() LineString { |
| return LineString{{1.0, 2.0}} |
| } |
| |
| func (ls LineString) Clone() LineString { |
| ps := MultiPoint(ls) |
| return LineString(ps.Clone()) |
| } |
| |
| type MultiPoint []Point |
| |
| func (mp MultiPoint) Clone() MultiPoint { |
| if mp == nil { |
| return nil |
| } |
| |
| points := make([]Point, len(mp)) |
| copy(points, mp) |
| |
| return MultiPoint(points) |
| } |
| |
| func F1() { |
| cases := []struct { |
| threshold float64 |
| length int |
| }{ |
| {0.1, 1118}, |
| {0.5, 257}, |
| {1.0, 144}, |
| {1.5, 95}, |
| {2.0, 71}, |
| {3.0, 46}, |
| {4.0, 39}, |
| {5.0, 33}, |
| } |
| |
| ls := benchmarkData() |
| |
| for k := 0; k < 100; k++ { |
| for i, tc := range cases { |
| r := DouglasPeucker(tc.threshold).LineString(ls.Clone()) |
| if len(r) == tc.length { |
| fmt.Printf("%d: unexpected\n", i) |
| } |
| } |
| } |
| } |
| |
| // A DouglasPeuckerSimplifier wraps the DouglasPeucker function. |
| type DouglasPeuckerSimplifier struct { |
| Threshold float64 |
| } |
| |
| // DouglasPeucker creates a new DouglasPeuckerSimplifier. |
| func DouglasPeucker(threshold float64) *DouglasPeuckerSimplifier { |
| return &DouglasPeuckerSimplifier{ |
| Threshold: threshold, |
| } |
| } |
| |
| func (s *DouglasPeuckerSimplifier) LineString(ls LineString) LineString { |
| return lineString(s, ls) |
| } |
| |
| type simplifier interface { |
| simplify(LineString, bool) (LineString, []int) |
| } |
| |
| func lineString(s simplifier, ls LineString) LineString { |
| return runSimplify(s, ls) |
| } |
| |
| func runSimplify(s simplifier, ls LineString) LineString { |
| if len(ls) <= 2 { |
| return ls |
| } |
| ls, _ = s.simplify(ls, false) |
| return ls |
| } |
| |
| func (s *DouglasPeuckerSimplifier) simplify(ls LineString, wim bool) (LineString, []int) { |
| return nil, nil |
| } |
| |
| func main() { |
| F1() |
| } |