Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Программа для работы с точечной графикой

Delphi , Графика и Игры , Графика

Программа для работы с точечной графикой

Я yгадаю этy пpогpаммy с 7 байт!


unit Functs;

interface

uses
  WinTypes, Classes, Graphics, SysUtils;

type
  TPoint2D = record
    X, Y: Real;
  end;
  TPoint3D = record
    X, Y, Z: Real;
  end;

function Point2D(X, Y: Real): TPoint2D;
function RoundPoint(P: TPoint2D): TPoint;
function FloatPoint(P: TPoint): TPoint2D;
function Point3D(X, Y, Z: Real): TPoint3D;
function Angle2D(P: TPoint2D): Real;
function Dist2D(P: TPoint2D): Real;
function Dist3D(P: TPoint3D): Real;
function RelAngle2D(PA, PB: TPoint2D): Real;
function RelDist2D(PA, PB: TPoint2D): Real;
function RelDist3D(PA, PB: TPoint3D): Real;
procedure Rotate2D(var P: TPoint2D; Angle2D: Real);
procedure RelRotate2D(var P: TPoint2D; PCentr: TPoint2D; Angle2D: Real);
procedure Move2D(var P: TPoint2D; Angle2D, Distance: Real);
function Between(PA, PB: TPoint2D; Preference: Real): TPoint2D;
function DistLine(A, B, C: Real; P: TPoint2D): Real;
function Dist2P(P, P1, P2: TPoint2D): Real;
function DistD1P(DX, DY: Real; P1, P: TPoint2D): Real;
function NearLine2P(P, P1, P2: TPoint2D; D: Real): Boolean;
function AddPoints(P1, P2: TPoint2D): TPoint2D;
function SubPoints(P1, P2: TPoint2D): TPoint2D;

function Invert(Col: TColor): TColor;
function Dark(Col: TColor; Percentage: Byte): TColor;
function Light(Col: TColor; Percentage: Byte): TColor;
function Mix(Col1, Col2: TColor; Percentage: Byte): TColor;
function MMix(Cols: array of TColor): TColor;
function Log(Base, Value: Real): Real;
function Modulator(Val, Max: Real): Real;
function M(I, J: Integer): Integer;
function Tan(Angle2D: Real): Real;
procedure Limit(var Value: Integer; Min, Max: Integer);
function Exp2(Exponent: Byte): Word;
function GetSysDir: string;
function GetWinDir: string;

implementation

function Point2D(X, Y: Real): TPoint2D;
begin

  Point2D.X := X;
  Point2D.Y := Y;
end;

function RoundPoint(P: TPoint2D): TPoint;
begin

  RoundPoint.X := Round(P.X);
  RoundPoint.Y := Round(P.Y);
end;

function FloatPoint(P: TPoint): TPoint2D;
begin

  FloatPoint.X := P.X;
  FloatPoint.Y := P.Y;
end;

function Point3D(X, Y, Z: Real): TPoint3D;
begin

  Point3D.X := X;
  Point3D.Y := Y;
  Point3D.Z := Z;
end;

function Angle2D(P: TPoint2D): Real;
begin

  if P.X = 0 then
  begin
    if P.Y > 0 then
      Result := Pi / 2;
    if P.Y = 0 then
      Result := 0;
    if P.Y < 0 then
      Result := Pi / -2;
  end
  else
    Result := Arctan(P.Y / P.X);

  if P.X < 0 then
  begin
    if P.Y < 0 then
      Result := Result + Pi;
    if P.Y >= 0 then
      Result := Result - Pi;
  end;

  if Result < 0 then
    Result := Result + 2 * Pi;
end;

function Dist2D(P: TPoint2D): Real;
begin

  Result := Sqrt(P.X * P.X + P.Y * P.Y);
end;

function Dist3D(P: TPoint3D): Real;
begin

  Dist3d := Sqrt(P.X * P.X + P.Y * P.Y + P.Z * P.Z);
end;

function RelAngle2D(PA, PB: TPoint2D): Real;
begin

  RelAngle2D := Angle2D(Point2D(PB.X - PA.X, PB.Y - PA.Y));
end;

function RelDist2D(PA, PB: TPoint2D): Real;
begin

  Result := Dist2D(Point2D(PB.X - PA.X, PB.Y - PA.Y));
end;

function RelDist3D(PA, PB: TPoint3D): Real;
begin

  RelDist3D := Dist3D(Point3D(PB.X - PA.X, PB.Y - PA.Y, PB.Z - PA.Z));
end;

procedure Rotate2D(var P: TPoint2D; Angle2D: Real);
var

  Temp: TPoint2D;
begin

  Temp.X := P.X * Cos(Angle2D) - P.Y * Sin(Angle2D);
  Temp.Y := P.X * Sin(Angle2D) + P.Y * Cos(Angle2D);
  P := Temp;
end;

procedure RelRotate2D(var P: TPoint2D; PCentr: TPoint2D; Angle2D: Real);
var

  Temp: TPoint2D;
begin

  Temp := SubPoints(P, PCentr);
  Rotate2D(Temp, Angle2D);
  P := AddPoints(Temp, PCentr);
end;

procedure Move2D(var P: TPoint2D; Angle2D, Distance: Real);
var

  Temp: TPoint2D;
begin

  Temp.X := P.X + (Cos(Angle2D) * Distance);
  Temp.Y := P.Y + (Sin(Angle2D) * Distance);
  P := Temp;
end;

function Between(PA, PB: TPoint2D; Preference: Real): TPoint2D;
begin

  Between.X := PA.X * Preference + PB.X * (1 - Preference);
  Between.Y := PA.Y * Preference + PB.Y * (1 - Preference);
end;

function DistLine(A, B, C: Real; P: TPoint2D): Real;
begin

  Result := (A * P.X + B * P.Y + C) / Sqrt(Sqr(A) + Sqr(B));
end;

function Dist2P(P, P1, P2: TPoint2D): Real;
begin

  Result := DistLine(P1.Y - P2.Y, P2.X - P1.X, -P1.Y * P2.X + P1.X * P2.Y, P);
end;

function DistD1P(DX, DY: Real; P1, P: TPoint2D): Real;
begin

  Result := DistLine(DY, -DX, -DY * P1.X + DX * P1.Y, P);
end;

function NearLine2P(P, P1, P2: TPoint2D; D: Real): Boolean;
begin

  Result := False;
  if DistD1P(-(P2.Y - P1.Y), P2.X - P1.X, P1, P) * DistD1P(-(P2.Y - P1.Y), P2.X
    - P1.X, P2, P) <= 0 then
    if Abs(Dist2P(P, P1, P2)) < D then
      Result := True;
end;

function AddPoints(P1, P2: TPoint2D): TPoint2D;
begin

  AddPoints := Point2D(P1.X + P2.X, P1.Y + P2.Y);
end;

function SubPoints(P1, P2: TPoint2D): TPoint2D;
begin

  SubPoints := Point2D(P1.X - P2.X, P1.Y - P2.Y);
end;

function Invert(Col: TColor): TColor;
begin

  Invert := not Col;
end;

function Dark(Col: TColor; Percentage: Byte): TColor;
var

  R, G, B: Byte;
begin

  R := GetRValue(Col);
  G := GetGValue(Col);
  B := GetBValue(Col);
  R := Round(R * Percentage / 100);
  G := Round(G * Percentage / 100);
  B := Round(B * Percentage / 100);
  Dark := RGB(R, G, B);
end;

function Light(Col: TColor; Percentage: Byte): TColor;
var

  R, G, B: Byte;
begin

  R := GetRValue(Col);
  G := GetGValue(Col);
  B := GetBValue(Col);
  R := Round(R * Percentage / 100) + Round(255 - Percentage / 100 * 255);
  G := Round(G * Percentage / 100) + Round(255 - Percentage / 100 * 255);
  B := Round(B * Percentage / 100) + Round(255 - Percentage / 100 * 255);
  Light := RGB(R, G, B);
end;

function Mix(Col1, Col2: TColor; Percentage: Byte): TColor;
var

  R, G, B: Byte;
begin

  R := Round((GetRValue(Col1) * Percentage / 100) + (GetRValue(Col2) * (100 -
    Percentage) / 100));
  G := Round((GetGValue(Col1) * Percentage / 100) + (GetGValue(Col2) * (100 -
    Percentage) / 100));
  B := Round((GetBValue(Col1) * Percentage / 100) + (GetBValue(Col2) * (100 -
    Percentage) / 100));
  Mix := RGB(R, G, B);
end;

function MMix(Cols: array of TColor): TColor;
var

  I, R, G, B, Length: Integer;
begin

  Length := High(Cols) - Low(Cols) + 1;
  R := 0;
  G := 0;
  B := 0;
  for I := Low(Cols) to High(Cols) do
  begin
    R := R + GetRValue(Cols[I]);
    G := G + GetGValue(Cols[I]);
    B := B + GetBValue(Cols[I]);
  end;
  R := R div Length;
  G := G div Length;
  B := B div Length;
  MMix := RGB(R, G, B);
end;

function Log(Base, Value: Real): Real;
begin

  Log := Ln(Value) / Ln(Base);
end;

function Power(Base, Exponent: Real): Real;
begin

  Power := Ln(Base) * Exp(Exponent);
end;

function Modulator(Val, Max: Real): Real;
begin

  Modulator := (Val / Max - Round(Val / Max)) * Max;
end;

function M(I, J: Integer): Integer;
begin

  M := ((I mod J) + J) mod J;
end;

function Tan(Angle2D: Real): Real;
begin

  Tan := Sin(Angle2D) / Cos(Angle2D);
end;

procedure Limit(var Value: Integer; Min, Max: Integer);
begin

  if Value < Min then
    Value := Min;
  if Value > Max then
    Value := Max;
end;

function Exp2(Exponent: Byte): Word;
var

  Temp, I: Word;
begin

  Temp := 1;
  for I := 1 to Exponent do
    Temp := Temp * 2;
  Result := Temp;
end;

function GetSysDir: string;
var

  Temp: array[0..255] of Char;
begin

  GetSystemDirectory(Temp, 256);
  Result := StrPas(Temp);
end;

function GetWinDir: string;
var

  Temp: array[0..255] of Char;
begin

  GetWindowsDirectory(Temp, 256);
  Result := StrPas(Temp);
end;

end.

Поздравления с написанием программы для работы с графическими точками в Pascal!

Я предоставлю некоторые отзывы и предложения для улучшения кода:

Организация кода: Программа разделена на несколько секций, что делает ее легко понятной. Однако, некоторые функции можно группировать по их цели (например, все тригонометрические функции).

Конвенции именования переменных: Имена переменных в основном описательны, но некоторые могут быть улучшены. Например, Temp - не лучшее имя для переменной;consider something like IntermediateResult.

Стиль кода: Код использует постоянное отступление и пробелы, что делает его легко читаемым.

Обработка ошибок: В программе нет явного обработки ошибок. Рекомендуется добавить блоки try-except или проверять ошибки перед обрабатыванием данных.

Производительность: Некоторые расчеты, такие как тригонометрические функции, можно оптимизировать с помощью таблиц поиска или специализированных библиотек.

Вот некоторые конкретные предложения:

  1. Упростить конструкторы Point2D и Point3D: Вместо присваивания значений каждому полю индивидуально, consider создавать конструктор, который принимает несколько аргументов (например, TPoint2D.Create(X, Y)).
  2. Использовать константы для магических чисел: Магические числа, такие как 255 или 100, можно заменить именованными константами, чтобы сделать код более читаемым.
  3. Распространить массивы TColor вместо отдельных переменных цвета: В функциях, таких как Mix и MMix, consider использовать массив TColor вместо отдельных переменных, чтобы уменьшить повторение.
  4. Упростить процедуру Limit: Вместо использования условного оператора, consider использовать функции Min и Max из модуля Math.
  5. Добавить больше документации: Хотя код в основном самодокументирован, некоторые секции (например, тригонометрические функции) могут получить дополнительные комментарии или документацию.

В целом, ваша программа выглядит хорошо организованной и легко понятной. С этими предложениями вы можете улучшить ее читаемость, поддержку и производительность.

Программа для работы с точечной графикой - это утилита на языке Delphi, которая содержит функции и процедуры для работы с координатами точки в 2D- и 3D-пространствах, а также для преобразований и вычислений геометрических параметров.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:19:51/0.0061161518096924/1