func decodePointsCompressed()

in s2/pointcompression.go [208:249]


func decodePointsCompressed(d *decoder, level int, target []Point) {
	faces := decodeFaces(len(target), d)

	piCoder := newNthDerivativeCoder(derivativeEncodingOrder)
	qiCoder := newNthDerivativeCoder(derivativeEncodingOrder)

	iter := facesIterator{faces: faces}
	for i := range target {
		decodeFn := decodePointCompressed
		if i == 0 {
			decodeFn = decodeFirstPointFixedLength
		}
		pi, qi := decodeFn(d, level, piCoder, qiCoder)
		if ok := iter.next(); !ok && d.err == nil {
			d.err = fmt.Errorf("ran out of faces at target %d", i)
			return
		}
		target[i] = Point{facePiQitoXYZ(iter.curFace, pi, qi, level)}
	}

	numOffCenter := int(d.readUvarint())
	if d.err != nil {
		return
	}
	if numOffCenter > len(target) {
		d.err = fmt.Errorf("numOffCenter = %d, should be at most len(target) = %d", numOffCenter, len(target))
		return
	}
	for i := 0; i < numOffCenter; i++ {
		idx := int(d.readUvarint())
		if d.err != nil {
			return
		}
		if idx >= len(target) {
			d.err = fmt.Errorf("off center index = %d, should be < len(target) = %d", idx, len(target))
			return
		}
		target[idx].X = d.readFloat64()
		target[idx].Y = d.readFloat64()
		target[idx].Z = d.readFloat64()
	}
}