我找遍了所有的互聯網,並沒有找到解決這個問題, 我想找到兩個點,A和B之間的電弧任何僞代碼,使用5個參數:幾何弧算法
- 起點
- 終點
- 半徑(如果這是需要不知道)
- 角度
- 質量
實施例:
StartPoint可以=左邊的綠色點爲開始點上的參數
端點設定=右邊的綠色點是終點上設置參數
角度=角的圓弧(半圓形)
質量=多少紅色圓圈爲Cr eate
我想有一個僞代碼來解決這個問題提前
感謝:d
我找遍了所有的互聯網,並沒有找到解決這個問題, 我想找到兩個點,A和B之間的電弧任何僞代碼,使用5個參數:幾何弧算法
實施例:
StartPoint可以=左邊的綠色點爲開始點上的參數
端點設定=右邊的綠色點是終點上設置參數
角度=角的圓弧(半圓形)
質量=多少紅色圓圈爲Cr eate
我想有一個僞代碼來解決這個問題提前
感謝:d
讓起點爲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軸下來的圖片)
好了一切似乎都很好,但我與最後一部分「C-P0矢量的旋轉」苟延殘喘,你可以驗證看看它是否是正確的 ? –
對於「半圓」,中心只是起始段的中間部分。 –
@MárioGabriel我大幅改變了職位,檢查了工作。 – MBo
什麼樣的弧線?圓形,橢圓形......?那麼開始/結束切線呢?請參見[繪製以直線結尾的弧線的公式,Y是X的函數,起始斜率,結束斜率,起點和弧半徑?](https://stackoverflow.com/a/22982623/2521214) – Spektre
只需簡單半圈,我需要他們嗎? –
如果用「他們」表示切線則表示沒有。沒有它們也是可行的,但在這種情況下,開始和結束斜率將不確定,這可能會導致某些任務出現問題。所以問題是你需要具體的開始或結束斜率或不... – Spektre