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;
            }

        }
       
    }

查看全文
  • 相关阅读:
    oracle数据库使用sys_guid()返回乱码问题
    weblogic 环境改变后,重启应用后方法,报错java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOGS.getInstance
    ORACLE数据库误删表后,没重新建表场景下数据恢复
    Linux环境下weblogic12开启远程debug端口
    关于HOSTS设置不生效的解决小方法
    dubbo调用 Caused by: com.alibaba.dubbo.remoting.RemotingException 异常解决方法
    textkit 研究,mark一下,一个不错的开源库:MLLabel(但是没有文档)
    swift流行UI库(github)
    Android高级第十一讲之不同系统间的区别
    欢快的使用Unity JSON吧
  • 原文地址:https://www.cnblogs.com/xianzuoqiaoqi/p/1507424.html
  • Copyright © 2011-2022 走看看