【问题标题】:How to calculate the points between two given points and given distance?如何计算两个给定点和给定距离之间的点?
【发布时间】:2017-06-01 17:34:32
【问题描述】:

我点A (35.163 , 128.001)和点B (36.573 , 128.707)

我需要计算点位于 A 点和 B 点内的点

使用2点之间的标准距离公式,我找到了D = 266.3

每个点位于线 AB 内(黑点 p1, p2, ... p8)以 d = D / 8 = 33.3 的相等距离​​分开

我如何计算 p1、p2、... p8 的 X 和 Y?

欢迎使用 Java 或 C# 语言示例

或者只是给我一个公式或方法就可以了。

谢谢。

**上面的计算实际上是用来计算我地图中阴影级别的虚拟点,并用于阴影区域插值*

【问题讨论】:

    标签: c# java math geometry


    【解决方案1】:

    这很容易,但您需要一些数学知识。

            PointF pointA, pointB;
    
            var diff_X = pointB.X - pointA.X;
            var diff_Y = pointB.Y - pointA.Y;
            int pointNum = 8;
    
            var interval_X = diff_X / (pointNum + 1);
            var interval_Y = diff_Y / (pointNum + 1);
    
            List<PointF> pointList = new List<PointF>();
            for (int i = 1; i <= pointNum; i++)
            {
                pointList.Add(new PointF(pointA.X + interval_X * i, pointA.Y + interval_Y*i));
            }
    

    【讨论】:

      【解决方案2】:

      Straitforward 三角函数可能是这样的:

      // I've used Tupple<Double, Double> to represent a point;
      // You, probably have your own type for it
      public static IList<Tuple<Double, Double>> SplitLine(
        Tuple<Double, Double> a, 
        Tuple<Double, Double> b, 
        int count) {
      
        count = count + 1;
      
        Double d = Math.Sqrt((a.Item1 - b.Item1) * (a.Item1 - b.Item1) + (a.Item2 - b.Item2) * (a.Item2 - b.Item2)) / count;
        Double fi = Math.Atan2(b.Item2 - a.Item2, b.Item1 - a.Item1);
      
        List<Tuple<Double, Double>> points = new List<Tuple<Double, Double>>(count + 1);
      
        for (int i = 0; i <= count; ++i)
          points.Add(new Tuple<Double, Double>(a.Item1 + i * d * Math.Cos(fi), a.Item2 + i * d * Math.Sin(fi)));
      
        return points;
      }
      
      ...
      
      IList<Tuple<Double, Double>> points = SplitLine(
        new Tuple<Double, Double>(35.163, 128.001),
        new Tuple<Double, Double>(36.573, 128.707),
        8);
      

      结果(分):

      (35,163, 128,001)                    // <- Initial point A
      (35,3196666666667, 128,079444444444)
      (35,4763333333333, 128,157888888889)
      (35,633, 128,236333333333)
      (35,7896666666667, 128,314777777778)
      (35,9463333333333, 128,393222222222)
      (36,103, 128,471666666667)
      (36,2596666666667, 128,550111111111)
      (36,4163333333333, 128,628555555556)
      (36,573, 128,707)                    // <- Final point B
      

      【讨论】:

      • 你能在这里解释一下 Math.Atan2 部分吗?
      • @Waleed: 我们使用Atan2 当给定xy 坐标时(请注意xy 可以有0 值:这就是为什么 Atan 还不够)我们想要得到 极角 fidocs.microsoft.com/en-us/dotnet/api/…
      • 这提供了锯齿形运动。我正在使用这种方法在 Google 地图上填充折线。
      【解决方案3】:

      从 B 中减去 A,按分量,得到从 A 到 B 的向量。将该向量乘以所需的步长值并将其添加到 A。(请注意,如您所示,有八个中间步骤,步骤距离是 1.0 / 9.0。)像这样,假设你真的想要七分:

      vec2 A = vec2 (35.163, 128.001);
      vec2 B = vec2 (36.573, 128.707);
      vec2 V = B - A;
      for (i = 1; i < 8; i++) {
          vec2 p[i] = A + V * (float)i / 8.0;
      }
      

      (抱歉,不懂 Java 或 C#。)

      【讨论】:

        【解决方案4】:

        设A为点(xa, ya),B为点(xb, yb)

        alpha = tan-1((yb - ya)/(xb - x a))

        p1 = (xa + d * cos(alpha), ya + d * sin(alpha))

        pk = (xa + kd * cos(alpha), ya + kd * sin(alpha)), k = 1 到 7

        (等效的方法是使用矢量算术)

        【讨论】:

        • 使用斜率的一个缺点是,如果点在垂直线上 (xa == xb),则会失败。
        • 我表达得很糟糕。如果 dx (几乎)为零,则通过atan(dy/dx) 计算斜率会失败(或数值不稳定)。 atan2(dy, dx) 没有这个问题。 - 但是使用矢量算术(正如您和其他人所建议的那样),这项任务根本不需要三角函数。
        • @MartinR 您可以像这样检查垂直坡度 if(Double.IsNegativeInfinity(slope) ) move = new Size(0,dist); else if(Double.IsPositiveInfinity(slope) ) move = new Size(0,-dist);
        【解决方案5】:
        • 首先求 AB 线的斜率。从这里获取帮助和公式:http://www.purplemath.com/modules/slope.htm

        • 然后考虑一个三角形Ap1E(认为有一个点E,它在A的右边,在p1的下方)。

        • 您已经知道 AEp1 的角度是 90 度。并且您已经计算出角度 p1AE(从 AB 的斜率)。
        • 现在找到 AE 和 Ep1。

        • Xp1=Xa+AE 和 Yp1=Ya+Ep1

        这在 C# 或 java 中不会很困难。 一旦你理解了逻辑,你会发现以自己的方式实现的乐趣。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-21
          • 1970-01-01
          • 1970-01-01
          • 2011-07-19
          • 2010-10-30
          • 2012-05-21
          相关资源
          最近更新 更多