Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何计算两个给定点之间的点和给定距离?_C#_Java_Math_Geometry - Fatal编程技术网

C# 如何计算两个给定点之间的点和给定距离?

C# 如何计算两个给定点之间的点和给定距离?,c#,java,math,geometry,C#,Java,Math,Geometry,我有点A(35.163128.001)和点B(36.5731287.707) 我需要计算A点和B点之间的点 使用两点之间的标准距离公式,我发现D=266.3 位于AB线内的每个点(黑点p1、p2、p8)之间的距离相等d=d/8=33.3 如何计算p1,p2,…的X和Y。。。p8 欢迎使用Java或C语言 或者给我一个公式或方法就行了 多谢各位 **上述计算实际上用于计算我的地图中着色级别的虚拟点,并用于着色区域插值* 设A为点(xa,ya),B为点(xb,yb) α=tan-1((yb-ya)/

我有点
A(35.163128.001)
和点
B(36.5731287.707)

我需要计算A点和B点之间的点

使用两点之间的标准距离公式,我发现
D=266.3

位于AB线内的每个点(黑点p1、p2、p8)之间的距离相等
d=d/8=33.3

如何计算p1,p2,…的X和Y。。。p8

欢迎使用Java或C语言

或者给我一个公式或方法就行了

多谢各位

**上述计算实际上用于计算我的地图中着色级别的虚拟点,并用于着色区域插值*

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

α=tan-1((yb-ya)/(xb-xa))

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

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


(一种等效的方法是使用向量算术)

从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;
}
vec2a=vec2(35.163128.001);
vec2b=vec2(36.5731287);
vec2v=B-A;
对于(i=1;i<8;i++){
vec2p[i]=A+V*(浮点)i/8.0;
}

(对不起,我不懂Java或C。)

这很简单,但你需要一些数学知识

        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));
        }
点F点A点B点;
var diff_X=点B.X-点A.X;
var diff_Y=点B.Y-点A.Y;
int pointNum=8;
var区间X=差异X/(pointNum+1);
var区间=差异/(pointNum+1);
列表点列表=新列表();
对于(int i=1;i
  • 首先找到AB线的斜率。从这里获得帮助和公式:

  • [L] >P>然后考虑一个三角形的AP1E(认为有一个点E是正确的A和下面的P1)。

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

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

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

狭义三角解可能是这样的:

// 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);
//我用tuple表示一个点;
//你,可能有你自己的类型
公共静态IList分割线(
元组a,
元组b,
整数计数){
计数=计数+1;
双d=数学Sqrt((a.Item1-b.Item1)*(a.Item1-b.Item1)+(a.Item2-b.Item2)*(a.Item2-b.Item2))/count;
双fi=数学Atan2(b.Item2-a.Item2,b.Item1-a.Item1);
列表点=新列表(计数+1);

对于(int i=0;i),使用斜率的一个缺点是,如果点位于垂直线上(xa==xb),它将失败。我表达得很糟糕。如果dx(几乎)为零,通过
atan(dy/dx)
计算斜率将失败(或数值不稳定)。
atan2(dy,dx)
没有这个问题。-但使用向量算法(正如您和其他人所建议的)此任务根本不需要三角函数。@MartinR如果(Double.IsNegativeInfinity(slope))move=新大小(0,dist),您可以这样检查垂直坡度;否则如果(Double.IsPositiveInfinity(slope))move=新大小(0,-dist);你能在这里解释一下Math.Atan2部分吗?@Waleed:当给定
x
y
坐标时,我们使用
Atan2
(请注意,
x
y
可以有
0
或负值:这就是
Atan
不够的原因)我们想要得到极角
fi
。这提供了一个之字形运动。我正在使用这种方法在谷歌地图上填充一条多段线。
(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