1- using System ;
2- using System . Runtime . InteropServices ;
1+ using System ;
2+ using System . Runtime . CompilerServices ;
33
44namespace Kuoste . LasZipNetStandard
55{
6-
76 public class LasPoint
87 {
98 public double X { get ; set ; }
@@ -23,24 +22,25 @@ public class LasPoint
2322 public ushort Green { get ; set ; }
2423 public ushort Blue { get ; set ; }
2524
26- internal static void ConvertPoint ( LasZipPointStruct pointStruct , ref LasPoint lasPoint )
27- {
28- lasPoint . X = pointStruct . X ;
29- lasPoint . Y = pointStruct . Y ;
30- lasPoint . Z = pointStruct . Z ;
31- lasPoint . Intensity = pointStruct . Intensity ;
32- lasPoint . ReturnNumber = pointStruct . ReturnNumber ;
33- lasPoint . NumberOfReturns = pointStruct . NumberOfReturns ;
34- lasPoint . ScanDirectionFlag = pointStruct . ScanDirectionFlag ;
35- lasPoint . EdgeOfFlightLine = pointStruct . EdgeOfFlightLine ;
36- lasPoint . Classification = pointStruct . Classification ;
37- lasPoint . ScanAngleRank = pointStruct . ScanAngleRank ;
38- lasPoint . UserData = pointStruct . UserData ;
39- lasPoint . PointSourceId = pointStruct . PointSourceID ;
40- lasPoint . GpsTime = pointStruct . GpsTime ;
41- lasPoint . Red = pointStruct . Rgb [ 0 ] ;
42- lasPoint . Green = pointStruct . Rgb [ 1 ] ;
43- lasPoint . Blue = pointStruct . Rgb [ 2 ] ;
25+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
26+ internal static unsafe void ConvertPoint ( LasZipPointNative * pointStruct , ref LasPoint lasPoint , double scaleFactorX , double scaleFactorY , double scaleFactorZ , double offsetX , double offsetY , double offsetZ )
27+ {
28+ lasPoint . X = pointStruct ->X * scaleFactorX + offsetX ;
29+ lasPoint . Y = pointStruct ->Y * scaleFactorY + offsetY ;
30+ lasPoint . Z = pointStruct ->Z * scaleFactorZ + offsetZ ;
31+ lasPoint . Intensity = pointStruct ->Intensity ;
32+ lasPoint . ReturnNumber = pointStruct ->ReturnNumber ;
33+ lasPoint . NumberOfReturns = pointStruct ->NumberOfReturns ;
34+ lasPoint . ScanDirectionFlag = pointStruct ->ScanDirectionFlag ;
35+ lasPoint . EdgeOfFlightLine = pointStruct ->EdgeOfFlightLine ;
36+ lasPoint . Classification = pointStruct ->Classification ;
37+ lasPoint . ScanAngleRank = pointStruct ->ScanAngleRank ;
38+ lasPoint . UserData = pointStruct ->UserData ;
39+ lasPoint . PointSourceId = pointStruct ->PointSourceID ;
40+ lasPoint . GpsTime = pointStruct ->GpsTime ;
41+ lasPoint . Red = pointStruct ->Rgb [ 0 ] ;
42+ lasPoint . Green = pointStruct ->Rgb [ 1 ] ;
43+ lasPoint . Blue = pointStruct ->Rgb [ 2 ] ;
4444 }
4545
4646 public override bool Equals ( object obj )
@@ -74,138 +74,4 @@ public override int GetHashCode()
7474 return HashCode . Combine ( GpsTime , Z ) ;
7575 }
7676 }
77-
78- [ StructLayout ( LayoutKind . Sequential ) ]
79- public struct LasZipPointStruct
80- {
81- public int X ;
82- public int Y ;
83- public int Z ;
84- public ushort Intensity ;
85- private byte bitField1 ; // ReturnNumber : 3, NumberOfReturns : 3, ScanDirectionFlag : 1, EdgeOfFlightLine : 1
86- private byte bitField2 ; // Classification : 5, SyntheticFlag : 1, KeypointFlag : 1, WithheldFlag : 1
87- public sbyte ScanAngleRank ;
88- public byte UserData ;
89- public ushort PointSourceID ;
90-
91- // LAS 1.4 only
92- public short ExtendedScanAngle ;
93- private byte bitField3 ; // ExtendedPointType : 2, ExtendedScannerChannel : 2, ExtendedClassificationFlags : 4
94- public byte ExtendedClassification ;
95- private byte bitField4 ; // ExtendedReturnNumber : 4, ExtendedNumberOfReturns : 4
96-
97- [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 7 ) ]
98- public byte [ ] Dummy ;
99-
100- public double GpsTime ;
101-
102- [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 4 ) ]
103- public ushort [ ] Rgb ;
104-
105- [ MarshalAs ( UnmanagedType . ByValArray , SizeConst = 29 ) ]
106- public byte [ ] WavePacket ;
107-
108- public int NumExtraBytes ;
109-
110- public IntPtr ExtraBytes ; // Use IntPtr instead of byte* for safe pointer handling
111-
112- public byte ReturnNumber
113- {
114- get => ( byte ) ( bitField1 & 0b00000111 ) ;
115- set => bitField1 = ( byte ) ( ( bitField1 & 0b11111000 ) | ( value & 0b00000111 ) ) ;
116- }
117-
118- public byte NumberOfReturns
119- {
120- get => ( byte ) ( ( bitField1 >> 3 ) & 0b00000111 ) ;
121- set => bitField1 = ( byte ) ( ( bitField1 & 0b11000111 ) | ( ( value & 0b00000111 ) << 3 ) ) ;
122- }
123-
124- public byte ScanDirectionFlag
125- {
126- get => ( byte ) ( ( bitField1 >> 6 ) & 0b00000001 ) ;
127- set => bitField1 = ( byte ) ( ( bitField1 & 0b10111111 ) | ( ( value & 0b00000001 ) << 6 ) ) ;
128- }
129-
130- public byte EdgeOfFlightLine
131- {
132- get => ( byte ) ( ( bitField1 >> 7 ) & 0b00000001 ) ;
133- set => bitField1 = ( byte ) ( ( bitField1 & 0b01111111 ) | ( ( value & 0b00000001 ) << 7 ) ) ;
134- }
135-
136- public byte Classification
137- {
138- get => ( byte ) ( bitField2 & 0b00011111 ) ;
139- set => bitField2 = ( byte ) ( ( bitField2 & 0b11100000 ) | ( value & 0b00011111 ) ) ;
140- }
141-
142- public byte SyntheticFlag
143- {
144- get => ( byte ) ( ( bitField2 >> 5 ) & 0b00000001 ) ;
145- set => bitField2 = ( byte ) ( ( bitField2 & 0b11011111 ) | ( ( value & 0b00000001 ) << 5 ) ) ;
146- }
147-
148- public byte KeypointFlag
149- {
150- get => ( byte ) ( ( bitField2 >> 6 ) & 0b00000001 ) ;
151- set => bitField2 = ( byte ) ( ( bitField2 & 0b10111111 ) | ( ( value & 0b00000001 ) << 6 ) ) ;
152- }
153-
154- public byte WithheldFlag
155- {
156- get => ( byte ) ( ( bitField2 >> 7 ) & 0b00000001 ) ;
157- set => bitField2 = ( byte ) ( ( bitField2 & 0b01111111 ) | ( ( value & 0b00000001 ) << 7 ) ) ;
158- }
159-
160- public byte ExtendedPointType
161- {
162- get => ( byte ) ( bitField3 & 0b00000011 ) ;
163- set => bitField3 = ( byte ) ( ( bitField3 & 0b11111100 ) | ( value & 0b00000011 ) ) ;
164- }
165-
166- public byte ExtendedScannerChannel
167- {
168- get => ( byte ) ( ( bitField3 >> 2 ) & 0b00000011 ) ;
169- set => bitField3 = ( byte ) ( ( bitField3 & 0b11110011 ) | ( ( value & 0b00000011 ) << 2 ) ) ;
170- }
171-
172- public byte ExtendedClassificationFlags
173- {
174- get => ( byte ) ( ( bitField3 >> 4 ) & 0b00001111 ) ;
175- set => bitField3 = ( byte ) ( ( bitField3 & 0b00001111 ) | ( ( value & 0b00001111 ) << 4 ) ) ;
176- }
177-
178- public byte ExtendedReturnNumber
179- {
180- get => ( byte ) ( bitField4 & 0b00001111 ) ;
181- set => bitField4 = ( byte ) ( ( bitField4 & 0b11110000 ) | ( value & 0b00001111 ) ) ;
182- }
183-
184- public byte ExtendedNumberOfReturns
185- {
186- get => ( byte ) ( ( bitField4 >> 4 ) & 0b00001111 ) ;
187- set => bitField4 = ( byte ) ( ( bitField4 & 0b00001111 ) | ( ( value & 0b00001111 ) << 4 ) ) ;
188- }
189-
190- internal static LasZipPointStruct ConvertPoint ( LasPoint lasPoint )
191- {
192- return new LasZipPointStruct ( )
193- {
194- X = ( int ) ( lasPoint . X + 0.5 ) ,
195- Y = ( int ) ( lasPoint . Y + 0.5 ) ,
196- Z = ( int ) ( lasPoint . Z + 0.5 ) ,
197- Intensity = lasPoint . Intensity ,
198- ReturnNumber = lasPoint . ReturnNumber ,
199- NumberOfReturns = lasPoint . NumberOfReturns ,
200- ScanDirectionFlag = lasPoint . ScanDirectionFlag ,
201- EdgeOfFlightLine = lasPoint . EdgeOfFlightLine ,
202- Classification = lasPoint . Classification ,
203- ScanAngleRank = lasPoint . ScanAngleRank ,
204- UserData = lasPoint . UserData ,
205- PointSourceID = lasPoint . PointSourceId ,
206- GpsTime = lasPoint . GpsTime ,
207- Rgb = new ushort [ ] { lasPoint . Red , lasPoint . Green , lasPoint . Blue , 0 }
208- } ;
209- }
210- }
21177}
0 commit comments