public unsafe override bool write(laszip_point item)
        {
            enc.encodeSymbol(m_packet_index, item.wave_packet[0]);

            fixed(byte *pItem = item.wave_packet)
            {
                LASwavepacket13 *wave = (LASwavepacket13 *)(pItem + 1);

                // calculate the difference between the two offsets
                long curr_diff_64 = (long)(wave->offset - last_item.offset);
                int  curr_diff_32 = (int)curr_diff_64;

                // if the current difference can be represented with 32 bits
                if (curr_diff_64 == (long)(curr_diff_32))
                {
                    if (curr_diff_32 == 0)                  // current difference is zero
                    {
                        enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 0);
                        sym_last_offset_diff = 0;
                    }
                    else if (curr_diff_32 == (int)last_item.packet_size)                  // current difference is size of last packet
                    {
                        enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 1);
                        sym_last_offset_diff = 1;
                    }
                    else                     //
                    {
                        enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 2);
                        sym_last_offset_diff = 2;
                        ic_offset_diff.compress(last_diff_32, curr_diff_32);
                        last_diff_32 = curr_diff_32;
                    }
                }
                else
                {
                    enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 3);
                    sym_last_offset_diff = 3;
                    enc.writeInt64(wave->offset);
                }

                ic_packet_size.compress((int)last_item.packet_size, (int)wave->packet_size);
                ic_return_point.compress(last_item.return_point.i32, wave->return_point.i32);
                ic_xyz.compress(last_item.x.i32, wave->x.i32, 0);
                ic_xyz.compress(last_item.y.i32, wave->y.i32, 1);
                ic_xyz.compress(last_item.z.i32, wave->z.i32, 2);

                last_item = *wave;
            }

            return(true);
        }
示例#2
0
        public unsafe override void read(laszip_point item)
        {
            item.wave_packet[0] = (byte)(dec.decodeSymbol(m_packet_index));

            fixed(byte *pItem = item.wave_packet)
            {
                LASwavepacket13 *wave = (LASwavepacket13 *)(pItem + 1);

                sym_last_offset_diff = dec.decodeSymbol(m_offset_diff[sym_last_offset_diff]);

                if (sym_last_offset_diff == 0)
                {
                    wave->offset = last_item.offset;
                }
                else if (sym_last_offset_diff == 1)
                {
                    wave->offset = last_item.offset + last_item.packet_size;
                }
                else if (sym_last_offset_diff == 2)
                {
                    last_diff_32 = ic_offset_diff.decompress(last_diff_32);
                    wave->offset = (ulong)((long)last_item.offset + last_diff_32);
                }
                else
                {
                    wave->offset = dec.readInt64();
                }

                wave->packet_size      = (uint)ic_packet_size.decompress((int)last_item.packet_size);
                wave->return_point.i32 = ic_return_point.decompress(last_item.return_point.i32);
                wave->x.i32            = ic_xyz.decompress(last_item.x.i32, 0);
                wave->y.i32            = ic_xyz.decompress(last_item.y.i32, 1);
                wave->z.i32            = ic_xyz.decompress(last_item.z.i32, 2);

                last_item = *wave;
            }
        }