// Returns the fraction of the segment that was visible func (l *Los) TestSeg(seg linear.Seg2) float64 { seg.P = seg.P.Sub(l.in.Pos) seg.Q = seg.Q.Sub(l.in.Pos) wrap := len(l.in.Buffer.ZBuffer) a1 := math.Atan2(seg.P.Y, seg.P.X) a2 := math.Atan2(seg.Q.Y, seg.Q.X) if a1 > a2 { a1, a2 = a2, a1 seg.P, seg.Q = seg.Q, seg.P } if a2-a1 > math.Pi { a1, a2 = a2, a1 seg.P, seg.Q = seg.Q, seg.P } start := int(((a1 / (2 * math.Pi)) + 0.5) * float64(len(l.in.Buffer.ZBuffer))) end := int(((a2 / (2 * math.Pi)) + 0.5) * float64(len(l.in.Buffer.ZBuffer))) count := 0.0 visible := 0.0 for i := start % wrap; i != end%wrap; i = (i + 1) % wrap { dist2 := float32(rays[i].Isect(seg).Mag2()) if dist2 < l.in.Buffer.ZBuffer[i] { visible += 1.0 } count += 1.0 } return visible / count }
func (l *Los) DrawSeg(seg linear.Seg2, source string) { seg.P = seg.P.Sub(l.in.Pos) seg.Q = seg.Q.Sub(l.in.Pos) wrap := len(l.in.Buffer.ZBuffer) a1 := math.Atan2(seg.P.Y, seg.P.X) a2 := math.Atan2(seg.Q.Y, seg.Q.X) if a1 > a2 { a1, a2 = a2, a1 seg.P, seg.Q = seg.Q, seg.P } if a2-a1 > math.Pi { a1, a2 = a2, a1 seg.P, seg.Q = seg.Q, seg.P } start := int(((a1 / (2 * math.Pi)) + 0.5) * float64(len(l.in.Buffer.ZBuffer))) end := int(((a2 / (2 * math.Pi)) + 0.5) * float64(len(l.in.Buffer.ZBuffer))) for i := start % wrap; i != end%wrap; i = (i + 1) % wrap { dist2 := float32(rays[i].Isect(seg).Mag2()) // dist = rays[i].Isect(seg).Mag2() if dist2 < l.in.Buffer.ZBuffer[i] { l.in.Buffer.ZBuffer[i] = dist2 l.in.Buffer.SBuffer[i] = source } } }
func distFromPointToSeg(p linear.Vec2, s linear.Seg2) float64 { s.P = s.P.Sub(p) s.Q = s.Q.Sub(p) cross := s.Ray().Cross() crossSeg := linear.Seg2{Q: cross} if crossSeg.Left(s.P) != crossSeg.Left(s.Q) { return s.DistFromOrigin() } da := s.P.Mag() db := s.Q.Mag() if da < db { return da } return db }