【问题标题】:Find point C that forms perpendicular line BC to line AB找到与线 AB 形成垂直线 BC 的点 C
【发布时间】:2018-06-22 07:53:28
【问题描述】:

我的线段 AB 由两个 2DA,B 定义。

我要做的是找到一个点C,距离d 远离B。 这两个约束是BC 必须垂直于AB 并且BC 总是相对于AB 逆时针90 度数。

到目前为止,我有以下内容

double d = .01;
Coordinate C = new Coordinate(A.Lat - B.Lat, A.Long - B.Long);

C.Long = C.Long * A.Long * Math.Cos(90);
C.Lat = C.Lat * A.Lat * Math.Cos(90);

C.Long = A.Long + C.Long * d;
C.Lat = A.Lat + C.Lat * d;

基本上我要问的是,我在哪里做错了?是c#代码吗?是逻辑吗?使用这两个约束解决C 的步骤是什么。

【问题讨论】:

  • 问题到底出在哪里,是C#部分的编程还是下面的几何/数学?
  • 它在几何/数学中。我不认为我说得对
  • 注意:这是删除 C# 部分和 C# 标签的提示。除了您在那里编码的内容之外,我根本看不到任何地理/数学,甚至没有将代码与图形相关联的描述。顺便说一句:您的代码中的一个快速错误是,通常角度不是以度数表示,而是以弧度表示。
  • 这可能是 100%!让我检查一下
  • 实际上没有必要计算 90° 的余弦 - 这是一个众所周知的常数......这是零,乘以零导致零 - 所以公式中似乎有错误因为最后 C 将具有与 A 相同的坐标

标签: c# algorithm math geometry 2d


【解决方案1】:

将 AB 向量归一化并旋转 90 度:

ABY = B.Y - A.Y
ABX = B.X - A.X
Len = Sqrt(ABY*ABY + ABX*ABX)
C.X = B.X - d * ABY / Len 
C.Y = B.Y + d * ABX / Len 

请注意,对于地理坐标(纬度/经度)和大距离,结果并不准确。

Link 供进一步参考(Bearing 部分,然后是 Destination point given distance and bearing from start point

【讨论】:

  • 我认为您忘记了 C 必须始终位于 B 左侧的约束。
  • @KelseyAbreu,当您的 自己的 术语不一致时,您怎么知道他的代码尚未实现这一点?在第一个图中,C 显然在 B 的右侧。这两个图显示的是,BC 始终相对于 AB 逆时针 90 度。
  • @meowgoesthedog 非常正确,我真的不知道如何描述。我会解决的
  • @Kelsey Abreu 如果left 与您的坐标系不一致(视情况而定),您可以在最后一对公式中交换+/- 符号。我认为left 术语是路径 A-B-C 在 B 之后左转。
  • @KelseyAbreu 它还取决于 x,y 轴指向的坐标系(或 long,lat ...)
【解决方案2】:

MBo 为您的任务提供了正确答案(当您转了 90 度时)我只是想向您展示如何修复您自己的可用代码(我推断您想要这样做)到任何角度转弯(但速度较慢,因为它需要测角):

d = .01;
a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your coordinate system
C.x = B.x + d*cos(a)
C.y = B.y + d*sin(a)

因此,您应该获取AB 的方向角a 并将其移动90 度。然后你只需将由a 旋转的d 添加到C,这可以通过参数圆方程来完成。

请注意,所有角度都应该以您的测角函数接受的单位为单位(所以无论是度数还是弧度),因为我没有在 C# 中编码我不知道,但在我编码的语言中通常是以弧度为单位。在这种情况下行:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your 

将更改为:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0*Pi/180.0; // sign depends on your 

在哪里Pi=3.1415926535897932384626433832795

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2014-06-09
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多