圆上任意角度的点的坐标

如上图,给定圆心(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=Cy−Rsin(θ)​
仅仅是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​+b2y2​xy​​==​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*pi23∗pi​<θ≤2∗pi
{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(θ)​ab​y=b2+a2tan2(θ)​abtan(θ)​​
(二). pi/2&lt;θ&lt;3∗pi2pi/2&lt;\theta&lt;\frac{3*pi}{2}pi/2<θ<23∗pi​
{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(θ)​ab​y=−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}θ=23∗pi​
{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,2∗pi]是相对于主轴的角度,α∈[−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​)−(Xc​Yc​​))
其中
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​)=R−1(xy​)+(Xc​Yc​​)
其中
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) R−1=RT=(cos(α)sin(α)​−sin(α)cos(α)​)                           (★)
这样将前面(xy)\begin{pmatrix} x\\ y \end{pmatrix}(xy​) 的四个结果应用过来,即得到倾斜的椭圆上的对应角度的点的坐标。

扩展:

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

求圆和椭圆上任意角度的点的坐标相关推荐

  1. matlab 变成圆形坐标,求圆和椭圆上任意角度的点的坐标

    圆上任意角度的点的坐标 如上图,给定圆心(Cx,Cy),半径为R, 求θ \thetaθ对应的点的坐标? 此处θ \thetaθ是相对于水平轴的角度. 显然我们可以使用极坐标转换来求: { p x = ...

  2. Qt绘图:求圆和椭圆上任意角度点的坐标

    (2021-2-11 之前把笛卡尔坐标的 x 和 y 标注反了,已修正) 0.圆相关公式 在笛卡尔坐标系上,一个标准的圆是这样的: 已知圆心坐标 (x0,y0),半径 R,角度 a,则圆边上点(x', ...

  3. 已知长短轴求椭圆上任意一点的坐标_高中数学必修2:平面解析几何——椭圆(经典习题)...

    今天接着给大家分享关于高中数学必修2平面解析几何中椭圆知识点讲解,从三个方面进行讲解:基础梳理.要点整理.经典高考习题解题过程及答案. 一.基础梳理 1.椭圆的定义 2.椭圆的标准方程和几何性质 要点 ...

  4. 过椭圆外一点引两条切线方程_过椭圆上任意一点的切线方程引发的思考与结论...

    过椭圆上任意一点的切线方程引发的思考与结论 邓魁甲 江西省赣州市第三中学 341000 最近笔者在讲授高三第一轮复习时遇见复习资料上一个题目:过椭圆外一点 向椭圆 作切线,与椭圆切于 两点,可知经过 ...

  5. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  6. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  7. 用面向对象方法实现求圆和椭圆的周长与面积

    设最底层的基类为Shape,Shape有周长和面积,圆Circle和椭圆Ellipse继承于Shape,设置计算周长的接口为circum(),计算面积的接口为area().继承图表如下: 图(1) S ...

  8. lisp 任意点 曲线距离_lisp程序能求多段线上任意一点到其中一个端点的距离,,每次要量桩号很烦...哪位大侠给个..谢谢了...........

    ;;;可导出桩号的代码 (defun C:GM (/ cur pt fi mile) ;;自定义错误处理函数 (defun myerror (s) (if (and (/= s "函数被取消 ...

  9. 根据角度求椭圆上坐标

    计算椭圆上坐标 分两步,求离心角和根据离心角求椭圆上坐标. 椭圆方程 椭圆方程是 x2a2+y2b2=(xa)2+(yb)2=(cos(t))2+(sin(t))2=1\frac{x^2}{a^2} ...

最新文章

  1. java迭代器创建后mutx锁,java集合【5】—— Collections接口源码解析
  2. 设计模式16——Memento设计模式
  3. 12、MySQL逻辑运算符
  4. DLX (Dancing Links/舞蹈链)算法——求解精确覆盖问题
  5. pip报 No module named ‘pip‘ 错误
  6. mysql size_mysql fetch size 相关问题
  7. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
  8. powershell编程_对Power BI PowerShell Commandlet的编程访问
  9. Python时间戳与时间字符串互相转换实例代码
  10. Alfred 4 for Mac(应用快速启动器)
  11. springmvc配置不拦截静态资源
  12. 面试计算机人员试题及答案,【仁宝电脑员工笔试试题及答案】 - 面试网
  13. Navicat获取注册码
  14. SharePoint导出CSV文件中文乱码
  15. 大数据技术之大数据概论
  16. 全球城市排行榜:香港不再是“最贵”,丹麦首都“最宜居”,伦敦洛杉矶当选“未来城市”...
  17. 数据库MySQL入门-下
  18. krpano相关笔记
  19. BI神器Power Query(18)-- PQ制作时间维度表(7)
  20. 天池O2O优惠券使用预测

热门文章

  1. element ui table scrollTop 滚动到行头或行尾
  2. mysql zip 安装
  3. WordPress分类列表函数:wp_list_categories用法及参数详解举例
  4. iOS-AFNetworking参数和多文件同时上传【多文件上传】
  5. PCB相关的基础知识
  6. 趁着对象泡脚的功夫,我把vueX吃透了
  7. vue --- 使用vue-router获取带参数的路由
  8. 算法 --- 插入排序的JS实现
  9. JSON基础与数据解析、JSON方法、AJAX初识
  10. 深入Java内存模型