Изменить формулу с расчета по кругу на расчет по овалу?

У меня есть эта формула в функции ниже. Это довольно простая концепция, но эта формула заняла у меня почти 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;

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

  • Center = Центральная точка, от которой нужно отталкиваться (центр эллипса)
  • Distance = Расстояние от центра в любом направлении, независимо от Degrees
  • Degrees = Сколько градусов вокруг центральной точки, начиная с up-right
  • OvalOffset = Отношение разницы между шириной и высотой

enter image description here

6
задан Jerry Dodge 8 December 2011 в 21:56
поделиться