2017-07-03 74 views
0

我找遍了所有的互聯網,並沒有找到解決這個問題, 我想找到兩個點,A和B之間的電弧任何僞代碼,使用5個參數:幾何弧算法

  1. 起點
  2. 終點
  3. 半徑(如果這是需要不知道)
  4. 角度
  5. 質量

實施例:

img

StartPoint可以=左邊的綠色點爲開始點上的參數

端點設定=右邊的綠色點是終點上設置參數

角度=角的圓弧(半圓形)

質量=多少紅色圓圈爲Cr eate

我想有一個僞代碼來解決這個問題提前

感謝:d

+0

什麼樣的弧線?圓形,橢圓形......?那麼開始/結束切線呢?請參見[繪製以直線結尾的弧線的公式,Y是X的函數,起始斜率,結束斜率,起點和弧半徑?](https://stackoverflow.com/a/22982623/2521214) – Spektre

+0

只需簡單半圈,我需要他們嗎? –

+0

如果用「他們」表示切線則表示沒有。沒有它們也是可行的,但在這種情況下,開始和結束斜率將不確定,這可能會導致某些任務出現問題。所以問題是你需要具體的開始或結束斜率或不... – Spektre

回答

0

讓起點爲P0,終點P1,角連接。 R不需要

首先找到弧中心。獲取P0-P1段的中間值。

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

和方向矢量d的

D = (P1 - P0)/2 

獲取長度

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) 

現在圓心

​​

矢量從中心開始點:使用圍繞中心點矢量CP0的旋轉

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

然後你就可以在弧計算的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) 

工作Del披代碼

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軸下來的圖片)

enter image description here

+0

好了一切似乎都很好,但我與最後一部分「C-P0矢量的旋轉」苟延殘喘,你可以驗證看看它是否是正確的 ? –

+0

對於「半圓」,中心只是起始段的中間部分。 –

+0

@MárioGabriel我大幅改變了職位,檢查了工作。 – MBo