Изменить формулу от расчета по кругу до овала? - PullRequest
6 голосов
/ 08 декабря 2011

У меня есть эта формула в функции ниже.Это довольно простая концепция, но эта формула заняла у меня почти 2 недели, чтобы стать идеальной.То, что он делает, вычисляет, в какую точку поместить объект на заданной степени вокруг и на расстоянии от центральной точки.Это полезно для рисования кругов вручную, а также я в первую очередь использую его для моей иглы.Он вычисляет, где нарисовать иглу.

Теперь я пытаюсь выяснить, как изменить эту формулу, чтобы учесть овалы или эллипсы.Я подумал об идее сначала нарисовать компонент круглой формы, а затем растянуть его после того, как все нарисовано, но это не чистое решение, так как чертеж, который я делаю, уже будет в форме овала.

Мне нужно добавить только один параметр в эту функцию, чтобы указать соотношение между шириной / высотой, чтобы он знал, как сместить эту точку.По умолчанию этот параметр должен быть равен 1, что означает ширину = высоту, что означает отсутствие овального рисунка или смещения.Но предположим, что я поставил 2, что означает, что ширина в два раза больше высоты, или 1,5 будет означать, что ширина в 1,5 раза больше высоты.

Вот исходная функция:

function NewPosition(Center: TPoint; Distance: Integer; Degrees: Single): TPoint;
var
  Radians: Real;
begin
  //Convert angle from degrees to radians; Subtract 135 to bring position to 0 Degrees
  Radians:= (Degrees - 135) * Pi / 180;
  Result.X:= Trunc(Distance*Cos(Radians)-Distance*Sin(Radians))+Center.X;
  Result.Y:= Trunc(Distance*Sin(Radians)+Distance*Cos(Radians))+Center.Y;
end;

Здесьэто с добавленным параметром, который мне нужен:

function NewPosition(Center: TPoint; Distance: Integer; Degrees: Single;
  OvalOffset: Single = 1): TPoint;
var
  Radians: Real;
begin
  //Convert angle from degrees to radians; Subtract 135 to bring position to 0 Degrees
  Radians:= (Degrees - 135) * Pi / 180;
  Result.X:= Trunc(Distance*Cos(Radians)-Distance*Sin(Radians))+Center.X;
  Result.Y:= Trunc(Distance*Sin(Radians)+Distance*Cos(Radians))+Center.Y;
end;

ОПРЕДЕЛЕНИЯ:

  • Центр = Центральная точка, на которой будут основаны вычисления (центр эллипса)
  • Дистанция = Как далеко от центра в любом направлении, независимо от градусов
  • Градусов = Сколько градусов вокруг центральной точки, начиная с верхних правых
  • OvalOffset = Коэффициент разницы междуШирина и высота

enter image description here

1 Ответ

6 голосов
/ 08 декабря 2011

Добавьте деление на OvalOffset к формуле Result.Y ...

Result.Y:= Trunc((Distance*Sin(Radians)+Distance*Cos(Radians))/OvalOffset)
           +Center.Y;
...