【问题标题】:Geometry Arc Algorithm几何弧算法
【发布时间】:2017-07-03 04:12:29
【问题描述】:

我搜索了所有互联网并没有找到任何解决此问题的伪代码, 我想使用 5 个参数在 A 和 B 两点之间找到一条弧:

  1. 起点
  2. 终点
  3. 半径(不知道是否需要)
  4. 角度
  5. 质量

示例:

StartPoint = 左边的绿点是参数设置的起点

EndPoint = 右边的绿点是参数设置的 End Point

角度 = 圆弧的角度(半圆)

质量 = 要创建多少个红色圆圈

我想要一个伪代码来解决这个问题

提前致谢:D

【问题讨论】:

标签: geometry computational-geometry


【解决方案1】:

设起点为P0,终点为P1,角度Fi。 不需要R

首先找到圆心。获取 P0-P1 段的中间。

 M = (P0 + P1) / 2 
 // M.x =  (P0.x + P1.x) / 2 , same for y

方向向量

 D = (P1 - P0) / 2

获取D的长度

 lenD = Math.Hypot(D.x, D.y)  //Vector.Length, sqrt of sum of squares

获取单位向量

 uD = D / lenD

获取(左)垂直向量

 (P.x, P.y) = (-uD.y, ud.x)

现在圆心

 if F = Pi then
     C.x = M.x
     C.y = M.y
 else
     C.x = M.x + P.x * Len / Tan(Fi/2)
     C.y = M.y + P.y * Len / Tan(Fi/2)

从中心到起点的向量:

CP0.x = P0.x - C.x
CP0.y = P0.y - C.y

然后您可以使用向量CP0围绕中心点的旋转计算圆弧上N个中间点的坐标

 an = i * Fi / (NSeg + 1);
 X[i] = C.x + CP0.x * Cos(an) - CP0.y * Sin(an)
 Y[i] = C.y + CP0.x * Sin(an) + CP0.y * Cos(an)

工作德尔福代码

procedure ArcByStartEndAngle(P0, P1: TPoint; Angle: Double; NSeg: Integer);
var
  i: Integer;
  len, dx, dy, mx, my, px, py, t, cx, cy, p0x, p0y, an: Double;
  xx, yy: Integer;
begin
  mx := (P0.x + P1.x) / 2;
  my := (P0.y + P1.y) / 2;

  dx := (P1.x - P0.x) / 2;
  dy := (P1.y - P0.y) / 2;

  len := Math.Hypot(dx, dy);

  px := -dy / len;
  py := dx / len;

  if Angle = Pi then
    t := 0
  else
    t := len / Math.Tan(Angle / 2);

  cx := mx + px * t;
  cy := my + py * t;

  p0x := P0.x - cx;
  p0y := P0.y - cy;

  for i := 0 to NSeg + 1 do begin

   an := i * Angle / (NSeg + 1);
   xx := Round(cx + p0x * Cos(an) - p0y * Sin(an));
   yy := Round(cy + p0x * Sin(an) + p0y * Cos(an));

   Canvas.Ellipse(xx - 3, yy - 3, xx + 4, yy + 4);
  end;
end;

(Point(100, 0), Point(0, 100), Pi / 2, 8 的结果(图中 Y 轴向下)

【讨论】:

  • 好吧,一切似乎都很好,但我正在努力解决最后一部分“C-P0 向量的旋转”,您能否验证一下它是否正确?
  • 对于“半圆”,中心正好是起始段的中间。
  • @Mário Gabriel 我彻底改变了帖子,检查了工作。
  • @MBo 嘿,我改变了我的代码,它就像你的 i.imgur.com/L4znPGv.png,但我不知道这是否正确,因为看看这个i.imgur.com/q5WcNa8.png 一些例子:200,400 到 400,200 = @987654324 @ 200,400 到 600,200 = i.imgur.com/2RVUg8N.png C# 代码 = hastebin.com/obeganuqaq.cs
  • 如果您需要浮动坐标,请移除 (float)Math.Round。这里有符号的错误: Y = cy + p0x * (float)Math.Sin(an) + p0y * (float)Math.Cos(an);另请注意 - 对于中间点,仅用于 (var i = 1... 并进行校正 WorldPoints[i-1] = vector;
猜你喜欢
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2011-03-03
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多