求教一简单几何问题,请问怎么样判断一个点是否在一个三角形内

时间:2022-07-13 10:25:44
点P坐标为Px,Py,三角型三个点A,B,C的坐标分别是Ax,Ay,Bx,By,Cx,Cy,

谁能给直接写出代码?数学基础有点差

13 个解决方案

#1


最好是给填写这个函数:

bool abc(Px,Py,Ax,Ay,Bx,By,Cx,Cy)//判断点p是否在三角型ABC内
{
return false;
or
return true;
}

#2


我是数学没学好、代码也写不好。
我想问题可以转换、判断点p是否是内点、需要先判断P在线段AB的那一侧、在C点一侧有可能是内点。

#3


我也听说是要判断这一点和三条边的对角是否在这一边的同侧,但是我不知道怎么判断,我也忘了这个以前学没学过了,反正现在我是不会,哪位知道给写一下

#4


其实、现在的问题相对简单、只要检查p点是否在过c点且平行于ab的直线
与ab所在直线之间即可。当有不同方法,比如:
ap<ac and bp<bc
ap是指线段ap的长度

#5


这个算法好象不能判断点a和点c是否在ab的同测?ap<ac好象也有可能是p在ab的另一测???

#6


象这种常用的问题现在应该有最优算法了吧?我的程序要求很高的效率,这个判断要循环很多次

#7


是我想错了、很抱歉。

可否这样,从直线方程考虑。用过ab的直线方程截距与过p点与之平行的直线的截距比较、参照另外两条边的情况、我想可以做判断。
粗略的想法是,如果p点在过a点的两条射线内,那么过p点作与之平行的两条直线,其截距、与p点在过a点的两条对应射线比较、应该小于一个而大于另一个。仓促间不知道这个想法对不对。

#8


******一个不需应用程序计算,且效率极高的方法:
......
......
HRGN hABC;
POINT abc[3];//三角形顶点坐标
POINT p;     //任一点坐标
hABC=CreatePolygonRgn(abc, 3, ALTERNATE);
if(PtInRegion(hABC, p.x, p.y)) 说明点p在ABC内;
DeleteObject(hABC);

#9


你的三个定点坐标abc知道的话:该点point如在三角形内的条件--》将point代入三条由三个点组成的直线中有两个<0,另一个>0,&&将对于>0所对应的直线未经过的顶点代入该直线中,如果>0则:在三角形内

#10


xqr(星球人)的方法很好,其他人的方法都不怎么样。
比较好的解析方法:首先要求三角形的三个顶点是有序的(都是逆时针或都是顺时针),然后分别求每条边的直线标准式系数a、b、c,对三条边而言,a×Px+b×Py+c的符号应该是相同的。

#11


xqr(星球人)用的几个函数以前怎么都没见过?属于哪一类的函数?效率真的很高?

#12


CreatePolygonRgn 和 PtInRegion 同属 Win API

*****再介绍一种利用矢性积(即叉积)符号的判别法。此法亦甚简单。*****
设 ap×ab 代表矢量ap与ab的矢性积,其坐标表达式为
   ap×ab = (xp-xa)*(yb-ya)-(yp-ya)*(xb-xa)
于是判别过程如下:
若 ap×ab>0 and bp×bc>0 and cp×ca>0 或 ap×ab<0 and bp×bc<0 and cp×ca<0
则可判定p在△abc内。
若 ap×ab=0 or bp×bc=0 or cp×ca=0
则可判定p在△abc轮廓上。
否则,p△abc在外。

#13


**********我的更正************

设 ap×ab 代表矢量ap与ab的矢性积,其坐标表达式为
   ap×ab = (xp-xa)*(yb-ya)-(yp-ya)*(xb-xa)
于是判别过程如下:

若 ap×ab>0 and bp×bc>0 and cp×ca>0 或 ap×ab<0 and bp×bc<0 and cp×ca<0
则可判定p在△abc内。

若 ap×ab=0 and (bp×bc>0 and cp×ca>0 或 bp×bc<0 and cp×ca<0)
或 bp×bc=0 and (ap×ab>0 and cp×ca>0 或 ap×ab<0 and cp×ca<0)
或 cp×ca=0 and (ap×ab>0 and bp×bc>0 或 ap×ab<0 and bp×bc<0)
则可判定p在△abc轮廓上。

否则,p在△abc在外。


#1


最好是给填写这个函数:

bool abc(Px,Py,Ax,Ay,Bx,By,Cx,Cy)//判断点p是否在三角型ABC内
{
return false;
or
return true;
}

#2


我是数学没学好、代码也写不好。
我想问题可以转换、判断点p是否是内点、需要先判断P在线段AB的那一侧、在C点一侧有可能是内点。

#3


我也听说是要判断这一点和三条边的对角是否在这一边的同侧,但是我不知道怎么判断,我也忘了这个以前学没学过了,反正现在我是不会,哪位知道给写一下

#4


其实、现在的问题相对简单、只要检查p点是否在过c点且平行于ab的直线
与ab所在直线之间即可。当有不同方法,比如:
ap<ac and bp<bc
ap是指线段ap的长度

#5


这个算法好象不能判断点a和点c是否在ab的同测?ap<ac好象也有可能是p在ab的另一测???

#6


象这种常用的问题现在应该有最优算法了吧?我的程序要求很高的效率,这个判断要循环很多次

#7


是我想错了、很抱歉。

可否这样,从直线方程考虑。用过ab的直线方程截距与过p点与之平行的直线的截距比较、参照另外两条边的情况、我想可以做判断。
粗略的想法是,如果p点在过a点的两条射线内,那么过p点作与之平行的两条直线,其截距、与p点在过a点的两条对应射线比较、应该小于一个而大于另一个。仓促间不知道这个想法对不对。

#8


******一个不需应用程序计算,且效率极高的方法:
......
......
HRGN hABC;
POINT abc[3];//三角形顶点坐标
POINT p;     //任一点坐标
hABC=CreatePolygonRgn(abc, 3, ALTERNATE);
if(PtInRegion(hABC, p.x, p.y)) 说明点p在ABC内;
DeleteObject(hABC);

#9


你的三个定点坐标abc知道的话:该点point如在三角形内的条件--》将point代入三条由三个点组成的直线中有两个<0,另一个>0,&&将对于>0所对应的直线未经过的顶点代入该直线中,如果>0则:在三角形内

#10


xqr(星球人)的方法很好,其他人的方法都不怎么样。
比较好的解析方法:首先要求三角形的三个顶点是有序的(都是逆时针或都是顺时针),然后分别求每条边的直线标准式系数a、b、c,对三条边而言,a×Px+b×Py+c的符号应该是相同的。

#11


xqr(星球人)用的几个函数以前怎么都没见过?属于哪一类的函数?效率真的很高?

#12


CreatePolygonRgn 和 PtInRegion 同属 Win API

*****再介绍一种利用矢性积(即叉积)符号的判别法。此法亦甚简单。*****
设 ap×ab 代表矢量ap与ab的矢性积,其坐标表达式为
   ap×ab = (xp-xa)*(yb-ya)-(yp-ya)*(xb-xa)
于是判别过程如下:
若 ap×ab>0 and bp×bc>0 and cp×ca>0 或 ap×ab<0 and bp×bc<0 and cp×ca<0
则可判定p在△abc内。
若 ap×ab=0 or bp×bc=0 or cp×ca=0
则可判定p在△abc轮廓上。
否则,p△abc在外。

#13


**********我的更正************

设 ap×ab 代表矢量ap与ab的矢性积,其坐标表达式为
   ap×ab = (xp-xa)*(yb-ya)-(yp-ya)*(xb-xa)
于是判别过程如下:

若 ap×ab>0 and bp×bc>0 and cp×ca>0 或 ap×ab<0 and bp×bc<0 and cp×ca<0
则可判定p在△abc内。

若 ap×ab=0 and (bp×bc>0 and cp×ca>0 或 bp×bc<0 and cp×ca<0)
或 bp×bc=0 and (ap×ab>0 and cp×ca>0 或 ap×ab<0 and cp×ca<0)
或 cp×ca=0 and (ap×ab>0 and bp×bc>0 或 ap×ab<0 and bp×bc<0)
则可判定p在△abc轮廓上。

否则,p在△abc在外。