悬赏20!用matlab求直线和椭圆的交点坐标!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了悬赏20!用matlab求直线和椭圆的交点坐标!相关的知识,希望对你有一定的参考价值。

>> syms a b t0 t kx ky
>> %已知椭圆上的一点(a*cos(t0),b*sin(t0)),过该点的矢量的方向为(kx,ky),求该向量与椭圆的另一个交点坐标(a*cos(t),b*sin(t)),即求出旋转角t;
>> %显然t与t0,a,b,kx,ky有关(t的定义见图示)

参考技术A

这个其实就是以t为未知量,把两点坐标代入直线方程求解。

可以直接用solve求解,但得到的结果可能会包含t0自身(有很小的误差),需要将其过滤。

 

参考代码:

% 常数定义
a=2;b=1;t0=11/18*pi;
x0=a*cos(t0);y0=b*sin(t0);
kx=3;ky=-2;

 

% 解方程
syms t
t1=solve(ky*(a*cos(t)-x0)-kx*(b*sin(t)-y0));

 

% 对解进行过滤
t1=double(t1);
t1((a*cos(t1)-x0).^2+(b*sin(t1)-y0).^2<eps)=[]

 

% 绘图
clf
ezplot(a*cos(t),b*sin(t))
hold on;
plot(x0,y0,'ro')
plot(a*cos(t1),b*sin(t1),'mp');

追问

谢谢你的回答,离我的问题很近了。
但是我的a,b t0,kx,ky都是符号变量,所以t必须是解析式,而不是数值;
我已提高悬赏,希望你继续回答!

追答

那就直接定义符号变量求解:

syms a b t0
x0=a*cos(t0);y0=b*sin(t0);
syms kx ky
syms t
t1=solve(ky*(a*cos(t)-x0)-kx*(b*sin(t)-y0))

 

得到结果:

t1 =
       t0
 atan(-(-kx^2*b^2*sin(t0)+2*ky*a*cos(t0)*kx*b+sin(t0)*ky^2*a^2)/(kx^2*b^2+ky^2*a^2),(-cos(t0)*kx^2*b^2+ky^2*a^2*cos(t0)-2*ky*a*kx*b*sin(t0))/(kx^2*b^2+ky^2*a^2))

其中第一个根就是t0自身,第二个反正切的那一大串就是你要的符号解了。

追问

按照你的程序,我的电脑里显示的为啥和你的不一样呢?
t1 =

t0
-log((a*ky - b*kx*i)/(a*ky*exp(t0*i) + b*kx*exp(t0*i)*i))*i
而且你得到的反正切括号里面为啥还有个逗号呢》???麻烦你了

追答

应该是不同符号运算内核造成的。

我的MATLAB是2007b,用的是Maple内核;你的很可能是2008b之后的版本,用的是MuPad内核。使用符号运算,不同内核(甚至不同版本)得到不同的表达式形式很正常,可以把数据代进去试试看,二者应该是等价的。

至于反正切的逗号,其参数形式相当于数值运算的函数atan2,即所谓四象限反正切。

本回答被提问者和网友采纳

[poj] 1375 Interval || 圆的切线&和直线的交点

原题

每组数据给出一些圆(障碍物)的圆心和半径,一个点和一条线段,求站在这个点,能开到的线段的部分的左端点和右端点。没有则输出“No View”


相当于求过该点的圆的两条切线,切线外即为可见的地方。
借鉴于这个blog:http://blog.csdn.net/acm_cxlove/article/details/7896110
只要求出两条直线和竖直的夹角,然后通过向量旋转即可得到交点横坐标。

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
double r,d;
struct point
{
    double x,y;
    point() {}
    point(double _x,double _y) : x(_x),y(_y) {}
    point operator - (const point &b) const
    {
        return point(b.x-x,b.y-y);
    }
    double dis()
    {
        return sqrt(x*x+y*y);
    }
}p,q;
struct edge
{
    double l,r;
    bool operator < (const edge &b) const
    {
        if (l==b.l) return r<b.r;
        return l<b.l;
    }
}line[510];

int main()
{
    while (~scanf("%d",&n) && n)
    {
    scanf("%lf%lf",&p.x,&p.y);
    for (int i=0;i<n;i++)
    {
        scanf("%lf%lf%lf",&q.x,&q.y,&r);
        d=(p-q).dis();
        double a=asin(r/d),b=asin((p.x-q.x)/d);
        double ang1=a+b,ang2=b-a;
        line[i].l=p.x-p.y*tan(ang1);
        line[i].r=p.x-p.y*tan(ang2);
    }
    sort(line,line+n);
    double L=line[0].l,R=line[0].r;
    for (int i=1;i<n;i++)
    {
        if (line[i].l>R)
        {
        printf("%.2f %.2f\n",L,R);
        L=line[i].l;
        R=line[i].r;
        }
        else R=max(line[i].r,R);
    }
    printf("%.2f %.2f\n\n",L,R);
    }
    return 0;
}

以上是关于悬赏20!用matlab求直线和椭圆的交点坐标!的主要内容,如果未能解决你的问题,请参考以下文章

怎样在matlab中得到直线方程与plot出的曲线之间的交点坐标

matlab中如何求两直线交点?

matlab中怎么求两曲线交点

matlab编程求两条直线的交点

MATLAB中怎么求两条曲线的交点并标注

MATLAB中怎么求两条曲线的交点并标注