point de démarrage est Let P0, point final P1, angle Fi. R n'est pas nécessaire
Au premier emplacement, recherchez le centre de l'arc. Obtenez le milieu du segment P0-P1.
M = (P0 + P1)/2
// M.x = (P0.x + P1.x)/2 , same for y
direction et de vecteur
D = (P1 - P0)/2
longueur Get de D
lenD = Math.Hypot(D.x, D.y) //Vector.Length, sqrt of sum of squares
Get vecteur unitaire
uD = D/lenD
Get (à gauche) perpendiculaire vecteur
(P.x, P.y) = (-uD.y, ud.x)
maintenant le cercle central
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)
vecteur du centre au point de départ:
CP0.x = P0.x - C.x
CP0.y = P0.y - C.y
Ensuite, vous pouvez calculer les coordonnées de N points intermédiaires à l'arc en utilisant la rotation du vecteur CP0 autour du point central
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)
Fonctionnement Del Code phi
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;
Résultat pour (Point(100, 0), Point(0, 100), Pi/2, 8
(axe Y vers le bas à l'image)
quel type d'arc? circulaire, elliptique ...? Qu'en est-il des tangentes de début et de fin? voir [Formule pour tracer des arcs se terminant par des droites, Y en fonction de X, pente de départ, pente de fin, point de départ et rayon d'arc?] (https://stackoverflow.com/a/22982623/2521214) – Spektre
Semi-cercle, aurai-je besoin d'eux? –
si par "eux" vous voulez dire les tangentes alors non. Cela est possible sans eux aussi, mais dans ce cas, la pente de début et de fin sera indéfinie, ce qui peut causer des problèmes pour certaines tâches. Donc, la question est de savoir si vous avez besoin d'une pente de début ou de fin spécifique ou non ... – Spektre