C# 点在线段上

       // 判断一点是否在指定线段中  

       //线段ab,a(ax,ay),b(bx,by),p(x,y);判断点p是否在线段ab上 
        public static   bool PtInSegment(double x, double y, double ax, double ay, double bx, double by)
        {
            #region
            /*利用斜率是否相同进行判断
            if (((x <= ax && x >= bx) || (x <= bx && x >= ax)) && ((y <= ay && y >= by) || (y <= by && y >= ay)))
            {
                if (ax == bx || ay==by)
                    return true;
                double result = (by - ay) / (bx - ax) - (y - ay) / (x - ax);

                return Math.Abs(result) < 0.1;

            }
            return false;
             * */
            #endregion
            #region
          
            //利用三角形定理判断 两边之和大于第三边
            //线段ap的长度
            double a_p = Math.Sqrt(Math.Pow(Math.Abs(ax - x), 2) + Math.Pow(Math.Abs(ay - y), 2));
            //线段b_p的长度
            double b_p = Math.Sqrt(Math.Pow(Math.Abs(bx - x), 2) + Math.Pow(Math.Abs(by - y), 2));
            //线段ab的长度
            double a_b = Math.Sqrt(Math.Pow(Math.Abs(ax - bx), 2) + Math.Pow(Math.Abs(ay - by), 2));
            //线段a_p和线段b_p的和
            double a_p_b = a_p + b_p;
            if (a_p_b - a_b < 0.5)
            {
                return true;
            }
            else
            {
                return false;
            }
          
            /*
            #endregion
            //利用向量的叉积进行判断,确定不可以进行模糊匹配
            //p(x,y),a(ax,ay),b(bx,by)
            //线段ab的向量表示(bx-ax,by-ay)
            //线段ap的向量表示(x-ax,y-ay)
            //向量ab和向量ap的叉积abp=(bx-ax)*(y-ay)+(by-ay)*(x-ax)
            double abp = (bx - ax) * (y - ay) -(by - ay) * (x - ax);
            double  MaxX = Math.Max(ax, bx);
            double MinX = Math.Min(ax, bx);
            double MaxY = Math.Max(ay, by);
            double MinY = Math.Min(ay, by);
            ax = MinX; bx = MaxX; ay = MinY; by = MaxY;
            if (ax <= x &&x<= bx && ay <= y &&y<= by )
            {
                if(Math .Abs (abp )==0)
                return true;
            }
            return false ;
            */

        }

要在C#中模拟一个在一个线段上的轨迹,你可以使用插值算法来计算线段上的位置。以下是一个示例代码: ```csharp using System; class LineSegment { public int startX, startY; public int endX, endY; public LineSegment(int startX, int startY, int endX, int endY) { this.startX = startX; this.startY = startY; this.endX = endX; this.endY = endY; } public void Draw() { Console.WriteLine($"Line segment: ({startX},{startY}) - ({endX},{endY})"); } public void SimulatePointMotion(int steps) { for (int i = 0; i <= steps; i++) { double t = (double)i / steps; // 插值参数 int x = (int)(startX + t * (endX - startX)); // 计算x坐标 int y = (int)(startY + t * (endY - startY)); // 计算y坐标 Console.WriteLine($"Step {i}: Point position: ({x},{y})"); } } } class Program { static void Main(string[] args) { LineSegment line = new LineSegment(0, 0, 10, 10); line.Draw(); // 模拟线段上的运动 line.SimulatePointMotion(10); Console.ReadLine(); } } ``` 在上面的示例中,我们定义了一个LineSegment类来表示线段,其中包含起和终的坐标。然后,在LineSegment类中,我们添加了一个SimulatePointMotion方法来模拟线段上的运动。该方法使用插值算法来计算在每个步骤中的位置,并打印出每个步骤的坐标。在Main方法中,我们创建了一个LineSegment对象,并调用SimulatePointMotion方法来模拟线段上的运动。你可以根据需要修改步数和线段的起和终坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值