AsphyreSuperEllipsoid.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:5k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreSuperEllipsoid;
  2. //---------------------------------------------------------------------------
  3. // AsphyreSuperEllipsoid.pas                            Modified: 02-Apr-2007
  4. // Superellipsoid implementation for Asphyre                      Version 1.0
  5. //---------------------------------------------------------------------------
  6. // This code generates superellipsoid documented by Paul Bourke at:
  7. //  http://local.wasp.uwa.edu.au/~pbourke/surfaces_curves/superellipse/
  8. //---------------------------------------------------------------------------
  9. // Important Notice:
  10. //
  11. // If you modify/use this code or one of its parts either in original or
  12. // modified form, you must comply with Mozilla Public License v1.1,
  13. // specifically section 3, "Distribution Obligations". Failure to do so will
  14. // result in the license breach, which will be resolved in the court.
  15. // Remember that violating author's rights is considered a serious crime in
  16. // many countries. Thank you!
  17. //
  18. // !! Please *read* Mozilla Public License 1.1 document located at:
  19. //  http://www.mozilla.org/MPL/
  20. //
  21. // If you require any clarifications about the license, feel free to contact
  22. // us or post your question on our forums at: http://www.afterwarp.net
  23. //---------------------------------------------------------------------------
  24. // The contents of this file are subject to the Mozilla Public License
  25. // Version 1.1 (the "License"); you may not use this file except in
  26. // compliance with the License. You may obtain a copy of the License at
  27. // http://www.mozilla.org/MPL/
  28. //
  29. // Software distributed under the License is distributed on an "AS IS"
  30. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  31. // License for the specific language governing rights and limitations
  32. // under the License.
  33. //
  34. // The Original Code is AsphyreSuperEllipsoid.pas.
  35. //
  36. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  37. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  38. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  39. //---------------------------------------------------------------------------
  40. interface
  41. //---------------------------------------------------------------------------
  42. uses
  43.  Windows, Math, Vectors2, Vectors3, AsphyreProceduralMeshes;
  44. //---------------------------------------------------------------------------
  45. type
  46.  TAsphyreSuperEllipsoid = class(TAsphyreProceduralMesh)
  47.  private
  48.  public
  49.   function Generate(Divisions: Integer; n1, n2: Single): Boolean;
  50.  end;
  51. //---------------------------------------------------------------------------
  52. implementation
  53. //---------------------------------------------------------------------------
  54. function SampleSuperEllipsoid(Phi, Beta, n1, n2: Single): TVector3;
  55. var
  56.  CosPhi, SinPhi, CosBeta, SinBeta, Temp: Single;
  57. begin
  58.  CosPhi := Cos(Phi);
  59.  SinPhi := Sin(Phi);
  60.  CosBeta:= Cos(Beta);
  61.  SinBeta:= Sin(Beta);
  62.  Temp:= Sign(CosPhi) * Power(Abs(CosPhi), n1);
  63.  Result.x:= Temp * Sign(CosBeta) * Power(Abs(CosBeta), n2);
  64.  Result.y:= Sign(SinPhi) * Power(Abs(SinPhi), n1);
  65.  Result.z:= Temp * Sign(SinBeta) * Power(Abs(SinBeta), n2);
  66. end;
  67. //---------------------------------------------------------------------------
  68. function CalculateNormal(Phi, Beta, n1, n2: Single): TVector3;
  69. var
  70.  CosPhi, SinPhi, CosBeta, SinBeta: Single;
  71. begin
  72.  CosPhi := Cos(Phi);
  73.  SinPhi := Sin(Phi);
  74.  CosBeta:= Cos(Beta);
  75.  SinBeta:= Sin(Beta);
  76.  Result.x:= Sign(CosPhi) * Power(Abs(CosPhi), 2.0 - n1) * Sign(CosBeta) *
  77.   Power(Abs(CosBeta), 2.0 - n2);
  78.  Result.z:= Sign(CosPhi) * Power(Abs(CosPhi), 2.0 - n1) * Sign(SinBeta) *
  79.   Power(Abs(SinBeta), 2.0 - n2);
  80.  Result.y:= Sign(SinPhi) * Power(Abs(SinPhi), 2.0 - n1);
  81. end;
  82. //---------------------------------------------------------------------------
  83. function TAsphyreSuperEllipsoid.Generate(Divisions: Integer; n1,
  84.  n2: Single): Boolean;
  85. var
  86.  Phi, Beta, PhiInc, BetaInc: Single;
  87.  i, j, ni, nj: Integer;
  88.  Tris, Rows, Cols: Integer;
  89. begin
  90.  Rows:= Divisions + 1;
  91.  Cols:= (Divisions div 2) + 2;
  92.  Tris:= Rows * (Cols - 1) * 2;
  93.  Result:= CreateBuffers(Tris, Rows * Cols);
  94.  if (not Result) then Exit;
  95.  Result:= LockBuffers();
  96.  if (not Result) then Exit;
  97.  PhiInc := Pi / (Cols - 2);
  98.  BetaInc:= 2.0 * Pi / (Rows - 1);
  99.  Phi:= -Pi * 0.5;
  100.  for j:= 0 to Cols - 1 do
  101.   begin
  102.    Beta:= -Pi;
  103.    for i:= 0 to Rows - 1 do
  104.     begin
  105.      IncludeVertex(SampleSuperEllipsoid(Phi, Beta, n1, n2) * 0.5,
  106.       CalculateNormal(Phi, Beta, n1, n2),
  107.       Point2(i / Rows, j / Cols));
  108.      ni:= (i + 1) mod Rows;
  109.      nj:= j + 1;
  110.      if (j < Cols - 1) then
  111.       begin
  112.        IncludeIndex(i + j * Rows);
  113.        IncludeIndex(i + nj * Rows);
  114.        IncludeIndex(ni + nj * Rows);
  115.        IncludeIndex(i + j * Rows);
  116.        IncludeIndex(ni + nj * Rows);
  117.        IncludeIndex(ni + j * Rows);
  118.       end;
  119.      Beta:= Beta + BetaInc;
  120.     end;
  121.    Phi:= Phi + PhiInc;
  122.   end;
  123.  UnlockBuffers();
  124. end;
  125. //---------------------------------------------------------------------------
  126. end.