求函数...

解决方案 »

  1.   

    设三角形三个点
    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两个负数的情况 
      

  2.   

    1楼的方法挺不错,还有一种用距离算,设A(x1,y1)B(x2,y2),C(x3,y3),点O(x,y),共有三个不等式,三角形两边之和大于第三边同时满足这三个不等式的点这有一个
    三角形两边之和大于第三边 列出第一个 其余类似
    sqrt[(x-x1)^2+(y-y1)^2]+sqrt[(x-x2)^2+(y-y1)^2]>sqrt[(x1-x2)^2+(y1-y2)^2]
    也可化简求解:
      

  3.   

    可以构造一个CRgn::CreatePolygonRgn,然后,调用CRgn::PtInRegion;当然,这是MFC的!
      

  4.   

    CPoint ptVertex[3];//假设ptVertex为三角形的3个点!ptVertex[0].x = 180;
    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;
      

  5.   

    设三角形为ABC  所判断点为P   area表示面积函数判断area(PAB)+area(PAC)+area(PBC)-area(ABC)与0关系大于0  则在三角形外部等于0  则在三角形内部
      

  6.   

    Windows自带了一个API检测区域BOOL PtInRegion(
      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应用的话  这些工具里面都有响应的函数  而且效率不错  适用范围更广
      

  7.   

    谢谢大家。。BOOL PtInRegion(
      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表示?
      

  8.   

    我这个算法是计算几何中的一个算法。首先将点与三角形的一个顶点相连,可以看做一个向量(x,y)。
    然后与该顶点链接的两条边,也可以看成两个向量(x1,y1)(x2,y2)
    用(x,y)分别与( x1,y1)(x2,y2)做内积,这个内积的方向是满足右手定则的。
    如果两次内积方向相反,则向量(x,y)在这两个向量( x1,y1)(x2,y2)之间。这样问题可以转化为内积问题,如果这个点与三个顶点的连线,均被三角形的三个边“包围”,则点在三角形内。这个算法知道4个点的坐标,仅用6次内积就可以判断出来。并且没有复杂的代码,理解起来也非常简单。
      

  9.   

    HRGN就是一个区域句柄   CreatePolygonRgn 返回的就是这个   
    具体细节应该查询MSDN  而不是继续再发帖问  
      

  10.   

    定义一个方向,然后对三条边都按这个方向判断点在边的哪边(左or右),如果方向都一样,那点就在三角形内.
    判断点在边的哪边可以用下边的程序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;
    }
      

  11.   

    (y2 - y1) * (x3 - x1) - (y3 - y1) * (x2 - x1);
    公式可以快速判断P1->P2->P3的关系,即从P1,到P2,到P3,是顺时针还是逆时针对你的任意点, 分别对三角形三条边进行判断, 如果全部是同向, 则点在三角形内部,效率也高。
      

  12.   

    总共四种情况:
    设置点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)
    这儿样四种情况我用图片画了出来。
    见图:
      

  13.   

    只要一个函数和几次判断,函数是输入三角形的三个顶点坐标,返回它的面积。
    设三角形的三个点是 ABC,另一点是D;先算 S1 = ABC;
    S2A = ABD;
    S2B = ACD;
    S2C = BCD;如果S1 > S2A + S2B + S2C ,则 D 在ABC之内。
    要注意数据精度,特别是D点很接近三角形的一条边的情况下。
    如果D点刚好在某一边的情况要另外考虑,就是 S2A , S2B,S2C 中某一个三角形的面积为0