ArcTan — Функция Delphi


Содержание

Клуб программистов

Delphi programming

Подписаться на рассылку:

ArcTan

арктангенс числа, возвращается в радианах

|| function ArcTan ( const Number : Extended ) : Extended;

Описание:

Delphi функция ArcTan является математической функцией, возвращающей величину арктангенса числа в радианах.

Пи РАДИАН = 180 градусов

Пример кода:

var
float : single;
begin
// The ArcTan of PI/2 should give 1.0
float := ArcTan(PI/2);
ShowMessage(‘ArcTan of PI/2 = ‘+FloatToStr(float));
end;

Функция ArcTan

Функция ArcTan вычисляет арктангенс числа. Синтаксис:

function ArcTan(X : ValReal) : ValReal;

Функция возвращает арктангенс числа Х, которое может быть любого вещественного типа. Результат работы функции — угол в радианах.

Как найти арктангенс числа

О тригонометрических функциях я рассказывал здесь. Поэтому в данной статье повторяться не буду. Напомню лишь о том, что такое тангенс и арктангенс.

Итак, тангенс — это отношение синуса угла к косинусу, которое выражается формулой:

tg(Z) = sin(Z) / cos(Z)

где Z — это угол.

В этом случае справедливо равенство:

где Х — это обратная функция, то есть число, которое мы получаем при вычислении тангенса угла Z.

Здесь углы указаны в градусах.

Отсюда также следует, что выражение арктангенс угла является неправильным, так как угол может быть результатом вычисления арктангенса, но не параметром функции. Можно говорить тангенс угла, или арктангенс числа.

Таблица арктангенсов

В качестве примера использования функции ArcTan предлагаю небольшую программу, которая выводит на экран таблицу арктангенсов (числа от 0 до единицы с шагом 0,1). Углы будут выводиться в градусах и радианах. При желании можно создать более подробную таблицу, например, с шагом 0,01.

ArcTan — Функция Delphi

Обратные тригонометрические функции одной переменной, такие, как арксинус , арккосинус , арктангенс и другие, имеют следующие недостатки:

  • Значительное увеличение погрешности вблизи осей Ox или Oy
  • При некоторых углах параметры стремятся к бесконечности
  • Неполный охват возможных углов ( Pi вместо 2 * Pi )

По этим причинам, когда нужно узнать угол по двум координатам, используют функцию «арктангенс двух переменных». Название не претендует на корректность. Более корректным является название «аргумент комплексного числа», но название ArcTan2 уже прижилось.

В самом простом случае (X = 0, Y = 0) любой результат будет верным, но вернуть надо что–то одно, поэтому 0. Далее вся плоскость разбивается по диагоналям между осями Ox и Oy, чтобы в каждом квадранте поделить меньшую по модулю координату на большую по модулю, вычислить арктангенс этого значения и сложением/вычитанием с Pi или Pi /2 привести полученный угол к углу относительно Ox. Левый квадрант, содержащий отрицательную часть оси Ox, дополнительно разбивается ею на два октанта с разрывом между — Pi и Pi .

Реализация

function ArcTan2 (X , Y : Real ) : Real ;
begin
if (X = 0.0 ) and (Y = 0.0 ) then
ArcTan2 := 0.0
else if X >= Y then
begin
if X >= — Y then
ArcTan2 := ArcTan (Y / X) < правый квадрант >
else
ArcTan2 := — Pi / 2 — ArcTan (X / Y) < нижний квадрант >
end
else
begin
if X >= — Y then
ArcTan2 := Pi / 2 — ArcTan (X / Y) < верхний квадрант >
else if Y >= 0.0 then
ArcTan2 := Pi + ArcTan (Y / X) < верхний октант в левом квадранте >
else
ArcTan2 := — Pi + ArcTan (Y / X) < нижний октант в левом квадранте >
end
end ;

begin
WriteLn ( ArcTan2 ( — 1.0 , — 0.5 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( — 1.0 , — 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( — 0.5 , — 1.0 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( 0.0 , — 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( 0.5 , — 1.0 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( 1.0 , — 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( 1.0 , — 0.5 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( 1.0 , 0.0 ) : 0 : 3 ) ;
WriteLn ( ArcTan2 ( 1.0 , 0.5 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( 1.0 , 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( 0.5 , 1.0 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( 0.0 , 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( — 0.5 , 1.0 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( — 1.0 , 1.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( — 1.0 , 0.5 ) : 0 : 3 , ‘ ‘ , ArcTan2 ( — 1.0 , 0.0 ) : 0 : 3 , ‘ ‘ ,
ArcTan2 ( 0.0 , 0.0 ) : 0 : 3 ) ;
< -2.678 -2.356 -2.034 -1.571 -1.107 -0.785 -0.464 0.000 >
< 0.464 0.785 1.107 1.571 2.034 2.356 2.678 3.142 0.000 >
end .

ArcTan — Функция Delphi

Windows калькулятор выдает tg(9)=83,659808254090090604005862335173

а Delphi:
edit1.Text:=floattostr(arctan(9)); выдает 1,460139105621;
edit1.Text:=floattostr(arctan(degtorad(9))); выдает 0,155806499969542
edit1.Text:=floattostr(arctan(radtodeg(9))); выдает 1,56885707450144

А как же все-таки получить эти самые Windows»овские 83,6598082.

Тангенс в градусах, с отмеченной галочкой INV

help
In Delphi code, ArcTan returns the arctangent of X.

X is a real-type expression that gives an angle in radians.

Илон Маск рекомендует:  Direct draw термины и концепции введение

> alikon1 (11.11.2007 13:15:00) [0]

между tg и arctg большая разница.

numpy.arctan2

Функция arctan2() вычисляет arctan(x1/x2) и возвращает значение угла в правильном квадранте (четверти координатной плоскости).

Параметры: x1 — число или подобный массиву объект y — координата или массив y-координат. x2 — подобный массиву объект x — координата или массив x-координат. *ufunc_args — аргументы универсальной функции Аргументы, позволяющие настроить и оптимизировать работу функции (подробнее см. универсальные функции). Возвращает: результат — массив NumPy или его подкласс Угол или массив углов в радианах из диапазона [-pi, pi] .

Замечание

Квадрант вычисляется из учета, что arctan2(x1, x2) является знаком угла (в радианнах) между двумя лучами, первый, проходит через начало координат и точку (1, 0), а второй через начало координат и точку (x2, x1). В данном случае x2 соответствует y-координате, а x1 соответствует x-координате.

Для функции arctan2(x1, x2) определены следующие специальные значения:

ArcTan2 Routine

Unit Edit

Description Edit

(Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)

Technical Comments Edit

(Known issues / Documentation clarifications / Things to be aware of)

Examples Edit

(Please provide links to articles/source code that show how to use this item.)

See Also Edit

(Please provide links to items specifically related to this item.)

User Comments/Tips Edit

(Please leave your name with your comment.)

advice on performing ArcTan2 (atan2) function please

advice on performing ArcTan2 (atan2) function please

advice on performing ArcTan2 (atan2) function please

I need to do an atan2(X,Y) calculation, and the function doesn’t seem available in Delphi 2007? (I’ve added Math to my uses statement, for other trig functions I need)

I’ve had a fair Google, and found some references, but I haven’t really found anything conclusive enough to do a sum.
Searching Delphi help does get references to atan2, but in javascript and C it seems.

Does anyone have an actual code snippet or know how do do it?

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

delivers many links, here’s one :

——————————————————
What You See Is What You Get
Never underestimate tha powah of tha google!

RE: advice on performing ArcTan2 (atan2) function please

(thanks daddy. I did see that page, but I have to be honest and say I missed the two small functions there, my eye being drawn by the bit below them, which was a bit whoosh, over my head.)

I’ve added the two functions now, and I assume they are working. I say assume, as the main part of my formula from which I can tell if the answer is correct, I still haven’t got working.

this is my source non-Delphi formula:

Now I can see Delphi mod performs integer division, returning the remainder, so this line doesn’t work.

Am I interpreting the original sum incorrectly, or am I implementing it incorrectly in Delphi?

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

RE: advice on performing ArcTan2 (atan2) function please

This is from the source:

Quote:

In the formula, atan2(y,x) is the arctangent, or inverse tangent, of
y/x, with the additional feature of deciding which quadrant the angle
belongs in, based on the signs of x and y. This is common in computer
programming languages.

Also, mod(a,2*pi) is the remainder you get when you divide a by 2*pi;
that is, subtract the largest multiple of 2*pi less than a from a,
and that’s the answer.

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

RE: advice on performing ArcTan2 (atan2) function please

«To err is human, but to really foul things up you need a computer.» (Paul Ehrlich)

To get the best answers from this forum see: FAQ102-5096: How do I get the best answers?

RE: advice on performing ArcTan2 (atan2) function please

I was so focused on Atan2 that I missed the ArcTan2 function.

——————————————————
What You See Is What You Get
Never underestimate tha powah of tha google!

RE: advice on performing ArcTan2 (atan2) function please

And better still I already tried that, by just guessing and trying if it was a function.
I got the red wiggly line error, figured wasn’t a function for it then.
Since that I’ve added math unit to my uses, for one of the trig functions, and never retried ArcTan2.

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

for those that helped, and for possible future people searching, I have this which is working:

uses about, details;

procedure CalcBearing;
var
tc1, x: double;
begin
tc1 := ArcTan2(sin(Lon-HomeLon)*cos(Lat),cos(HomeLat)*sin(Lat)-sin(HomeLat)*cos(Lat)*cos(Lon-HomeLon));
x := int(tc1 / (2*pi));
tc1 := tc1 — x;
tc1 := tc1 * (180/pi); // convert back to degrees
Bearing := round (tc1);
if Bearing

RE: advice on performing ArcTan2 (atan2) function please

darn it, I’m sure that posted when I clicked preview.

Anyway, I was about to say, for some reason I had to add the if then line as western headings were expressed in negative bearings from north, but it works now, so.

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

I’ve been trying to do something similar — distance and bearing between two sets of decimal lat/lon coordinates. What I found on the net is more than a bit baffling, as they have an online calculator which works in javascript, but produces slightly different numbers from my Delphi conversion of the code they use. I also refuse to believe that there is not a much simpler formula if you are only interested in locations a few miles apart and don’t need results to twenty decimal places! The curvature of the earth doesn’t come into it.

Илон Маск рекомендует:  Заливка сложной области

But the main difference between the formulae I found and the one that you are using for bearing is that as the trig functions in Delphi operate on radians, each time a Lat or Lon value is expressed in degrees is used they put in DegtoRad(value) (or rather a javascript user function equivalent). You haven’t done that, do I assume you’ve converted your Lat/Lon values to radians in a routine you haven’t mentioned?

There’s also a RadToDeg function, by the way.

RE: advice on performing ArcTan2 (atan2) function please

Hi. Yes I’m converting user input to Lat and Long in a routine that produces the answer in Radians.

You will find several small variations in the results, depending mostly on what each person has taken as the radius of the earth. Some may even factor in the fact that Earth is ellipsoid rather than perfectly spherical. (It’s fatter round the equator than it is around the poles.)

Researching around, for my purposes, the following seems to give the best stab at it:

Where 6371.291 is radius of Earth in Km (therefore result is Km too)

Also, the reason I use the bearing calc above is exactly because it is NOT dependent on distance, which some formulae are.

Hope this is of use/interest.

Steve (Delphi 2007 & XP)

RE: advice on performing ArcTan2 (atan2) function please

It looks like you’ve already got a conversion but I’ll add what works for me as an alternative.

Some years ago, long before GPS, I programmed a calculator with the following formula.

During the winter I transferred it to Delphi 7 as an exercise. My results are displayed in Statute, miles, Nautical miles, and in Kilometers. The calculation is straightforward if you bear in mind that this is Spherical Trig and not Plane.

Degrees are input in the decimal form. My interface will take either minutes or decimal and the conversion, if necessary, is fairly easy after recognition.
Recognition can be accomplished by simply leaving a separate box for minutes and seconds blank to default to decimal format. Either way, the degrees are converted to radians prior entering the function performing the actual calculation.

The actual calculation, it’s called ‘RealSolution’ simply because it’s a real number, is as follows:

RealSolution := ((ArcCos((SIN(LAT1)*SIN(LAT2))+(COS(LAT1) * COS(LAT2) * COS(LNG1-LNG2))))*GoRad)* (24879.6737/360);

Where LAT1&LON1 are the start and LAT2&LON2 are the stop.

The «GoRad» is the function (GoRad : = 180/3.14159265;) that converts the trig results back to degrees prior to being multiplied but the circumference.

The rather extensive circumference constant is in Statute miles but should work with any measure.

The calculation function returns Statute miles, which is then converted for display as indicated above.

It tested properly for Western half of the Northern hemisphere.
Additional measure requires a conversion to address the Eastern half as would the variance posed by the corresponding portions of the Northern and Southern hemispheres as well North to South.

I’d also like to try to calculate a bearing as part of the distance calculation maybe next winter I’ll go back to my old trig book and get to it.
It gets a little tricky there because of the spherical aspects of the Great Circle Route versus Mercator.

Given all the help I’ve received at this site, I hope I’m able to return something here.

Red Flag Submitted

Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
The Tek-Tips staff will check this out and take appropriate action.

Reply To This Thread

Posting in the Tek-Tips forums is a member-only feature.

Click Here to join Tek-Tips and talk with other members! Already a Member? Login

FAQ — Сводка функций модуля Math

Сводка функций модуля Math

Здесь я привожу полный список всех функций и процедур модуля Math. При переходе от Delphi 2 к Delphi 3 модуль Math почти не изменился, фирма Borland ввела в него только три новые функции: MaxIntVal ue, MInIntValue и Sumint. Эти функции отличаются от своих прототипов (MaxValue, MI nVal ue и Sum) лишь тем, что работают исключительно с целыми числами, не принимая и не возвращая величин с плавающей точкой. Что касается остальных функций, то большинство из них вполне очевидно. Если вам покажется иначе — что ж, садитесь за исследования. И не надейтесь, что все тайны Delphi достанутся вам на блюдечке в виде help-файла!

Тригонометрические функции и процедуры

  • ArcCos — Арккосинус
  • ArcCosh — Пиперболический арккосинус
  • ArcSIn — Арксинус
  • ArcSInh — Гиперболический арксинус
  • ArcTahn — Гиперболический арктангенс
  • ArcTan2 — Арктангенс с учетом квадранта (функция ArcTan, не учитывающая квадрант, находится в модуле System)
  • Cosh — Гиперболический косинус
  • Cotan — Котангенс
  • CycleToRad — Преобразование циклов в радианы
  • DegToRad — Преобразование градусов в радианы
  • GradToRad — Преобразование градов в радианы
  • Hypot — Вычисление гипотенузы прямоугольного треугольника по длинам катетов
  • RadToCycle — Преобразование радианов в циклы
  • RadToDeg — Преобразование радианов в градусы
  • RacIToGrad — Преобразование радианов в грады
  • SinCos — Вычисление синуса и косинуса угла. Как и в случае SumAndSquares и MeanAndStdDev, одновременная генерация обеих величин происходит быстрее
  • Sinh — Гиперболический синус
  • Tan — Тангенс
  • Tanh — Гиперболический тангенс

ArcTan — Функция Delphi

function atan2 (y, x : real) : real;
begin

Илон Маск рекомендует:  clip в CSS

<
Я сделал это некоторое время назад при портировании кода из FORTRAN на Pascal.
К сожалению, это было так давно, что я не помню, тестировал я это,
или нет.
>

От: Terje Mathisen
Тема: На: Как продублировать C функцию ATAN2 в Delphi?
Дата: 18 Мая 1995 19:25:10 GMT

Я думаю вы должны для этого обратить пристальное внимание на инструкцию FPATAN!

Это x87 opcode реализация IEEE-compliant функции ATAN2(), с полной расширенной точностью, и поддержкой аппаратных реализаций низкоуровневых функций.

Если вы активизировали «числовые» исключения, и контроль за неверными входными числами, чип x87 выдаст верное значение без необходимости опережающего тестирования параметров.

p BP/TP/Delphi-совместимая версия должна выглядеть примерно так:

Function atan2(y : extended; x : extended): Extended;
Assembler;
asm

Общее время выполнение — менее 200 чиклов на Pentium, с вероятностью возникновения ошибки — максимально не более одной, если, конечно, у вас не Pentium с ошибкой FDIV, где ее вероятность появляется после первых 15-20 верных битов! :-)

Библиотечная функция ArcTan(x) реализуется как fpatan(1.0,x), если вы компилируете ее с реальной установкой IEEE <$N+>.


-Terje Mathisen (включая стандартное предупреждение)
«почти все программирование может быть рассмотрено как упражнение в кэшировании»

Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и .NET. — Архангельский А.Я.

Архангельский А.Я. Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и .NET. — М.: Бином- Пресс, 2006. — 1152 c.
ISBN 5-9518-0138-9
Скачать (прямая ссылка): delphispravochnoeposobie2006.djvu Предыдущая 379 380 381 382 383 384 .. 478 >> Следующая
Sqrt(X) квадратный корень выражение Extended System / Borland. Delphi.System / System.Math
Trunc(X) возвращает целую часть действительного выражения выражение Extended System / Borland. Delphi.System

Модуль Math в приложениях VCL Win32 и пространство имен Borland.VcL Math в приложениях .NET должны подключаться вручную предложениями uses.

Многие функции практически идентичны в разных модулях, разных пространствах имен и в классе System.Math. Так что можно с равным успехом использовать любой из этих источников. Например, в приложении VCL Win32 вычисление абсолютного значения переменной А можно оформить так:

uses Math; А := Abs(А);

А в приложении Windows Forms то же самое можно оформить так:

или, не подключая дополнительное пространство имен, так:

О возможных ошибках при вычислении математических функций см. в разд. 2.8.3.

11-3 Тригонометрические и гиперболические функции

Тригонометрические и гиперболические функции объявлены в модулях Math и System в приложениях VCL Win32, в пространствах имен Borland. VcLMath и Borland.Delphi.System в приложениях .NET, и реализуются соответствующими методами класса System.Math, описание которого вы найдете в гл. 9. 11.3 ¦ Тригонометрические и гиперболические функции

Функция Описание Модуль / Пространство имен / Класс
Acos(X) арккосинус System.Math
Asin(X) арксинус System.Math
Atan(X) арктангенс System.Math
Atan2(X) арктангенс отношения двух действительных выражений System.Math
ArcCos(X) арккосинус Math / Borland. Vcl.Math
ArcCosh(X) арккосинус гиперболический Math / Borland. Vcl.Math
ArcCot(X) арккотангенс Math / Borland. Vcl.Math
ArcCotH(X) арккотангенс гиперболический Math / Borland. Vcl.Math
ArcCsc(X) арккосеканс Math / Borland. Vcl.Math
ArcCscH(X) арккосеканс гиперболический Math / Borland. Vcl.Math
ArcSec(X) арксеканс Math / Borland. Vcl.Math
ArcSecH(X) арксеканс гиперболический Math / Borland. Vcl.Math
ArcSin(X) арксинус Math / Borland. Vcl.Math
ArcSinh(X) арксинус гиперболический Math / Borland. Vcl.Math
ArcTarv(X) арктангенс System / Borland. Delphi. System
ArcTan2(Y, X) арктангенс от Y / X Math / Borland. Vcl.Math
ArcTanh(X) арктангенс гиперболический Math / Borland. Vcl.Math
Cos(X) косинус System / Borland. Delphi.System / System.Math
Cosecant(X) косеканс Math / Borland. Vcl.Math 886

Глава 11 ¦ Обзор функций

Функция Описание Модуль / Пространство имен / Класс
Cosh(X) косинус гиперболический Math / Borland. Vcl. Math/ System. Math
Cot(X) котангенс Math / Borland. Vcl. Math
Cotan(X) котангенс Math / Borland. Vcl.Math
CotH(X) котангенс гиперболический Math / Borland. Vcl. Math
Csc(X) косеканс Math / Borland. Vcl. Math
CscH(X) косеканс гиперболический Math / Borland. Vcl.Math
Hypo t(X, Y) вычисление гипотенузы по заданным катетам XhY Math / Borland. Vcl. Math
Sec(X) секанс Math / Borland. Vcl.Math
Secant(X) секанс Math / Borland. Vcl. Math
SecH(X) секанс гиперболический Math / Borland. Vcl.Math
Sin(X) синус System / Borland. Delphi.System / System.Math
SinCos(X, S, С) синус и косинус Math / Borland. Vcl. Math
Sinh(X) синус гиперболический Math / Borland. Vcl. Math/ System.Math
Tan(X) тангенс Math / Borland. Vcl.Math / System.Math
Tanh(X) тангенс гиперболический Math / Borland. Vcl.Math / System.Math

Модуль Math в приложениях VCL Win32 и пространство имен Borland.Vcl. Math в приложениях .NET должны подключаться вручную предложениями uses. 11.4 ¦ Процедуры и функции обработки дат и времени

Во всех функциях тип аргумента и тип возвращаемого значения — Extended.

Во всех тригонометрических функциях аргумент X — угол в радианах. Для перевода в радианы угла, заданного в градусах или циклах, можно использовать функции DegToRad и CycleToRad (см. разд. 11.2 и гл. 12).

Обратные тригонометрические функции возвращают главное значение угла в радианах. В функциях ArcSin и ArcCos аргумент должен лежать в пределах от — 1 до 1. Функции ArcSin и ArcTan возвращают результат в пределах [—Pi/2 .. Pi/2], ArcCos — в пределах [0 .. Pi].

function ArcTan2(Y, X: Extended): Extended;

вычисляет арктангенс ArcTan(Y/X) и возвращает угол с учетом квадранта. Возвращаемые значения угла в радианах лежат в пределах [-Pi.. Pi]. Значения X и Y должны лежать в пределах [-264 .. 264]. Кроме того X не должен равняться нулю.

procedure SinCos(Theta: Extended; var Sin, Cos: Extended);

вычисляет одновременно синус Sin и косинус Cos угла Theta. Эта функция работает вдвое быстрее, чем раздельное вычисление сначала синуса и затем косинуса.

11.4 Процедуры и функции обработки дат и времени

Процедуры и функции, работающих с датами и временем, используют множество форматов данных (хотя не очень понятно, почему нельзя их свести к одному, двум, трем стандартам). Поэтому, прежде всего, имеет смысл дать обзор этих форматов. А подробное описание многих типов, обеспечивающих эти форматы, вы найдете в гл. 9.
Предыдущая 379 380 381 382 383 384 .. 478 >> Следующая

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL