c#实现的一些几何算法(三)

来源:互联网 发布:淘宝店怎么看订单 编辑:程序博客网 时间:2024/06/05 08:27

续一、二

//关于面的

public class GeometricClass

{

  // 已知矩形的三个顶点(a,b,c),计算第四个顶点d的坐标. 注意:已知的三个顶点可以是无序的 

       public static SpatialPoint FourthPointOfRec(SpatialPoint a, SpatialPoint b, SpatialPoint c)

        {

            SpatialPoint d=new SpatialPoint();

            if (Math.Abs(dotmultiply(a, b, c)) < EP) // 说明c点是直角拐角处 

            {

                d.x = a.x + b.x - c.x;

                d.y = a.y + b.y - c.y;

            }

            if (Math.Abs(dotmultiply(a, c, b)) < EP) // 说明b点是直角拐角处 

            {

                d.x = a.x + c.x - b.x;

                d.y = a.y + c.y - b.x;

            }

            if (Math.Abs(dotmultiply(c, b, a)) < EP) // 说明a点是直角拐角处 

            {

                d.x = c.x + b.x - a.x;

                d.y = c.y + b.y - a.y;

            }

            return d;

        } 

 

 

       //点q是凸多边形polygon内时,返回true;注意:多边形polygon一定要是凸多边形  

     public static bool InsideConvexPolygon(int vcount,SpatialPoint[] polygon,SpatialPoint q) // 可用于三角形! 

        {

            SpatialPoint p=new SpatialPoint(); 

       SpatialLine l=new SpatialLine(); 

       int i; 

       p.x=0;p.y=0; 

       for(i=0;i<vcount;i++) // 寻找一个肯定在多边形polygon内的点p:多边形顶点平均值 

       { 

       p.x+=polygon[i].x; 

       p.y+=polygon[i].y; 

       } 

       p.x /= vcount; 

       p.y /= vcount; 

 

       for(i=0;i<vcount;i++) 

       { 

       l.startPoint=polygon[i];

                l.endPoint=polygon[(i+1)%vcount]; 

 

       if(multiply(p,l.endPoint,l.startPoint)*multiply(q,l.endPoint,l.startPoint)<0) /* 点p和点q在边l的两侧,说明点q肯定在多边形外 */ 

       break; 

       } 

       return (i==vcount); 

        }

 

原创粉丝点击