Для нахождения координат точки эллипса по углу существует простое и элегантное решение. Понимаю, что для маститого математика это решение является очевидным. Однако, для меня в то далекое время, когда инет был диким, связь модемной, а я сильно молодым, это таковым не являлось.
ВНИМАНИЕ! Если Вы искали как найти координаты точки по углу от произвольной прямой и совсем не подразумевали эллипс, то Вам сюда.
Калькулятор точки на эллипсе
Давайте посмотрим, как это выглядит на практике. Потом теория. Оранжевый маркер отвечает за угол, на основании которого считаем координаты. Красный — параметрический угол, о котором ниже.
Параметрическое уравнение эллипса
Обратимся, как обычно, к Википедии. Находим там следующее:
Каноническое уравнение эллипса может быть параметризовано:

Очевидно, что t — это угол, и это не «наш» угол. Это какой-то другой угол, который функционально связан с «нашим». «Нашим» называю угол, от которого требуется посчитать координаты.
Таким образом, задача нахождения координат точки эллипса по углу сводится к задаче нахождения угла t, зависящим от требуемого. Нахождением этой зависимости и займемся.
Подготовка

У нас есть эллипс, описанный двумя полуосями a и b. Представим две окружности, имеющих общий центр. Меньшая окружность (зеленая) имеет радиус b. Большая окружность (синяя) имеет радиус a.
Проведем прямую из общего центра [X0;Y0] в произвольную точку плоскости [X;Y]. В результате пересечения с этими окружностями получаются две точки [X1;Y1] и [X2;Y2].
α – угол между прямой и осью X.
Малая окружность | X1 = b × cos α | Y1 = b × sin α |
Большая окружность | X2 = a × cos α | Y2 = a × sin α |
Нахождение зависимости

Используя уравнение (1) посчитаем координаты точки на эллипсе [X’;Y’] для угла α. Проведем прямую из центра [X0;Y0] в точку [X’;Y’]. Угол β – угол между этой прямой и осью X.
Задача сводится к тому, чтобы найти такой α, при котором β был бы равен интересующему нас углу. Таким образом, угол α будет являться параметром в уравнении (1) для требуемого угла β.
Найдем зависимость между получившимся углом β и углом α. На рисунке видно, что прилегающий к углу катет (синий) равен ранее рассчитанному X2, а противолежащий (зеленый) равен Y1:
X’ = X2 = a × cos α
Y’ = Y1 = b × sin α
Опыт показывает, что тут зачастую возникает легкий ступор. Возможно, рисунок вводит в некое заблуждение. Видим треугольник, и если с синим катетом вопросов нет, то с зеленым — масса. Почему синус от α? Угол «вона где», тут синус вообще не от того угла и т.д.
Смотрим на пересечение прямой и малой (зеленой) окружности. Зеленый катет прилетает именно оттуда. Именно так координату Y’ и рассчитывали, согласно уравнению(1). Рисунок — это иллюстрация, не метод решения.
Тангенс угла β в этом случае равен:
(3) Тангенс угла β
Используя формулу тангенса произведем дальнейшие преобразования:
(4) Зависимость тангенса α от тангенса β
Таким образом, видим прямую зависимость угла α, который нужен нам в качестве параметра в уравнении(1), от угла β, координаты точки от которого хотим получить.
Нахождение координат
Угол α находим через арктангенс. В Delphi (и не только) для этих целей используется функция ArcTan2 из модуля math. Она корректно возвращает знак ± угла в зависимости от квадранта, а также предусмотрительно нечувствительна к возможным коллизиям, типа деления на 0.
Находим синус и косинус от требуемого угла β и подставляем в параметры функции ArcTan2, согласно последней формуле (4):
1 2 3 |
//-- находим параметр (некий угол) для уравнения --- SinCos(Angle,sn,cs); t := ArcTan2(a*sn, b*cs); |
Получившийся в результате вызова ArcTan2 угол есть ничто иное, как параметр t в параметрическом уравнении (1). Подставив его в уравнение, находим координаты точки на эллипсе, отстоящей на заданный угол от оси X.
О параметре
Практический смысл параметра t состоит в том, что это угол окружности до «сплющивания». Этот тот угол окружности, который будет соответствовать точке эллипса при заданном угле. Попытаюсь на практике показать.
В JavaScript’е нет понятия эллипс. Тем более нет понятия дуги эллипса. Но можно нарисовать окружность (через дугу) и «сплющить». Может быть такой номер пройдет и с дугой?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// рисует дугу эллипса function drawArcEllipse(ctx, center, a, b, start, finish, colorLine='none', widthLine=0.0, angle=0.0) { if (a==0.0) return; var t1 = start; var t2 = finish; ctx.beginPath(); // сохраняем контекст ctx.save(); // перемещение координат в центр эллипса ctx.translate(center.x, center.y); // поворот плоскости на угол, если требуется if (angle!=0.0) ctx.rotate(angle); // сжимаем по вертикали ctx.scale(1, b/a); // рисуем дугу ctx.arc(0, 0, a, t1, t2); // восстанавливает контекст ctx.restore(); if (colorLine!='none') ctx.strokeStyle = colorLine; if (widthLine>0.0) ctx.lineWidth = widthLine; ctx.stroke(); ctx.closePath(); } |

На рисунке слева видим, что дуга расположена совершенно неправильно. Очевидно, что надо использовать какие-то другие углы. Вот тут на помощь приходит параметр эллипса. Это как раз тот самый угол, который обеспечивает «попадание» в нужный нам угол при «сплющивании» окружности.
Перепишем функцию с учетом нахождения параметра:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// рисует дугу эллипса function drawArcEllipse(ctx, center, a, b, start, finish, colorLine='none', widthLine=0.0, angle=0.0) { if (a==0.0) return; var sn = Math.sin(start); var cs = Math.cos(start); var t1 = Math.atan2(a*sn, b*cs); sn = Math.sin(finish); cs = Math.cos(finish); var t2 = Math.atan2(a*sn, b*cs); ctx.beginPath(); // сохраняем контекст ctx.save(); // перемещение координат в центр эллипса ctx.translate(center.x, center.y); // поворот плоскости на угол, если требуется if (angle!=0.0) ctx.rotate(angle); // сжимаем по вертикали ctx.scale(1, b/a); // рисуем дугу ctx.arc(0, 0, a, t1, t2); // восстанавливает контекст ctx.restore(); if (colorLine!='none') ctx.strokeStyle = colorLine; if (widthLine>0.0) ctx.lineWidth = widthLine; ctx.stroke(); ctx.closePath(); } |
На рисунке справа видим, что все встало на свои места. Идеальная дуга )
Координаты точки наклонного эллипса

Перенесено в отдельную статью.
Практика
Две функции. Первая находит параметр t по углу. Вторая производит расчет координат. Из второй не вызываю первую, т.к. получится двойное вычисление полуосей. Код не настолько велик, чтобы его нельзя было продублировать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//****************************************************************** // Найти угол, который будет использован в расчете точки на элипсе // Т.е. тот самый параметр t в параметрическом уравнении эллипса: // x = a * cos t // y = b * sin t //****************************************************************** function GetEllipseAngleParam(ARect : TRectF; Angle : Extended) : Extended; var sn,cs : Extended; // синус/косинус a,b : Extended; // полуоси по X/Y begin a := ARect.Width/2; b := ARect.Height/2; SinCos(Angle,sn,cs); result := ArcTan2(a * sn, b * cs); end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//******************************************************************** // Найти координату точки на эллипсе по углу отклонения //******************************************************************** function CalcEllipsePointCoord(ARect : TRectF; Angle : extended) : TPointF; var sn,cs : Extended; // синус/косинус a,b : Extended; // полуоси по X/Y cnt : TPointF; // центр t : Extended; // параметр для уравнения эллипса begin // инициализация полуосей a := ARect.Width/2; b := ARect.Height/2; // центр эллипса cnt := ARect.CenterPoint; // находим параметр (некий угол) для уравнения SinCos(Angle,sn,cs); t := ArcTan2(a * sn, b * cs); // считаем результат по параметрическому уравнению SinCos (t, sn, cs); result.X := cnt.x + a * cs; result.Y := cnt.Y + b * sn; end; |
Скачать исходник + исполнямый файл
Друзья, спасибо за внимание!
Надеюсь, материал после правок стал понятней.
Подписывайтесь на телегу.
Если есть вопросы, с удовольствием отвечу )
Подскажите пожалуйста,я пытаюсь сделать примерную операцию в экселе, но по формуле atan2, оно не выводит значение, которое аналогично вашему в данной статье, а в разы меньше.
Булат, тут не «блокирует», просто комментарий требует одобрения для новых пользователей. Следующий ваш комментарий проскочит уже сразу, без одобрения.
В итоге, разобрались в группе телеграм-канала.
Для читателей вкратце обрисую проблему. Возможно, у кого-то есть аналогичный трабл.
Необходимо найти параметрических угол, но в Excel.
1) «в разы меньше» — вечная проблема радианов в градусы.
НО! Цитата из телеги: «Булат, [16.03.2022 15:45]
Если быть точнее, у меня получается 0,79818, что равняется 45,732 в градусах, а у вас 44,2
Достаточно большая погрешность»
2) оказалось, что функция ATAN2 в Excel (в отличие от Delphi, JS, C#) первым параметром берет X, вторым Y. Когда аргументы были поменены местами, результат стал тот, который ожидался.
Мне кажется что на диаграмме неправильно строиться, по координате У с положительным значением точка с низу.
Ось Y направлена вниз. Это нормально. И настолько привычно, что не сразу увидел в своё время, что неплохо бы знак поменять. Разницу между направлениями Y можно тут глянуть
посчитаем координаты точки на эллипсе [X’;Y’] для угла α.(или: для ситуации при угле альфа.? Не вникая дальше я задаюсь этим вопросом, потому, что у читателя этот вопрос возникнет именно в этот момент, независимо от того, что может быть дальше в тексте это будет разжёвано.
Прошёл текст до конца — действительно изящно.Но прихожу к мысли, что предложенная мною редакция фразы недостаточна, Нужна более тонкая шлифовка. «Опыт показывает, что тут зачастую возникает легкий ступор. Возможно, рисунок вводит в некое заблуждение. Видим треугольник, и если с синим катетом вопросов нет, то с зеленым — масса. Почему синус от α? Угол «вона где», тут синус вообще не от того угла и т.д.» Мне кажется, что продуманная редакция предложения «Используя уравнение (1) посчитаем координаты точки на эллипсе [X’;Y’] для угла α» предотвратит этот ступор. Не берусь предложить текст, но я встрял в это исключительно потому восхищён ходом мысли в статье. Рисунок не вводит в заблуждение.Рисунок, на мой взгляд, нуждается поддержки текстом -пару предложений, описывающих ситуацию на рисунке в момент, когда параметр равен величине альфа. Потому, что когда величина альфа изменится, тогда возникнет другая ситуация. Когда читатель усвоит это в начале, в дальнейшем ступора не будет. Я споткнулся на описанной фразе. Вы указали ешё одно место, где читатель может споткнуться. Если устранить первые «грабли», возможно на вторые читатель не наступит. С большим уважением к тексту.
Вообще то самое трудное в математических статьях -это текст. Выведение уравнения, поиски параметра, ошибки, озарения, всё в прошлом. Всё готово. Осталось только донести до широкого читателя. И вот здесь автору трудно встать на место читателя. Потому, что пройденный путь кажется автору простым и понятным. Он уже забыл, как прорубался этот путь, Как надежда сменялась отчаянием, а потом опять надеждой. А читатель идёт по тропинке впервые и спотыкается там где текст начинает говорить на своём птичьем языке. . Бьёшся, бьёшся над текстом месяц, два бесчисленное количество раз переписываешь. Радуешься, гордишься результатом. А через годик, перечитывая текст кусаешь губы от досады на косность собственных мыслей. Это я о себе, как об авторе своих статей.
А мне нравится стиль и изложения в статьях на данном ресурсе. Если нужно найти быстро информацию, как с точки зрения математики, так и с точки зрения программирования, для меня этот сайт номер один. Я уже ни один год пользуюсь этими статьями, расширяю свой кругозор и применяю полученные знания в своей работе. Спасибо больше автору за такие интересные темы. Читается на одном дыхании, усваивается сложная информация легко. Вы пишите что вы сам автор. А где можно почитать ваши статьи? С удовольствием ознакомилась бы с вашим материалом.
Анна, спасибо большущее!!! Очень приятно, прямо потеплело всё вокруг )))
А мне, наоборот, зашло изложение темы именно в таком формате. Можно бесконечно шлифовать формулировки, но до дела так и не дойти.
У меня тоже возник вопрос, как и у автора, где угол. Когда сначала не понял, а потом как понял:-)
И вот мне, как читателю, приятно знать, что я не одинока в поисках этого угла, и что это вполне закономерный вопрос!
Вы, Людмила, не одиноки в поисках угла. Но чей вопрос «вполне закономерный»? Мой, Елены или Романа?
Людмила, мне кажется. что Роман, при всей кажущейся его строгости, позволяет нам с Вами общаться на платформе его сайта!
Привет, Людмила! Ваше «наоборот зашло» меня заворожило.Угол настолько меня беспокоит, что я написал по этому поводу аж целую статью. Поделитесь пожалуйста со мной своими сомнениями подробнее,пожалуйста!
«Задача сводится к тому, чтобы найти такой α, при котором β был бы равен интересующему нас углу. Таким образом, угол α будет являться параметром в уравнении (1) для требуемого угла β.» Вообще то параметром задаются и задаваясь параметром находят множество значений искомой величины. И в этом множестве может находится искомая «требуемая» величина. Текст.
Уважаемый, Berdi! Спасибо большое за ваше мнение. К сожалению, я его не разделяю. Знакома с Романом уже давно. Знаю, как пишутся статьи, и знаю его плотный график. Роман один из немногих, кто умеет удерживать и анализировать большой объем информации в голове. У него, как в статьях, так и в жизни, все структурированно, последовательно, выверенно. В статьях не присутствует никакой лишней информации, которая не потребуется читателю в дальнейшем. И, как правильно заметила Anna, по таким статьям легко ориентироваться и находить необходимую информацию.
Anna, хочу поблагодарить Вас за комментарий. Целый день размышляла, могу ли я поделиться с вами ссылкой, которую вы просите. Пришла к положительном ответу, поэтому вот ссылка https://isicad.ru/ru/articles.php?article_num=22566
Елена,здравствуйте! Я плохо ориентируюсь в пространстве Вашего сайта. Видимо я натоптал в посудной лавке. У меня есть вопросы. Каким образом я могу задавать их Вам, как редактору. Я плохо ориентируюсь в пространстве Вашего сайта. Мне, видимо, мешает то, что я мыслю категориями Википедии. И, видимо, я не знаком с уставом вашего монастыря. Дорожная карта — это всё,что я прошу. Я совершенно не представляю структурную сложность Вашего сайта. Я всего лишь автор, который желает быть опубликованным. Мой email надеюсь, а Вас есть.
Складывается ощущение, что вас тут притесняют и не дают публиковаться. Это не так.
Вам предоставили роль Автора. Вам предоставили доступ в консоль. У вас что-то не получалось, и Роман сам запостил вашу статью под вашим пользователем в статусе «черновик». Вы не сделали ничего, не написали даже заголовка. От вас требовалось только нажать кнопку «Опубликовать», и она бы появилась на главной странице под вашим авторством. Инструкция об этом вам была дана. Что остановило? Если вы всего лишь автор, который хочет быть опубликованным, почему не воспользовались?
Здравствуйте,Елена! Публикация статьи была приостановлена в результате совместного решения коренным образом перелопатить содержание. Учитывая загруженность Романа,это произойдёт не так скоро, как хотелось бы.
P.S. О моих рассуждениях о тексте безотносительно к данной статье. Волк в лесу -это нормально. Хищник в природе — тоже норма. Критика — то же самое проявление нормы. Всё, что нас не убивает, делает нас сильнее.В мире науки это рутинная реальность. Пусть сильнее грянет буря.
У Энштейна с Бором были радикально противоположные взгляды на принцип неопределённости Гейзенберга, что не мешало им оставаться друзьями.
О критике. В понедельник я прицепился к знаку градуса в вашей формуле у арксинуса, потому что такого никогда ранее не видел:

Скинул вам определение арксинуса из Вики. И проиллюстрировал, что такое значение арксинуса в градусах:

В результате мы убираем из (7) и π, и градусы. Получаем более правильное выражение:

Вот это я считаю примером хорошей конструктивной критики. А как считаете вы?
Я помню этот факт и благодарен Вам за эту формулу. Тем более, что сам я до неё бы не додумался. Я искренне считал, что выполнил поставленную задачу и на достигнутом остановился, ужасно довольный собой. Каюсь. Посыпаю голову пеплом. Кстати у меня готов черновик простенького решения по нахождению координат точки эллипса по углу. Но он до того прост, что мне, любителю пространных текстов и один лист не заполнить. Я готов дней через десять отправить статью на Ваш суд,Дайте только добро и укажите на какую платформу. Куда отправить.Вам или Елене, на какой email.
В голове наклёвывается ещё один вариант по этим же координатам, пытаюсь максимально упростить изложение — то бишь текст.
1) Конечно помните. После этого вы приняли «совместное» решение отложить публикацию, зашли сюда и оставили четыре несуразных комментария.
2) У вас есть своя статья, которую вам якобы не дают опубликовать, займитесь ей, зачем тратить столько времени на мою?
3) Платформа — Хабр.
Роман, Вы видимо давно не проверяли нашу личную переписку перечитайте пожалуйста.
Разве мы не пришли к решению к совместному решению?
Я в недоумении, перечитайте пожалуйста, нашу личную переписку.
Я могу переслать Вам текст нашего решения.
Да, видимо, произошло недопонимание )))-Роман Я рад, что недоразумение разрешилось.- Берды
Роман, я считаю Вас «Редчайшим земельным элементом». Только поэтому я считаю, что мне повезло встретиться с Вами. Но. Я — тоже «редкоземельный», Моя статья ждёт Вашего либо одобрения,либо осуждения. «Пусть сильнее грянет буря» Максим Горький -гений российского народа. Как и Алексей Толстой, как и Катаев, Имена Ш. Варламова, Шукшина, Юлиуса Гашека, Ганди,Хеменгуэйя, Гарсия Маркеса, Лорки, Грем Грина, Булгакова,с его Гевсиманским садом, Ворбьинными горами(Библиотека имени Ленина) и многих, неперечислимо многих сынов человеческих, неперечесть. Матчасть надо изучать, ребята.
Роман, Вам нужны статьи? Вам нужны крутые авторы? Вы песней хотите — их есть у меня! Мне хочется публиковаться у Вас. Аудитория у Вас высочайшего качества. И Ваши тексты очень высокого качества. Перечитайте нашу личную переписку, я там высказал высочайшее уважение к вашему творчеству. Честь имею. математик — математику.
Роман,перечитайте пожалуйста нашу переписку1
Главное моё желание — публиковаться на Вашем сайте, Поэтому я принимаю все Ваши условия, все Ваши обвинения в мой адрес.Я приношу все возможные извинения во всевозможных формах. Святых коров не трогать. Вопрос -есть ли у меня шанс печататься у вас?
У меня готовая статья…
Когда я смотрю на небо — я летаю.
«После этого вы приняли «совместное» решение отложить публикацию, зашли сюда и оставили четыре несуразных комментария». Вопрос — куда это — «сюда»? Разве это не наше общее решение? И разве мы с Вами не решили перелопатить статью?)
«Конечно помните. После этого вы приняли «совместное» решение отложить публикацию, зашли сюда и оставили четыре несуразных комментария.»
Соображения этики не позволяют мне выкладывать наши внутренние дискуссии. Позволю себе выложить «Если время ждёт до декабря примерно, там очень вероятен отпуск, то напишу.» «Я предложил пути улучшения, структуру статьи, спросил ждать ли нового текста статьи. Вы это проигнорировали. Я сделал вывод, что улучшений пока не будет.» — Видимо вот здесь я не услышал Вас. Приношу свои извинения. «И самое главное улучшение, развить статью, дописать, структурировать, показать что-то новое, в отличие от мартовского варианта.» — Да,это именно то что я хотел бы. Новая статья, где часть старого текста(конструктивно сокращенного) стала бы просто вступлением в новом тексте. Структура нового текста видится мне полностью созданной Вами по аналогии с Вашей статьёй «Нахождение длины дуги эллипса». С новыми графическими решениями, с калькуляторами, своими выводами, умозаключениями. По сути это должна быть Ваша статья. С меня достаточно упоминания меня как авторы статьи первоисточника, автора основной формулы . Я в самом начале удивился когда Вы наотрез отказывались публиковать под Вашим именем. Попробуем?
Это было моё предложение. Перечитайте нашу переписку, Я в том возрасте, когда врать — страшный грех. Пространство нравственности, это способ существования, когда твои внуки следуют не твоим словам, но твоим поступкам… Роман, я скорее Ваш друг, чем Ваш враг.
Какова же судьба нашей совместной статьи? Вы забыли принятые на себя обязательства? У меня две готовые новые статьи. Но я не могу отправить их Вам, пока не появится обговоренная статья. Кто же Вам будет верить после всего этого. И комментарии не стираете. А люди читают. И задумываются — если выскажу сомнения,пожелания, следующим буду я? Последствия — как говорил Джон Уик в знаменитом сериале. В этой жизни за всё приходится платить. Так устроен мир. Жду Ваших предложений. И приберитесь в окне комментариев. Дурно пахнет.
Альтернатива — обсуждение на внутренних платформах
Это конечно апогей. Надо отвечать. Часть 1.
»Какова же судьба нашей совместной статьи?»
Какая ещё совместная статья? Что за безумные фантазии?
Я не пишу совместных статей, это не в логике блога. Никогда не давал согласие писать совместную статью. Это блог, логика блога такая — есть Авторы, каждый имеет свою площадку, где может публиковать свой материал, отстаивать идеи.
Мне не нужно сотрудничество, мне нужна конкуренция.
«Вы забыли принятые на себя обязательства?»
Какие обязательства? У нас с вами деловое сотрудничество? Напомните, какая мне или сайту польза от вас?
Я вас не знаю. То, что вы о себе возомнили, не имеет связи с реальностью. Вы пришли ниоткуда, попросили помощи. Вам её оказали. Вам показалось мало. Я сказал, что ещё раз помогу, в декабре, написать за вас вашу статью. И ни разу не сказал, что собираюсь её публиковать. Тем более под своим авторством. Публиковать должен автор, пусть даже ненастоящий.
Апогей. Часть 2.
«У меня две готовые новые статьи. Но я не могу отправить их Вам, пока не появится обговоренная статья.»
Какая потеря. Чтобы их никогда не видеть, готов подарить вам две своих.
«Кто же Вам будет верить после всего этого. И комментарии не стираете. А люди читают. И задумываются — если выскажу сомнения,пожелания, следующим буду я? Последствия — как говорил Джон Уик в знаменитом сериале. В этой жизни за всё приходится платить. Так устроен мир.»
Без комментариев…
«Жду Ваших предложений.»
Ждите, по возможности, молча. А то вы всех утомили.
«И приберитесь в окне комментариев. Дурно пахнет.»
Кто вы такой, чтобы указывать мне, что делать, на моём сайте?
Но с вашей самокритикой согласен.
(3)тангенс угла β в этом случае равен: Latex formula … Формулы(3) и(4) заменены этой фразой. Latex formula (4) Зависимость тангенса α от тангенса β. Роман, вместо формул я вижу Latex formula. Это что, калькулятор? Или мой Windows 07 не читает текст? Дело в том, что я вынужден был самостоятельно вывести эти зависимости, но мне не с чем сравнить, чтобы понять каким путём шли Вы при создании своего калькулятора. Объясните пожалуйста что значит «Latex formula»
«Кто вы такой, чтобы указывать мне, что делать, на моём сайте?» Роман, интересно, для какого читателя, посетителя, потенциального автора Вы создавали сайт?