zoukankan      html  css  js  c++  java
  • 【算法】点在多边形内外判断

    射线发

     /// 射线发判断点是否在多边形内部
            /// p 待判断的点。格式{x:X坐标,y:Y坐标}
            /// {Array} poly 多边形定点,数组成员格式相同
            private string rayCasting(Point p, List<Point> poly)
            {
                double px = p.X;
                double py = p.Y;
                Boolean flag = false;
                for (int i = 0, l = poly.Count, j = l - 1; i < l; j = i, i++)
                {
                    double sx = poly[i].X;
                    double sy = poly[i].Y;
                    double tx = poly[j].X;
                    double ty = poly[j].Y;
    
                    if((sx==px&&sy==py)||(tx==px&&ty==py)){
                        return "on";
                    }
    
                    //*****判断线段两短点是否在射线两侧
                    if((sy<py&&ty>=py)||(sy>=py&&ty<py)){
    
                        double x = sx + (py - sy) * (tx - sx) / (ty - sy);
                        if (x == px)
                        {
                            return "on";
                        }
    
                        if (x > px)
                        {
                            flag = !flag;
                        }
    
    
                    }
                }
                return flag ? "in" : "out";
    
            }

    实际应用例子,GDI+ c#  

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
                Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
                g.DrawLine(p, 10, 10, 100, 10);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
                g.DrawLine(p, 100, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
                g.DrawLine(p, 100, 100, 10, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
                g.DrawLine(p, 10, 100, 50, 50);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
                g.DrawLine(p, 50, 50, 10, 10);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
               // g.DrawRectangle(p, 10, 10, 100, 100);//在画板上画矩形,起始坐标为(10,10),宽为,高为
              //  g.DrawEllipse(p, 10, 10, 100, 100);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为
                
    
                Point P = new Point();
                P.X = 10;
                P.Y = 50;
                g.DrawEllipse(p, 10, 50, 5, 5);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为
                
                List<Point> lst = new List<Point>();
                Point P1 = new Point();
                P1.X = 10;
                P1.Y = 10;
                Point P2 = new Point();
                P2.X = 100;
                P2.Y = 10;
                Point P3 = new Point();
                P3.X = 100;
                P3.Y = 100;
                Point P4 = new Point();
                P4.X = 10;
                P4.Y = 100;
                Point P5 = new Point();
                P5.X = 50;
                P5.Y = 50;
                lst.Add(P1); lst.Add(P2); lst.Add(P3); lst.Add(P4); lst.Add(P5);
                string w=rayCasting(P,lst);
                MessageBox.Show(w);
            }
    
            /// 射线发判断点是否在多边形内部
            /// p 待判断的点。格式{x:X坐标,y:Y坐标}
            /// {Array} poly 多边形定点,数组成员格式相同
            private string rayCasting(Point p, List<Point> poly)
            {
                double px = p.X;
                double py = p.Y;
                Boolean flag = false;
                for (int i = 0, l = poly.Count, j = l - 1; i < l; j = i, i++)
                {
                    double sx = poly[i].X;
                    double sy = poly[i].Y;
                    double tx = poly[j].X;
                    double ty = poly[j].Y;
    
                    if((sx==px&&sy==py)||(tx==px&&ty==py)){
                        return "on";
                    }
    
                    //*****判断线段两短点是否在射线两侧
                    if((sy<py&&ty>=py)||(sy>=py&&ty<py)){
    
                        double x = sx + (py - sy) * (tx - sx) / (ty - sy);
                        if (x == px)
                        {
                            return "on";
                        }
    
                        if (x > px)
                        {
                            flag = !flag;
                        }
    
    
                    }
                }
                return flag ? "in" : "out";
    
            }
        }
        class Point
        {
            private double x;
            private double y;
            public double X
            {
                get
                {
                    return x;
    
                }
                set
                {
                    x = value;
                }
            }
            public double Y
            {
                get
                {
                    return y;
    
                }
                set
                {
                    y = value;
                }
    
            }
    
        }
    }
  • 相关阅读:
    CF1328B K-th Beautiful String
    CF1327B Princesses and Princes
    CF750D New Year and Fireworks
    CF57C Array
    洛谷P5661 公交换乘(CSP-J 2019 T2)
    Docker原理:Cgroup
    Docker原理:Namespace
    Anaconda软件安装使用问题
    初步了解Unix系统的I/O模式
    深入理解索引和AVL树、B-树、B+树的关系
  • 原文地址:https://www.cnblogs.com/marky/p/5664217.html
Copyright © 2011-2022 走看看