|  | // run -race | 
|  |  | 
|  | //go:build cgo && linux && amd64 | 
|  |  | 
|  | // 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. | 
|  |  | 
|  | 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() | 
|  | } |