zoukankan      html  css  js  c++  java
  • C# 点在多边形内

  • //这个算法是参考计算机图形学书上的算法得来的,可以说十分简单高效。   (C++)
  • //calc point in ploygon or not    
  • bool PIP(CPoint p,const CPoint data[],int n){   
  •     bool flag=0;   
  •     for(int i=0;i<n;i++){   
  •         if(p.y<data[i].y&&p.y<data[(i+1)%n].y)   
  •             continue;   
  •         if(data[i].x<=p.x&&data[(i+1)%n].x<=p.x)   
  •             continue;   
  •         int dx=data[(i+1)%n].x-data[i].x;   
  •         int dy=data[(i+1)%n].y-data[i].y;   
  •         float t=float(p.x-data[i].x)/dx;//求得交点的t值   
  •          float y=t*dy+data[i].y;   
  •         if(y<=p.y&&t>=0&&t<=1)   
  •         flag=!flag;   
  •     }   
  •     return flag;   
  • }  
  • ----------------------------------------------------------------

    c# 测试代码

    namespace _062001
    {
        class Program
        {
            static void Main(string[] args)
            {
                Point[] data = new Point[4];
                data[0] = new Point(0, 0);
                data[1] = new Point(0, 5);
                data[2] = new Point(5, 5);
                data[3] = new Point(5, 0);

                Point p = new Point(3, 3);
                if (PIP(p,data,4))
                {
                    Console.WriteLine("在区域内");
                }else{
                    Console.WriteLine("不在区域内");
                }
            }

            static bool PIP(Point p,Point[] data,int n)
            {
                bool flag =false;
                for (int i=0;i<n;i++)
                {
                    if (p.Y <data[i].Y && p.Y<data[(i+1)%n].Y)
                          continue;
                    if (data[i].X <p.X && data[(i+1)%n].X <p.X)
                          continue;
                    float dx = data[(i+1)%n].X - data[i].X;
                    float dy = data[(i+1)%n].Y - data[i].Y;
                    float t= (float)((p.X - data[i].X)/dx);
                    float y = t*dx + data[i].Y;
                    if (y<p.Y && t>=0 && t<=1)
                          flag =!flag;
                }
                return flag;
            }
        }
        class Point
        {
            private float x;

            public float X
            {
                get { return x; }
                set { x = value; }
            }
            private float y;
            public float Y
            {
                get { return y; }
                set { y = value; }
            }

            public Point(float p_x,float p_y)
            {
                x = p_x;
                y = p_y;
            }

        }
       
    }

查看全文
  • 相关阅读:
    Window7幻灯片字体显示混乱,难道真的是病毒么
    COCOS2DX 3.0 优化提升渲染速度 Auto-batching
    iOS 打印出视图中全部的子视图的名称
    【linux】学习2
    【编程之美】2.16 求数组的最大递增子序列
    【linux】学习1
    【编程之美】2.15 子数组之和的最大值(二维)
    【编程之美】2.14 求数组的子数组之和的最大值
    【QT】视频播放
    【编程之美】3.5 最短摘要的生成
  • 原文地址:https://www.cnblogs.com/xianzuoqiaoqi/p/1507424.html
  • Copyright © 2011-2022 走看看