another triangulation bugfix, points should be considered inside the polygon if they are on a line, with a small amount of tolerance
This commit is contained in:
parent
3f85d64ff3
commit
50c77477c9
2 changed files with 24 additions and 0 deletions
9
paths.go
9
paths.go
|
@ -357,6 +357,15 @@ func lineIntersection(a0, a1, b0, b1 vec) (vec, float64, float64) {
|
||||||
return a0.add(va.mulf(p)), p, q
|
return a0.add(va.mulf(p)), p, q
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func linePointDistSqr(a, b, p vec) float64 {
|
||||||
|
v := b.sub(a)
|
||||||
|
vl := v.len()
|
||||||
|
vn := v.divf(vl)
|
||||||
|
d := p.sub(a).dot(vn)
|
||||||
|
c := a.add(vn.mulf(d))
|
||||||
|
return p.sub(c).lenSqr()
|
||||||
|
}
|
||||||
|
|
||||||
// Fill fills the current path with the current FillStyle
|
// Fill fills the current path with the current FillStyle
|
||||||
func (cv *Canvas) Fill() {
|
func (cv *Canvas) Fill() {
|
||||||
cv.fillPath(&cv.path, matIdentity())
|
cv.fillPath(&cv.path, matIdentity())
|
||||||
|
|
|
@ -72,6 +72,13 @@ func triangleContainsPoint(a, b, c, p vec) bool {
|
||||||
return count == 1
|
return count == 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const parallelTolerance = 1e-10
|
||||||
|
|
||||||
|
func parallel(a1, b1, a2, b2 vec) bool {
|
||||||
|
ang := b1.sub(a1).angleTo(b2.sub(a2))
|
||||||
|
return math.Abs(ang) < parallelTolerance || math.Abs(ang-math.Pi) < parallelTolerance
|
||||||
|
}
|
||||||
|
|
||||||
func polygonContainsLine(polygon []vec, ia, ib int, a, b vec) bool {
|
func polygonContainsLine(polygon []vec, ia, ib int, a, b vec) bool {
|
||||||
for i := range polygon {
|
for i := range polygon {
|
||||||
if i == ia || i == ib {
|
if i == ia || i == ib {
|
||||||
|
@ -89,6 +96,8 @@ func polygonContainsLine(polygon []vec, ia, ib int, a, b vec) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onLineToleranceSqr = 1e-20
|
||||||
|
|
||||||
func polygonContainsPoint(polygon []vec, p vec) bool {
|
func polygonContainsPoint(polygon []vec, p vec) bool {
|
||||||
a := polygon[len(polygon)-1]
|
a := polygon[len(polygon)-1]
|
||||||
count := 0
|
count := 0
|
||||||
|
@ -96,6 +105,9 @@ func polygonContainsPoint(polygon []vec, p vec) bool {
|
||||||
if r, _ := pointIsRightOfLine(a, b, p); r {
|
if r, _ := pointIsRightOfLine(a, b, p); r {
|
||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
|
if linePointDistSqr(a, b, p) < onLineToleranceSqr {
|
||||||
|
return true
|
||||||
|
}
|
||||||
a = b
|
a = b
|
||||||
}
|
}
|
||||||
return count%2 == 1
|
return count%2 == 1
|
||||||
|
@ -129,6 +141,9 @@ func triangulatePath(path []pathPoint, mat mat, target [][2]float64) [][2]float6
|
||||||
if !polygonContainsLine(polygon, i, ic, a, c) {
|
if !polygonContainsLine(polygon, i, ic, a, c) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if parallel(a, b, b, c) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
target = append(target, a, b, c)
|
target = append(target, a, b, c)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue