求圓和橢圓上任意角度的點的坐標

圓上任意角度的點的坐標

在這里插入圖片描述

如上圖,給定圓心(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&#x27;=\left\{\begin{matrix} \theta-\alpha+2*pi, &amp; \theta&lt;\alpha \\ \theta-\alpha, &amp; \theta \geq \alpha \end{matrix}\right. θ={θ?α+2?pi,θ?α,?θ<αθα?
    θ′\theta&#x27;θ替換以上標準橢圓下的θ\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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ ac100題存檔

不知不覺AC100題了&#xff0c;放眼望去好像都是水題。在這里就做一個存檔吧&#xff08;特別感謝各位大神尤其是云神http://hi.baidu.com/greencloud和麗潔姐http://wjmzbmr.com/的blog提供的題解&#xff09; 代碼什么的有時間在放。 1000: AB Problem 好吧&#xff0c;這也算…

Android Build.VERSION.SDK_INT兼容介紹

盡管Android向下兼容不好&#xff0c;但是一個程序還是可以在多個平臺上跑的。向下兼容不好&#xff0c;接口改變&#xff0c;新的平臺上不能用舊的API&#xff0c;舊的平臺更不可能用新的API&#xff0c;不等于一個平臺需要一個APK。可以在高SDK上開發&#xff0c;并在程序中作…

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;新添加至對列的操作都會排在隊尾關于多線程的…

將bgr彩色矩陣歸一化到0-255之間 【RGB image normalization】

參考下面文章&#xff0c;可以使用normalize 函數。 https://blog.csdn.net/kuweicai/article/details/78988886 對于彩色rgb圖像&#xff0c;也可以直接使用以上函數, 參考 https://devtalk.nvidia.com/default/topic/1042100/rgb-image-normalization/?offset8 image cv2…

多線程編程2-NSOperation

本文目錄 前言一、NSInvocationOperation二、NSBlockOperation三、NSOperation的其他用法四、自定義NSOperation回到頂部前言 1.上一講簡單介紹了NSThread的使用&#xff0c;雖然也可以實現多線程編程&#xff0c;但是需要我們去管理線程的生命周期&#xff0c;還要考慮線程同步…

python圖片顯示英文字符_python如何解析字符串中出現的英文人名?

這里有四個例子&#xff0c;結果來自google scholarstr1 "Jakes, William C., and Donald C. Cox. Microwave mobile communications. Wiley-IEEE Press, 1994."str2 "Schlegel, David J., Douglas P. Finkbeiner, and Marc Davis. \"Maps of dust infra…

閃回表操作語法+使用閃回刪除

閃回表操作語法 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;表示恢復到刪除…

在現有的python環境下創建另一個python版本【親測有效】

比如&#xff0c;你現在的python環境是3.6&#xff0c;想要使用一個3.5&#xff0c;可以在anaconda環境下使用conda虛擬環境。 第一步&#xff1a; conda create -n py35 【創建Py35虛擬環境】 第二步&#xff1a; 進入環境 activate py35 第三步&#xff1a; 升級或者降…

時間戳

我發現&#xff0c;我在本站公布的文章&#xff0c;url 最后一段都是 134 開頭的一串數字。一開始并沒在意&#xff0c;僅僅想當然以為是程序隨機生成的。 昨天跟程序作者交談的過程中無意問起&#xff0c;他說這是代表時間的。剛才訪問 GoAgent 項目時發現&#xff0c;其作者 …

歐拉函數 - 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…

Radar Installation

題目鏈接&#xff1a;http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id27586 題意&#xff1a; 在海岸線上擺放雷達并限定雷達覆蓋半徑d&#xff0c;再以海岸線為軸&#xff0c;給定海上島嶼坐標&#xff0c;求至少需要多少雷達可以覆蓋所以島嶼&#xff0c;如…

win7 + vs2015+ matlab2016a + python3.5安裝matcaffe cpu版本

參考&#xff1a; 1. caffe-windows直接安裝版---編譯后的Release 2.安裝Windows10 和環境下的caffe&#xff08;新版&#xff09; 3.win10vs2015編譯caffe的cpu debug版本、部署matcaffe 主要的方法參考文獻3. 當前caffe-windows僅支持python2.7和3.5 要注意的是&#…

python調用 matlab庫_python調用matlab的搜索結果-阿里云開發者社區

2018python技術問答集錦&#xff0c;希望能給喜歡python的同學一些幫助小編發現問答專區中有很多人在問關于python的問題&#xff0c;小編把這些問題匯總一下&#xff0c;希望能給喜歡python的大家一些啟示和幫助本帖不定期更新&#xff0c;喜歡的可以收藏哦python可能替代Java…

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;瀏覽效果更好…

打勾顯示輸入的密碼 --EditText與setTransformationMethod

實現目標: 實現原理: 為CheckBox添加一個監聽器事件; 實現的源碼: package edu.cquptzx.showPassword; import android.app.Activity; import android.os.Bundle; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransforma…