首页 > 编程语言 >[CSharpTips]C# 判断一个点是否在线段上

[CSharpTips]C# 判断一个点是否在线段上

时间:2022-09-23 13:45:00浏览次数:57  
标签:p2 p1 Point C# 线段 points pf CSharpTips

C# 判断一个点是否在线段上

using System;
using System.Collections.Generic;
using System.Windows;

namespace PointInLineTest
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Point> points = new List<Point>();
            points.Add(new Point(97.513, 5.076));
            points.Add(new Point(103.589, 11.153));
            points.Add(new Point(131.885, 39.449));
            var result = GetPointIsInLine(points[1], points[0], points[2], 0.001);
            Console.WriteLine(result);
            Console.ReadLine();
        }
        /// <summary>
        /// 判断点是否在线段上
        /// </summary>
        /// <param name="pf">判断点</param>
        /// <param name="p1">线段起点</param>
        /// <param name="p2">线段终点</param>
        /// <param name="range">判断的的误差,不需要误差则赋值0</param>
        /// <returns></returns>
        public static bool GetPointIsInLine(Point pf, Point p1, Point p2, double range)
        {
            //点在线段首尾两端之外则return false
            double cross = (p2.X - p1.X) * (pf.X - p1.X) + (p2.Y - p1.Y) * (pf.Y - p1.Y);
            if (cross <= 0) return false;
            double d2 = (p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y);
            if (cross >= d2) return false;

            double r = cross / d2;
            double px = p1.X + (p2.X - p1.X) * r;
            double py = p1.Y + (p2.Y - p1.Y) * r;

            //判断距离是否小于误差
            return Math.Sqrt((pf.X - px) * (pf.X - px) + (py - pf.Y) * (py - pf.Y)) <= range;
        }
    }
}

运行结果

 

标签:p2,p1,Point,C#,线段,points,pf,CSharpTips
From: https://www.cnblogs.com/axiaoshuye/p/16722406.html

相关文章

  • 如何将CAD数据导入GIS软件,实现GIS+CAD空间规划一张图?
    “规划一张图管理系统”是为规划管理部门、规划设计部门研发的,管理各类规划编制成果、规划审批成果、规划监管成果以及基础地理信息数据的一张图系统。旨在建立符合国家、......
  • Linux主机安装VNC服务端
    yuminstalltigervnctigervnc-servervi/etc/sysconfig/vncservers#VNCSERVERS="1:vncuser2:john"#usethemethodformoreuserVNCSERVERS="0:root1:viewer"#VN......
  • 实验2:Open vSwitch虚拟交换机实践
    1./home/用户名/学号/lab2/目录下执行ovs-vsctlshow命令、以及p0和p1连通性测试的执行结果截图;ovs-vsctlshow命令ovs-ofctlshowovs命令p0,p1连通性2./home/用户......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Pytho......
  • JavaScript变量
    1.变量的使用 (1)声明变量      (2)输出变量 控制台打印输出结果 、2.案例练习(1)变量案例  输入代码 在控制台显示结果:  (2)变量案......
  • leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)
    一、题目大意给你二叉树的根节点root,返回它节点值的前序遍历。示例1:输入:root=[1,null,2,3]输出:[1,2,3]示例2:输入:root=[]输出:[]示例3:输入:root=......
  • C#:多态之虚方法、抽象类、接口、 类的序列化、MD5加密。
     (总的来说多态的作用便是解决代码的冗余问题,但代码更加具有可读性,更加的简洁)多态的第一种表现形式:虚方法usingSystem;usingSystem.Collections.Generic;usingSystem......
  • UEC++ 智能指针——共享指针、共享引用、弱指针
    C++中,往往令人头痛的是指针的管理问题!在对象动态构建时,我们需要将对象指针进行存储,一旦忘记释放,那么将会导致不可预估的错误。在C++中排查指针导致的内存泄漏问题实在令人......
  • sanic生命周期
    首先在Sanic的生命周期,流程大致如下:http请求——Sanic解析request——匹配路由——请求中间件——视图函数——响应中间件——http响应Sanic在匹配路由中会检测是否存在......
  • sanic框架了解
    最近在工作中需要用到sanic框架Sanic是什么?话不多说先给一个官方的解释SanicisaPython3.6+webserverandwebframeworkthat’swrittentogofast.Itallows......