| // +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() | |
| } |