判断一个点是否在圆内(三点确定一个圆)
2015-09-05 19:03
302 查看
///Returnstrueifthepoint(p)liesinsidethecircumcirclemadeupbypoints(p1,p2,p3)
///</summary>
///<remarks>
///NOTE:Apointontheedgeisinsidethecircumcircle
///</remarks>
///<paramname="p">Pointtocheck</param>
///<paramname="p1">Firstpointoncircle</param>
///<paramname="p2">Secondpointoncircle</param>
///<paramname="p3">Thirdpointoncircle</param>
///<returns>trueifpisinsidecircle</returns>
privatestaticboolInCircle(Geometry.Pointp,Geometry.Pointp1,Geometry.Pointp2,Geometry.Pointp3)
{
//ReturnTRUEifthepoint(xp,yp)liesinsidethecircumcircle
//madeupbypoints(x1,y1)(x2,y2)(x3,y3)
//NOTE:Apointontheedgeisinsidethecircumcircle
if(System.Math.Abs(p1.Y-p2.Y)<double.Epsilon&&System.Math.Abs(p2.Y-p3.Y)<double.Epsilon)
{
//INCIRCUM-F-Pointsarecoincident!!
returnfalse;
}
doublem1,m2;
doublemx1,mx2;
doublemy1,my2;
doublexc,yc;
if(System.Math.Abs(p2.Y-p1.Y)<double.Epsilon)
{
m2=-(p3.X-p2.X)/(p3.Y-p2.Y);
mx2=(p2.X+p3.X)*0.5;
my2=(p2.Y+p3.Y)*0.5;
//CalculateCircumCirclecenter(xc,yc)
xc=(p2.X+p1.X)*0.5;
yc=m2*(xc-mx2)+my2;
}
elseif(System.Math.Abs(p3.Y-p2.Y)<double.Epsilon)
{
m1=-(p2.X-p1.X)/(p2.Y-p1.Y);
mx1=(p1.X+p2.X)*0.5;
my1=(p1.Y+p2.Y)*0.5;
//CalculateCircumCirclecenter(xc,yc)
xc=(p3.X+p2.X)*0.5;
yc=m1*(xc-mx1)+my1;
}
else
{
m1=-(p2.X-p1.X)/(p2.Y-p1.Y);
m2=-(p3.X-p2.X)/(p3.Y-p2.Y);
mx1=(p1.X+p2.X)*0.5;
mx2=(p2.X+p3.X)*0.5;
my1=(p1.Y+p2.Y)*0.5;
my2=(p2.Y+p3.Y)*0.5;
//CalculateCircumCirclecenter(xc,yc)
xc=(m1*mx1-m2*mx2+my2-my1)/(m1-m2);
yc=m1*(xc-mx1)+my1;
}
doubledx=p2.X-xc;
doubledy=p2.Y-yc;
doublersqr=dx*dx+dy*dy;
//doubler=Math.Sqrt(rsqr);//Circumcircleradius
dx=p.X-xc;
dy=p.Y-yc;
doubledrsqr=dx*dx+dy*dy;
return(drsqr<=rsqr);
}
相关文章推荐
- 51cto那些技术专题们
- 2015年9月5日课程作业(练习)安排
- delete
- Android知识点目录(Updating……)
- selenium testNG jmeter
- [bzoj3333][排队计划][树状数组+线段树]
- MFC对话框程序中的OnCreate和OnInitDialog函数
- nginx日志切割
- Android五分钟让你集成底部菜单栏(fragment或者fragment+viewpager)
- Linux根目录中个目录的含义
- nginx配置ssl双向验证 nginx https ssl证书配置
- 重载与重写
- 腾讯笔试题--删除set与vector中QQ号为奇数的号码
- hdu 4417 Super Mario(查找区间不大于h的数有多少个)(线段树+二分查找,划分树+二分查找)
- 可能是ThinkPHP导航高亮显示当前页面的最简便的方法(不服来辩哈哈)
- mycncart1.1.0.0 发布
- I/O Stream <傻瓜机器人对话>
- mycncart1.1.0.0 发布
- IIS发布常见错误-HTTP 错误 404.0 - Not-Found
- 用gdb调试core dump文件