怎样判断一个坐标是否在已知三角形内?
2006-05-22 20:21
555 查看
根据直线Ax+By+C=0和点P的关系知识可知,把点P代入式子Ax+By+C的值的正负,来判断点P在直线的位置。
又知三角形的内心必在三角形内部,所以我们可以把测试点和内心比较,即可得出该点是否在三角形内部。
源代码:(在BCB6.0测试通过)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float fPointX1,fPointY1;
float fPointX2,fPointY2;
float fPointX3,fPointY3;
float k1,b1,k2,b2,k3,b3;
char cFlag1 = 0;
char cFlag2 = 0;
float fTestPX =232,fTestPY = 192;
float fInX,fInY;
fPointX1 = 72;
fPointY1 = 56;
fPointX2 = 104;
fPointY2 = 208;
fPointX3 = 280;
fPointY3 = 136;
float temp1 = sqrt( Power(fPointX3-fPointX2,2)+Power(fPointY3-fPointY2,2) );
float temp2 = sqrt( Power(fPointX3-fPointX1,2)+Power(fPointY3-fPointY1,2) );
float temp3 = sqrt( Power(fPointX2-fPointX1,2)+Power(fPointY2-fPointY1,2) );
//得到该三角形的内心,内心必在三角形内部
fInX = ((temp1*fPointX1)+(temp2*fPointX2)+(temp3*fPointX3))/(temp1+temp2+temp3);
fInY = ((temp1*fPointY1)+(temp2*fPointY2)+(temp3*fPointY3))/(temp1+temp2+temp3);
//得到三角形 三个边的直线方程系数
k1 = (fPointY2-fPointY1)/(fPointX2-fPointX1);
b1 = fPointY1-k1*fPointX1;
k2 = (fPointY3-fPointY2)/(fPointX3-fPointX2);
b2 = fPointY2-k2*fPointX2;
k3 = (fPointY3-fPointY1)/(fPointX3-fPointX1);
b3 = fPointY3-k3*fPointX3;
//得到内心的 对应数的值
if (k1*fInX-fInY+b1 > 1e-6)
cFlag1 = cFlag1 | 0200;
else
cFlag1 = cFlag1 | 0100;
if (k2*fInX-fInY+b2 > 1e-6)
cFlag1 = cFlag1 | 0020;
else
cFlag1 = cFlag1 | 0010;
if (k3*fInX-fInY+b3 > 1e-6)
cFlag1 = cFlag1 | 0002;
else
cFlag1 = cFlag1 | 0001;
//检验对应点
if (k1*fTestPX-fTestPY+b1 > 1e-6)
cFlag2 = cFlag2 | 0200;
else
cFlag2 = cFlag2 | 0100;
if (k2*fTestPX-fTestPY+b2 > 1e-6)
cFlag2 = cFlag2 | 0020;
else
cFlag2 = cFlag2 | 0010;
if (k3*fTestPX-fTestPY+b3 > 1e-6)
cFlag2 = cFlag2 | 0002;
else
cFlag2 = cFlag2 | 0001;
if (cFlag1 == cFlag2)
ShowMessage("inside");
else
ShowMessage("outside");
}
又知三角形的内心必在三角形内部,所以我们可以把测试点和内心比较,即可得出该点是否在三角形内部。
源代码:(在BCB6.0测试通过)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float fPointX1,fPointY1;
float fPointX2,fPointY2;
float fPointX3,fPointY3;
float k1,b1,k2,b2,k3,b3;
char cFlag1 = 0;
char cFlag2 = 0;
float fTestPX =232,fTestPY = 192;
float fInX,fInY;
fPointX1 = 72;
fPointY1 = 56;
fPointX2 = 104;
fPointY2 = 208;
fPointX3 = 280;
fPointY3 = 136;
float temp1 = sqrt( Power(fPointX3-fPointX2,2)+Power(fPointY3-fPointY2,2) );
float temp2 = sqrt( Power(fPointX3-fPointX1,2)+Power(fPointY3-fPointY1,2) );
float temp3 = sqrt( Power(fPointX2-fPointX1,2)+Power(fPointY2-fPointY1,2) );
//得到该三角形的内心,内心必在三角形内部
fInX = ((temp1*fPointX1)+(temp2*fPointX2)+(temp3*fPointX3))/(temp1+temp2+temp3);
fInY = ((temp1*fPointY1)+(temp2*fPointY2)+(temp3*fPointY3))/(temp1+temp2+temp3);
//得到三角形 三个边的直线方程系数
k1 = (fPointY2-fPointY1)/(fPointX2-fPointX1);
b1 = fPointY1-k1*fPointX1;
k2 = (fPointY3-fPointY2)/(fPointX3-fPointX2);
b2 = fPointY2-k2*fPointX2;
k3 = (fPointY3-fPointY1)/(fPointX3-fPointX1);
b3 = fPointY3-k3*fPointX3;
//得到内心的 对应数的值
if (k1*fInX-fInY+b1 > 1e-6)
cFlag1 = cFlag1 | 0200;
else
cFlag1 = cFlag1 | 0100;
if (k2*fInX-fInY+b2 > 1e-6)
cFlag1 = cFlag1 | 0020;
else
cFlag1 = cFlag1 | 0010;
if (k3*fInX-fInY+b3 > 1e-6)
cFlag1 = cFlag1 | 0002;
else
cFlag1 = cFlag1 | 0001;
//检验对应点
if (k1*fTestPX-fTestPY+b1 > 1e-6)
cFlag2 = cFlag2 | 0200;
else
cFlag2 = cFlag2 | 0100;
if (k2*fTestPX-fTestPY+b2 > 1e-6)
cFlag2 = cFlag2 | 0020;
else
cFlag2 = cFlag2 | 0010;
if (k3*fTestPX-fTestPY+b3 > 1e-6)
cFlag2 = cFlag2 | 0002;
else
cFlag2 = cFlag2 | 0001;
if (cFlag1 == cFlag2)
ShowMessage("inside");
else
ShowMessage("outside");
}
相关文章推荐
- Linux下完成: 已知两三角形顶点坐标,判断其是否有公共边
- 怎样判断一个类的实例是否属于一个类对象
- 第六周任务四设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。
- java实现判断一个经纬度坐标是否在一个多边形内(经自己亲测)
- 输入N个点的坐标,由程序判断该N个点是否能构成一个凸多边形。(VB)
- Algorithm: 如何判断一个点是否在一个三角形内
- vc6代码实现: 怎样判断一个点是否在一个窗口(或对话框或控件)内?
- php怎样判断一个字符串是否包含另一个字符串strpos()
- 写一个判断是否构成三角形的程序
- 怎样判断一个链表是否有环
- 如何判断一个点是否在三角形内
- 一个判断点是否在三角形内的简单方法
- 【摘】给定一些单元格的坐标,如何判断它们是否能合并为一个单元格?
- 判断一个点是否在一个三角形内(二维)
- 绘制一个三角形和判断一个点是否在这个三角形中
- 判断一个点是否在三角形内部
- php怎样判断一个字符串是否包含另一个字符串?
- Java中怎样判断一个字符串是否是数字
- Java中怎样判断一个字符串是否是数字
- 判断一个点是否在三角形区域内