求函数...
解决方案 »
- 求解VS2008生成MFC框架窗口点关闭就崩溃
- 我想在PDA上实现指纹识别的功能,有谁做过?
- 有关WMI的一个程序问题???
- 一个有关ATL/COM连接数据库的问题:
- 怎样在VC中读出并显示AUTOCAD 中DWG 格式的文件————急!!!!
- 谁能给我一个COM返回Ado RecordSet对象的代码?急
- 用位图做即时战略游戏中的图片,可是刷新的速度太慢,请问VC高手们如何解决!
- 有谁知道将 char* chstr[20];的前10个字符付给 CString string;的函数??????????
- 如何激活一个程序中菜单上的一项?
- 通过cfile去open某txt文件,报sharingviolation的错。
- VC编写程序与HID通信的问题
- 请教一个问题,为什么生成的库里面最好不要有全局变量~~
A(a1,a2),B(b1,b2),C(c1,c2)
三条边方程
BC:fa(x,y)=0
AC:fb(x,y)=0
AB:fc(x,y)=0
以BC为例,在三角形内的点必须与点A在BC的同侧
所以对于点D(x,y)
在三角形内首先要满足fa(x,y)*fa(a1,a2)>0
其他边也同理
所以只要比较
fa(x,y)*fa(a1,a2)
fb(x,y)*fb(b1,b2)
fc(x,y)*fc(c1,c2)
这三个数的正负性
1三个数都是正数:D在三角形内
2至少有一个负数:D在三角形外
3有且只有一个0,另两个为正数:在三角形边上
4有且只有一个0,一个正数一个负数:在三角形边的延长线上,也算在三角形外,因为满足2
5有二个0:在三角形的顶点上
6不可能出现3个0,或3个负数,或一个0两个负数的情况
三角形两边之和大于第三边 列出第一个 其余类似
sqrt[(x-x1)^2+(y-y1)^2]+sqrt[(x-x2)^2+(y-y1)^2]>sqrt[(x1-x2)^2+(y1-y2)^2]
也可化简求解:
ptVertex[0].y = 80;
ptVertex[1].x = 100;
ptVertex[1].y = 160;
ptVertex[2].x = 120;
ptVertex[2].y = 260;CRgn rgnA
VERIFY(rgnA.CreatePolygonRgn( ptVertex, 3, ALTERNATE));
BOOL flag = rgnA.PtInRegion(a);;//TRUE为在三角形内
rgnA.DeleteObject();
return flag;
HRGN hrgn, // handle to region
int X, // x-coordinate of point
int Y // y-coordinate of point
);HRGN CreatePolygonRgn(
CONST POINT *lppt, // array of points
int cPoints, // number of points in array
int fnPolyFillMode // polygon-filling mode
);如果是做MapX的等GIS应用的话 这些工具里面都有响应的函数 而且效率不错 适用范围更广
HRGN hrgn, // handle to region
int X, // x-coordinate of point
int Y // y-coordinate of point
);HRGN CreatePolygonRgn(
CONST POINT *lppt, // array of points
int cPoints, // number of points in array
int fnPolyFillMode // polygon-filling mode
);
请问这个HRGN hrgn是什么类型呢?如何把一个三角形用HRGN表示?
然后与该顶点链接的两条边,也可以看成两个向量(x1,y1)(x2,y2)
用(x,y)分别与( x1,y1)(x2,y2)做内积,这个内积的方向是满足右手定则的。
如果两次内积方向相反,则向量(x,y)在这两个向量( x1,y1)(x2,y2)之间。这样问题可以转化为内积问题,如果这个点与三个顶点的连线,均被三角形的三个边“包围”,则点在三角形内。这个算法知道4个点的坐标,仅用6次内积就可以判断出来。并且没有复杂的代码,理解起来也非常简单。
具体细节应该查询MSDN 而不是继续再发帖问
判断点在边的哪边可以用下边的程序bool ChkWhichSide(PPOINT p1,PPOINT p2,PPOINT p)
{ //判断p在p1->p2的哪一边:1---左边,0---右边(或线上)
double equ = ((p.y - p1.y) * (p2.x - p1.x)) - ((p2.y - p1.y) * (p.x - p1.x));
if(equ > 0)
return true;
else
return false;
}
公式可以快速判断P1->P2->P3的关系,即从P1,到P2,到P3,是顺时针还是逆时针对你的任意点, 分别对三角形三条边进行判断, 如果全部是同向, 则点在三角形内部,效率也高。
设置点n1,三角形三个顶点为:a1,a2,a3
1:点在三角形内(n1跟三角形三个顶点组成的角度:a1n1a2,a1n1a3 a2n1a3之和必定等于360度)
2:点在三角形边上(n1跟三角形三个顶点组成的角度:a1n1a2,a1n1a3 a2n1a3之和必定等于180度,但有个角为0)
3:点在三角形边的延长线上。(n1跟三角形三个顶点组成的角度:a1n1a2,a1n1a3 a2n1a3之和必定等于360度,但有个角为180)
4:点在三角形外面但部署于上述任何一种情况。(n1跟三角形三个顶点组成的角度:a1n1a2,a1n1a3 a2n1a3之和必定小于360)
这儿样四种情况我用图片画了出来。
见图:
设三角形的三个点是 ABC,另一点是D;先算 S1 = ABC;
S2A = ABD;
S2B = ACD;
S2C = BCD;如果S1 > S2A + S2B + S2C ,则 D 在ABC之内。
要注意数据精度,特别是D点很接近三角形的一条边的情况下。
如果D点刚好在某一边的情况要另外考虑,就是 S2A , S2B,S2C 中某一个三角形的面积为0