怎样判断一个点在椭圆内部?

hell_wolf 2008-04-20 11:38:00
我根据椭圆方程写了如下函数判断点(ri_x,ri_y)是否在椭圆内部,
但是椭圆的水平和垂直半径太大的时候会超出32位整数范围,因为性能问题不能用64位整数或者浮点数,
请大家帮我想下有什么好的算法,谢谢!
static int IsPixelInEllipse(
int ri_X,
int ri_Y,
int ri_CentreX,
int ri_CentreY,
int ri_HRadius,
int ri_VRadius)
{
int i_X;
int i_Y;

unsigned long i_SquareA;
unsigned long i_SquareB;


i_X = ri_X - ri_CentreX ;
i_Y = ri_Y - ri_CentreY ;

i_SquareA = ri_HRadius * ri_HRadius ;
i_SquareB = ri_VRadius * ri_VRadius ;

return i_SquareB * ( i_X * i_X) + i_SquareA * ( i_Y * i_Y) <= i_SquareA * i_SquareB;

}
...全文
3726 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
x_hui 2011-03-23
  • 打赏
  • 举报
回复
我觉着这个方法好,正好是我需要的
[Quote=引用 8 楼 rover___ 的回复:]
一楼的还不完整:碰到倾斜的椭圆,怎么办?
首先要根据椭圆方程,计算出椭圆的2个焦点坐标,以及长短半径,椭圆内部的点到2焦点的距离和小于2倍的长半径。
[/Quote]
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
什么呀
kingmax54212008 2008-04-22
  • 打赏
  • 举报
回复
关注
kingmax54212008 2008-04-22
  • 打赏
  • 举报
回复
讨论一下,有些概念是不太清楚了。
mathe 2008-04-22
  • 打赏
  • 举报
回复
基本上答非所问。
6楼方法基本可用,只有一个问题,就是点同椭圆比较接近时会有精度问题。
这里有一个问题,就是通常你需要判断的点是基本上都很接近椭圆曲线呢还是大部分都在椭圆内部?
如果点的出现通常都不会很接近椭圆曲线,那么可以稍微修改一下6楼的代码,根据结果大于0(椭圆外部),小于0(椭圆内部),等于0(接近椭圆曲线)分成3类,对于前面两类结果已经确定,而当遇上最后一类的时候,那么再次调用一个64位整数的版本来确定点的位置就可以了。
这样就可以让大部分情况代码速度很快,但是少数情况,我们需要使用一个比较慢的版本,但是平均速度还是不错的
fly4free 2008-04-22
  • 打赏
  • 举报
回复
楼上什么思路?

椭圆的圆心?还是数轴上的零点?
sinxy 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rover___ 的回复:]
一楼的还不完整:碰到倾斜的椭圆,怎么办?
首先要根据椭圆方程,计算出椭圆的2个焦点坐标,以及长短半径,椭圆内部的点到2焦点的距离和小于2倍的长半径。
[/Quote]倾斜椭圆就用椭圆的方程的一般形式啊
ax^2 + by^2 + cxy + dx + ey =1
Java_Design 2008-04-22
  • 打赏
  • 举报
回复
我想到一个简单的方法:

你把这个点和椭圆的中心做个连线,如果2个点的连线与椭圆相交,则说明点在椭圆内;
如果不相交,则说明点在椭圆外。
fire_woods 2008-04-21
  • 打赏
  • 举报
回复
//如果i_X, i_Y都小于2^23.
//当然,这么做会有点进度损失.

static int IsPixelInEllipse(
int ri_X,
int ri_Y,
int ri_CentreX,
int ri_CentreY,
int ri_HRadius,
int ri_VRadius)
{
int i_X;
int i_Y;

unsigned long i_SquareA;
unsigned long i_SquareB;


i_X = ri_X - ri_CentreX ;
i_Y = ri_Y - ri_CentreY ;

i_SX = ((i_X<<8)/ri_HRadius);
i_SY = ((i_Y<<8)/ri_VRadius);
if(i_SX>(1<<8) || i_SY>(1<<8))
{
return false;//0
}
else
{
return (i_SX * i_SX) + (i_SY*i_SY) <= (1<<16);
}
}
jmulxg 2008-04-21
  • 打赏
  • 举报
回复
(x/a)^2+(y/b)^2<=1
先求商再平方,数据就不会溢出;
当然最先判断如果x>a||y>b,那么(x,y)肯定不在椭圆里面
arong1234 2008-04-21
  • 打赏
  • 举报
回复
任何一个椭圆方程f(x,y)=0,f(x1,y1)<0都说明x1,y1在椭圆内。不是我不完整,而是你不灵活

[Quote=引用 8 楼 rover___ 的回复:]
一楼的还不完整:碰到倾斜的椭圆,怎么办?
首先要根据椭圆方程,计算出椭圆的2个焦点坐标,以及长短半径,椭圆内部的点到2焦点的距离和小于2倍的长半径。
[/Quote]
rover___ 2008-04-21
  • 打赏
  • 举报
回复
一楼的还不完整:碰到倾斜的椭圆,怎么办?
首先要根据椭圆方程,计算出椭圆的2个焦点坐标,以及长短半径,椭圆内部的点到2焦点的距离和小于2倍的长半径。
九桔猫 2008-04-21
  • 打赏
  • 举报
回复
被1楼抢先了
arong1234 2008-04-20
  • 打赏
  • 举报
回复
给定椭圆f(x,y)= x^2/a^2 + y^2/b^2=1,
f(x1,y1) <1说明x1,y1在椭圆内部
sheltonwan 2008-04-20
  • 打赏
  • 举报
回复
高中的几何知识,有些真记不起来了
fly4free 2008-04-20
  • 打赏
  • 举报
回复
计算方法很重要啊~
被1楼一句话给解决了
yqsshr 2008-04-20
  • 打赏
  • 举报
回复
1楼说的对!

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧