tidwall / geojson

GeoJSON for Go. Used by Tile38
MIT License
130 stars 28 forks source link

Intersection of polygons does not work as expected #14

Closed thomascoquet closed 4 years ago

thomascoquet commented 4 years ago

Hello,

I noticed a strange behavior wrt the ring intersection : https://play.golang.org/p/NIXpnLvZTWG

package main

import (
"fmt"
"github.com/tidwall/geojson/geometry"
)

func main() {
    exterior := make([]geometry.Point, 5)
    exterior[0] = geometry.Point{X: 0, Y: 0}
    exterior[1] = geometry.Point{X: 6000, Y: 0}
    exterior[2] = geometry.Point{X: 10, Y: 10.1}
    exterior[3] = geometry.Point{X: 0, Y: 10}
    exterior[4] = geometry.Point{X: 0, Y: 0}

    polygon := geometry.NewPoly(exterior, nil, nil)

    rectangle := geometry.Rect{
        Min: geometry.Point{X: 2560, Y: 0},
        Max: geometry.Point{X: 5120, Y: 2560},
    }

    flagContains := polygon.ContainsRect(rectangle)
    flagIntersects := rectangle.IntersectsPoly(polygon)
    flagIntersects2 := polygon.IntersectsRect(rectangle)

    fmt.Printf("intersects %v, contains %v, intersects2 %v", flagIntersects, flagContains, flagIntersects2)
}

Yields: False,False,False. Expected output: True, False, True.

Thank you ! Thomas

tidwall commented 4 years ago

I pushed a fix. Thanks for letting me know.

thomascoquet commented 4 years ago

Thanks for the fix and your work!

sotex commented 3 years ago

@tidwall I also found here that the calculation results seem to be wrong

https://play.golang.org/p/Vl8LfCf77P-

package main

import (
    "fmt"

    "github.com/tidwall/geojson"
    "github.com/tidwall/geojson/geometry"
)

func main() {
    poly := geojson.NewPolygon(
        geometry.NewPoly([]geometry.Point{
            {112.5323, 35.6394},
            {111.7749, 31.7842},
            {115.6311, 31.3255},
            {116.8506, 34.8228},
            {112.5323, 35.6394}}, nil, nil))
    poly2 := geojson.NewPolygon(
        geometry.NewPoly([]geometry.Point{
            {115.07, 35.16},
            {115.071, 35.16},
            {115.071, 35.161},
            {115.07, 35.161},
            {115.07, 35.16}}, nil, nil))

    fmt.Println(poly.JSON())
    fmt.Println(poly2.JSON())
    fmt.Println(poly.IntersectsPoly(poly2.Base()))
}

outputs

{"type":"Polygon","coordinates":[[[112.5323,35.6394],[111.7749,31.7842],[115.6311,31.3255],[116.8506,34.8228],[112.5323,35.6394]]]}
{"type":"Polygon","coordinates":[[[115.07,35.16],[115.071,35.16],[115.071,35.161],[115.07,35.161],[115.07,35.16]]]}
false

svg

sotex commented 3 years ago

Is the reason for drawing. It's actually disjoint.

geogebar