У меня есть эта формула в функции ниже. Это довольно простая концепция, но эта формула заняла у меня почти 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;
ОПРЕДЕЛЕНИЯ: