求圆和椭圆上任意角度的点的坐标

圆上任意角度的点的坐标

在这里插入图片描述

如上图,给定圆心(Cx,Cy),半径为R, 求θ\thetaθ对应的点的坐标? 此处θ\thetaθ是相对于水平轴的角度。

显然我们可以使用极坐标转换来求:
{px=Cx+Rcos(θ)py=Cy+Rsin(θ)\left\{\begin{matrix} px= Cx+Rcos(\theta) \\ py= Cy+Rsin(\theta) \end{matrix}\right. {px=Cx+Rcos(θ)py=Cy+Rsin(θ)
注意如果以上竖直坐标系向下,此时变为图像的坐标系,即
在这里插入图片描述

结果变成:

{px=Cx+Rcos(θ)py=Cy−Rsin(θ)\left\{\begin{matrix} px= Cx+Rcos(\theta) \\ py= Cy-Rsin(\theta) \end{matrix}\right. {px=Cx+Rcos(θ)py=CyRsin(θ)
仅仅是y变了。

椭圆上任意角度的点的坐标

首先我们先来考虑标准椭圆上任意角度的点的坐标,再进行推广。

在这里插入图片描述

已知主轴a(即椭圆箭头所指方向对应的轴),次轴b,求解与水平轴相交θ\thetaθ对应的点的坐标?
{x2a2+y2b2=1yx=tan⁡(θ)\left\{\begin{matrix} \frac{x^2}{a^2}+\frac{y^2}{b^2}&=&1 \\ \frac{y}{x}& =& \tan(\theta) \end{matrix}\right. {a2x2+b2y2xy==1tan(θ)
将上面的第二式带入第一式,可以求解得到:
x2=a2b2b2+a2tan⁡2(θ)x^2=\frac{a^2b^2}{b^2+a^2\tan^2(\theta)} x2=b2+a2tan2(θ)a2b2
这时我们考虑θ\thetaθ的范围,可以得到:
(一). 0≤θ&lt;pi/20\leq\theta&lt;pi/20θ<pi/2 或者 3∗pi2&lt;θ≤2∗pi\frac{3*pi}{2}&lt;\theta \leq 2*pi23pi<θ2pi
{x=abb2+a2tan⁡2(θ)y=abtan⁡(θ)b2+a2tan⁡2(θ)\left\{\begin{matrix} x=\frac{ab}{\sqrt{b^2+a^2\tan^2(\theta)}} \\ y=\frac{ab\tan(\theta)}{\sqrt{b^2+a^2\tan^2(\theta)}} \end{matrix}\right. x=b2+a2tan2(θ)aby=b2+a2tan2(θ)abtan(θ)
(二). pi/2&lt;θ&lt;3∗pi2pi/2&lt;\theta&lt;\frac{3*pi}{2}pi/2<θ<23pi
{x=−abb2+a2tan⁡2(θ)y=−abtan⁡(θ)b2+a2tan⁡2(θ)\left\{\begin{matrix} x=-\frac{ab}{\sqrt{b^2+a^2\tan^2(\theta)}} \\ y=-\frac{ab\tan(\theta)}{\sqrt{b^2+a^2\tan^2(\theta)}} \end{matrix}\right. x=b2+a2tan2(θ)aby=b2+a2tan2(θ)abtan(θ)
(三). θ=pi/2\theta = pi/2θ=pi/2
{x=0y=b\left\{\begin{matrix} x=0 \\ y=b \end{matrix}\right. {x=0y=b
(四). θ=3∗pi2\theta = \frac{3*pi}{2}θ=23pi
{x=0y=−b\left\{\begin{matrix} x=0 \\ y=-b \end{matrix}\right. {x=0y=b
再考虑一般情况下的椭圆,如下:

在这里插入图片描述

如上θ∈[0,2∗pi]\theta\in[0,2*pi]θ[0,2pi]是相对于主轴的角度,α∈[−pi,pi]\alpha\in[-pi,pi]α[pi,pi], 不过我们一般仅仅考虑α∈[0,pi]\alpha\in[0,pi]α[0,pi],求θ\thetaθ对应的点的坐标?

基本思路就是先转换成标准椭圆,再应用标准椭圆下的结果。

显然我们需要将以上椭圆的中心移到原点,再绕原点旋转−α-\alphaα ,即顺时针旋转α\alphaα,即:
(xy)=R((XY)−(XcYc))\begin{pmatrix} x\\ y \end{pmatrix}=R(\begin{pmatrix} X\\ Y \end{pmatrix}-\begin{pmatrix} X_c\\Y_c \end{pmatrix}) (xy)=R((XY)(XcYc))
其中
R=(cos(−α)−sin(−α)sin(−α)cos(−α))=(cos(α)sin(α)−sin(α)cos(α))R=\begin{pmatrix} cos(-\alpha) &amp;-sin(-\alpha) \\ sin(-\alpha) &amp; cos(-\alpha) \end{pmatrix}=\begin{pmatrix} cos(\alpha) &amp;sin(\alpha) \\ -sin(\alpha) &amp; cos(\alpha) \end{pmatrix} R=(cos(α)sin(α)sin(α)cos(α))=(cos(α)sin(α)sin(α)cos(α))
因此
(XY)=R−1(xy)+(XcYc)\begin{pmatrix} X\\ Y \end{pmatrix} =R^{-1}\begin{pmatrix} x\\ y \end{pmatrix}+\begin{pmatrix} X_c\\Y_c \end{pmatrix} (XY)=R1(xy)+(XcYc)
其中
R−1=RT=(cos(α)−sin(α)sin(α)cos(α))(★)R^{-1}=R^{T}=\begin{pmatrix} cos(\alpha) &amp;-sin(\alpha) \\ sin(\alpha) &amp; cos(\alpha) \end{pmatrix}~~~~~~~~~~~~~~~~~~~~~~~~~~~(\bigstar) R1=RT=(cos(α)sin(α)sin(α)cos(α))                           ()
这样将前面(xy)\begin{pmatrix} x\\ y \end{pmatrix}(xy) 的四个结果应用过来,即得到倾斜的椭圆上的对应角度的点的坐标。

扩展:

  1. 如果以上的角度是相对于水平轴的角度,则对应的椭圆上的点的坐标如何求呢?
    答: 其实很简单,只需要:
    θ′={θ−α+2∗pi,θ&lt;αθ−α,θ≥α\theta&#x27;=\left\{\begin{matrix} \theta-\alpha+2*pi, &amp; \theta&lt;\alpha \\ \theta-\alpha, &amp; \theta \geq \alpha \end{matrix}\right. θ={θα+2pi,θα,θ<αθα
    θ′\theta&#x27;θ替换以上标准椭圆下的θ\thetaθ即可。
  2. 如果竖直坐标轴为竖直向下的,即为图像坐标系下的椭圆,那么如何求对应的角度?
    答:
    需要做两方面的改变即可:
    {α→−αy→−y\left\{\begin{matrix} \alpha\rightarrow -\alpha\\ y\rightarrow -y \end{matrix}\right. {ααyy
    第一行改变★\bigstar出的α\alphaα. 第二行改变标准椭圆下的y值的符号。

matlab代码

demo.m
################################
center_x=282;
center_y=263;
phi=pi/6;
R1=141;
R2=62;
%DrawEllipse([center_x,center_y],R1,R2,phi);
axis equal;
hold on;
set(gca,'ydir','reverse')
for angle=linspace(0,3*pi/2,360)[ px,py ] = get_points_ellipse(center_x, center_y,phi,R1,R2, angle );plot(px,py,'ro');hold on;
end
axis([0,500,0,500])
function [ px,py ] = get_points_ellipse(center_x, center_y,phi,R1,R2, angle )
% 求椭圆某个角度上的点的坐标。
%https://math.stackexchange.com/questions/22064/calculating-a-point-that-lies-on-an-ellipse-given-an-angle
%https://blog.csdn.net/xiamentingtao/article/details/54934467%https://stackoverflow.com/questions/17762077/how-to-find-the-point-on-ellipse-given-the-angle
%另一种解法  从极坐标的角度出发。% 椭圆参数  圆心 (center_x.center_y) 角度 phi(-pi,pi),实际上仅考虑(0,pi) 沿着角度的主轴半径R1,另一主轴对应的半径R2
% 求相对于水平轴x轴上angle(基于0-2pi之间)上对应的点坐标。
% 注意求解的坐标系为:水平向右为x轴,竖直向上为y轴。 如果竖直向下为y轴,则下面的y应该变换成-y, phi变成-phi%先将斜的椭圆转正,并平移到原点。方法就是平移到中心,且旋转-phi角度,再应用标准椭圆求取点。
if(angle<phi)theta = angle-phi+2*pi;  %想对于主轴的角度
elsetheta = angle-phi;
end
% theta为相对于主轴的角度
alpha = -phi;    %与竖直的轴有关,如果是竖直向上,则变为正phi
% 先计算标准椭圆 x^2/R1^2+y^2/R2^2=1  与 直线 y/x=tan(angle)的交点。
assert(angle>=0 && angle<=2*pi);
if(theta==pi/2)x=0;y=R2;
elseif(theta==pi*3/2)x=0;y=-R2;
elseif(theta>pi/2 && theta<pi*3/2)x=-R1*R2/sqrt(R2^2+R1^2*tan(theta)^2);y=-R1*R2*tan(theta)/sqrt(R2^2+R1^2*tan(theta)^2);
elsex=R1*R2/sqrt(R2^2+R1^2*tan(theta)^2);y=R1*R2*tan(theta)/sqrt(R2^2+R1^2*tan(theta)^2); 
endy=-y;    %与竖直的轴有关,如果是竖直向上,则变为正y
% 将以上结果转换回去
px= cos(alpha)*x-sin(alpha)*y+center_x;
py=sin(alpha)*x+cos(alpha)*y+center_y;end
function DrawEllipse(C,a,b,alpha)
% DRAWELLIPSE plots an ellipse
%   DrawEllipse(C,a,b,alpha) plots ellipse with center C, semiaxis a
%   and b and angle alpha between a and the x-axiss=sin(alpha); c=cos(alpha);
Q =[c -s; s c]; theta=[0:0.02:2*pi];
u=diag(C)*ones(2,length(theta)) + Q*[a*cos(theta); b*sin(theta)];
plot(u(1,:),u(2,:));
hold on;
plot(C(1),C(2),'+');

显示结果,起点对应着角度为0。
在这里插入图片描述

另一种基于极坐标变换的高效实现【转载】

转载: https://blog.csdn.net/he_zhidan/article/details/81347426
根据“圆心角”弧度(函数会将圆心角转成离心角),获取斜椭圆上的点坐标。ptCenter,椭圆中心;a椭圆长轴长度;b,椭圆短轴长度;radian,点于椭圆长轴夹角的弧度;dChangZhouAngle,长轴弧度

CDoublePoint2d GetPointOnEllipse(const CDoublePoint2d& ptCenter, double a, double b, double radian, double dChangZhouAngle)
{
const double dLiXin = atan2(asin(radian), bcos(radian));//离心角
double x = a*cos(dLiXin)cos(dChangZhouAngle) - bsin(dLiXin)sin(dChangZhouAngle) + ptCenter.x;
double y = a
cos(dLiXin)sin(dChangZhouAngle) + bsin(dLiXin)*cos(dChangZhouAngle) + ptCenter.y;
return CDoublePoint2d(x, y);
}

问题:

一,为什么不用atan?

答:atan的范围是[-π/2,π/2],atan2的范围是(-π,π]。前者只能表示两个象限,后者可以表示4个。

二,为什么不atan2(a*tan(radian),b)?

答:这样写,和用atan的效果一样。

参考文献

  1. https://math.stackexchange.com/questions/22064/calculating-a-point-that-lies-on-an-ellipse-given-an-angle (主要参考这个)
  2. https://stackoverflow.com/questions/17762077/how-to-find-the-point-on-ellipse-given-the-angle (这里有一个从极坐标变换角度新的推导)
  3. https://blog.csdn.net/xiamentingtao/article/details/54934467

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

smtp中mailfrom是必须的吗_你是住在高层建筑中吗?这是你必须了解的

01PARTONE消防电梯和普通客梯的作用及特点1.消防电梯是在建筑物发生火灾时供消防人员进行灭火与救援使用且具有一定功能的电梯。因此&#xff0c;消防电梯具有较高的防火要求&#xff0c;其防火设计十分重要。2.普通电梯均不具备消防功能&#xff0c;发生火灾时禁止人们搭乘电梯…

c++ 函数的值传递,引用传递 和 引用返回的探索

2019独角兽企业重金招聘Python工程师标准>>> 前言 C的函数参数和返回分为按值传递和按引用传递,应用到类上面,会涉及到类的 赋值操作 复制函数 构造函数 析构函数 虽然java开发了两年,但对我而言c我还只是一个初学者.c还有很多陌生的特性需要自己亲自探索.这里用实际…

GCD的部分总结

GCD是基于C语言的底层API,用Block定义任务用起来非常灵活便捷. GCD的基本思想是就将操作放在队列中去执行 (1)操作使用Blocks定义(2)队列负责调度任务执行所在的线程以及具体的执行时间(3)队列的特点是先进先出(FIFO)的&#xff0c;新添加至对列的操作都会排在队尾关于多线程的…

多线程编程2-NSOperation

本文目录 前言一、NSInvocationOperation二、NSBlockOperation三、NSOperation的其他用法四、自定义NSOperation回到顶部前言 1.上一讲简单介绍了NSThread的使用&#xff0c;虽然也可以实现多线程编程&#xff0c;但是需要我们去管理线程的生命周期&#xff0c;还要考虑线程同步…

闪回表操作语法+使用闪回删除

闪回表操作语法 flashback table 【 schema.】 table_name to {【before drop 【rename to new_table_name】 】|【scn | timestamp 】】 expr 【enable | disable 】 triggers}: 参数说明&#xff1a; schema&#xff1a;用户模式 before drop&#xff1a;表示恢复到删除…

欧拉函数 - HDU1286

欧拉函数的作用&#xff1a; 有[1,2.....n]这样一个集合&#xff0c;f(n)这个集合中与n互质的元素的个数。欧拉函数描述了一些列与这个f(n)有关的一些性质&#xff0c;如下&#xff1a; 1、令p为一个素数&#xff0c;n p ^ k&#xff0c;则 f(n) p ^ k - p ^ (k-1) 2、令m&…

其中一个页签慢_渭南提升一个大专学历的有效方法

渭南提升一个大专学历的有效方法&#xff0c;宏德教育&#xff0c;目前已形成以高等学历教育为特色王牌&#xff0c;职称考评、企业内训为辅助的强力优势品牌。渭南提升一个大专学历的有效方法&#xff0c; 获得发明专利或实用新型专利&#xff0c;且已实施取得效益。出版本专业…

《收集苹果》 动态规划入门

问题描写叙述 平面上有N*M个格子&#xff0c;每一个格子中放着一定数量的苹果。你从左上角的格子開始&#xff0c;每一步仅仅能向下走或是向右走&#xff0c;每次走到一个格子上就把格子里的苹果收集起来&#xff0c;这样下去&#xff0c;你最多能收集到多少个苹果。 输入&…

Xamarin XAML语言教程通过ProgressTo方法对进度条设置

2019独角兽企业重金招聘Python工程师标准>>> Xamarin XAML语言教程通过ProgressTo方法对进度条设置 在ProgressBar中定义了一个ProgressTo方法&#xff0c;此方法也可以用来对进度条当前的进行进行设置&#xff0c;ProgressTo与Progress属性的不同之处在于ProgressT…

h5新特性

 CSDN博客 Gane_ChengHTML5新特性浅谈 发表于2016/10/17 21:25:58 7809人阅读 分类&#xff1a; 前端 转载请注明出处&#xff1a; http://blog.csdn.net/gane_cheng/article/details/52819118 http://www.ganecheng.tech/blog/52819118.html &#xff08;浏览效果更好…

mysql日期截取年月_摄影大赛丨“我遇见最美的光”第五届全国医务人员摄影大展 截稿日期2020年8月15日...

截稿日期2020年8月15日《“我遇见最美的光”第五届全国医务人员摄影大展》欣赏过山川壮丽&#xff0c;瞻仰过造化旖旎&#xff0c;敬重于生命伟大&#xff0c;感动于英雄凯旋……由《大众摄影》主办&#xff0c;正大天晴药业集团股份有限公司、《中国卫生影像》杂志协办的“我遇…

Pytorch的C++接口实践

Pytorch1.1版本已经提供了相对稳定的c接口&#xff0c;网上也有了众多的资料供大家参考&#xff0c;进行c的接口的初步尝试。 可以按照对应的选项下载&#xff0c;下面我们要说的是&#xff1a; 如何利用已经编译好的官方libtorch库和其他的opencv库等联合编写应用&#xff1f…

HttpClient v4.5 简单抓取主页数据

由于工作原因&#xff0c;需要每隔半小时刷新一些网页&#xff0c;并查看上面的数据是否有更新。这件事能否自动化进行呢&#xff1f;查找了下Java相关的资料&#xff0c;蹦出一个关键词&#xff1a;HttpClient。 HttpClient是常用Http客户端库&#xff0c;相关的资料也不少&am…

matlab局部放大的图中图画法

【亲测有效】 在作图过程中&#xff0c;如果想将局部信息展示出来并且画在同一张图中&#xff0c;一般的MATLAB作图法就比较拙计了&#xff0c;好在MATLAB还是很强大的&#xff0c;当然&#xff0c;除了不能当女朋友之外 .... ╮(╯▽╰)╭ function showdetail()% 在当前的ax…

【2020年】最新中国科学院大学学位论文写作规范

最近在完成国科大博士论文写作的时候&#xff0c;有一些心得体会&#xff0c;特此总结下来&#xff0c;以飨读者&#xff0c;尤其是可爱的学弟学妹们。需要注意的是&#xff0c; 以下仅仅是我自己的心得而已&#xff0c;仅供参考。 1. 首先推荐大家使用国科大的Latex模板&…

用fft对信号进行频谱分析实验报告_示波器上的频域分析利器,Spectrum View测试分析...

简介&#xff1a;【Spectrum View技术文章系列】从基础篇开始&#xff0c;讲述利用示波器上的Spectrum View功能观测多通道信号频谱分析正文&#xff1a;示波器和频谱仪都是电子测试测量中必不可少的测试设备&#xff0c;分别用于观察信号的时域波形和频谱。时域波形是信号最原…

复盘caffe安装

最近因之前的服务器上的caffe奔溃了&#xff0c;不得已重新安装这一古老的深度学习框架&#xff0c;之前也尝试了好几次&#xff0c;每次都失败&#xff0c;这次总算是成功了&#xff0c;因此及时地总结一下。 以下安装的caffe主要是针对之前虹膜分割和巩膜分割所需的caffe版本…

HP P2000 RAID-5两块盘离线的数据恢复报告

1. 故障描述本案例是HP P2000的存储vmware exsi虚拟化平台&#xff0c;由RAID-5由10块lT硬盘组成&#xff0c;其中6号盘是热备盘&#xff0c;由于故障导致RAID-5磁盘阵列的两块盘掉线&#xff0c;表现为两块硬盘亮黄灯。 经用户方维护人员检测&#xff0c;故障硬盘应为物理故障…

为什么torch.nn.Linear的表达形式为y=xA^T+b而不是常见的y=Ax+b?

今天看代码&#xff0c;对比了常见的公式表达与代码的表达&#xff0c;发觉torch.nn.Linear的数学表达与我想象的有点不同&#xff0c;于是思索了一番。 众多周知&#xff0c;torch.nn.Linear作为全连接层&#xff0c;将下一层的每个结点与上一层的每一节点相连&#xff0c;用…

Leetcode47: Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. 推断一个链表是不是回文的&#xff0c;一个比較简单的办法是把链表每一个结点的值存在vector里。然后首尾比較。时间复杂度O(n)。空间复杂度O(n)。 /*** Definition for singly-linked list.* struct ListNode {…