00001
00009 using System;
00010
00011 namespace Objects3D
00012 {
00020 public class Coordinate
00021 {
00022 protected event OnChangedHandler FOnAssigned;
00023
00024 protected float FX;
00025 protected float FY;
00026 protected float FZ;
00027
00028 public delegate void OnChangedHandler(Coordinate ACoordinate, float AOldX, float AOldY, float AOldZ);
00029
00041 protected virtual void RaiseOnAssigned(float AOldX, float AOldY, float AOldZ)
00042 {
00043 if (FOnAssigned != null)
00044 {
00045 FOnAssigned(this, AOldX, AOldY, AOldZ);
00046 }
00047 }
00048
00049 public Coordinate()
00050 {
00051 FX = 0f;
00052 FY = 0f;
00053 FZ = 0f;
00054 }
00055
00056 public Coordinate(float AX, float AY, float AZ)
00057 {
00058 FX = AX;
00059 FY = AY;
00060 FZ = AZ;
00061 }
00062
00070 public static int ByteSize
00071 {
00072 get
00073 {
00074 return (sizeof(float) * 3);
00075 }
00076 }
00077
00085 public OnChangedHandler OnAssigned
00086 {
00087 get
00088 {
00089 return FOnAssigned;
00090 }
00091
00092 set
00093 {
00094 FOnAssigned = value;
00095 }
00096 }
00097
00105 public float X
00106 {
00107 get
00108 {
00109 return FX;
00110 }
00111
00112 set
00113 {
00114 Assign(value, FY, FZ);
00115 }
00116 }
00117
00125 public float Y
00126 {
00127 get
00128 {
00129 return FY;
00130 }
00131
00132 set
00133 {
00134 Assign(FX, value, FZ);
00135 }
00136 }
00137
00145 public float Z
00146 {
00147 get
00148 {
00149 return FZ;
00150 }
00151
00152 set
00153 {
00154 Assign(FX, FY, value);
00155 }
00156 }
00157
00167 public byte[] GetBytes()
00168 {
00169 byte[] LResult = new byte[ByteSize];
00170
00171 byte[] LX = BitConverter.GetBytes(FX);
00172 byte[] LY = BitConverter.GetBytes(FY);
00173 byte[] LZ = BitConverter.GetBytes(FZ);
00174
00175 LX.CopyTo(LResult, (sizeof(float) * 0));
00176 LY.CopyTo(LResult, (sizeof(float) * 1));
00177 LZ.CopyTo(LResult, (sizeof(float) * 2));
00178
00179 return LResult;
00180 }
00181
00194 public bool SetBytes(byte[] ABytes, int AOffset)
00195 {
00196 bool LResult = false;
00197
00198 if (((ABytes.Length - AOffset) >= ByteSize) && (AOffset >= 0))
00199 {
00200 Assign(BitConverter.ToSingle(ABytes, (sizeof(float) * 0) + AOffset),
00201 BitConverter.ToSingle(ABytes, (sizeof(float) * 1) + AOffset),
00202 BitConverter.ToSingle(ABytes, (sizeof(float) * 2) + AOffset));
00203
00204 LResult = true;
00205 }
00206
00207 return LResult;
00208 }
00209
00223 public bool Assign(float AX, float AY, float AZ)
00224 {
00225 float LX = FX;
00226 float LY = FY;
00227 float LZ = FZ;
00228
00229 FX = AX;
00230 FY = AY;
00231 FZ = AZ;
00232
00233 RaiseOnAssigned(LX, LY, LZ);
00234
00235 return true;
00236 }
00237
00249 public bool Assign(Coordinate ACoordinate)
00250 {
00251 bool LResult = false;
00252
00253 if (ACoordinate != null)
00254 {
00255 LResult = Assign(ACoordinate.X, ACoordinate.Y, ACoordinate.Z);
00256 }
00257
00258 return LResult;
00259 }
00260
00274 public bool Equals(float AX, float AY, float AZ)
00275 {
00276 return ((FX == AX) && (FY == AY) && (FZ == AZ));
00277 }
00278
00290 public bool Equals(Coordinate ACoordinate)
00291 {
00292 bool LResult = false;
00293
00294 if (ACoordinate != null)
00295 {
00296 LResult = Equals(ACoordinate.X, ACoordinate.Y, ACoordinate.Z);
00297 }
00298
00299 return LResult;
00300 }
00301
00316 public bool Rotate(float AX, float AY, float AZ, bool APositive)
00317 {
00318 float LTempX = FX;
00319 float LTempY = FY;
00320 float LTempZ = FZ;
00321
00322 if (APositive)
00323 {
00324
00325 FX = (float)(LTempX * Math.Cos(AZ) - LTempY * Math.Sin(AZ));
00326 FY = (float)(LTempX * Math.Sin(AZ) + LTempY * Math.Cos(AZ));
00327 FZ = LTempZ;
00328
00329
00330 LTempX = FX;
00331 LTempY = FY;
00332 LTempZ = FZ;
00333
00334
00335 FX = (float)(LTempZ * Math.Sin(AY) + LTempX * Math.Cos(AY));
00336 FY = LTempY;
00337 FZ = (float)(LTempZ * Math.Cos(AY) - LTempX * Math.Sin(AY));
00338
00339
00340 LTempX = FX;
00341 LTempY = FY;
00342 LTempZ = FZ;
00343
00344
00345 FX = LTempX;
00346 FY = (float)(LTempY * Math.Cos(AX) - LTempZ * Math.Sin(AX));
00347 FZ = (float)(LTempY * Math.Sin(AX) + LTempZ * Math.Cos(AX));
00348 }
00349 else
00350 {
00351
00352 FX = LTempX;
00353 FY = (float)(LTempY * Math.Cos(- AX) - LTempZ * Math.Sin(- AX));
00354 FZ = (float)(LTempY * Math.Sin(- AX) + LTempZ * Math.Cos(- AX));
00355
00356
00357 LTempX = FX;
00358 LTempY = FY;
00359 LTempZ = FZ;
00360
00361
00362 FX = (float)(LTempZ * Math.Sin(- AY) + LTempX * Math.Cos(- AY));
00363 FY = LTempY;
00364 FZ = (float)(LTempZ * Math.Cos(- AY) - LTempX * Math.Sin(- AY));
00365
00366
00367 LTempX = FX;
00368 LTempY = FY;
00369 LTempZ = FZ;
00370
00371
00372 FX = (float)(LTempX * Math.Cos(- AZ) - LTempY * Math.Sin(- AZ));
00373 FY = (float)(LTempX * Math.Sin(- AZ) + LTempY * Math.Cos(- AZ));
00374 FZ = LTempZ;
00375 }
00376
00377 return true;
00378 }
00379
00392 public bool Rotate(Coordinate ACoordinate, bool APositive)
00393 {
00394 bool LResult = false;
00395
00396 if (ACoordinate != null)
00397 {
00398 LResult = Rotate(ACoordinate.X, ACoordinate.Y, ACoordinate.Z, APositive);
00399 }
00400
00401 return LResult;
00402 }
00403
00419 public bool Scale(float AX, float AY, float AZ, float AMultiplier, bool APositive)
00420 {
00421 bool LResult = false;
00422
00423 if (APositive)
00424 {
00425 FX *= AX * AMultiplier;
00426 FY *= AY * AMultiplier;
00427 FZ *= AZ * AMultiplier;
00428
00429 LResult = true;
00430 }
00431 else
00432 {
00433 if ((AMultiplier != 0f) && (AX != 0f) && (AY != 0f) && (AZ != 0f))
00434 {
00435 FX /= AX * AMultiplier;
00436 FY /= AY * AMultiplier;
00437 FZ /= AZ * AMultiplier;
00438
00439 LResult = true;
00440 }
00441 }
00442
00443 return LResult;
00444 }
00445
00459 public bool Scale(Coordinate ACoordinate, float AMultiplier, bool APositive)
00460 {
00461 bool LResult = false;
00462
00463 if (ACoordinate != null)
00464 {
00465 LResult = Scale(ACoordinate.X, ACoordinate.Y, ACoordinate.Z, AMultiplier, APositive);
00466 }
00467
00468 return LResult;
00469 }
00470
00485 public bool Translate(float AX, float AY, float AZ, bool APositive)
00486 {
00487 if(APositive)
00488 {
00489 FX += AX;
00490 FY += AY;
00491 FZ += AZ;
00492 }
00493 else
00494 {
00495 FX -= AX;
00496 FY -= AY;
00497 FZ -= AZ;
00498 }
00499
00500 return true;
00501 }
00502
00515 public bool Translate(Coordinate ACoordinate, bool APositive)
00516 {
00517 bool LResult = false;
00518
00519 if (ACoordinate != null)
00520 {
00521 LResult = Translate(ACoordinate.X, ACoordinate.Y, ACoordinate.Z, APositive);
00522 }
00523
00524 return LResult;
00525 }
00526
00538 public static float DegToRad(float AAngle)
00539 {
00540 return (float)((AAngle / 180f) * Math.PI);
00541 }
00542
00554 public static float RadToDeg(float AAngle)
00555 {
00556 return (float)((AAngle / Math.PI) * 180f);
00557 }
00558 }
00559 }